Freeciv-3.4
Loading...
Searching...
No Matches
cityrep.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 <stdio.h>
19#include <stdlib.h>
20#include <string.h>
21
22#include <gtk/gtk.h>
23#include <gdk/gdk.h>
24
25/* utility */
26#include "fcintl.h"
27#include "log.h"
28#include "shared.h"
29#include "support.h"
30
31/* common */
32#include "city.h"
33#include "game.h"
34#include "packets.h"
35#include "unit.h"
36
37/* client/agents */
38#include "cma_fec.h"
39
40/* client */
41#include "citydlg_common.h"
42#include "cityrepdata.h"
43#include "client_main.h"
44#include "climisc.h"
45#include "global_worklist.h"
46#include "mapctrl_common.h" /* is_city_hilited() */
47#include "mapview_common.h"
48#include "options.h"
49
50/* client/gui-gtk-5.0 */
51#include "chatline.h"
52#include "citydlg.h"
53#include "gui_main.h"
54#include "gui_stuff.h"
55#include "mapview.h"
56#include "optiondlg.h"
57#include "repodlgs.h"
58
59#include "cityrep.h"
60
61#define NEG_VAL(x) ((x)<0 ? (x) : (-x))
62
63/* Some versions of gcc have problems with negative values here (PR#39722). */
64#define CMA_NONE (10000)
65#define CMA_CUSTOM (10001)
66
67struct sell_data {
68 int count; /* Number of cities. */
69 int gold; /* Amount of gold. */
70 const struct impr_type *target; /* The target for selling. */
71};
72
76
77/******************************************************************/
79
82
83static void city_command_callback(struct gui_dialog *dlg, int response,
84 gpointer data);
85
88 gpointer data);
89static void update_total_buy_cost(void);
90
93
94static GMenu *create_change_menu(GActionGroup *group, const char *mname,
95 const char *human_mname,
97
99
100enum {
103
110#define CRD_COL_CITY_ID (0 + NUM_CREPORT_COLS)
111
112static void recreate_production_menu(GActionGroup *group);
113static void recreate_select_menu(GActionGroup *group);
114static void recreate_sell_menu(GActionGroup *group);
115
120
129
142
146
147#define FC_TYPE_CITY_ROW (fc_city_row_get_type())
148
150
158
163
165
166/**********************************************************************/
170{
172
173 free(row->columns);
174 row->columns = nullptr;
175
177}
178
179/**********************************************************************/
182static void
189
190/**********************************************************************/
193static void
195{
196 self->columns = fc_malloc(sizeof(char *) * NUM_CREPORT_COLS);
197}
198
199/**********************************************************************/
203{
204 FcCityRow *result;
205
206 result = g_object_new(FC_TYPE_CITY_ROW, nullptr);
207
208 return result;
209}
210
211/************************************************************************/
214static void get_city_table_header(char **text, int n)
215{
216 struct city_report_spec *spec;
217 int i;
218
219 for (i = 0, spec = city_report_specs; i < NUM_CREPORT_COLS; i++, spec++) {
220 fc_snprintf(text[i], n, "%*s\n%*s",
221 NEG_VAL(spec->width), spec->title1 ? spec->title1 : "",
222 NEG_VAL(spec->width), spec->title2 ? spec->title2 : "");
223 }
224}
225
226/****************************************************************************
227 CITY REPORT DIALOG
228****************************************************************************/
229
230/**********************************************************************/
244
245/**********************************************************************/
254
255/************************************************************************/
259{
261 gint i;
262
263 /* City report data. */
264 for (i = 0; i < NUM_CREPORT_COLS; i++) {
266 }
267
268 /* Specific gtk client data. */
269 model_types[i++] = G_TYPE_INT; /* CRD_COL_CITY_ID */
270
272}
273
274/************************************************************************/
278 struct city *pcity)
279{
280 struct city_report_spec *spec;
281 char buf[64];
282 gint i;
283
284 for (i = 0; i < NUM_CREPORT_COLS; i++) {
285 spec = city_report_specs + i;
286 fc_snprintf(buf, sizeof(buf), "%*s", NEG_VAL(spec->width),
287 spec->func(pcity, spec->data));
288 gtk_list_store_set(store, iter, i, buf, -1);
289 }
291}
292
293/************************************************************************/
296static void city_store_set(FcCityRow *row, struct city *pcity)
297{
298 struct city_report_spec *spec;
299 char buf[64];
300 gint i;
301
302 row->city_id = pcity->id;
303
304 for (i = 0; i < NUM_CREPORT_COLS; i++) {
305 spec = city_report_specs + i;
306 fc_snprintf(buf, sizeof(buf), "%*s", NEG_VAL(spec->width),
307 spec->func(pcity, spec->data));
308 row->columns[i] = fc_strdup(buf);
309 }
310}
311
312/************************************************************************/
316{
317 struct city *pcity;
318 int id;
319
320 gtk_tree_model_get(model, iter, CRD_COL_CITY_ID, &id, -1);
322 return ((NULL != pcity
325 ? NULL : pcity);
326}
327
328/************************************************************************/
332 const struct city *pcity)
333{
334 const int searched = pcity->id;
335 int id;
336
338 do {
339 gtk_tree_model_get(model, iter, CRD_COL_CITY_ID, &id, -1);
340 if (searched == id) {
341 return TRUE;
342 }
343 } while (gtk_tree_model_iter_next(model, iter));
344 }
345 return FALSE;
346}
347
348/************************************************************************/
352 GtkTreeSelection *selection, GHashTable *select)
353{
355
356 if (client_has_player()) {
360 if (NULL != select
363 }
365 } else {
366 /* Global observer case. */
370 if (NULL != select
373 }
375 }
376}
377
378/************************************************************************/
381static void city_store_fill(GListStore *store,
382 GtkMultiSelection *selection, GHashTable *select)
383{
384 if (client_has_player()) {
387
391 if (NULL != select
395 FALSE);
396 }
398 } else {
399 /* Global observer case. */
402
406 if (NULL != select
410 FALSE);
411 }
413 }
414}
415
416/************************************************************************/
431
432/************************************************************************/
441
442/************************************************************************/
447 const char *act_pfx,
448 const char *act_pfx2,
449 bool append_units,
450 bool append_wonders,
455 int size)
456{
458 struct item items[MAX_NUM_PRODUCTION_TARGETS];
459 int i, item, targets_used;
460 char *row[4];
461 char buf[4][64];
462
463 GtkSizeGroup *size_group[3];
464
465 if (city_operation != CO_NONE) {
466 GPtrArray *selected;
467 ITree it;
468 int num_selected = 0;
470 struct city **data;
471
472 selected = g_ptr_array_sized_new(size);
473
474 for (itree_begin(model, &it); !itree_end(&it); itree_next(&it)) {
475 struct city *pcity;
476
478 || !(pcity = city_model_get(model, TREE_ITER_PTR(it)))) {
479 continue;
480 }
481
482 g_ptr_array_add(selected, pcity);
483 num_selected++;
484 }
485
486 data = (struct city **)g_ptr_array_free(selected, FALSE);
490 g_free(data);
491 } else {
494 test_func);
495 }
496
497 name_and_sort_items(targets, targets_used, items,
499
500 for (i = 0; i < 4; i++) {
501 row[i] = buf[i];
502 }
503
504
505 for (i = 0; i < 3; i++) {
507 }
508
509 for (item = 0; item < targets_used; item++) {
510 struct universal target = items[item].item;
512 char actbuf[256];
513 GSimpleAction *act;
514
515 get_city_dialog_production_row(row, sizeof(buf[0]), &target, NULL);
516
517 fc_snprintf(actbuf, sizeof(actbuf), "win.%s%s%d", act_pfx, act_pfx2, item);
518
520
521 fc_snprintf(actbuf, sizeof(actbuf), "%s%s%d", act_pfx, act_pfx2, item);
523 g_object_set_data(G_OBJECT(act), "freeciv_test_func", test_func);
524 g_object_set_data(G_OBJECT(act), "freeciv_city_operation",
527 g_signal_connect(act, "activate", callback,
528 GINT_TO_POINTER(cid_encode(target)));
530 }
531
532 for (i = 0; i < 3; i++) {
533 g_object_unref(size_group[i]);
534 }
535}
536
537/************************************************************************/
542{
543 struct universal target = cid_decode(GPOINTER_TO_INT(data));
544 struct city *pcity = city_model_get(model, iter);
545
546 if (NULL != pcity) {
548 }
549}
550
551/************************************************************************/
557 GtkTreePath *path,
559 gpointer data)
560{
561 struct universal target = cid_decode(GPOINTER_TO_INT(data));
562 struct city *pcity = city_model_get(model, iter);
563
564 if (NULL != pcity) {
565 (void) city_queue_insert(pcity, -1, &target);
566 }
567 /* Perhaps should warn the user if not successful? */
568}
569
570/************************************************************************/
578 GtkTreePath *path,
580 gpointer data)
581{
582 struct universal target = cid_decode(GPOINTER_TO_INT(data));
583 struct city *pcity = city_model_get(model, iter);
584
585 if (NULL != pcity) {
586 (void) city_queue_insert(pcity, 0, &target);
587 }
588 /* Perhaps should warn the user if not successful? */
589}
590
591/************************************************************************/
598 GtkTreePath *path,
600 gpointer data)
601{
602 struct universal target = cid_decode(GPOINTER_TO_INT(data));
603 struct city *pcity = city_model_get(model, iter);
604
605 if (NULL != pcity) {
606 (void) city_queue_insert(pcity, 1, &target);
607 }
608 /* Perhaps should warn the user if not successful? */
609}
610
611/************************************************************************/
617 GtkTreePath *path,
619 gpointer data)
620{
621 struct universal target = cid_decode(GPOINTER_TO_INT(data));
622 struct city *pcity = city_model_get(model, iter);
623
624 if (NULL != pcity) {
625 city_queue_insert(pcity, worklist_length(&pcity->worklist), &target);
626 }
627}
628
629/************************************************************************/
634{
635 struct sell_data *sd = (struct sell_data *) data;
636 struct city *pcity = city_model_get(model, iter);
637
638 if (NULL != pcity
639 && !pcity->did_sell
640 && city_has_building(pcity, sd->target)) {
641 sd->count++;
642 sd->gold += impr_sell_gold(sd->target);
644 }
645}
646
647struct scbs_data {
648 const struct impr_type *building;
649 const char *imprname;
650};
651
652/************************************************************************/
655static void sell_callback_response(GObject *dialog, GAsyncResult *result,
656 gpointer data)
657{
659 result, NULL);
660
661 if (button == 0) {
662 struct scbs_data *scbs = (struct scbs_data *)data;
663 struct sell_data sd = { 0, 0, scbs->building };
664 GtkWidget *w;
665
668 if (sd.count > 0) {
669 /* FIXME: plurality of sd.count is ignored! */
670 /* TRANS: "Sold 3 Harbor for 90 gold." (Pluralisation is in gold --
671 * second %d -- not in buildings.) */
674 PL_("Sold %d %s for %d gold.",
675 "Sold %d %s for %d gold.",
676 sd.gold),
677 sd.count, scbs->imprname, sd.gold);
678 } else {
681 _("No %s could be sold."),
682 scbs->imprname);
683 }
684
685 g_signal_connect(w, "response",
687 gtk_window_present(GTK_WINDOW(w)); /* Asynchron. */
688 }
689
690 free(data);
691}
692
693/************************************************************************/
698 GVariant *parameter,
699 gpointer data)
700{
701 struct universal target = cid_decode(GPOINTER_TO_INT(data));
702 TestCityFunc test_func = g_object_get_data(G_OBJECT(action), "freeciv_test_func");
704 GPOINTER_TO_INT(g_object_get_data(G_OBJECT(action), "freeciv_city_operation"));
705
706 /* If this is not a city operation: */
707 if (city_operation == CO_NONE) {
709 ITree it;
710
712 for (itree_begin(model, &it); !itree_end(&it); itree_next(&it)) {
713 struct city *pcity = city_model_get(model, TREE_ITER_PTR(it));
714
715 if (NULL != pcity && test_func(pcity, &target)) {
717 }
718 }
719 } else {
721
723 switch (city_operation) {
724 case CO_LAST:
727 GINT_TO_POINTER(cid_encode(target)));
728 break;
729 case CO_CHANGE:
732 GINT_TO_POINTER(cid_encode(target)));
733 break;
734 case CO_FIRST:
737 GINT_TO_POINTER(cid_encode(target)));
738 break;
739 case CO_NEXT:
742 GINT_TO_POINTER(cid_encode(target)));
743 break;
744 case CO_NEXT_TO_LAST:
747 GINT_TO_POINTER(cid_encode(target)));
748 break;
749 case CO_SELL:
750 fc_assert_action(target.kind == VUT_IMPROVEMENT, break);
751 {
752 struct scbs_data *scbs = fc_malloc(sizeof(struct scbs_data));
754 gchar *buf;
755 const char *buttons[] = { _("Yes"), _("No"), NULL };
756
757 scbs->building = target.value.building;
758 scbs->imprname = improvement_name_translation(scbs->building);
759
760 /* Ask confirmation */
761 buf = g_strdup_printf(_("Are you sure you want to sell those %s?"), scbs->imprname);
762 w = gtk_alert_dialog_new("%s", buf);
763 g_free(buf);
768 }
769 break;
770 case CO_NONE:
771 break;
772 }
774 }
775}
776
777/************************************************************************/
782{
783 struct city *pcity = city_model_get(model, iter);
784 int idx = GPOINTER_TO_INT(data);
785
786 if (NULL != pcity) {
787 if (CMA_NONE == idx) {
789 } else {
791 }
793 }
794}
795
796/************************************************************************/
801 GVariant *parameter,
802 gpointer data)
803{
804 int idx = GPOINTER_TO_INT(data);
805 bool change_governor =
807 struct cm_parameter cm;
808
809 /* If this is not the change button but the select cities button. */
810 if (!change_governor) {
811 ITree it;
813
815 for (itree_begin(model, &it); !itree_end(&it); itree_next(&it)) {
816 struct city *pcity = city_model_get(model, TREE_ITER_PTR(it));
817 int controlled;
818 bool select;
819
820 if (NULL == pcity) {
821 continue;
822 }
824 select = FALSE;
825
826 if (idx == CMA_NONE) {
827 /* CMA_NONE selects not-controlled, all others require controlled */
828 if (!controlled) {
829 select = TRUE;
830 }
831 } else if (controlled) {
832 if (idx == CMA_CUSTOM) {
834 select = TRUE;
835 }
836 } else if (cm_are_parameter_equal(&cm,
838 select = TRUE;
839 }
840 }
841
842 if (select) {
844 }
845 }
846 } else {
849 GINT_TO_POINTER(idx));
850 }
851}
852
853/************************************************************************/
860 bool change_governor)
861{
862 GMenu *menu;
863 int i;
864 struct cm_parameter cm;
865
866 menu = g_menu_new();
867
869 return menu;
870 }
871
872 if (change_governor) {
873 GSimpleAction *act;
874
875 act = g_simple_action_new("chg_governor_none", NULL);
876 g_object_set_data(G_OBJECT(act), "governor",
882 g_menu_item_new(Q_("?cma:none"),
883 "win.chg_governor_none"));
884
885 for (i = 0; i < cmafec_preset_num(); i++) {
886 char buf[128];
887
888 fc_snprintf(buf, sizeof(buf), "chg_governor_%d", i);
890 g_object_set_data(G_OBJECT(act), "governor",
895 fc_snprintf(buf, sizeof(buf), "win.chg_governor_%d", i);
898 }
899 } else {
900 /* Search for a "none" */
901 bool found;
902
903 found = FALSE;
906 found = TRUE;
907 break;
908 }
910
911 if (found) {
912 GSimpleAction *act;
913
914 act = g_simple_action_new("sel_governor_none", NULL);
915 g_object_set_data(G_OBJECT(act), "governor",
921 g_menu_item_new(Q_("?cma:none"),
922 "win.sel_governor_none"));
923 }
924
925 /*
926 * Search for a city that's under custom (not preset) agent. Might
927 * take a lonnggg time.
928 */
929 found = FALSE;
933 found = TRUE;
934 break;
935 }
937
938 if (found) {
939 /* We found city that's under agent but not a preset */
940 GSimpleAction *act;
941
942 act = g_simple_action_new("sel_governor_custom", NULL);
943 g_object_set_data(G_OBJECT(act), "governor",
949 g_menu_item_new(Q_("?cma:custom"),
950 "win.sel_governor_custom"));
951 }
952
953 /* Only fill in presets that are being used. */
954 for (i = 0; i < cmafec_preset_num(); i++) {
955 found = FALSE;
960 found = TRUE;
961 break;
962 }
964
965 if (found) {
966 GSimpleAction *act;
967 char buf[128];
968
969 fc_snprintf(buf, sizeof(buf), "sel_governor_%d", i);
970
972 g_object_set_data(G_OBJECT(act), "governor",
977 fc_snprintf(buf, sizeof(buf), "win.sel_governor_%d", i);
980 buf));
981 }
982 }
983 }
984
985 return menu;
986}
987
988/************************************************************************/
997
998/************************************************************************/
1004 GtkTreeIter *iter, gpointer data)
1005{
1006 const struct worklist *pwl = data;
1007 struct city *pcity = city_model_get(model, iter);
1008
1010
1011 if (NULL != pcity) {
1013 }
1014}
1015
1016/************************************************************************/
1022 GVariant *parameter,
1023 gpointer data)
1024{
1025 struct global_worklist *pgwl =
1027
1029
1030 if (!pgwl) {
1031 /* Maybe removed by an other way, not an error. */
1032 return;
1033 }
1034
1038}
1039
1040/************************************************************************/
1045 GtkTreeIter *iter, gpointer data)
1046{
1047 const struct worklist *pwl = data;
1048 struct city *pcity = city_model_get(model, iter);
1049
1051
1052 if (NULL != pcity) {
1054 }
1055}
1056
1057/************************************************************************/
1062 GVariant *parameter,
1063 gpointer data)
1064{
1065 struct global_worklist *pgwl =
1067
1071
1072 if (!pgwl) {
1073 /* Maybe removed by an other way, not an error. */
1074 return;
1075 }
1076
1080}
1081
1082/************************************************************************/
1085static GMenu *create_wl_menu(GActionGroup *group, const char *act_pfx,
1086 GCallback cb)
1087{
1088 GMenu *menu;
1089 GSimpleAction *act;
1090 int count = 0;
1091
1092 menu = g_menu_new();
1093
1094 if (!can_client_issue_orders()) {
1095 return NULL;
1096 }
1097
1099 char buf[128];
1100
1101 fc_snprintf(buf, sizeof(buf), "wl%s%d", act_pfx, count);
1104 g_signal_connect(act, "activate", cb,
1106 fc_snprintf(buf, sizeof(buf), "win.wl%s%d", act_pfx, count);
1109 buf));
1110 count++;
1112
1113 if (count == 0) {
1114 char buf[64];
1115
1116 fc_snprintf(buf, sizeof(buf), "win.wl%s_dummy", act_pfx);
1118 g_menu_item_new(_("(no worklists defined)"), buf));
1119 }
1120
1121 return menu;
1122}
1123
1124/************************************************************************/
1128{
1129 struct city_report_spec *spec;
1132 GList *columns, *p;
1133
1136
1138
1139 for (p = columns; p != NULL; p = p->next) {
1140 col = p->data;
1141 spec = g_object_get_data(G_OBJECT(col), "city_report_spec");
1143 }
1144
1145 g_list_free(columns);
1146}
1147
1148/************************************************************************/
1153{
1154 GMenuItem *item;
1155 char act_name[50];
1156 struct city_report_spec *spec = city_report_specs + pos;
1157
1158 fc_snprintf(act_name, sizeof(act_name), "win.display%d(%s)",
1159 pos, spec->show ? "true" : "false");
1162
1163 return item;
1164}
1165
1166/************************************************************************/
1170{
1171 struct city_report_spec *spec = data;
1172 int idx = spec - city_report_specs;
1173
1174 spec->show ^= 1;
1176
1179}
1180
1181/************************************************************************/
1185{
1186 struct city_report_spec *spec;
1187 int i;
1189
1191 for (i = 0, spec = city_report_specs; i < NUM_CREPORT_COLS; i++, spec++) {
1192 GSimpleAction *act;
1193 char act_name[50];
1194 GVariant *var = g_variant_new("b", TRUE);
1195
1196 fc_snprintf(act_name, sizeof(act_name), "display%d", i);
1199 g_signal_connect(act, "change-state", G_CALLBACK(toggle_view), (gpointer)spec);
1200
1202 }
1203
1205
1206 return display_menu;
1207}
1208
1209/************************************************************************/
1247
1248/************************************************************************/
1253{
1255 gchar *str1, *str2;
1256 int i;
1257
1258 gtk_tree_model_get(model, a, col, &str1, -1);
1259 gtk_tree_model_get(model, b, col, &str2, -1);
1260
1262 g_free(str1);
1263 g_free(str2);
1264 return i;
1265}
1266
1267/************************************************************************/
1271{
1272 static char **titles;
1273 static char (*buf)[128];
1274 struct city_report_spec *spec;
1275
1276 GtkWidget *w, *sw, *aux_menu;
1277 int i;
1278
1281
1283
1286
1287 /* Menu */
1290
1291 /* Buttons */
1298
1300 _("_Buy"), CITY_BUY);
1301 city_buy_command = w;
1302
1304 _("_Inspect"), CITY_POPUP);
1306
1308 _("Cen_ter"), CITY_CENTER);
1310
1312
1317
1318 /* Tree view */
1319 buf = fc_realloc(buf, NUM_CREPORT_COLS * sizeof(buf[0]));
1321 for (i = 0; i < NUM_CREPORT_COLS; i++) {
1322 titles[i] = buf[i];
1323 }
1324 get_city_table_header(titles, sizeof(buf[0]));
1325
1326 for (i = 0; i < NUM_CREPORT_COLS; i++) {
1329
1335
1338 }
1339
1344 gtk_widget_set_name(city_view_depr, "small_font");
1345 g_signal_connect(city_view_depr, "row_activated",
1351
1352 for (i = 0, spec = city_report_specs; i < NUM_CREPORT_COLS; i++, spec++) {
1353 GtkWidget *header;
1354 GtkCellRenderer *renderer;
1356
1357 renderer = gtk_cell_renderer_text_new();
1359 "text", i, NULL);
1360 header = gtk_label_new(titles[i]);
1367 g_object_set_data(G_OBJECT(col), "city_report_spec", spec);
1371 NULL);
1372 }
1373
1379
1381
1383 city_store_fill(city_store, nullptr, nullptr);
1385
1386 /* Real menus */
1390
1392}
1393
1394/************************************************************************/
1403
1404/************************************************************************/
1413
1414/************************************************************************/
1418 GVariant *parameter,
1419 gpointer data)
1420{
1421 ITree it;
1423
1424 for (itree_begin(model, &it); !itree_end(&it); itree_next(&it)) {
1427 } else {
1429 }
1430 }
1431}
1432
1433/************************************************************************/
1437 GVariant *parameter,
1438 gpointer data)
1439{
1440 ITree it;
1442
1444
1445 for (itree_begin(model, &it); !itree_end(&it); itree_next(&it)) {
1446 struct city *pcity = city_model_get(model, TREE_ITER_PTR(it));
1447
1448 if (pcity != NULL
1451 }
1452 }
1453}
1454
1455/************************************************************************/
1459 GtkTreeIter *iter, gpointer data)
1460{
1461 struct city *selected_pcity = city_model_get(model, iter);
1462 ITree it;
1463
1464 if (NULL == selected_pcity) {
1465 return;
1466 }
1467
1468 for (itree_begin(model, &it); !itree_end(&it); itree_next(&it)) {
1469 struct city *pcity = city_model_get(model, TREE_ITER_PTR(it));
1470
1471 if (NULL != pcity
1473 == tile_continent(selected_pcity->tile))) {
1475 }
1476 }
1477}
1478
1479/************************************************************************/
1489
1490/************************************************************************/
1494 GVariant *parameter,
1495 gpointer data)
1496{
1498 ITree it;
1500
1502
1503 for (itree_begin(model, &it); !itree_end(&it); itree_next(&it)) {
1504 struct city *pcity = city_model_get(model, TREE_ITER_PTR(it));
1505
1506 if (NULL != pcity
1507 && ((which == PCT_UNIT && VUT_UTYPE == pcity->production.kind)
1508 || (which == PCT_IMPROVEMENT
1509 && VUT_IMPROVEMENT == pcity->production.kind
1510 && !is_wonder(pcity->production.value.building))
1511 || (which == PCT_WONDER
1512 && VUT_IMPROVEMENT == pcity->production.kind
1513 && is_wonder(pcity->production.value.building)))) {
1515 }
1516 }
1517}
1518
1519/************************************************************************/
1522static void buy_iterate(GtkTreeModel *model, GtkTreePath *path,
1523 GtkTreeIter *iter, gpointer data)
1524{
1525 struct city *pcity = city_model_get(model, iter);
1526
1527 if (NULL != pcity) {
1529 }
1530}
1531
1532/************************************************************************/
1535static void center_iterate(GtkTreeModel *model, GtkTreePath *path,
1536 GtkTreeIter *iter, gpointer data)
1537{
1538 struct city *pcity = city_model_get(model, iter);
1539
1540 if (NULL != pcity) {
1542 }
1543}
1544
1545/************************************************************************/
1548static void popup_iterate(GtkTreeModel *model, GtkTreePath *path,
1549 GtkTreeIter *iter, gpointer data)
1550{
1551 struct city *pcity = city_model_get(model, iter);
1552
1553 if (NULL != pcity) {
1556 }
1558 }
1559}
1560
1561/************************************************************************/
1564static void city_command_callback(struct gui_dialog *dlg, int response,
1565 gpointer data)
1566{
1567 switch (response) {
1568 case CITY_CENTER:
1570 /* Center to city doesn't make sense if many city are selected. */
1572 NULL);
1573 }
1574 break;
1575 case CITY_POPUP:
1577 break;
1578 case CITY_BUY:
1580 break;
1581 default:
1582 gui_dialog_destroy(dlg);
1583 break;
1584 }
1585}
1586
1587/************************************************************************/
1592{
1593 GtkTreeModel *model;
1595 GdkSurface *win;
1596 GdkSeat *seat;
1598
1600
1601 if (!gtk_tree_model_get_iter(model, &iter, path)) {
1602 return;
1603 }
1604
1607
1609 NULL, NULL, &mask);
1610
1611 if (!(mask & GDK_CONTROL_MASK)) {
1612 popup_iterate(model, path, &iter, NULL);
1613 } else {
1614 center_iterate(model, path, &iter, NULL);
1615 }
1616}
1617
1618/************************************************************************/
1622{
1623 GHashTable *selected;
1624 ITree iter;
1625 gint city_id;
1626
1627 if (NULL == city_dialog_shell) {
1628 return;
1629 }
1630
1631 /* Save the selection. */
1632 selected = g_hash_table_new(NULL, NULL);
1634 !itree_end(&iter); itree_next(&iter)) {
1636 itree_get(&iter, CRD_COL_CITY_ID, &city_id, -1);
1637 g_hash_table_insert(selected, GINT_TO_POINTER(city_id), NULL);
1638 }
1639 }
1640
1641 /* Update and restore the selection. */
1644
1647 g_hash_table_destroy(selected);
1648
1650}
1651
1652/************************************************************************/
1670
1671/************************************************************************/
1680static GMenu *create_change_menu(GActionGroup *group, const char *mname,
1681 const char *human_mname,
1683{
1684 GMenu *menu = g_menu_new();
1685 GMenu *submenu;
1686 int n;
1687 char buf[128];
1688
1690
1691 submenu = g_menu_new();
1693 TRUE, FALSE, oper,
1696 fc_snprintf(buf, sizeof(buf), human_mname, _("Unit"));
1698
1699 submenu = g_menu_new();
1701 FALSE, FALSE, oper,
1704 fc_snprintf(buf, sizeof(buf), human_mname, _("Improvement"));
1706
1707 submenu = g_menu_new();
1709 FALSE, TRUE, oper,
1712 fc_snprintf(buf, sizeof(buf), human_mname, _("Wonder"));
1714
1715 return menu;
1716}
1717
1718/************************************************************************/
1722{
1723 int n;
1724 GMenu *menu = g_menu_new();
1725
1727
1728 append_impr_or_unit_to_menu(menu, group, "sell", "",
1732 n);
1733
1735 submenu_insert_unref(cityrep_menu, 2, _("S_ell"), G_MENU_MODEL(menu));
1736}
1737
1738/************************************************************************/
1742{
1743 GSimpleAction *act;
1744
1746
1747 /* TRANS: Menu name part to be used like "Change to Improvement"
1748 * This is about changing current production. */
1749 change_menu = create_change_menu(group, "change", _("Change to %s"), CO_CHANGE);
1751
1753
1754 /* TRANS: Menu name to be used like "Set Improvement first"
1755 * This is about adding item to the beginning of the worklist. */
1756 add_first_menu = create_change_menu(group, "first", _("Set %s first"), CO_FIRST);
1757 submenu_append_unref(prod_menu, _("Add _First"),
1759
1761
1762 /* TRANS: Menu name to be used like "Set Improvement last"
1763 * This is about adding item to the end of the worklist. */
1764 add_last_menu = create_change_menu(group, "last", _("Set %s last"), CO_LAST);
1765 submenu_append_unref(prod_menu, _("Add _Last"),
1767
1769
1770 /* TRANS: Menu name to be used like "Set Improvement next"
1771 * This is about adding item after current one on the worklist. */
1772 add_next_menu = create_change_menu(group, "next", _("Set %s next"), CO_NEXT);
1773 submenu_append_unref(prod_menu, _("Add _Next"),
1775
1777
1778 /* TRANS: Menu name to be used like "Set Improvement 2nd last"
1779 * This is about adding item as second last on the worklist. */
1780 add_2ndlast_menu = create_change_menu(group, "2ndlast", _("Set %s 2nd last"), CO_NEXT_TO_LAST);
1781 submenu_append_unref(prod_menu, _("Add _2nd Last"),
1783
1785 submenu_append_unref(prod_menu, _("Set Worklist"),
1787
1789 submenu_append_unref(prod_menu, _("Append Worklist"),
1791
1792 act = g_simple_action_new("clear_worklist", NULL);
1795 NULL);
1797 "win.clear_worklist"));
1798
1799 return prod_menu;
1800}
1801
1802/************************************************************************/
1821
1822/************************************************************************/
1825static bool city_building_impr_or_unit(const struct city *pcity,
1826 const struct universal *target)
1827{
1828 return are_universals_equal(&pcity->production, target);
1829}
1830
1831/************************************************************************/
1835{
1836 GSimpleAction *act;
1837 char buf[128];
1838
1840
1841#if 0
1844#endif
1845
1846 act = g_simple_action_new("select_all", NULL);
1849 NULL);
1851 "win.select_all"));
1852
1853 act = g_simple_action_new("select_none", NULL);
1856 NULL);
1858 "win.select_none"));
1859
1860 act = g_simple_action_new("select_invert", NULL);
1863 NULL);
1865 "win.select_invert"));
1866
1867 act = g_simple_action_new("select_build_unit", NULL);
1872 "win.select_build_unit"));
1873
1874 act = g_simple_action_new("select_build_impr", NULL);
1878 menu_item_append_unref(select_menu, g_menu_item_new(_("Building Improvements"),
1879 "win.select_build_impr"));
1880
1881 act = g_simple_action_new("select_build_wonder", NULL);
1886 "win.select_build_wonder"));
1887
1889 append_impr_or_unit_to_menu(unit_b_select_menu, group, "sel", "_b_u",
1890 TRUE, FALSE, CO_NONE,
1893 fc_snprintf(buf, sizeof(buf), _("Building %s"), _("Unit"));
1895
1897 append_impr_or_unit_to_menu(impr_b_select_menu, group, "sel", "_b_b",
1901 fc_snprintf(buf, sizeof(buf), _("Building %s"), _("Improvement"));
1903
1905 append_impr_or_unit_to_menu(wndr_b_select_menu, group, "sel", "_b_w",
1906 FALSE, TRUE, CO_NONE,
1909 fc_snprintf(buf, sizeof(buf), _("Building %s"), _("Wonder"));
1911
1912 act = g_simple_action_new("select_coastal", NULL);
1915 NULL);
1917 "win.select_coastal"));
1918
1919 act = g_simple_action_new("select_island", NULL);
1922 NULL);
1924 "win.select_island"));
1925
1927 append_impr_or_unit_to_menu(unit_s_select_menu, group, "sel", "_s_u",
1928 TRUE, FALSE, CO_NONE,
1931 fc_snprintf(buf, sizeof(buf), _("Supported %s"), _("Unit"));
1933
1935 append_impr_or_unit_to_menu(unit_p_select_menu, group, "sel", "_p_u",
1936 TRUE, FALSE, CO_NONE,
1939 fc_snprintf(buf, sizeof(buf), _("Present %s"), _("Unit"));
1941
1943 append_impr_or_unit_to_menu(impr_p_select_menu, group, "sel", "_p_b",
1947 fc_snprintf(buf, sizeof(buf), _("Present %s"), _("Improvement"));
1949
1951 append_impr_or_unit_to_menu(wndr_p_select_menu, group, "sel", "_p_w",
1952 FALSE, TRUE, CO_NONE,
1955 fc_snprintf(buf, sizeof(buf), _("Present %s"), _("Wonder"));
1957
1959 append_impr_or_unit_to_menu(unit_a_select_menu, group, "sel", "_a_u",
1960 TRUE, FALSE, CO_NONE,
1963 fc_snprintf(buf, sizeof(buf), _("Available %s"), _("Unit"));
1965
1967 append_impr_or_unit_to_menu(impr_a_select_menu, group, "sel", "_a_b",
1971 fc_snprintf(buf, sizeof(buf), _("Available %s"), _("Improvement"));
1973
1975 append_impr_or_unit_to_menu(wndr_a_select_menu, group, "sel", "_a_w",
1976 FALSE, TRUE, CO_NONE,
1979 fc_snprintf(buf, sizeof(buf), _("Available %s"), _("Wonder"));
1981
1983 submenu_append_unref(select_menu, _("Citizen Governor"),
1985
1986 return select_menu;
1987}
1988
1989/************************************************************************/
2012
2013/************************************************************************/
2017static void update_total_buy_cost(void)
2018{
2019 GtkWidget *label, *view;
2020 GList *rows, *p;
2021 GtkTreeModel *model;
2023 GtkTreePath *path;
2025 struct city *pcity;
2026 int total = 0;
2027
2030
2031 if (!view || !label) {
2032 return;
2033 }
2034
2037
2038 for (p = rows; p != NULL; p = p->next) {
2039 path = p->data;
2040 if (gtk_tree_model_get_iter(model, &iter, path)) {
2041 if ((pcity = city_model_get(model, &iter))) {
2042 total += pcity->client.buy_cost;
2043 }
2044 }
2045 gtk_tree_path_free(path);
2046 }
2048
2049 if (total > 0) {
2050 gchar *buf = g_strdup_printf(_("Total Buy Cost: %d"), total);
2051
2053 g_free(buf);
2054 } else {
2056 }
2057}
2058
2059/************************************************************************/
2073
2074/************************************************************************/
2078 GtkTreePath *path,
2080 gpointer data)
2081{
2082 struct city *pcity = city_model_get(model, iter);
2083
2084 if (NULL != pcity) {
2085 struct worklist empty;
2086
2089 }
2090}
2091
2092/************************************************************************/
2107
2108/************************************************************************/
2114{
2115 ITree it;
2116 GtkTreeModel *model;
2117
2118 if (!city_dialog_shell) {
2119 return;
2120 }
2121
2123
2125
2126 for (itree_begin(model, &it); !itree_end(&it); itree_next(&it)) {
2127 struct city *pcity = city_model_get(model, TREE_ITER_PTR(it));
2128
2129 if (NULL != pcity && is_city_hilited(pcity)) {
2131 }
2132 }
2133}
2134
2135/************************************************************************/
2139{
2141
2142 if (NULL == city_dialog_shell) {
2143 return;
2144 }
2145
2147 if (on_off) {
2149 } else {
2151 }
2152 }
2153}
#define n
Definition astring.c:77
bool city_has_building(const struct city *pcity, const struct impr_type *pimprove)
Definition city.c:1296
#define cities_iterate_end
Definition city.h:517
#define city_list_iterate(citylist, pcity)
Definition city.h:508
#define cities_iterate(pcity)
Definition city.h:512
#define city_owner(_pcity_)
Definition city.h:564
#define city_list_iterate_end
Definition city.h:510
void get_city_dialog_production_row(char *buf[], size_t column_size, struct universal *target, struct city *pcity)
int city_set_worklist(struct city *pcity, const struct worklist *pworklist)
bool city_queue_insert(struct city *pcity, int position, struct universal *item)
bool city_queue_insert_worklist(struct city *pcity, int position, const struct worklist *worklist)
bool city_set_queue(struct city *pcity, const struct worklist *pqueue)
int city_change_production(struct city *pcity, struct universal *target)
int city_sell_improvement(struct city *pcity, Impr_type_id sell_id)
void popup_city_dialog(struct city *pcity)
void refresh_city_dialog(struct city *pcity)
bool can_city_sell_universal(const struct city *pcity, const struct universal *target)
struct city_report_spec * city_report_specs
int cityrepfield_compare(const char *str1, const char *str2)
#define NUM_CREPORT_COLS
Definition cityrepdata.h:25
static struct ai_type * self
Definition classicai.c:47
struct civclient client
bool can_client_issue_orders(void)
bool client_has_player(void)
#define client_player()
bool city_unit_supported(const struct city *pcity, const struct universal *target)
Definition climisc.c:545
void cityrep_buy(struct city *pcity)
Definition climisc.c:1160
void name_and_sort_items(struct universal *targets, int num_targets, struct item *items, bool show_cost, struct city *pcity)
Definition climisc.c:650
cid cid_encode(struct universal target)
Definition climisc.c:483
bool city_building_present(const struct city *pcity, const struct universal *target)
Definition climisc.c:583
struct universal cid_decode(cid id)
Definition climisc.c:526
bool can_city_build_now_client(const struct city *pcity, const struct universal *target)
Definition climisc.c:593
bool city_unit_present(const struct city *pcity, const struct universal *target)
Definition climisc.c:564
int collect_production_targets(struct universal *targets, struct city **selected_cities, int num_selected_cities, bool append_units, bool append_wonders, bool change_prod, TestCityFunc test_func)
Definition climisc.c:700
#define MAX_NUM_PRODUCTION_TARGETS
Definition climisc.h:89
bool(* TestCityFunc)(const struct city *, const struct universal *)
Definition climisc.h:87
bool cm_are_parameter_equal(const struct cm_parameter *const p1, const struct cm_parameter *const p2)
Definition cm.c:2143
bool cma_is_city_under_agent(const struct city *pcity, struct cm_parameter *parameter)
Definition cma_core.c:552
void cma_put_city_under_agent(struct city *pcity, const struct cm_parameter *const parameter)
Definition cma_core.c:524
void cma_release_city(struct city *pcity)
Definition cma_core.c:542
char * cmafec_preset_get_descr(int idx)
Definition cma_fec.c:169
const struct cm_parameter * cmafec_preset_get_parameter(int idx)
Definition cma_fec.c:182
int cmafec_preset_get_index_of_parameter(const struct cm_parameter *const parameter)
Definition cma_fec.c:196
int cmafec_preset_num(void)
Definition cma_fec.c:213
char * incite_cost
Definition comments.c:77
void connection_do_buffer(struct connection *pc)
Definition connection.c:325
void connection_do_unbuffer(struct connection *pc)
Definition connection.c:337
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 int const struct action *paction struct unit struct city * pcity
Definition dialogs_g.h:77
int int id
Definition editgui_g.h:28
#define Q_(String)
Definition fcintl.h:70
#define PL_(String1, String2, n)
Definition fcintl.h:71
#define _(String)
Definition fcintl.h:67
struct world wld
Definition game.c:63
struct city * game_city_by_number(int id)
Definition game.c:106
struct global_worklist * global_worklist_by_id(int id)
const char * global_worklist_name(const struct global_worklist *pgwl)
int global_worklist_id(const struct global_worklist *pgwl)
const struct worklist * global_worklist_get(const struct global_worklist *pgwl)
#define global_worklists_iterate(pgwl)
#define global_worklists_iterate_end
static void append_worklist_foreach(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
Definition cityrep.c:853
static void create_city_report_dialog(bool make_modal)
Definition cityrep.c:1138
static void city_invert_selection_callback(GtkMenuItem *item, gpointer data)
Definition cityrep.c:1259
static GtkWidget * city_popup_command
Definition cityrep.c:119
static void worklist_next_impr_or_unit_iterate(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
Definition cityrep.c:509
static GtkWidget * city_total_buy_cost_label
Definition cityrep.c:124
static GtkWidget * city_buy_command
Definition cityrep.c:120
static void update_total_buy_cost(void)
Definition cityrep.c:1959
void real_city_report_dialog_update(void *unused)
Definition cityrep.c:1454
#define CRD_COL_CITY_ID
Definition cityrep.c:107
void real_city_report_update_city(struct city *pcity)
Definition cityrep.c:1489
static void city_select_building_callback(GtkMenuItem *item, gpointer data)
Definition cityrep.c:1328
static void popup_iterate(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
Definition cityrep.c:1381
static void create_select_menu(GtkWidget *item)
Definition cityrep.c:1770
static void city_activated_callback(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data)
Definition cityrep.c:1423
static void select_impr_or_unit_callback(GtkWidget *wdg, gpointer data)
Definition cityrep.c:563
static void impr_or_unit_iterate(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
Definition cityrep.c:452
static void center_iterate(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
Definition cityrep.c:1368
void toggle_city_hilite(struct city *pcity, bool on_off)
Definition cityrep.c:2089
static bool city_building_impr_or_unit(const struct city *pcity, const struct universal *target)
Definition cityrep.c:1889
#define CMA_NONE
Definition cityrep.c:64
static gint cityrep_sort_func(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer data)
Definition cityrep.c:1119
static struct city * city_model_get(GtkTreeModel *model, GtkTreeIter *iter)
Definition cityrep.c:224
static void city_select_coastal_callback(GtkMenuItem *item, gpointer data)
Definition cityrep.c:1276
static void popup_select_menu(GtkMenuShell *menu, gpointer data)
Definition cityrep.c:1898
static void city_command_callback(struct gui_dialog *dlg, int response, gpointer data)
Definition cityrep.c:1397
static void city_clear_worklist_callback(GtkMenuItem *item, gpointer data)
Definition cityrep.c:2049
static void clear_worklist_foreach_func(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
Definition cityrep.c:2031
#define NEG_VAL(x)
Definition cityrep.c:61
static void city_select_all_callback(GtkMenuItem *item, gpointer data)
Definition cityrep.c:1243
#define CMA_CUSTOM
Definition cityrep.c:65
static void sell_impr_iterate(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
Definition cityrep.c:544
static GtkTreeSelection * city_selection
Definition cityrep.c:105
static void same_island_iterate(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
Definition cityrep.c:1296
static void set_worklist_callback(GtkMenuItem *menuitem, gpointer data)
Definition cityrep.c:909
static void city_selection_changed_callback(GtkTreeSelection *selection)
Definition cityrep.c:2005
static gboolean city_model_find(GtkTreeModel *model, GtkTreeIter *iter, const struct city *pcity)
Definition cityrep.c:240
static void worklist_next_to_last_impr_or_unit_iterate(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
Definition cityrep.c:528
static void city_report_update_views(void)
Definition cityrep.c:982
static void get_city_table_header(char **text, int n)
Definition cityrep.c:167
void hilite_cities_from_canvas(void)
Definition cityrep.c:2066
void city_report_dialog_popdown(void)
Definition cityrep.c:308
void city_report_dialog_popup(bool raise)
Definition cityrep.c:290
static GtkWidget * city_view
Definition cityrep.c:104
@ CITY_POPUP
Definition cityrep.c:101
@ CITY_CENTER
Definition cityrep.c:101
@ CITY_BUY
Definition cityrep.c:101
static struct gui_dialog * city_dialog_shell
Definition cityrep.c:98
static void worklist_first_impr_or_unit_iterate(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
Definition cityrep.c:489
static void set_worklist_foreach(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
Definition cityrep.c:892
static void toggle_view(GtkCheckMenuItem *item, gpointer data)
Definition cityrep.c:1006
static void append_worklist_callback(GtkMenuItem *menuitem, gpointer data)
Definition cityrep.c:871
static void city_unselect_all_callback(GtkMenuItem *item, gpointer data)
Definition cityrep.c:1251
static void worklist_last_impr_or_unit_iterate(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
Definition cityrep.c:468
static GtkWidget * city_center_command
Definition cityrep.c:118
static void buy_iterate(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
Definition cityrep.c:1355
city_operation_type
Definition cityrep.c:73
@ CO_SELL
Definition cityrep.c:74
@ CO_NEXT_TO_LAST
Definition cityrep.c:74
@ CO_NEXT
Definition cityrep.c:74
@ CO_CHANGE
Definition cityrep.c:74
@ CO_FIRST
Definition cityrep.c:74
@ CO_LAST
Definition cityrep.c:74
@ CO_NONE
Definition cityrep.c:74
static void recreate_sell_menu(void)
Definition cityrep.c:1743
static void create_change_menu(GtkWidget *item)
Definition cityrep.c:1508
static struct tile * pos
Definition finddlg.c:53
GtkWidget * top_notebook
Definition gui_main.c:130
GtkWidget * toplevel
Definition gui_main.c:126
void gui_dialog_destroy(struct gui_dialog *dlg)
Definition gui_stuff.c:954
void gui_dialog_present(struct gui_dialog *dlg)
Definition gui_stuff.c:835
void itree_get(ITree *it,...)
Definition gui_stuff.c:164
void gui_dialog_raise(struct gui_dialog *dlg)
Definition gui_stuff.c:865
void gui_dialog_new(struct gui_dialog **pdlg, GtkNotebook *notebook, gpointer user_data, bool check_top)
Definition gui_stuff.c:517
void gui_dialog_response_set_callback(struct gui_dialog *dlg, GUI_DIALOG_RESPONSE_FUN fun)
Definition gui_stuff.c:988
void itree_begin(GtkTreeModel *model, ITree *it)
Definition gui_stuff.c:127
void itree_unselect(GtkTreeSelection *selection, ITree *it)
Definition gui_stuff.c:206
void gui_dialog_show_all(struct gui_dialog *dlg)
Definition gui_stuff.c:795
void itree_select(GtkTreeSelection *selection, ITree *it)
Definition gui_stuff.c:198
void gui_dialog_set_title(struct gui_dialog *dlg, const char *title)
Definition gui_stuff.c:935
void gui_dialog_set_default_size(struct gui_dialog *dlg, int width, int height)
Definition gui_stuff.c:919
void itree_next(ITree *it)
Definition gui_stuff.c:144
gboolean itree_is_selected(GtkTreeSelection *selection, ITree *it)
Definition gui_stuff.c:190
GtkWidget * gui_dialog_add_button(struct gui_dialog *dlg, const char *icon_name, const char *text, int response)
Definition gui_stuff.c:706
gboolean itree_end(ITree *it)
Definition gui_stuff.c:136
#define TREE_ITER_PTR(x)
Definition gui_stuff.h:38
static GMenu * impr_b_select_menu
Definition cityrep.c:129
static GtkWidget * create_city_report_menu(void)
Definition cityrep.c:1042
static GMenu * wl_set_menu
Definition cityrep.c:124
static void recreate_production_menu(GActionGroup *group)
Definition cityrep.c:1612
static GMenu * unit_b_select_menu
Definition cityrep.c:128
static void city_select_island_callback(GSimpleAction *action, GVariant *parameter, gpointer data)
Definition cityrep.c:1292
static GMenu * display_menu
Definition cityrep.c:142
static GMenu * add_first_menu
Definition cityrep.c:120
static GMenu * add_2ndlast_menu
Definition cityrep.c:123
static GMenu * add_next_menu
Definition cityrep.c:122
static GMenu * impr_a_select_menu
Definition cityrep.c:136
static void select_governor_callback(GSimpleAction *action, GVariant *parameter, gpointer data)
Definition cityrep.c:630
static GMenu * unit_s_select_menu
Definition cityrep.c:131
static GMenu * impr_p_select_menu
Definition cityrep.c:133
static GActionGroup * cityrep_group
Definition cityrep.c:141
static GMenu * wl_append_menu
Definition cityrep.c:125
static void governors_iterate(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
Definition cityrep.c:610
static GMenu * create_governor_menu(GActionGroup *group, bool change_governor)
Definition cityrep.c:689
static GMenu * create_display_menu(GActionGroup *group)
Definition cityrep.c:1014
static void recreate_select_menu(GActionGroup *group)
Definition cityrep.c:1799
static GMenu * create_production_menu(GActionGroup *group)
Definition cityrep.c:1548
static GMenuItem * create_display_menu_item(int pos)
Definition cityrep.c:982
static GMenu * select_menu
Definition cityrep.c:127
static GMenu * prod_menu
Definition cityrep.c:118
static GMenu * add_last_menu
Definition cityrep.c:121
static GMenu * cityrep_menu
Definition cityrep.c:140
static GMenu * create_wl_menu(GActionGroup *group, const char *act_pfx, GCallback cb)
Definition cityrep.c:915
static void append_impr_or_unit_to_menu(GMenu *menu, GActionGroup *act_group, const char *act_pfx, const char *act_pfx2, bool append_units, bool append_wonders, enum city_operation_type city_operation, TestCityFunc test_func, GCallback callback, int size)
Definition cityrep.c:296
static GMenu * unit_a_select_menu
Definition cityrep.c:135
static GMenu * unit_p_select_menu
Definition cityrep.c:132
static void update_governor_menu(void)
Definition cityrep.c:821
static GMenu * governor_select_menu
Definition cityrep.c:138
static GMenu * change_menu
Definition cityrep.c:119
static GMenu * wndr_b_select_menu
Definition cityrep.c:130
static GMenu * wndr_p_select_menu
Definition cityrep.c:134
static GMenu * wndr_a_select_menu
Definition cityrep.c:137
GtkWidget * aux_menu_new(void)
Definition gui_stuff.c:244
void gui_dialog_add_content_widget(struct gui_dialog *dlg, GtkWidget *wdg)
Definition gui_stuff.c:1108
GtkWidget * gui_dialog_add_action_widget(struct gui_dialog *dlg, GtkWidget *widget)
Definition gui_stuff.c:690
#define submenu_append_unref(menu, name, submenu)
Definition gui_stuff.h:165
#define menu_item_insert_unref(menu, index, item)
Definition gui_stuff.h:142
#define submenu_insert_unref(menu, index, name, submenu)
Definition gui_stuff.h:156
#define menu_item_append_unref(menu, item)
Definition gui_stuff.h:149
static void sell_callback_response(GObject *dialog, GAsyncResult *result, gpointer data)
Definition cityrep.c:655
static void fc_city_row_finalize(GObject *gobject)
Definition cityrep.c:169
static void city_factory_bind(GtkSignalListItemFactory *self, GtkListItem *list_item, gpointer user_data)
Definition cityrep.c:233
#define FC_TYPE_CITY_ROW
Definition cityrep.c:147
static GtkTreeSelection * city_selection_depr
Definition cityrep.c:105
static void fc_city_row_init(FcCityRow *self)
Definition cityrep.c:194
static void city_model_fill_depr(GtkListStore *store, GtkTreeSelection *selection, GHashTable *select)
Definition cityrep.c:351
static void city_model_set_depr(GtkListStore *store, GtkTreeIter *iter, struct city *pcity)
Definition cityrep.c:277
static void fc_city_row_class_init(FcCityRowClass *klass)
Definition cityrep.c:183
static GtkListStore * city_model_depr
Definition cityrep.c:106
static void city_store_set(FcCityRow *row, struct city *pcity)
Definition cityrep.c:296
static GtkWidget * city_view_depr
Definition cityrep.c:104
static void city_store_fill(GListStore *store, GtkMultiSelection *selection, GHashTable *select)
Definition cityrep.c:381
static GtkListStore * city_report_dialog_store_new_depr(void)
Definition cityrep.c:258
static FcCityRow * fc_city_row_new(void)
Definition cityrep.c:202
static GListStore * city_store
Definition cityrep.c:109
static void city_factory_setup(GtkSignalListItemFactory *self, GtkListItem *list_item, gpointer user_data)
Definition cityrep.c:248
int impr_sell_gold(const struct impr_type *pimprove)
Impr_type_id improvement_number(const struct impr_type *pimprove)
bool is_wonder(const struct impr_type *pimprove)
const char * improvement_name_translation(const struct impr_type *pimprove)
#define fc_assert_ret(condition)
Definition log.h:192
#define fc_assert_action(condition, action)
Definition log.h:188
bool is_city_hilited(struct city *pcity)
void center_tile_mapcanvas(const struct tile *ptile)
#define fc_strdup(str)
Definition mem.h:43
#define fc_realloc(ptr, sz)
Definition mem.h:36
#define fc_malloc(sz)
Definition mem.h:34
struct client_options gui_options
Definition options.c:71
struct city_list * cities
Definition packhand.c:121
bool are_universals_equal(const struct universal *psource1, const struct universal *psource2)
size_t size
Definition specvec.h:72
struct sprite int int int int struct sprite * mask
Definition sprite_g.h:32
GObjectClass parent_class
Definition cityrep.c:161
GObject parent_instance
Definition cityrep.c:153
int city_id
Definition cityrep.c:156
char ** columns
Definition cityrep.c:155
const char *(* func)(const struct city *pcity, const void *data)
Definition cityrepdata.h:34
const char * title2
Definition cityrepdata.h:31
const char * explanation
Definition cityrepdata.h:32
const char * title1
Definition cityrepdata.h:30
Definition city.h:318
struct connection conn
Definition client_main.h:96
bool center_when_popup_city
Definition options.h:162
struct player * playing
Definition connection.h:151
Definition climisc.h:82
struct universal item
Definition climisc.h:83
struct city_list * cities
Definition player.h:281
const char * imprname
Definition cityrep.c:649
const struct impr_type * building
Definition cityrep.c:648
int gold
Definition cityrep.c:69
int count
Definition cityrep.c:68
const struct impr_type * target
Definition cityrep.c:70
int id
Definition unit.h:146
struct tile * tile
Definition unit.h:141
struct unit::@84::@86 client
enum universals_n kind
Definition fc_types.h:595
universals_u value
Definition fc_types.h:594
struct civ_map map
int fc_snprintf(char *str, size_t n, const char *format,...)
Definition support.c:960
#define TRUE
Definition support.h:46
#define FALSE
Definition support.h:47
bool is_terrain_class_near_tile(const struct civ_map *nmap, const struct tile *ptile, enum terrain_class tclass)
Definition terrain.c:615
#define tile_continent(_tile)
Definition tile.h:93
const struct impr_type * building
Definition fc_types.h:529
void worklist_init(struct worklist *pwl)
Definition worklist.c:38
int worklist_length(const struct worklist *pwl)
Definition worklist.c:57