Do not return NULL as boolean from wonder_is_lost() nor wonder_is_built()
[freeciv.git] / client / gui-gtk-2.0 / messagedlg.c
blob770c72d4036aa335458a6fdeca66b38b59f70687
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.
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 ***********************************************************************/
14 #ifdef HAVE_CONFIG_H
15 #include <fc_config.h>
16 #endif
18 #include <gtk/gtk.h>
20 /* utility */
21 #include "fcintl.h"
23 /* common */
24 #include "events.h"
26 /* client */
27 #include "options.h"
29 /* client/gui-gtk-2.0 */
30 #include "colors.h"
31 #include "gui_main.h"
32 #include "gui_stuff.h"
34 #include "messagedlg.h"
36 #define NUM_LISTS 1
38 /*************************************************************************/
39 static struct gui_dialog *shell;
40 static GtkListStore *models[NUM_LISTS];
42 static void create_messageopt_dialog(void);
43 static void messageopt_response(struct gui_dialog *dlg, int response,
44 gpointer data);
45 static void item_toggled(GtkCellRendererToggle *cell,
46 gchar *spath, gpointer data);
48 /**************************************************************************
49 Open messageoptions dialog
50 **************************************************************************/
51 void popup_messageopt_dialog(void)
53 if (!shell)
54 create_messageopt_dialog();
56 gui_dialog_raise(shell);
59 /**************************************************************************
60 Create messageoptions dialog
61 **************************************************************************/
62 static void create_messageopt_dialog(void)
64 GtkWidget *form, *explanation;
65 int n, i = 0, j;
67 gui_dialog_new(&shell, GTK_NOTEBOOK(top_notebook), NULL, TRUE);
68 gui_dialog_set_title(shell, _("Message Options"));
70 gui_dialog_set_default_size(shell, -1, 450);
72 gui_dialog_add_button(shell, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
73 gui_dialog_add_button(shell, GTK_STOCK_OK, GTK_RESPONSE_OK);
75 explanation = gtk_label_new(NULL);
76 gtk_label_set_markup(GTK_LABEL(explanation),
77 _("Where to display messages?\n"
78 "<b>Out</b>put window ; "
79 "<b>Mes</b>sages window ; "
80 "<b>Pop</b>up individual window"));
81 gtk_widget_set_name(explanation, "comment_label");
82 gtk_box_pack_start(GTK_BOX(shell->vbox), explanation, FALSE, FALSE, 4);
83 gtk_widget_show(explanation);
85 form = gtk_vbox_new(FALSE, 0);
86 gtk_box_pack_start(GTK_BOX(shell->vbox), form, TRUE, TRUE, 0);
88 for (n = 0; n < NUM_LISTS; n++) {
89 models[n] = gtk_list_store_new(5, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN,
90 G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_INT);
93 sorted_event_iterate(ev) {
94 GtkTreeIter it;
95 GValue value = { 0, };
97 n = (i++ % NUM_LISTS);
99 gtk_list_store_append(models[n], &it);
101 g_value_init(&value, G_TYPE_STRING);
102 g_value_set_static_string(&value, get_event_message_text(ev));
103 gtk_list_store_set_value(models[n], &it, 3, &value);
104 g_value_unset(&value);
106 gtk_list_store_set(models[n], &it, 4, ev, -1);
108 for (j = 0; j < NUM_MW; j++) {
109 gtk_list_store_set(models[n], &it, j, messages_where[ev] & (1<<j), -1);
111 } sorted_event_iterate_end;
113 for (n = 0; n < NUM_LISTS; n++) {
114 GtkWidget *view, *sw;
115 GtkCellRenderer *renderer;
116 GtkTreeViewColumn *column;
118 view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(models[n]));
119 g_object_unref(models[n]);
121 renderer = gtk_cell_renderer_text_new();
122 column = gtk_tree_view_column_new_with_attributes(_("Event"),
123 renderer, "text", 3, NULL);
124 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
125 gtk_tree_view_column_set_expand(column, TRUE);
127 renderer = gtk_cell_renderer_toggle_new();
128 g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(0));
129 g_signal_connect(renderer, "toggled", G_CALLBACK(item_toggled), models[n]);
131 gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view),
132 -1, _("Out"), renderer,
133 "active", 0, NULL);
135 renderer = gtk_cell_renderer_toggle_new();
136 g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(1));
137 g_signal_connect(renderer, "toggled", G_CALLBACK(item_toggled), models[n]);
139 gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view),
140 -1, _("Mes"), renderer,
141 "active", 1, NULL);
143 renderer = gtk_cell_renderer_toggle_new();
144 g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(2));
145 g_signal_connect(renderer, "toggled", G_CALLBACK(item_toggled), models[n]);
147 gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view),
148 -1, _("Pop"), renderer,
149 "active", 2, NULL);
151 sw = gtk_scrolled_window_new(NULL, NULL);
152 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw),
153 GTK_SHADOW_ETCHED_IN);
154 gtk_container_add(GTK_CONTAINER(sw), view);
156 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw),
157 GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
158 gtk_box_pack_start(GTK_BOX(form), sw, TRUE, TRUE, 0);
160 gtk_tree_view_focus(GTK_TREE_VIEW(view));
163 gui_dialog_response_set_callback(shell, messageopt_response);
164 gui_dialog_show_all(shell);
167 /**************************************************************************
168 Use responded to messageoptions dialog
169 **************************************************************************/
170 static void messageopt_response(struct gui_dialog *dlg, int response,
171 gpointer data)
173 if (response == GTK_RESPONSE_OK) {
174 ITree it;
175 gint n, j, i;
176 gboolean toggle;
178 for (i = 0; i <= event_type_max(); i++) {
179 /* Include possible undefined messages. */
180 messages_where[i] = 0;
183 for ( n= 0; n < NUM_LISTS; n++) {
184 GtkTreeModel *pmodel = GTK_TREE_MODEL(models[n]);
186 for (itree_begin(pmodel, &it); !itree_end(&it); itree_next(&it)) {
187 for (j = 0; j < NUM_MW; j++) {
188 itree_get(&it, j, &toggle, 4, &i, -1);
190 if (toggle)
191 messages_where[i] |= (1<<j);
196 gui_dialog_destroy(dlg);
199 /**************************************************************************
200 User toggled item
201 **************************************************************************/
202 static void item_toggled(GtkCellRendererToggle *cell,
203 gchar *spath, gpointer data)
205 GtkTreeModel *model = GTK_TREE_MODEL(data);
206 GtkTreePath *path;
207 GtkTreeIter it;
208 gboolean toggle;
209 gint column;
211 path = gtk_tree_path_new_from_string(spath);
213 column = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cell), "column"));
215 gtk_tree_model_get_iter(model, &it, path);
216 gtk_tree_model_get(model, &it, column, &toggle, -1);
217 toggle ^= 1;
218 gtk_list_store_set(GTK_LIST_STORE(model), &it, column, toggle, -1);
220 gtk_tree_path_free(path);