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-2.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_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
) {
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
,
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
,
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
,
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
,
173 if (response
== GTK_RESPONSE_OK
) {
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);
191 messages_where
[i
] |= (1<<j
);
196 gui_dialog_destroy(dlg
);
199 /**************************************************************************
201 **************************************************************************/
202 static void item_toggled(GtkCellRendererToggle
*cell
,
203 gchar
*spath
, gpointer data
)
205 GtkTreeModel
*model
= GTK_TREE_MODEL(data
);
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);
218 gtk_list_store_set(GTK_LIST_STORE(model
), &it
, column
, toggle
, -1);
220 gtk_tree_path_free(path
);