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
28GtkWidget *C4DevmodeDlg::window = nullptr;
29GtkWidget *C4DevmodeDlg::notebook = nullptr;
30
31int C4DevmodeDlg::x = -1;
32int C4DevmodeDlg::y = -1;
33
34namespace
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
44void C4DevmodeDlg::OnDestroy(GtkWidget *window, gpointer user_data)
45{
46 C4DevmodeDlg::window = nullptr;
47 C4DevmodeDlg::notebook = nullptr;
48}
49
50void 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
79void 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
90void 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
124void 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