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)
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 ***********************************************************************/
15 #include <fc_config.h>
29 /* client/gui-gtk-3.0 */
32 #include "gui_stuff.h"
34 #include "messagedlg.h"
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
,
45 static void item_toggled(GtkCellRendererToggle
*cell
,
46 gchar
*spath
, gpointer data
);
48 /**************************************************************************
49 Open messageoptions dialog
50 **************************************************************************/
51 void popup_messageopt_dialog(void)
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
;
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_OK
, GTK_RESPONSE_OK
);
73 gui_dialog_add_button(shell
, GTK_STOCK_CANCEL
, GTK_RESPONSE_CANCEL
);
75 explanation
= gtk_label_new(NULL
);
76 g_object_set(explanation
, "margin", 4, NULL
);
77 gtk_label_set_markup(GTK_LABEL(explanation
),
78 _("Where to display messages?\n"
79 "<b>Out</b>put window ; "
80 "<b>Mes</b>sages window ; "
81 "<b>Pop</b>up individual window"));
82 gtk_widget_set_name(explanation
, "comment_label");
83 gtk_container_add(GTK_CONTAINER(shell
->vbox
), explanation
);
84 gtk_widget_show(explanation
);
86 form
= gtk_grid_new();
87 gtk_container_add(GTK_CONTAINER(shell
->vbox
), form
);
89 for (n
= 0; n
< NUM_LISTS
; n
++) {
90 models
[n
] = gtk_list_store_new(5, G_TYPE_BOOLEAN
, G_TYPE_BOOLEAN
,
91 G_TYPE_BOOLEAN
, G_TYPE_STRING
, G_TYPE_INT
);
94 sorted_event_iterate(ev
) {
96 GValue value
= { 0, };
98 n
= (i
++ % NUM_LISTS
);
100 gtk_list_store_append(models
[n
], &it
);
102 g_value_init(&value
, G_TYPE_STRING
);
103 g_value_set_static_string(&value
, get_event_message_text(ev
));
104 gtk_list_store_set_value(models
[n
], &it
, 3, &value
);
105 g_value_unset(&value
);
107 gtk_list_store_set(models
[n
], &it
, 4, ev
, -1);
109 for (j
= 0; j
< NUM_MW
; j
++) {
110 gtk_list_store_set(models
[n
], &it
, j
, messages_where
[ev
] & (1<<j
), -1);
112 } sorted_event_iterate_end
;
114 for (n
= 0; n
< NUM_LISTS
; n
++) {
115 GtkWidget
*view
, *sw
;
116 GtkCellRenderer
*renderer
;
117 GtkTreeViewColumn
*column
;
119 view
= gtk_tree_view_new_with_model(GTK_TREE_MODEL(models
[n
]));
120 gtk_widget_set_hexpand(view
, TRUE
);
121 gtk_widget_set_vexpand(view
, TRUE
);
122 g_object_unref(models
[n
]);
124 renderer
= gtk_cell_renderer_text_new();
125 column
= gtk_tree_view_column_new_with_attributes(_("Event"),
126 renderer
, "text", 3, NULL
);
127 gtk_tree_view_append_column(GTK_TREE_VIEW(view
), column
);
128 gtk_tree_view_column_set_expand(column
, TRUE
);
130 renderer
= gtk_cell_renderer_toggle_new();
131 g_object_set_data(G_OBJECT(renderer
), "column", GINT_TO_POINTER(0));
132 g_signal_connect(renderer
, "toggled", G_CALLBACK(item_toggled
), models
[n
]);
134 gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view
),
135 -1, _("Out"), renderer
,
138 renderer
= gtk_cell_renderer_toggle_new();
139 g_object_set_data(G_OBJECT(renderer
), "column", GINT_TO_POINTER(1));
140 g_signal_connect(renderer
, "toggled", G_CALLBACK(item_toggled
), models
[n
]);
142 gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view
),
143 -1, _("Mes"), renderer
,
146 renderer
= gtk_cell_renderer_toggle_new();
147 g_object_set_data(G_OBJECT(renderer
), "column", GINT_TO_POINTER(2));
148 g_signal_connect(renderer
, "toggled", G_CALLBACK(item_toggled
), models
[n
]);
150 gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view
),
151 -1, _("Pop"), renderer
,
154 sw
= gtk_scrolled_window_new(NULL
, NULL
);
155 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw
),
156 GTK_SHADOW_ETCHED_IN
);
157 gtk_container_add(GTK_CONTAINER(sw
), view
);
159 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw
),
160 GTK_POLICY_AUTOMATIC
, GTK_POLICY_ALWAYS
);
161 gtk_container_add(GTK_CONTAINER(form
), sw
);
163 gtk_tree_view_focus(GTK_TREE_VIEW(view
));
166 gui_dialog_response_set_callback(shell
, messageopt_response
);
167 gui_dialog_show_all(shell
);
170 /**************************************************************************
171 Use responded to messageoptions dialog
172 **************************************************************************/
173 static void messageopt_response(struct gui_dialog
*dlg
, int response
,
176 if (response
== GTK_RESPONSE_OK
) {
181 for (i
= 0; i
<= event_type_max(); i
++) {
182 /* Include possible undefined messages. */
183 messages_where
[i
] = 0;
186 for (n
= 0; n
< NUM_LISTS
; n
++) {
187 GtkTreeModel
*pmodel
= GTK_TREE_MODEL(models
[n
]);
189 for (itree_begin(pmodel
, &it
); !itree_end(&it
); itree_next(&it
)) {
190 for (j
= 0; j
< NUM_MW
; j
++) {
191 itree_get(&it
, j
, &toggle
, 4, &i
, -1);
194 messages_where
[i
] |= (1<<j
);
199 gui_dialog_destroy(dlg
);
202 /**************************************************************************
204 **************************************************************************/
205 static void item_toggled(GtkCellRendererToggle
*cell
,
206 gchar
*spath
, gpointer data
)
208 GtkTreeModel
*model
= GTK_TREE_MODEL(data
);
214 path
= gtk_tree_path_new_from_string(spath
);
216 column
= GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cell
), "column"));
218 gtk_tree_model_get_iter(model
, &it
, path
);
219 gtk_tree_model_get(model
, &it
, column
, &toggle
, -1);
221 gtk_list_store_set(GTK_LIST_STORE(model
), &it
, column
, toggle
, -1);
223 gtk_tree_path_free(path
);