| 1 | /* |
| 2 | * LegacyClonk |
| 3 | * |
| 4 | * Copyright (c) RedWolf Design |
| 5 | * Copyright (c) 2007, Clonk-Karl |
| 6 | * Copyright (c) 2017-2019, The LegacyClonk Team and contributors |
| 7 | * |
| 8 | * Distributed under the terms of the ISC license; see accompanying file |
| 9 | * "COPYING" for details. |
| 10 | * |
| 11 | * "Clonk" is a registered trademark of Matthes Bender, used with permission. |
| 12 | * See accompanying file "TRADEMARK" for details. |
| 13 | * |
| 14 | * To redistribute this file separately, substitute the full license texts |
| 15 | * for the above references. |
| 16 | */ |
| 17 | |
| 18 | /* Common window for drawing and property tool dialogs in console mode */ |
| 19 | |
| 20 | #include <C4DevmodeDlg.h> |
| 21 | |
| 22 | #ifdef WITH_DEVELOPER_MODE |
| 23 | |
| 24 | #include <cassert> |
| 25 | |
| 26 | #include <gtk/gtk.h> |
| 27 | |
| 28 | GtkWidget *C4DevmodeDlg::window = nullptr; |
| 29 | GtkWidget *C4DevmodeDlg::notebook = nullptr; |
| 30 | |
| 31 | int C4DevmodeDlg::x = -1; |
| 32 | int C4DevmodeDlg::y = -1; |
| 33 | |
| 34 | namespace |
| 35 | { |
| 36 | gboolean OnDeleteEvent(GtkWidget *widget, gpointer user_data) |
| 37 | { |
| 38 | // Just hide the window, don't destroy it |
| 39 | C4DevmodeDlg::SwitchPage(widget: nullptr); |
| 40 | return TRUE; |
| 41 | } |
| 42 | } |
| 43 | |
| 44 | void C4DevmodeDlg::OnDestroy(GtkWidget *window, gpointer user_data) |
| 45 | { |
| 46 | C4DevmodeDlg::window = nullptr; |
| 47 | C4DevmodeDlg::notebook = nullptr; |
| 48 | } |
| 49 | |
| 50 | void C4DevmodeDlg::AddPage(GtkWidget *widget, GtkWindow *parent, const char *title) |
| 51 | { |
| 52 | // Create Window if necessary |
| 53 | if (window == nullptr) |
| 54 | { |
| 55 | notebook = gtk_notebook_new(); |
| 56 | gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), FALSE); |
| 57 | gtk_notebook_set_show_border(GTK_NOTEBOOK(notebook), FALSE); |
| 58 | gtk_widget_show(GTK_WIDGET(notebook)); |
| 59 | |
| 60 | window = gtk_window_new(type: GTK_WINDOW_TOPLEVEL); |
| 61 | gtk_container_add(GTK_CONTAINER(window), widget: notebook); |
| 62 | |
| 63 | gtk_window_set_resizable(GTK_WINDOW(window), TRUE); |
| 64 | gtk_window_set_type_hint(GTK_WINDOW(window), hint: GDK_WINDOW_TYPE_HINT_UTILITY); |
| 65 | gtk_window_set_role(GTK_WINDOW(window), role: "toolbox" ); |
| 66 | |
| 67 | gtk_window_set_transient_for(GTK_WINDOW(window), parent); |
| 68 | gtk_window_set_position(GTK_WINDOW(window), position: GTK_WIN_POS_CENTER_ON_PARENT); |
| 69 | |
| 70 | g_signal_connect(G_OBJECT(window), "delete-event" , G_CALLBACK(OnDeleteEvent), nullptr); |
| 71 | g_signal_connect(G_OBJECT(window), "destroy" , G_CALLBACK(OnDestroy), nullptr); |
| 72 | } |
| 73 | |
| 74 | // Add page to notebook |
| 75 | GtkWidget *label = gtk_label_new(str: title); |
| 76 | gtk_notebook_append_page(GTK_NOTEBOOK(notebook), child: widget, tab_label: label); |
| 77 | } |
| 78 | |
| 79 | void C4DevmodeDlg::RemovePage(GtkWidget *widget) |
| 80 | { |
| 81 | int page_num = gtk_notebook_page_num(GTK_NOTEBOOK(notebook), child: widget); |
| 82 | assert(page_num != -1); // Make sure it is contained |
| 83 | |
| 84 | gtk_notebook_remove_page(GTK_NOTEBOOK(notebook), page_num); |
| 85 | |
| 86 | if (gtk_notebook_get_n_pages(GTK_NOTEBOOK(notebook)) == 0) |
| 87 | gtk_widget_destroy(widget: window); |
| 88 | } |
| 89 | |
| 90 | void C4DevmodeDlg::SwitchPage(GtkWidget *widget) |
| 91 | { |
| 92 | bool is_visible = gtk_widget_get_visible(GTK_WIDGET(window)); |
| 93 | |
| 94 | // Remember window position |
| 95 | if (window != nullptr && is_visible) |
| 96 | gtk_window_get_position(GTK_WINDOW(window), root_x: &x, root_y: &y); |
| 97 | |
| 98 | if (widget != nullptr) |
| 99 | { |
| 100 | assert(window != nullptr); |
| 101 | |
| 102 | // Show required page |
| 103 | int page_num = gtk_notebook_page_num(GTK_NOTEBOOK(notebook), child: widget); |
| 104 | assert(page_num != -1); // Make sure it is contained |
| 105 | |
| 106 | gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), page_num); |
| 107 | gtk_window_set_title(GTK_WINDOW(window), title: gtk_notebook_get_tab_label_text(GTK_NOTEBOOK(notebook), child: widget)); |
| 108 | |
| 109 | // Show window if not visible |
| 110 | if (!is_visible) |
| 111 | { |
| 112 | gtk_widget_show(widget: window); |
| 113 | if (x != -1 || y != -1) |
| 114 | gtk_window_move(GTK_WINDOW(window), x, y); |
| 115 | } |
| 116 | } |
| 117 | else |
| 118 | { |
| 119 | if (window != nullptr && is_visible) |
| 120 | gtk_widget_hide(widget: window); |
| 121 | } |
| 122 | } |
| 123 | |
| 124 | void C4DevmodeDlg::SetTitle(GtkWidget *widget, const char *title) |
| 125 | { |
| 126 | gtk_notebook_set_tab_label_text(GTK_NOTEBOOK(notebook), child: widget, tab_text: title); |
| 127 | int page_num = gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)); |
| 128 | if (gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), page_num) == widget) |
| 129 | gtk_window_set_title(GTK_WINDOW(window), title); |
| 130 | } |
| 131 | |
| 132 | #endif // WITH_DEVELOPER_MODE |
| 133 | |