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

Freeciv-3.3

Loading...
Searching...
No Matches
unitselect.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 "fc_types.h"
25#include "game.h"
26#include "player.h"
27#include "unit.h"
28#include "unitlist.h"
29#include "unittype.h"
30
31/* client */
32#include "client_main.h"
33#include "control.h"
34#include "goto.h"
35#include "tilespec.h"
36#include "unitselect_common.h"
37
38/* client/gui-gtk-3.22 */
39#include "graphics.h"
40#include "gui_stuff.h"
41#include "gui_main.h"
42
43#include "unitselect.h"
44
45/* Activate this to get more columns (see below) */
46#undef DEBUG_USDLG
47
48 enum usdlg_column_types {
49 COL_PIXBUF,
50 COL_TEXT,
51 COL_INT
52};
53
54 enum usdlg_row_types {
55 ROW_UNITTYPE,
56 ROW_ACTIVITY,
57 ROW_UNIT,
58 ROW_UNIT_TRANSPORTED
59};
60
61/* Basic data (Unit, description, count) */
62#define USDLG_COLUMNS_DEFAULT 3
63/* Additional data; shown if DEBUG_USDLG */
64#define USDLG_COL_UTID USDLG_COLUMNS_DEFAULT + 0 /* Unit type ID */
65#define USDLG_COL_UID USDLG_COLUMNS_DEFAULT + 1 /* Unit ID */
66#define USDLG_COL_LOCATION USDLG_COLUMNS_DEFAULT + 2 /* Unit location */
67#define USDLG_COL_ACTIVITY USDLG_COLUMNS_DEFAULT + 3 /* Unit activity */
68#define USDLG_COL_ROW_TYPE USDLG_COLUMNS_DEFAULT + 4 /* Row type */
69#define USDLG_COLUMNS_DEBUG USDLG_COLUMNS_DEFAULT + 5
70/* Layout options; never shown */
71#define USDLG_COL_STYLE USDLG_COLUMNS_DEBUG + 0
72#define USDLG_COL_WEIGHT USDLG_COLUMNS_DEBUG + 1
73#define USDLG_COLUMNS_ALL USDLG_COLUMNS_DEBUG + 2
74
75#ifdef DEBUG_USDLG
76 #define USDLG_COLUMNS_SHOW USDLG_COLUMNS_DEBUG
77#else
78 #define USDLG_COLUMNS_SHOW USDLG_COLUMNS_DEFAULT
79#endif /* DEBUG_USDLG */
80
81 enum usdlg_column_types usdlg_col_types[USDLG_COLUMNS_ALL] = {
82 COL_PIXBUF, /* Unit */
83 COL_TEXT, /* Description */
84 COL_INT, /* Count */
85 COL_INT, /* Debug: unit type */
86 COL_INT, /* Debug: unit ID */
87 COL_INT, /* Debug: location */
88 COL_INT, /* Debug: activity */
89 COL_INT, /* Debug: row type */
90 COL_INT, /* Layout: style */
91 COL_INT /* Layout: width */
92};
93
94 static const char *usdlg_col_titles[USDLG_COLUMNS_ALL] = {
95 N_("Unit"),
96 N_("Description"),
97 N_("Count"),
98 "[Unittype]", /* Only for debug, no translation! */
99 "[Unit ID]",
100 "[Location]",
101 "[Activity]",
102 "[Row type]",
103 "[Style]",
104 "[Width]"
105};
106
107 enum usdlg_cmd {
108 USDLG_CMD_SELECT,
109 USDLG_CMD_DESELECT,
110 USDLG_CMD_READY,
111 USDLG_CMD_SENTRY,
112 USDLG_CMD_CENTER,
113 USDLG_CMD_FOCUS,
114 USDLG_CMD_LAST
115};
116
117 struct unit_select_dialog {
118 struct tile *ptile;
119 int unit_id_focus;
120
121 GtkWidget *shell;
122 GtkWidget *notebook;
123
124 struct {
125 GtkTreeStore *store;
126 GtkWidget *view;
127 GtkTreePath *path;
128 } units;
129
130 struct {
131 GtkTreeStore *store;
132 GtkWidget *page;
133 GtkWidget *view;
134 GtkTreePath *path;
135
136 GtkWidget *cmd[USDLG_CMD_LAST];
137 } tabs[SELLOC_COUNT];
138};
139
140/* The unit selection dialog; should only be used in usdlg_get(). */
141 static struct unit_select_dialog *unit_select_dlg = NULL;
142
143static struct unit_select_dialog *usdlg_get(bool create);
144static struct unit_select_dialog *usdlg_create(void);
145static void usdlg_destroy(void);
146static void usdlg_destroy_callback(GObject *object, gpointer data);
147static void usdlg_tile(struct unit_select_dialog *pdialog,
148 struct tile *ptile);
149static void usdlg_refresh(struct unit_select_dialog *pdialog);
150
151static void usdlg_tab_select(struct unit_select_dialog *pdialog,
152 const char *title,
153 enum unit_select_location_mode loc);
154static GtkTreeStore *usdlg_tab_store_new(void);
155static bool usdlg_tab_update(struct unit_select_dialog *pdialog,
156 struct usdata_hash *ushash,
157 enum unit_select_location_mode loc);
158static void usdlg_tab_append_utype(GtkTreeStore *store,
159 enum unit_select_location_mode loc,
160 const struct unit_type *putype,
161 GtkTreeIter *it);
162static void usdlg_tab_append_activity(GtkTreeStore *store,
163 enum unit_select_location_mode loc,
164 const struct unit_type *putype,
165 enum unit_activity act,
166 int count, GtkTreeIter *it,
167 GtkTreeIter *parent);
168static void usdlg_tab_append_units(struct unit_select_dialog *pdialog,
169 enum unit_select_location_mode loc,
170 enum unit_activity act,
171 const struct unit *punit,
172 bool transported, GtkTreeIter *it,
173 GtkTreeIter *parent);
174
175static void usdlg_cmd_ready(GObject *object, gpointer data);
176static void usdlg_cmd_sentry(GObject *object, gpointer data);
177static void usdlg_cmd_select(GObject *object, gpointer data);
178static void usdlg_cmd_deselect(GObject *object, gpointer data);
179static void usdlg_cmd_exec(GObject *object, gpointer mode_data,
180 enum usdlg_cmd cmd);
181static void usdlg_cmd_exec_unit(struct unit *punit, enum usdlg_cmd cmd);
182static void usdlg_cmd_center(GObject *object, gpointer data);
183static void usdlg_cmd_focus(GObject *object, gpointer data);
184static void usdlg_cmd_focus_real(GtkTreeView *view);
185static void usdlg_cmd_row_activated(GtkTreeView *view, GtkTreePath *path,
186 GtkTreeViewColumn *col, gpointer data);
187static void usdlg_cmd_cursor_changed(GtkTreeView *view, gpointer data);
188
189
190/*************************************************************************/
193 void unit_select_dialog_popup_main(struct tile *ptile, bool create)
194{
195 struct unit_select_dialog *pdialog;
196
197 /* Create the dialog if it is requested. */
198 pdialog = usdlg_get(create);
199
200 /* Present the unit selection dialog if it exists. */
201 if (pdialog) {
202 /* Show all. */
203 gtk_widget_show_all(GTK_WIDGET(pdialog->shell));
204 /* Update tile. */
205 usdlg_tile(pdialog, ptile);
206 /* Refresh data and hide unused tabs. */
207 usdlg_refresh(pdialog);
208 }
209}
210
211/*************************************************************************/
214 void unit_select_dialog_popdown(void)
215{
216 usdlg_destroy();
217}
218
219/*************************************************************************/
223 static struct unit_select_dialog *usdlg_get(bool create)
224{
225 if (unit_select_dlg) {
226 /* Return existing dialog. */
227 return unit_select_dlg;
228 } else if (create) {
229 /* Create new dialog. */
230 unit_select_dlg = usdlg_create();
231 return unit_select_dlg;
232 } else {
233 /* Nothing. */
234 return NULL;
235 }
236}
237
238/*************************************************************************/
241 static struct unit_select_dialog *usdlg_create(void)
242{
243 GtkWidget *vbox;
244 GtkWidget *close_cmd;
245 struct unit_select_dialog *pdialog;
246
247 /* Create a container for the dialog. */
248 pdialog = fc_calloc(1, sizeof(*pdialog));
249
250 /* No tile defined. */
251 pdialog->ptile = NULL;
252
253 /* Create the dialog. */
254 pdialog->shell = gtk_dialog_new();
255 gtk_window_set_title(GTK_WINDOW(pdialog->shell), _("Unit selection"));
256 setup_dialog(pdialog->shell, toplevel);
257 g_signal_connect(pdialog->shell, "destroy",
258 G_CALLBACK(usdlg_destroy_callback), pdialog);
259 gtk_window_set_position(GTK_WINDOW(pdialog->shell), GTK_WIN_POS_MOUSE);
260 gtk_widget_realize(pdialog->shell);
261
262 vbox = gtk_dialog_get_content_area(GTK_DIALOG(pdialog->shell));
263
264 /* Notebook. */
265 pdialog->notebook = gtk_notebook_new();
266 gtk_notebook_set_tab_pos(GTK_NOTEBOOK(pdialog->notebook),
267 GTK_POS_BOTTOM);
268 gtk_box_pack_start(GTK_BOX(vbox), pdialog->notebook, TRUE, TRUE, 0);
269
270 /* Append pages. */
271 usdlg_tab_select(pdialog, _("_Units"), SELLOC_UNITS);
272 usdlg_tab_select(pdialog, _("_Tile"), SELLOC_TILE);
273 usdlg_tab_select(pdialog, _("C_ontinent"), SELLOC_CONT);
274 usdlg_tab_select(pdialog, _("_Land"), SELLOC_LAND);
275 usdlg_tab_select(pdialog, _("_Sea"), SELLOC_SEA);
276 usdlg_tab_select(pdialog, _("_Both"), SELLOC_BOTH);
277 usdlg_tab_select(pdialog, _("_World"), SELLOC_WORLD);
278
279 /* Buttons. */
280 close_cmd = gtk_dialog_add_button(GTK_DIALOG(pdialog->shell),
281 _("_Close"), GTK_RESPONSE_CLOSE);
282 gtk_dialog_set_default_response(GTK_DIALOG(pdialog->shell),
283 GTK_RESPONSE_CLOSE);
284 g_signal_connect(close_cmd, "clicked",
285 G_CALLBACK(usdlg_destroy_callback), pdialog);
286
287 return pdialog;
288}
289
290/*************************************************************************/
293 static void usdlg_destroy(void)
294{
295 if (unit_select_dlg) {
296 gtk_widget_destroy(GTK_WIDGET(unit_select_dlg->shell));
297 free(unit_select_dlg);
298 }
299 unit_select_dlg = NULL;
300}
301
302/*************************************************************************/
305 static void usdlg_destroy_callback(GObject *object, gpointer data)
306{
307 usdlg_destroy();
308}
309
310/*************************************************************************/
313 static void usdlg_tile(struct unit_select_dialog *pdialog,
314 struct tile *ptile)
315{
316 if (!pdialog) {
317 return;
318 }
319
320 /* Check for a valid tile. */
321 if (ptile != NULL) {
322 pdialog->ptile = ptile;
323 } else if (pdialog->ptile == NULL) {
324 struct unit *punit = head_of_units_in_focus();
325
326 if (punit) {
327 pdialog->ptile = unit_tile(punit);
328 center_tile_mapcanvas(pdialog->ptile);
329 } else {
330 pdialog->ptile = get_center_tile_mapcanvas();
331 }
332 }
333}
334
335/*************************************************************************/
338 static void usdlg_refresh(struct unit_select_dialog *pdialog)
339{
340 struct usdata_hash *ushash = NULL;
341 enum unit_select_location_mode loc;
342
343 if (!pdialog) {
344 return;
345 }
346
347 /* Sort units into the hash. */
348 ushash = usdlg_data_new(pdialog->ptile);
349 /* Update all tabs. */
350 for (loc = unit_select_location_mode_begin();
351 loc != unit_select_location_mode_end();
352 loc = unit_select_location_mode_next(loc)) {
353 bool show = usdlg_tab_update(pdialog, ushash, loc);
354
355 if (!show) {
356 gtk_widget_hide(pdialog->tabs[loc].page);
357 } else {
358 gtk_widget_show(pdialog->tabs[loc].page);
359
360 if (pdialog->tabs[loc].path) {
361 gtk_tree_view_expand_row(GTK_TREE_VIEW(pdialog->tabs[loc].view),
362 pdialog->tabs[loc].path,FALSE);
363 gtk_tree_view_set_cursor(GTK_TREE_VIEW(pdialog->tabs[loc].view),
364 pdialog->tabs[loc].path, NULL, FALSE);
365 gtk_tree_path_free(pdialog->tabs[loc].path);
366 pdialog->tabs[loc].path = NULL;
367 }
368 }
369 }
370 /* Destroy the hash. */
371 usdlg_data_destroy(ushash);
372}
373
374/*************************************************************************/
387 static void usdlg_tab_select(struct unit_select_dialog *pdialog,
388 const char *title,
389 enum unit_select_location_mode loc)
390{
391 GtkWidget *page, *label, *hbox, *vbox, *view, *sw;
392 GtkTreeStore *store;
393 static bool titles_done;
394 int i;
395
396 page = gtk_grid_new();
397 gtk_orientable_set_orientation(GTK_ORIENTABLE(page),
398 GTK_ORIENTATION_VERTICAL);
399 gtk_container_set_border_width(GTK_CONTAINER(page), 8);
400 pdialog->tabs[loc].page = page;
401
402 label = gtk_label_new_with_mnemonic(title);
403 gtk_notebook_append_page(GTK_NOTEBOOK(pdialog->notebook), page, label);
404
405 hbox = gtk_grid_new();
406 gtk_container_add(GTK_CONTAINER(page), hbox);
407
408 store = usdlg_tab_store_new();
409 pdialog->tabs[loc].store = store;
410
411 view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
412 gtk_widget_set_hexpand(view, TRUE);
413 gtk_widget_set_vexpand(view, TRUE);
414 pdialog->tabs[loc].view = view;
415 g_object_unref(store);
416
417 g_signal_connect(view, "row-activated", G_CALLBACK(usdlg_cmd_row_activated),
418 GINT_TO_POINTER(loc));
419 g_signal_connect(view, "cursor-changed",
420 G_CALLBACK(usdlg_cmd_cursor_changed), GINT_TO_POINTER(loc));
421
422 /* Translate titles. */
423 intl_slist(ARRAY_SIZE(usdlg_col_titles), usdlg_col_titles, &titles_done);
424
425 for (i = 0; i < USDLG_COLUMNS_SHOW; i++) {
426 GtkTreeViewColumn *column = NULL;
427 GtkCellRenderer *renderer = NULL;
428
429 switch (usdlg_col_types[i]) {
430 case COL_PIXBUF:
431 renderer = gtk_cell_renderer_pixbuf_new();
432 column = gtk_tree_view_column_new_with_attributes(
433 usdlg_col_titles[i], renderer, "pixbuf", i, NULL);
434 gtk_tree_view_column_set_expand(column, FALSE);
435 break;
436 case COL_TEXT:
437 renderer = gtk_cell_renderer_text_new();
438 column = gtk_tree_view_column_new_with_attributes(
439 usdlg_col_titles[i], renderer, "text", i,
440 "style", USDLG_COL_STYLE, "weight", USDLG_COL_WEIGHT, NULL);
441 gtk_tree_view_column_set_expand(column, TRUE);
442 break;
443 case COL_INT:
444 renderer = gtk_cell_renderer_text_new();
445 column = gtk_tree_view_column_new_with_attributes(
446 usdlg_col_titles[i], renderer, "text", i,
447 "style", USDLG_COL_STYLE, "weight", USDLG_COL_WEIGHT, NULL);
448 g_object_set(renderer, "xalign", 1.0, NULL);
449 gtk_tree_view_column_set_alignment(column, 1.0);
450 gtk_tree_view_column_set_expand(column, FALSE);
451 break;
452 }
453
454 fc_assert_ret(column != NULL);
455 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
456 }
457
458 sw = gtk_scrolled_window_new(NULL, NULL);
459 gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(sw), 300);
460 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw),
461 GTK_SHADOW_ETCHED_IN);
462 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw),
463 GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
464 gtk_container_add(GTK_CONTAINER(sw), view);
465 gtk_container_add(GTK_CONTAINER(hbox), sw);
466
467 vbox = gtk_grid_new();
468 gtk_orientable_set_orientation(GTK_ORIENTABLE(vbox),
469 GTK_ORIENTATION_VERTICAL);
470 gtk_container_add(GTK_CONTAINER(hbox), vbox);
471
472 /* button box 1: ready, sentry */
473
474 pdialog->tabs[loc].cmd[USDLG_CMD_READY]
475 = gtk_button_new_with_mnemonic(_("Ready"));
476 gtk_container_add(GTK_CONTAINER(vbox),
477 pdialog->tabs[loc].cmd[USDLG_CMD_READY]);
478 g_signal_connect(pdialog->tabs[loc].cmd[USDLG_CMD_READY], "clicked",
479 G_CALLBACK(usdlg_cmd_ready), GINT_TO_POINTER(loc));
480 gtk_widget_set_sensitive(
481 GTK_WIDGET(pdialog->tabs[loc].cmd[USDLG_CMD_READY]), FALSE);
482
483 pdialog->tabs[loc].cmd[USDLG_CMD_SENTRY]
484 = gtk_button_new_with_mnemonic(_("Sentry"));
485 gtk_widget_set_margin_bottom(
486 GTK_WIDGET(pdialog->tabs[loc].cmd[USDLG_CMD_SENTRY]), 10);
487 gtk_container_add(GTK_CONTAINER(vbox),
488 pdialog->tabs[loc].cmd[USDLG_CMD_SENTRY]);
489 g_signal_connect(pdialog->tabs[loc].cmd[USDLG_CMD_SENTRY], "clicked",
490 G_CALLBACK(usdlg_cmd_sentry), GINT_TO_POINTER(loc));
491 gtk_widget_set_sensitive(
492 GTK_WIDGET(pdialog->tabs[loc].cmd[USDLG_CMD_SENTRY]), FALSE);
493
494 /* button box 2: select, deselect */
495
496 pdialog->tabs[loc].cmd[USDLG_CMD_SELECT]
497 = gtk_button_new_with_mnemonic(_("_Select"));
498 gtk_container_add(GTK_CONTAINER(vbox),
499 pdialog->tabs[loc].cmd[USDLG_CMD_SELECT]);
500 g_signal_connect(pdialog->tabs[loc].cmd[USDLG_CMD_SELECT], "clicked",
501 G_CALLBACK(usdlg_cmd_select), GINT_TO_POINTER(loc));
502 gtk_widget_set_sensitive(
503 GTK_WIDGET(pdialog->tabs[loc].cmd[USDLG_CMD_SELECT]), FALSE);
504
505 pdialog->tabs[loc].cmd[USDLG_CMD_DESELECT]
506 = gtk_button_new_with_mnemonic(_("_Deselect"));
507 gtk_widget_set_margin_bottom(
508 GTK_WIDGET(pdialog->tabs[loc].cmd[USDLG_CMD_DESELECT]), 10);
509 gtk_container_add(GTK_CONTAINER(vbox),
510 pdialog->tabs[loc].cmd[USDLG_CMD_DESELECT]);
511 g_signal_connect(pdialog->tabs[loc].cmd[USDLG_CMD_DESELECT], "clicked",
512 G_CALLBACK(usdlg_cmd_deselect), GINT_TO_POINTER(loc));
513 gtk_widget_set_sensitive(
514 GTK_WIDGET(pdialog->tabs[loc].cmd[USDLG_CMD_DESELECT]), FALSE);
515
516 /* button box 3: center, focus */
517
518 pdialog->tabs[loc].cmd[USDLG_CMD_CENTER]
519 = gtk_button_new_with_mnemonic(_("C_enter"));
520 gtk_container_add(GTK_CONTAINER(vbox),
521 pdialog->tabs[loc].cmd[USDLG_CMD_CENTER]);
522 g_signal_connect(pdialog->tabs[loc].cmd[USDLG_CMD_CENTER], "clicked",
523 G_CALLBACK(usdlg_cmd_center), GINT_TO_POINTER(loc));
524 gtk_widget_set_sensitive(
525 GTK_WIDGET(pdialog->tabs[loc].cmd[USDLG_CMD_CENTER]), FALSE);
526
527 pdialog->tabs[loc].cmd[USDLG_CMD_FOCUS]
528 = gtk_button_new_with_mnemonic(_("_Focus"));
529 gtk_container_add(GTK_CONTAINER(vbox),
530 pdialog->tabs[loc].cmd[USDLG_CMD_FOCUS]);
531 g_signal_connect(pdialog->tabs[loc].cmd[USDLG_CMD_FOCUS], "clicked",
532 G_CALLBACK(usdlg_cmd_focus), GINT_TO_POINTER(loc));
533 gtk_widget_set_sensitive(
534 GTK_WIDGET(pdialog->tabs[loc].cmd[USDLG_CMD_FOCUS]), FALSE);
535}
536
537/*************************************************************************/
540 static GtkTreeStore *usdlg_tab_store_new(void)
541{
542 GtkTreeStore *store;
543 GType model_types[USDLG_COLUMNS_ALL];
544 int i;
545
546 for (i = 0; i < USDLG_COLUMNS_ALL; i++) {
547 switch (usdlg_col_types[i]) {
548 case COL_PIXBUF:
549 model_types[i] = GDK_TYPE_PIXBUF;
550 break;
551 case COL_TEXT:
552 model_types[i] = G_TYPE_STRING;
553 break;
554 case COL_INT:
555 model_types[i] = G_TYPE_INT;
556 break;
557 }
558 }
559
560 store = gtk_tree_store_newv(i, model_types);
561
562 return store;
563}
564
565/*************************************************************************/
568 static bool usdlg_tab_update(struct unit_select_dialog *pdialog,
569 struct usdata_hash *ushash,
570 enum unit_select_location_mode loc)
571{
572 bool show = FALSE;
573 GtkTreeStore *store;
574
575 fc_assert_ret_val(ushash, FALSE);
576 fc_assert_ret_val(pdialog != NULL, FALSE);
577
578 store = pdialog->tabs[loc].store;
579
580 /* clear current store. */
581 gtk_tree_store_clear(GTK_TREE_STORE(store));
582
583 /* Iterate over all unit types. */
584 if (loc == SELLOC_UNITS) {
585 /* Special case - show all units on this tile in their transports. */
586 unit_type_iterate(utype) {
587 struct usdata *data;
588
589 usdata_hash_lookup(ushash, utype_index(utype), &data);
590
591 if (!data) {
592 continue;
593 }
594
595 activity_type_iterate(act) {
596 if (unit_list_size(data->units[loc][act]) == 0) {
597 continue;
598 }
599
600 unit_list_iterate(data->units[loc][act], punit) {
601 GtkTreeIter it_unit;
602
603 usdlg_tab_append_units(pdialog, loc, act, punit, FALSE,
604 &it_unit, NULL);
605 } unit_list_iterate_end;
606
607 /* Show this tab. */
608 show = TRUE;
609 } activity_type_iterate_end;
610 } unit_type_iterate_end;
611 } else {
612 unit_type_iterate(utype) {
613 struct usdata *data;
614 bool first = TRUE;
615 GtkTreeIter it_utype;
616 GtkTreePath *path;
617 int count = 0;
618
619 usdata_hash_lookup(ushash, utype_index(utype), &data);
620
621 if (!data) {
622 continue;
623 }
624
625 activity_type_iterate(act) {
626 GtkTreeIter it_act;
627
628 if (unit_list_size(data->units[loc][act]) == 0) {
629 continue;
630 }
631
632 /* Level 1: Display unit type. */
633 if (first) {
634 usdlg_tab_append_utype(GTK_TREE_STORE(store), loc, data->utype,
635 &it_utype);
636 first = FALSE;
637 }
638
639 /* Level 2: Display unit activities. */
640 usdlg_tab_append_activity(GTK_TREE_STORE(store), loc, data->utype,
641 act, unit_list_size(data->units[loc][act]),
642 &it_act, &it_utype);
643
644 /* Level 3: Display all units with this activitiy
645 * (and transported units in further level(s)). */
646 unit_list_iterate(data->units[loc][act], punit) {
647 GtkTreeIter it_unit;
648
649 usdlg_tab_append_units(pdialog, loc, act, punit, FALSE,
650 &it_unit, &it_act);
651 } unit_list_iterate_end;
652
653 count += unit_list_size(data->units[loc][act]);
654
655 /* Update sum of units with this type. */
656 gtk_tree_store_set(GTK_TREE_STORE(store), &it_utype, 2, count, -1);
657
658 /* Expand to the activities. */
659 path
660 = gtk_tree_model_get_path(GTK_TREE_MODEL(pdialog->tabs[loc].store),
661 &it_utype);
662 gtk_tree_view_expand_row(GTK_TREE_VIEW(pdialog->tabs[loc].view), path,
663 FALSE);
664 gtk_tree_path_free(path);
665
666 /* Show this tab. */
667 show = TRUE;
668 } activity_type_iterate_end;
669 } unit_type_iterate_end;
670 }
671
672 return show;
673}
674
675/*************************************************************************/
678 static void usdlg_tab_append_utype(GtkTreeStore *store,
679 enum unit_select_location_mode loc,
680 const struct unit_type *putype,
681 GtkTreeIter *it)
682{
683 GdkPixbuf *pix;
684 char buf[128];
685
686 fc_assert_ret(store != NULL);
687 fc_assert_ret(putype != NULL);
688
689 /* Add this item. */
690 gtk_tree_store_append(GTK_TREE_STORE(store), it, NULL);
691
692 /* Create a icon */
693 {
694 struct canvas canvas_store = FC_STATIC_CANVAS_INIT;
695
696 canvas_store.surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32,
697 tileset_full_tile_width(tileset), tileset_full_tile_height(tileset));
698
699 put_unittype(putype, &canvas_store, 1.0, 0, 0);
700 pix = surface_get_pixbuf(canvas_store.surface, tileset_full_tile_width(tileset),
701 tileset_full_tile_height(tileset));
702 cairo_surface_destroy(canvas_store.surface);
703 }
704
705 /* The name of the unit. */
706 fc_snprintf(buf, sizeof(buf), "%s", utype_name_translation(putype));
707
708 /* Add it to the tree. */
709 gtk_tree_store_set(GTK_TREE_STORE(store), it,
710 0, pix, /* Unit pixmap */
711 1, buf, /* Text */
712 2, -1, /* will be set later */ /* Number of units */
713 3, utype_index(putype), /* Unit type ID */
714 /* 4: not set */ /* Unit ID */
715 5, loc, /* Unit location */
716 /* 6: not set */ /* Unit activity */
717 7, ROW_UNITTYPE, /* Row type */
718 8, PANGO_STYLE_NORMAL, /* Style */
719 9, PANGO_WEIGHT_BOLD, /* Weight */
720 -1);
721 g_object_unref(pix);
722}
723
724/*************************************************************************/
727 static void usdlg_tab_append_activity(GtkTreeStore *store,
728 enum unit_select_location_mode loc,
729 const struct unit_type *putype,
730 enum unit_activity act,
731 int count, GtkTreeIter *it,
732 GtkTreeIter *parent)
733{
734 char buf[128] = "";
735
736 fc_assert_ret(store != NULL);
737 fc_assert_ret(putype != NULL);
738
739 /* Add this item. */
740 gtk_tree_store_append(GTK_TREE_STORE(store), it, parent);
741
742 /* The activity. */
743 fc_snprintf(buf, sizeof(buf), "%s", get_activity_text(act));
744
745 /* Add it to the tree. */
746 gtk_tree_store_set(GTK_TREE_STORE(store), it,
747 /* 0: not set */ /* Unit pixmap */
748 1, buf, /* Text */
749 2, count, /* Number of units */
750 3, utype_index(putype), /* Unit type ID */
751 /* 4: not set */ /* Unit ID */
752 5, loc, /* Unit location */
753 6, act, /* Unit activity */
754 7, ROW_ACTIVITY, /* Row type */
755 8, PANGO_STYLE_NORMAL, /* Style */
756 9, PANGO_WEIGHT_NORMAL, /* Weight */
757 -1);
758}
759
760/*************************************************************************/
765 GdkPixbuf *usdlg_get_unit_image(const struct unit *punit)
766{
767 GdkPixbuf *out;
768 struct canvas canvas_store = FC_STATIC_CANVAS_INIT;
769
770 canvas_store.surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32,
771 tileset_full_tile_width(tileset), tileset_full_tile_height(tileset));
772
773 put_unit(punit, &canvas_store, 1.0, 0, 0);
774 out = surface_get_pixbuf(canvas_store.surface,
775 tileset_full_tile_width(tileset),
776 tileset_full_tile_height(tileset));
777 cairo_surface_destroy(canvas_store.surface);
778
779 return out;
780}
781
782/*************************************************************************/
786 const char *usdlg_get_unit_descr(const struct unit *punit)
787{
788 static char buf[248] = "";
789 char buf2[248] = "";
790 struct city *phome;
791
792 phome = game_city_by_number(punit->homecity);
793 if (phome) {
794 fc_snprintf(buf2, sizeof(buf2), "%s", city_name_get(phome));
795 } else if (unit_owner(punit) == client_player()
796 || client_is_global_observer()) {
797 /* TRANS: used in place of unit home city name */
798 sz_strlcpy(buf2, _("no home city"));
799 } else {
800 /* TRANS: used in place of unit home city name */
801 sz_strlcpy(buf2, _("unknown"));
802 }
803#ifdef FREECIV_DEBUG
804 /* Strings only used in debug builds, don't bother with i18n */
805 fc_snprintf(buf, sizeof(buf), "%s [Unit ID %d]\n(%s)\nCoordinates: (%d,%d)",
806 unit_name_translation(punit), punit->id, buf2,
807 TILE_XY(unit_tile(punit)));
808 {
809 struct unit *ptrans = unit_transport_get(punit);
810
811 if (ptrans) {
812 cat_snprintf(buf, sizeof(buf), "\nTransported by unit ID %d",
813 ptrans->id);
814 }
815 }
816#else /* FREECIV_DEBUG */
817 /* TRANS: unit type and home city, e.g. "Transport\n(New Orleans)" */
818 fc_snprintf(buf, sizeof(buf), _("%s\n(%s)"), unit_name_translation(punit),
819 buf2);
820#endif /* FREECIV_DEBUG */
821
822 return buf;
823}
824
825/*************************************************************************/
828 static void usdlg_tab_append_units(struct unit_select_dialog *pdialog,
829 enum unit_select_location_mode loc,
830 enum unit_activity act,
831 const struct unit *punit,
832 bool transported, GtkTreeIter *it,
833 GtkTreeIter *parent)
834{
835 const char *text;
836 GdkPixbuf *pix;
837 enum usdlg_row_types row = ROW_UNIT;
838 int style = PANGO_STYLE_NORMAL;
839 int weight = PANGO_WEIGHT_NORMAL;
840 GtkTreeStore *store;
841
842 fc_assert_ret(pdialog != NULL);
843 fc_assert_ret(punit != NULL);
844
845 store = pdialog->tabs[loc].store;
846
847
848 /* Add this item. */
849 gtk_tree_store_append(GTK_TREE_STORE(store), it, parent);
850
851 /* Unit gfx */
852 pix = usdlg_get_unit_image(punit);
853
854 text = usdlg_get_unit_descr(punit);
855
856 if (transported) {
857 weight = PANGO_WEIGHT_NORMAL;
858 style = PANGO_STYLE_ITALIC;
859 row = ROW_UNIT_TRANSPORTED;
860 }
861
862 /* Add it to the tree. */
863 gtk_tree_store_set(GTK_TREE_STORE(store), it,
864 0, pix, /* Unit pixmap */
865 1, text, /* Text */
866 2, 1, /* Number of units */
867 3, utype_index(unit_type_get(punit)), /* Unit type ID */
868 4, punit->id, /* Unit ID */
869 5, loc, /* Unit location */
870 6, act, /* Unit activity */
871 7, row, /* Row type */
872 8, style, /* Style */
873 9, weight, /* Weight */
874 -1);
875 g_object_unref(pix);
876
877 if (get_transporter_occupancy(punit) > 0) {
878 unit_list_iterate(unit_transport_cargo(punit), pcargo) {
879 GtkTreeIter it_cargo;
880
881 usdlg_tab_append_units(pdialog, loc, act, pcargo, TRUE, &it_cargo, it);
882 } unit_list_iterate_end;
883 }
884
885 if (!transported && unit_is_in_focus(punit)
886 && get_num_units_in_focus() == 1) {
887 /* Put the keyboard focus on the selected unit. It isn't transported.
888 * Selection maps to keyboard focus since it alone is selected. */
889 fc_assert_action(pdialog->tabs[loc].path == NULL,
890 /* Don't leak memory. */
891 gtk_tree_path_free(pdialog->tabs[loc].path));
892
893 pdialog->tabs[loc].path
894 = gtk_tree_model_get_path(GTK_TREE_MODEL(store), it);
895 }
896}
897
898/*************************************************************************/
901 static void usdlg_cmd_ready(GObject *object, gpointer data)
902{
903 usdlg_cmd_exec(object, data, USDLG_CMD_READY);
904}
905
906/*************************************************************************/
909 static void usdlg_cmd_sentry(GObject *object, gpointer data)
910{
911 usdlg_cmd_exec(object, data, USDLG_CMD_SENTRY);
912}
913
914/*************************************************************************/
917 static void usdlg_cmd_select(GObject *object, gpointer data)
918{
919 usdlg_cmd_exec(object, data, USDLG_CMD_SELECT);
920}
921
922/*************************************************************************/
925 static void usdlg_cmd_deselect(GObject *object, gpointer data)
926{
927 usdlg_cmd_exec(object, data, USDLG_CMD_DESELECT);
928}
929
930/*************************************************************************/
933 static void usdlg_cmd_exec(GObject *object, gpointer mode_data,
934 enum usdlg_cmd cmd)
935{
936 enum unit_select_location_mode loc_mode
937 = (enum unit_select_location_mode) GPOINTER_TO_INT(mode_data);
938 GtkTreeView *view;
939 GtkTreeSelection *selection;
940 GtkTreeModel *model;
941 GtkTreeIter it;
942 gint row;
943 struct unit_select_dialog *pdialog = usdlg_get(FALSE);
944
945 fc_assert_ret(pdialog != NULL);
946 fc_assert_ret(unit_select_location_mode_is_valid(loc_mode));
947
948 if (!can_client_change_view() || !can_client_control()) {
949 return;
950 }
951
952 view = GTK_TREE_VIEW(pdialog->tabs[loc_mode].view);
953 selection = gtk_tree_view_get_selection(view);
954
955 if (!gtk_tree_selection_get_selected(selection, &model, &it)) {
956 log_debug("No selection");
957 return;
958 }
959 gtk_tree_model_get(model, &it, USDLG_COL_ROW_TYPE, &row, -1);
960
961 switch (row) {
962 case ROW_UNITTYPE:
963 {
964 gint loc, utid;
965 struct usdata_hash *ushash;
966 struct usdata *data;
967
968 gtk_tree_model_get(model, &it, USDLG_COL_LOCATION, &loc,
969 USDLG_COL_UTID, &utid, -1);
970
971 /* We can't be sure that all units still exists - recalc the data. */
972 ushash = usdlg_data_new(pdialog->ptile);
973
974 usdata_hash_lookup(ushash, utid, &data);
975 if (data != NULL) {
976 activity_type_iterate(act) {
977 if (unit_list_size(data->units[loc][act]) == 0) {
978 continue;
979 }
980
981 unit_list_iterate(data->units[loc][act], punit) {
982 usdlg_cmd_exec_unit(punit, cmd);
983 } unit_list_iterate_end;
984 } activity_type_iterate_end;
985 }
986
987 /* Destroy the hash. */
988 usdlg_data_destroy(ushash);
989 }
990 break;
991 case ROW_ACTIVITY:
992 {
993 gint loc, act, utid;
994 struct usdata_hash *ushash;
995 struct usdata *data;
996
997 gtk_tree_model_get(model, &it, USDLG_COL_ACTIVITY, &act,
998 USDLG_COL_LOCATION, &loc, USDLG_COL_UTID, &utid, -1);
999
1000 /* We can't be sure that all units still exists - recalc the data. */
1001 ushash = usdlg_data_new(pdialog->ptile);
1002
1003 usdata_hash_lookup(ushash, utid, &data);
1004 if (data != NULL
1005 && unit_list_size(data->units[loc][act]) != 0) {
1006 unit_list_iterate(data->units[loc][act], punit) {
1007 usdlg_cmd_exec_unit(punit, cmd);
1008 } unit_list_iterate_end;
1009 }
1010
1011 /* Destroy the hash. */
1012 usdlg_data_destroy(ushash);
1013 }
1014 break;
1015 case ROW_UNIT:
1016 case ROW_UNIT_TRANSPORTED:
1017 {
1018 gint uid;
1019 struct unit *punit;
1020
1021 gtk_tree_model_get(model, &it, USDLG_COL_UID, &uid, -1);
1022
1023 punit = game_unit_by_number(uid);
1024
1025 if (!punit) {
1026 log_debug("Unit vanished (Unit ID %d)!", uid);
1027 return;
1028 }
1029
1030 usdlg_cmd_exec_unit(punit, cmd);
1031 }
1032 break;
1033 }
1034
1035 /* Update focus. */
1036 unit_focus_update();
1037 /* Refresh dialog. */
1038 usdlg_refresh(pdialog);
1039}
1040
1041/*************************************************************************/
1044 static void usdlg_cmd_exec_unit(struct unit *punit, enum usdlg_cmd cmd)
1045{
1046 fc_assert_ret(punit);
1047
1048 switch (cmd) {
1049 case USDLG_CMD_SELECT:
1050 if (!unit_is_in_focus(punit)) {
1051 unit_focus_add(punit);
1052 }
1053 break;
1054 case USDLG_CMD_DESELECT:
1055 if (unit_is_in_focus(punit)) {
1056 unit_focus_remove(punit);
1057 }
1058 break;
1059 case USDLG_CMD_READY:
1060 if (punit->activity != ACTIVITY_IDLE) {
1061 request_new_unit_activity(punit, ACTIVITY_IDLE);
1062 }
1063 break;
1064 case USDLG_CMD_SENTRY:
1065 if (punit->activity != ACTIVITY_SENTRY) {
1066 request_new_unit_activity(punit, ACTIVITY_SENTRY);
1067 }
1068 break;
1069 case USDLG_CMD_CENTER:
1070 case USDLG_CMD_FOCUS:
1071 /* Nothing here. It is done in its own functions. */
1072 break;
1073 case USDLG_CMD_LAST:
1074 /* Should never happen. */
1075 fc_assert_ret(cmd != USDLG_CMD_LAST);
1076 break;
1077 }
1078}
1079
1080/*************************************************************************/
1083 static void usdlg_cmd_center(GObject *object, gpointer data)
1084{
1085 enum unit_select_location_mode loc
1086 = (enum unit_select_location_mode) GPOINTER_TO_INT(data);
1087 GtkTreeView *view;
1088 GtkTreeSelection *selection;
1089 GtkTreeModel *model;
1090 GtkTreeIter it;
1091 gint row;
1092 struct unit_select_dialog *pdialog = usdlg_get(FALSE);
1093
1094 fc_assert_ret(pdialog != NULL);
1095 fc_assert_ret(unit_select_location_mode_is_valid(loc));
1096
1097 view = GTK_TREE_VIEW(pdialog->tabs[loc].view);
1098 selection = gtk_tree_view_get_selection(view);
1099
1100 if (!gtk_tree_selection_get_selected(selection, &model, &it)) {
1101 log_debug("No selection");
1102 return;
1103 }
1104 gtk_tree_model_get(model, &it, USDLG_COL_ROW_TYPE, &row, -1);
1105
1106 if (row == ROW_UNIT || row == ROW_UNIT_TRANSPORTED) {
1107 gint uid;
1108 struct unit *punit;
1109
1110 gtk_tree_model_get(model, &it, USDLG_COL_UID, &uid, -1);
1111
1112 punit = player_unit_by_number(client_player(), uid);
1113 if (punit) {
1114 center_tile_mapcanvas(unit_tile(punit));
1115 }
1116 }
1117}
1118
1119/*************************************************************************/
1122 static void usdlg_cmd_focus(GObject *object, gpointer data)
1123{
1124 enum unit_select_location_mode loc
1125 = (enum unit_select_location_mode) GPOINTER_TO_INT(data);
1126 struct unit_select_dialog *pdialog = usdlg_get(FALSE);
1127
1128 fc_assert_ret(pdialog != NULL);
1129 fc_assert_ret(unit_select_location_mode_is_valid(loc));
1130
1131 usdlg_cmd_focus_real(GTK_TREE_VIEW(pdialog->tabs[loc].view));
1132}
1133
1134/*************************************************************************/
1137 static void usdlg_cmd_row_activated(GtkTreeView *view, GtkTreePath *path,
1138 GtkTreeViewColumn *col, gpointer data)
1139{
1140 usdlg_cmd_focus_real(view);
1141}
1142
1143/*************************************************************************/
1146 static void usdlg_cmd_focus_real(GtkTreeView *view)
1147{
1148 GtkTreeSelection *selection = gtk_tree_view_get_selection(view);
1149 GtkTreeModel *model;
1150 GtkTreeIter it;
1151 gint row;
1152
1153 if (!can_client_change_view() || !can_client_control()) {
1154 return;
1155 }
1156
1157 if (!gtk_tree_selection_get_selected(selection, &model, &it)) {
1158 log_debug("No selection");
1159 return;
1160 }
1161 gtk_tree_model_get(model, &it, USDLG_COL_ROW_TYPE, &row, -1);
1162
1163 if (row == ROW_UNIT || row == ROW_UNIT_TRANSPORTED) {
1164 gint uid;
1165 struct unit *punit;
1166
1167 gtk_tree_model_get(model, &it, USDLG_COL_UID, &uid, -1);
1168
1169 punit = player_unit_by_number(client_player(), uid);
1170 if (punit && unit_owner(punit) == client_player()) {
1171 unit_focus_set(punit);
1172 usdlg_destroy();
1173 }
1174 }
1175}
1176
1177/*************************************************************************/
1180 static void usdlg_cmd_cursor_changed(GtkTreeView *view, gpointer data)
1181{
1182 enum unit_select_location_mode loc
1183 = (enum unit_select_location_mode) GPOINTER_TO_INT(data);
1184 GtkTreeSelection *selection;
1185 GtkTreeModel *model;
1186 GtkTreeIter it;
1187 gint row, uid;
1188 struct unit_select_dialog *pdialog = usdlg_get(FALSE);
1189 struct unit *punit;
1190 bool cmd_status[USDLG_CMD_LAST];
1191 int cmd_id;
1192
1193 fc_assert_ret(unit_select_location_mode_is_valid(loc));
1194
1195 if (pdialog == NULL) {
1196 /* Dialog closed, nothing we can do */
1197 return;
1198 }
1199
1200 selection = gtk_tree_view_get_selection(view);
1201 if (!gtk_tree_selection_get_selected(selection, &model, &it)) {
1202 log_debug("No selection");
1203 return;
1204 }
1205 gtk_tree_model_get(model, &it, USDLG_COL_ROW_TYPE, &row, USDLG_COL_UID,
1206 &uid, -1);
1207
1208 switch (row) {
1209 case ROW_UNITTYPE:
1210 case ROW_ACTIVITY:
1211 /* Button status for rows unittype and activity:
1212 * player observer
1213 * ready TRUE FALSE
1214 * sentry TRUE FALSE
1215 * select TRUE FALSE
1216 * deselect TRUE FALSE
1217 * center FALSE FALSE
1218 * focus FALSE FALSE */
1219 if (can_client_change_view() && can_client_control()) {
1220 cmd_status[USDLG_CMD_READY] = TRUE;
1221 cmd_status[USDLG_CMD_SENTRY] = TRUE;
1222 cmd_status[USDLG_CMD_SELECT] = TRUE;
1223 cmd_status[USDLG_CMD_DESELECT] = TRUE;
1224 } else {
1225 cmd_status[USDLG_CMD_READY] = FALSE;
1226 cmd_status[USDLG_CMD_SENTRY] = FALSE;
1227 cmd_status[USDLG_CMD_SELECT] = FALSE;
1228 cmd_status[USDLG_CMD_DESELECT] = FALSE;
1229 }
1230
1231 cmd_status[USDLG_CMD_CENTER] = FALSE;
1232 cmd_status[USDLG_CMD_FOCUS] = FALSE;
1233 break;
1234 case ROW_UNIT:
1235 case ROW_UNIT_TRANSPORTED:
1236 /* Button status for rows unit and unit (transported):
1237 * player observer
1238 * ready !IDLE FALSE
1239 * sentry !SENTRY FALSE
1240 * select !FOCUS FALSE
1241 * deselect FOCUS FALSE
1242 * center TRUE TRUE
1243 * focus !FOCUS FALSE */
1244 punit = player_unit_by_number(client_player(), uid);
1245
1246 if (punit && can_client_change_view() && can_client_control()) {
1247 if (punit->activity == ACTIVITY_IDLE) {
1248 cmd_status[USDLG_CMD_READY] = FALSE;
1249 } else {
1250 cmd_status[USDLG_CMD_READY] = TRUE;
1251 }
1252
1253 if (punit->activity == ACTIVITY_SENTRY) {
1254 cmd_status[USDLG_CMD_SENTRY] = FALSE;
1255 } else {
1256 cmd_status[USDLG_CMD_SENTRY] = TRUE;
1257 }
1258
1259 if (!unit_is_in_focus(punit)) {
1260 cmd_status[USDLG_CMD_SELECT] = TRUE;
1261 cmd_status[USDLG_CMD_DESELECT] = FALSE;
1262 cmd_status[USDLG_CMD_FOCUS] = TRUE;
1263 } else {
1264 cmd_status[USDLG_CMD_SELECT] = FALSE;
1265 cmd_status[USDLG_CMD_DESELECT] = TRUE;
1266 cmd_status[USDLG_CMD_FOCUS] = FALSE;
1267 }
1268 } else {
1269 cmd_status[USDLG_CMD_READY] = FALSE;
1270 cmd_status[USDLG_CMD_SENTRY] = FALSE;
1271
1272 cmd_status[USDLG_CMD_SELECT] = FALSE;
1273 cmd_status[USDLG_CMD_DESELECT] = FALSE;
1274
1275 cmd_status[USDLG_CMD_FOCUS] = FALSE;
1276 }
1277
1278 cmd_status[USDLG_CMD_CENTER] = TRUE;
1279 break;
1280
1281 default:
1282 fc_assert(FALSE);
1283 for (cmd_id = 0; cmd_id < USDLG_CMD_LAST; cmd_id++) {
1284 cmd_status[cmd_id] = FALSE;
1285 }
1286 break;
1287 }
1288
1289 /* Set widget status. */
1290 for (cmd_id = 0; cmd_id < USDLG_CMD_LAST; cmd_id++) {
1291 gtk_widget_set_sensitive(GTK_WIDGET(pdialog->tabs[loc].cmd[cmd_id]),
1292 cmd_status[cmd_id]);
1293 }
1294}
city_name_get
const char * city_name_get(const struct city *pcity)
Definition city.c:1128
can_client_control
bool can_client_control(void)
Definition client_main.c:1253
client_is_global_observer
bool client_is_global_observer(void)
Definition client_main.c:1345
can_client_change_view
bool can_client_change_view(void)
Definition client_main.c:1312
client_main.h
client_player
#define client_player()
Definition client_main.h:106
incite_cost
char * incite_cost
Definition comments.c:74
unit_is_in_focus
bool unit_is_in_focus(const struct unit *punit)
Definition control.c:383
unit_focus_add
void unit_focus_add(struct unit *punit)
Definition control.c:556
unit_focus_set
void unit_focus_set(struct unit *punit)
Definition control.c:501
unit_focus_remove
void unit_focus_remove(struct unit *punit)
Definition control.c:586
head_of_units_in_focus
struct unit * head_of_units_in_focus(void)
Definition control.c:405
get_num_units_in_focus
int get_num_units_in_focus(void)
Definition control.c:185
unit_focus_update
void unit_focus_update(void)
Definition control.c:771
request_new_unit_activity
void request_new_unit_activity(struct unit *punit, enum unit_activity act)
Definition control.c:1903
control.h
punit
struct unit struct city struct unit struct tile struct extra_type const struct act_prob *act_probs int actor_unit_id struct unit struct unit * punit
Definition dialogs_g.h:74
fc_types.h
fcintl.h
_
#define _(String)
Definition fcintl.h:67
N_
#define N_(String)
Definition fcintl.h:69
game_unit_by_number
struct unit * game_unit_by_number(int id)
Definition game.c:116
game_city_by_number
struct city * game_city_by_number(int id)
Definition game.c:107
game.h
goto.h
FC_STATIC_CANVAS_INIT
#define FC_STATIC_CANVAS_INIT
Definition canvas.h:28
loc
struct tile * loc
Definition citydlg.c:221
toplevel
GtkWidget * toplevel
Definition gui_main.c:125
setup_dialog
void setup_dialog(GtkWidget *shell, GtkWidget *parent)
Definition gui_stuff.c:287
intl_slist
void intl_slist(int n, const char **s, bool *done)
Definition gui_stuff.c:111
title
const char * title
Definition repodlgs.c:1314
surface_get_pixbuf
GdkPixbuf * surface_get_pixbuf(cairo_surface_t *surf, int width, int height)
Definition sprite.c:418
USDLG_COL_LOCATION
#define USDLG_COL_LOCATION
Definition unitselect.c:66
usdlg_cmd_ready
static void usdlg_cmd_ready(GObject *object, gpointer data)
Definition unitselect.c:901
usdlg_cmd_deselect
static void usdlg_cmd_deselect(GObject *object, gpointer data)
Definition unitselect.c:925
usdlg_cmd_center
static void usdlg_cmd_center(GObject *object, gpointer data)
Definition unitselect.c:1083
USDLG_COL_ROW_TYPE
#define USDLG_COL_ROW_TYPE
Definition unitselect.c:68
usdlg_cmd_cursor_changed
static void usdlg_cmd_cursor_changed(GtkTreeView *view, gpointer data)
Definition unitselect.c:1180
usdlg_get_unit_image
GdkPixbuf * usdlg_get_unit_image(const struct unit *punit)
Definition unitselect.c:765
usdlg_get_unit_descr
const char * usdlg_get_unit_descr(const struct unit *punit)
Definition unitselect.c:786
usdlg_tab_append_units
static void usdlg_tab_append_units(struct unit_select_dialog *pdialog, enum unit_select_location_mode loc, enum unit_activity act, const struct unit *punit, bool transported, GtkTreeIter *it, GtkTreeIter *parent)
Definition unitselect.c:828
usdlg_tile
static void usdlg_tile(struct unit_select_dialog *pdialog, struct tile *ptile)
Definition unitselect.c:313
USDLG_COL_UTID
#define USDLG_COL_UTID
Definition unitselect.c:64
usdlg_cmd_sentry
static void usdlg_cmd_sentry(GObject *object, gpointer data)
Definition unitselect.c:909
usdlg_get
static struct unit_select_dialog * usdlg_get(bool create)
Definition unitselect.c:223
USDLG_COL_STYLE
#define USDLG_COL_STYLE
Definition unitselect.c:71
USDLG_COL_UID
#define USDLG_COL_UID
Definition unitselect.c:65
usdlg_cmd_exec_unit
static void usdlg_cmd_exec_unit(struct unit *punit, enum usdlg_cmd cmd)
Definition unitselect.c:1044
usdlg_tab_append_activity
static void usdlg_tab_append_activity(GtkTreeStore *store, enum unit_select_location_mode loc, const struct unit_type *putype, enum unit_activity act, int count, GtkTreeIter *it, GtkTreeIter *parent)
Definition unitselect.c:727
usdlg_create
static struct unit_select_dialog * usdlg_create(void)
Definition unitselect.c:241
usdlg_cmd_focus
static void usdlg_cmd_focus(GObject *object, gpointer data)
Definition unitselect.c:1122
USDLG_COL_ACTIVITY
#define USDLG_COL_ACTIVITY
Definition unitselect.c:67
usdlg_cmd_exec
static void usdlg_cmd_exec(GObject *object, gpointer mode_data, enum usdlg_cmd cmd)
Definition unitselect.c:933
USDLG_COLUMNS_ALL
#define USDLG_COLUMNS_ALL
Definition unitselect.c:73
usdlg_destroy_callback
static void usdlg_destroy_callback(GObject *object, gpointer data)
Definition unitselect.c:305
usdlg_row_types
usdlg_row_types
Definition unitselect.c:54
ROW_UNITTYPE
@ ROW_UNITTYPE
Definition unitselect.c:55
ROW_UNIT_TRANSPORTED
@ ROW_UNIT_TRANSPORTED
Definition unitselect.c:58
ROW_UNIT
@ ROW_UNIT
Definition unitselect.c:57
ROW_ACTIVITY
@ ROW_ACTIVITY
Definition unitselect.c:56
usdlg_cmd_select
static void usdlg_cmd_select(GObject *object, gpointer data)
Definition unitselect.c:917
usdlg_col_titles
static const char * usdlg_col_titles[USDLG_COLUMNS_ALL]
Definition unitselect.c:94
usdlg_cmd_focus_real
static void usdlg_cmd_focus_real(GtkTreeView *view)
Definition unitselect.c:1146
USDLG_COLUMNS_SHOW
#define USDLG_COLUMNS_SHOW
Definition unitselect.c:78
unit_select_dlg
static struct unit_select_dialog * unit_select_dlg
Definition unitselect.c:141
usdlg_col_types
enum usdlg_column_types usdlg_col_types[USDLG_COLUMNS_ALL]
Definition unitselect.c:81
unit_select_dialog_popup_main
void unit_select_dialog_popup_main(struct tile *ptile, bool create)
Definition unitselect.c:193
usdlg_cmd_row_activated
static void usdlg_cmd_row_activated(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data)
Definition unitselect.c:1137
unit_select_dialog_popdown
void unit_select_dialog_popdown(void)
Definition unitselect.c:214
usdlg_tab_append_utype
static void usdlg_tab_append_utype(GtkTreeStore *store, enum unit_select_location_mode loc, const struct unit_type *putype, GtkTreeIter *it)
Definition unitselect.c:678
USDLG_COL_WEIGHT
#define USDLG_COL_WEIGHT
Definition unitselect.c:72
usdlg_tab_select
static void usdlg_tab_select(struct unit_select_dialog *pdialog, const char *title, enum unit_select_location_mode loc)
Definition unitselect.c:387
usdlg_tab_update
static bool usdlg_tab_update(struct unit_select_dialog *pdialog, struct usdata_hash *ushash, enum unit_select_location_mode loc)
Definition unitselect.c:568
usdlg_refresh
static void usdlg_refresh(struct unit_select_dialog *pdialog)
Definition unitselect.c:338
usdlg_column_types
usdlg_column_types
Definition unitselect.c:48
COL_INT
@ COL_INT
Definition unitselect.c:51
COL_TEXT
@ COL_TEXT
Definition unitselect.c:50
COL_PIXBUF
@ COL_PIXBUF
Definition unitselect.c:49
usdlg_cmd
usdlg_cmd
Definition unitselect.c:107
USDLG_CMD_FOCUS
@ USDLG_CMD_FOCUS
Definition unitselect.c:113
USDLG_CMD_SENTRY
@ USDLG_CMD_SENTRY
Definition unitselect.c:111
USDLG_CMD_LAST
@ USDLG_CMD_LAST
Definition unitselect.c:114
USDLG_CMD_CENTER
@ USDLG_CMD_CENTER
Definition unitselect.c:112
USDLG_CMD_READY
@ USDLG_CMD_READY
Definition unitselect.c:110
USDLG_CMD_DESELECT
@ USDLG_CMD_DESELECT
Definition unitselect.c:109
USDLG_CMD_SELECT
@ USDLG_CMD_SELECT
Definition unitselect.c:108
usdlg_destroy
static void usdlg_destroy(void)
Definition unitselect.c:293
usdlg_tab_store_new
static GtkTreeStore * usdlg_tab_store_new(void)
Definition unitselect.c:540
gui_stuff.h
USDLG_CMD_LAST
@ USDLG_CMD_LAST
Definition unitselect.c:114
unitselect.h
show
#define show(id)
Definition widget.h:235
graphics.h
gui_main.h
fc_assert_ret
#define fc_assert_ret(condition)
Definition log.h:191
fc_assert
#define fc_assert(condition)
Definition log.h:176
fc_assert_ret_val
#define fc_assert_ret_val(condition, val)
Definition log.h:194
fc_assert_action
#define fc_assert_action(condition, action)
Definition log.h:187
log_debug
#define log_debug(message,...)
Definition log.h:115
get_center_tile_mapcanvas
struct tile * get_center_tile_mapcanvas(void)
Definition mapview_common.c:1227
put_unit
void put_unit(const struct unit *punit, struct canvas *pcanvas, float zoom, int canvas_x, int canvas_y)
Definition mapview_common.c:1389
put_unittype
void put_unittype(const struct unit_type *putype, struct canvas *pcanvas, float zoom, int canvas_x, int canvas_y)
Definition mapview_common.c:1403
center_tile_mapcanvas
void center_tile_mapcanvas(const struct tile *ptile)
Definition mapview_common.c:1237
fc_calloc
#define fc_calloc(n, esz)
Definition mem.h:38
player_unit_by_number
struct unit * player_unit_by_number(const struct player *pplayer, int unit_id)
Definition player.c:1229
player.h
ARRAY_SIZE
#define ARRAY_SIZE(x)
Definition shared.h:85
canvas
Definition canvas.h:22
canvas::surface
cairo_surface_t * surface
Definition canvas.h:23
city
Definition city.h:320
tile
Definition tile.h:50
tileset
Definition tilespec.c:481
unit_select_dialog
Definition unitselect.c:117
unit_select_dialog::ptile
struct tile * ptile
Definition unitselect.c:118
unit_select_dialog::path
GtkTreePath * path
Definition unitselect.c:127
unit_select_dialog::units
struct unit_select_dialog::@158 units
unit_select_dialog::shell
GtkWidget * shell
Definition unitselect.c:121
unit_select_dialog::view
GtkWidget * view
Definition unitselect.c:126
unit_select_dialog::unit_id_focus
int unit_id_focus
Definition unitselect.c:119
unit_select_dialog::cmd
GtkWidget * cmd[USDLG_CMD_LAST]
Definition unitselect.c:136
unit_select_dialog::notebook
GtkWidget * notebook
Definition unitselect.c:122
unit_select_dialog::store
GtkTreeStore * store
Definition unitselect.c:125
unit_select_dialog::tabs
struct unit_select_dialog::@159 tabs[SELLOC_COUNT]
unit_select_dialog::page
GtkWidget * page
Definition unitselect.c:132
unit_type
Definition unittype.h:507
unit
Definition unit.h:140
unit::activity
enum unit_activity activity
Definition unit.h:159
unit::id
int id
Definition unit.h:147
unit::homecity
int homecity
Definition unit.h:148
usdata
Definition unitselect_common.h:24
usdata::units
struct unit_list * units[SELLOC_COUNT][ACTIVITY_LAST]
Definition unitselect_common.h:26
usdata::utype
const struct unit_type * utype
Definition unitselect_common.h:25
view
Definition mapview_common.h:36
fc_snprintf
int fc_snprintf(char *str, size_t n, const char *format,...)
Definition support.c:960
cat_snprintf
int cat_snprintf(char *str, size_t n, const char *format,...)
Definition support.c:986
sz_strlcpy
#define sz_strlcpy(dest, src)
Definition support.h:189
TRUE
#define TRUE
Definition support.h:46
FALSE
#define FALSE
Definition support.h:47
TILE_XY
#define TILE_XY(ptile)
Definition tile.h:43
tileset_full_tile_height
int tileset_full_tile_height(const struct tileset *t)
Definition tilespec.c:789
tileset_full_tile_width
int tileset_full_tile_width(const struct tileset *t)
Definition tilespec.c:776
tilespec.h
get_transporter_occupancy
int get_transporter_occupancy(const struct unit *ptrans)
Definition unit.c:1816
unit_transport_get
struct unit * unit_transport_get(const struct unit *pcargo)
Definition unit.c:2485
get_activity_text
const char * get_activity_text(enum unit_activity activity)
Definition unit.c:634
unit_transport_cargo
struct unit_list * unit_transport_cargo(const struct unit *ptrans)
Definition unit.c:2495
unit.h
unit_tile
#define unit_tile(_pu)
Definition unit.h:397
unit_owner
#define unit_owner(_pu)
Definition unit.h:396
activity_type_iterate
#define activity_type_iterate(_act_)
Definition unit.h:287
activity_type_iterate_end
#define activity_type_iterate_end
Definition unit.h:292
unitlist.h
unit_list_iterate
#define unit_list_iterate(unitlist, punit)
Definition unitlist.h:31
unit_list_iterate_end
#define unit_list_iterate_end
Definition unitlist.h:33
usdlg_data_new
struct usdata_hash * usdlg_data_new(const struct tile *ptile)
Definition unitselect_common.c:94
usdlg_data_destroy
void usdlg_data_destroy(struct usdata_hash *ushash)
Definition unitselect_common.c:138
unitselect_common.h
unit_type_get
const struct unit_type * unit_type_get(const struct unit *punit)
Definition unittype.c:123
unit_name_translation
const char * unit_name_translation(const struct unit *punit)
Definition unittype.c:1569
utype_index
Unit_type_id utype_index(const struct unit_type *punittype)
Definition unittype.c:91
utype_name_translation
const char * utype_name_translation(const struct unit_type *punittype)
Definition unittype.c:1560
unittype.h
unit_type_iterate
#define unit_type_iterate(_p)
Definition unittype.h:859
unit_type_iterate_end
#define unit_type_iterate_end
Definition unittype.h:866