Freeciv-3.3: /fast/freeciv/nightly/main/client/gui-gtk-4.0/messagedlg.c Source File

Freeciv-3.3

Loading...
Searching...
No Matches
messagedlg.c
Go to the documentation of this file.
1/***********************************************************************
2 Freeciv - Copyright (C) 1996 - A Kjeldberg, L Gregersen, P Unold
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation; either version 2, or (at your option)
6 any later version.
7
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
12***********************************************************************/
13
14#ifdef HAVE_CONFIG_H
15#include <fc_config.h>
16#endif
17
18#include <gtk/gtk.h>
19
20/* utility */
21#include "fcintl.h"
22
23/* common */
24#include "events.h"
25
26/* client */
27#include "options.h"
28
29/* client/gui-gtk-4.0 */
30#include "colors.h"
31#include "gui_main.h"
32#include "gui_stuff.h"
33
34#include "messagedlg.h"
35
36#define NUM_LISTS 1
37
38/*************************************************************************/
39 static struct gui_dialog *shell;
40 static GtkListStore *models[NUM_LISTS];
41
42static void create_messageopt_dialog(void);
43static void messageopt_response(struct gui_dialog *dlg, int response,
44 gpointer data);
45static void item_toggled(GtkCellRendererToggle *cell,
46 gchar *spath, gpointer data);
47
48/**********************************************************************/
51 void popup_messageopt_dialog(void)
52{
53 if (shell == NULL) {
54 create_messageopt_dialog();
55 }
56
57 gui_dialog_raise(shell);
58}
59
60/**********************************************************************/
63 static void create_messageopt_dialog(void)
64{
65 GtkWidget *form, *explanation;
66 int n, i = 0, j;
67 int form_col = 0;
68
69 gui_dialog_new(&shell, GTK_NOTEBOOK(top_notebook), NULL, TRUE);
70 gui_dialog_set_title(shell, _("Message Options"));
71
72 gui_dialog_set_default_size(shell, -1, 450);
73
74 gui_dialog_add_button(shell, NULL, _("_OK"), GTK_RESPONSE_OK);
75 gui_dialog_add_button(shell, NULL, _("_Cancel"), GTK_RESPONSE_CANCEL);
76
77 explanation = gtk_label_new(NULL);
78 gtk_widget_set_margin_bottom(explanation, 4);
79 gtk_widget_set_margin_end(explanation, 4);
80 gtk_widget_set_margin_start(explanation, 4);
81 gtk_widget_set_margin_top(explanation, 4);
82 gtk_label_set_markup(GTK_LABEL(explanation),
83 _("Where to display messages?\n"
84 "<b>Out</b>put window ; "
85 "<b>Mes</b>sages window ; "
86 "<b>Pop</b>up individual window"));
87 gtk_widget_set_name(explanation, "comment_label");
88 gui_dialog_add_content_widget(shell, explanation);
89 gtk_widget_set_visible(explanation, TRUE);
90
91 form = gtk_grid_new();
92 gui_dialog_add_content_widget(shell, form);
93
94 for (n = 0; n < NUM_LISTS; n++) {
95 models[n] = gtk_list_store_new(5, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN,
96 G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_INT);
97 }
98
99 sorted_event_iterate(ev) {
100 GtkTreeIter it;
101 GValue value = { 0, };
102
103 n = (i++ % NUM_LISTS);
104
105 gtk_list_store_append(models[n], &it);
106
107 g_value_init(&value, G_TYPE_STRING);
108 g_value_set_static_string(&value, get_event_message_text(ev));
109 gtk_list_store_set_value(models[n], &it, 3, &value);
110 g_value_unset(&value);
111
112 gtk_list_store_set(models[n], &it, 4, ev, -1);
113
114 for (j = 0; j < NUM_MW; j++) {
115 gtk_list_store_set(models[n], &it, j, messages_where[ev] & (1<<j), -1);
116 }
117 } sorted_event_iterate_end;
118
119 for (n = 0; n < NUM_LISTS; n++) {
120 GtkWidget *view, *sw;
121 GtkCellRenderer *renderer;
122 GtkTreeViewColumn *column;
123
124 view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(models[n]));
125 gtk_widget_set_hexpand(view, TRUE);
126 gtk_widget_set_vexpand(view, TRUE);
127 g_object_unref(models[n]);
128
129 renderer = gtk_cell_renderer_text_new();
130 column = gtk_tree_view_column_new_with_attributes(_("Event"),
131 renderer, "text", 3, NULL);
132 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
133 gtk_tree_view_column_set_expand(column, TRUE);
134
135 renderer = gtk_cell_renderer_toggle_new();
136 g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(0));
137 g_signal_connect(renderer, "toggled", G_CALLBACK(item_toggled), models[n]);
138
139 gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view),
140 -1, _("Out"), renderer,
141 "active", 0, NULL);
142
143 renderer = gtk_cell_renderer_toggle_new();
144 g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(1));
145 g_signal_connect(renderer, "toggled", G_CALLBACK(item_toggled), models[n]);
146
147 gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view),
148 -1, _("Mes"), renderer,
149 "active", 1, NULL);
150
151 renderer = gtk_cell_renderer_toggle_new();
152 g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(2));
153 g_signal_connect(renderer, "toggled", G_CALLBACK(item_toggled), models[n]);
154
155 gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view),
156 -1, _("Pop"), renderer,
157 "active", 2, NULL);
158
159 sw = gtk_scrolled_window_new();
160 gtk_scrolled_window_set_has_frame(GTK_SCROLLED_WINDOW(sw), TRUE);
161 gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(sw), view);
162
163 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw),
164 GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
165 gtk_grid_attach(GTK_GRID(form), sw, form_col++, 0, 1, 1);
166
167 gtk_tree_view_focus(GTK_TREE_VIEW(view));
168 }
169
170 gui_dialog_response_set_callback(shell, messageopt_response);
171 gui_dialog_show_all(shell);
172}
173
174/**********************************************************************/
177 static void messageopt_response(struct gui_dialog *dlg, int response,
178 gpointer data)
179{
180 if (response == GTK_RESPONSE_OK) {
181 ITree it;
182 gint n, j, i;
183 gboolean toggle;
184
185 for (i = 0; i <= event_type_max(); i++) {
186 /* Include possible undefined messages. */
187 messages_where[i] = 0;
188 }
189
190 for (n = 0; n < NUM_LISTS; n++) {
191 GtkTreeModel *pmodel = GTK_TREE_MODEL(models[n]);
192
193 for (itree_begin(pmodel, &it); !itree_end(&it); itree_next(&it)) {
194 for (j = 0; j < NUM_MW; j++) {
195 itree_get(&it, j, &toggle, 4, &i, -1);
196
197 if (toggle) {
198 messages_where[i] |= (1<<j);
199 }
200 }
201 }
202 }
203 }
204 gui_dialog_destroy(dlg);
205}
206
207/**********************************************************************/
210 static void item_toggled(GtkCellRendererToggle *cell,
211 gchar *spath, gpointer data)
212{
213 GtkTreeModel *model = GTK_TREE_MODEL(data);
214 GtkTreePath *path;
215 GtkTreeIter it;
216 gboolean toggle;
217 gint column;
218
219 path = gtk_tree_path_new_from_string(spath);
220
221 column = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cell), "column"));
222
223 gtk_tree_model_get_iter(model, &it, path);
224 gtk_tree_model_get(model, &it, column, &toggle, -1);
225 toggle ^= 1;
226 gtk_list_store_set(GTK_LIST_STORE(model), &it, column, toggle, -1);
227
228 gtk_tree_path_free(path);
229}
n
#define n
Definition astring.c:77
incite_cost
char * incite_cost
Definition comments.c:74
get_event_message_text
const char * get_event_message_text(enum event_type event)
Definition events.c:247
events.h
sorted_event_iterate_end
#define sorted_event_iterate_end
Definition events.h:213
sorted_event_iterate
#define sorted_event_iterate(event)
Definition events.h:203
fcintl.h
_
#define _(String)
Definition fcintl.h:67
top_notebook
GtkWidget * top_notebook
Definition gui_main.c:129
gtk_tree_view_focus
void gtk_tree_view_focus(GtkTreeView *view)
Definition gui_stuff.c:236
gui_dialog_destroy
void gui_dialog_destroy(struct gui_dialog *dlg)
Definition gui_stuff.c:954
itree_get
void itree_get(ITree *it,...)
Definition gui_stuff.c:164
gui_dialog_raise
void gui_dialog_raise(struct gui_dialog *dlg)
Definition gui_stuff.c:865
gui_dialog_new
void gui_dialog_new(struct gui_dialog **pdlg, GtkNotebook *notebook, gpointer user_data, bool check_top)
Definition gui_stuff.c:517
gui_dialog_response_set_callback
void gui_dialog_response_set_callback(struct gui_dialog *dlg, GUI_DIALOG_RESPONSE_FUN fun)
Definition gui_stuff.c:988
itree_begin
void itree_begin(GtkTreeModel *model, ITree *it)
Definition gui_stuff.c:127
gui_dialog_show_all
void gui_dialog_show_all(struct gui_dialog *dlg)
Definition gui_stuff.c:795
gui_dialog_set_title
void gui_dialog_set_title(struct gui_dialog *dlg, const char *title)
Definition gui_stuff.c:935
gui_dialog_set_default_size
void gui_dialog_set_default_size(struct gui_dialog *dlg, int width, int height)
Definition gui_stuff.c:919
itree_next
void itree_next(ITree *it)
Definition gui_stuff.c:144
gui_dialog_add_button
GtkWidget * gui_dialog_add_button(struct gui_dialog *dlg, const char *icon_name, const char *text, int response)
Definition gui_stuff.c:706
itree_end
gboolean itree_end(ITree *it)
Definition gui_stuff.c:136
item_toggled
static void item_toggled(GtkCellRendererToggle *cell, gchar *spath, gpointer data)
Definition messagedlg.c:206
models
static GtkListStore * models[NUM_LISTS]
Definition messagedlg.c:40
popup_messageopt_dialog
void popup_messageopt_dialog(void)
Definition messagedlg.c:51
NUM_LISTS
#define NUM_LISTS
Definition messagedlg.c:36
create_messageopt_dialog
static void create_messageopt_dialog(void)
Definition messagedlg.c:63
messageopt_response
static void messageopt_response(struct gui_dialog *dlg, int response, gpointer data)
Definition messagedlg.c:174
shell
static struct gui_dialog * shell
Definition messagedlg.c:39
gui_dialog_add_content_widget
void gui_dialog_add_content_widget(struct gui_dialog *dlg, GtkWidget *wdg)
Definition gui_stuff.c:1105
gui_stuff.h
colors.h
gui_main.h
messagedlg.h
messages_where
int messages_where[E_COUNT]
Definition options.c:5301
options.h
NUM_MW
#define NUM_MW
Definition options.h:614
ITree
Definition gui_stuff.h:32
gui_dialog
Definition gui_stuff.h:70
view
Definition mapview_common.h:36
TRUE
#define TRUE
Definition support.h:46