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>
35 /* client/gui-gtk-4.0 */
38 #include "gui_stuff.h"
43 static struct gui_dialog
*find_dialog_shell
;
44 static GtkWidget
*find_view
;
46 static void update_find_dialog(GtkListStore
*store
);
48 static void find_response(struct gui_dialog
*dlg
, int response
, gpointer data
);
49 static void find_destroy_callback(GtkWidget
*w
, gpointer data
);
50 static void find_selection_callback(GtkTreeSelection
*selection
,
53 static struct tile
*pos
;
55 /****************************************************************
56 popup the dialog 10% inside the main-window
57 *****************************************************************/
58 void popup_find_dialog(void)
60 if (!find_dialog_shell
) {
64 GtkTreeSelection
*selection
;
65 GtkCellRenderer
*renderer
;
66 GtkTreeViewColumn
*column
;
68 pos
= get_center_tile_mapcanvas();
70 gui_dialog_new(&find_dialog_shell
, GTK_NOTEBOOK(bottom_notebook
), NULL
,
72 gui_dialog_set_title(find_dialog_shell
, _("Find City"));
73 gui_dialog_set_default_size(find_dialog_shell
, -1, 240);
75 gui_dialog_add_button(find_dialog_shell
, "edit-find", _("Find"),
77 gui_dialog_add_button(find_dialog_shell
, NULL
, _("Cancel"),
80 gui_dialog_set_default_response(find_dialog_shell
, GTK_RESPONSE_ACCEPT
);
82 gui_dialog_response_set_callback(find_dialog_shell
, find_response
);
84 g_signal_connect(find_dialog_shell
->vbox
, "destroy",
85 G_CALLBACK(find_destroy_callback
), NULL
);
87 store
= gtk_list_store_new(2, G_TYPE_STRING
, G_TYPE_POINTER
);
88 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store
),
89 0, GTK_SORT_ASCENDING
);
91 find_view
= gtk_tree_view_new_with_model(GTK_TREE_MODEL(store
));
92 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(find_view
));
93 g_object_unref(store
);
94 gtk_tree_view_columns_autosize(GTK_TREE_VIEW(find_view
));
95 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(find_view
), FALSE
);
97 renderer
= gtk_cell_renderer_text_new();
98 column
= gtk_tree_view_column_new_with_attributes(NULL
, renderer
,
100 gtk_tree_view_column_set_sort_order(column
, GTK_SORT_ASCENDING
);
101 gtk_tree_view_append_column(GTK_TREE_VIEW(find_view
), column
);
103 sw
= gtk_scrolled_window_new(NULL
, NULL
);
104 g_object_set(sw
, "margin", 2, NULL
);
105 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw
),
106 GTK_SHADOW_ETCHED_IN
);
107 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw
),
108 GTK_POLICY_AUTOMATIC
, GTK_POLICY_ALWAYS
);
109 gtk_container_add(GTK_CONTAINER(sw
), find_view
);
111 gtk_widget_set_hexpand(GTK_WIDGET(find_view
), TRUE
);
112 gtk_widget_set_vexpand(GTK_WIDGET(find_view
), TRUE
);
114 label
= g_object_new(GTK_TYPE_LABEL
,
115 "use-underline", TRUE
,
116 "mnemonic-widget", find_view
,
117 "label", _("Ci_ties:"),
118 "xalign", 0.0, "yalign", 0.5, NULL
);
119 gtk_container_add(GTK_CONTAINER(find_dialog_shell
->vbox
), label
);
120 gtk_container_add(GTK_CONTAINER(find_dialog_shell
->vbox
), sw
);
122 g_signal_connect(selection
, "changed",
123 G_CALLBACK(find_selection_callback
), store
);
125 update_find_dialog(store
);
126 gtk_tree_view_focus(GTK_TREE_VIEW(find_view
));
128 gui_dialog_show_all(find_dialog_shell
);
131 gui_dialog_raise(find_dialog_shell
);
134 /**************************************************************************
135 Update find dialog with current cities
136 **************************************************************************/
137 static void update_find_dialog(GtkListStore
*store
)
141 gtk_list_store_clear(store
);
143 players_iterate(pplayer
) {
144 city_list_iterate(pplayer
->cities
, pcity
) {
145 GValue value
= { 0, };
147 gtk_list_store_append(store
, &it
);
149 g_value_init(&value
, G_TYPE_STRING
);
150 g_value_set_static_string(&value
, city_name_get(pcity
));
151 gtk_list_store_set_value(store
, &it
, 0, &value
);
152 g_value_unset(&value
);
154 gtk_list_store_set(store
, &it
, 1, pcity
, -1);
155 } city_list_iterate_end
;
156 } players_iterate_end
;
159 /**************************************************************************
160 User responded to find dialog
161 **************************************************************************/
162 static void find_response(struct gui_dialog
*dlg
, int response
, gpointer data
)
164 if (response
== GTK_RESPONSE_ACCEPT
) {
165 GtkTreeSelection
*selection
;
169 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(find_view
));
171 if (gtk_tree_selection_get_selected(selection
, &model
, &it
)) {
174 gtk_tree_model_get(model
, &it
, 1, &pcity
, -1);
181 gui_dialog_destroy(dlg
);
184 /**************************************************************************
185 Find dialog destroyed
186 **************************************************************************/
187 static void find_destroy_callback(GtkWidget
*w
, gpointer data
)
190 center_tile_mapcanvas(pos
);
194 /**************************************************************************
195 User selected city from find dialog
196 **************************************************************************/
197 static void find_selection_callback(GtkTreeSelection
*selection
,
203 if (!gtk_tree_selection_get_selected(selection
, NULL
, &it
))
206 gtk_tree_model_get(model
, &it
, 1, &pcity
, -1);
210 center_tile_mapcanvas(pcity
->tile
);