Freeciv-3.4
Loading...
Searching...
No Matches
citizensinfo.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/gdkkeysyms.h>
24
25/* common */
26#include "citizens.h"
27#include "city.h"
28#include "nation.h"
29#include "player.h"
30
31/* client/gui-gtk-4.0 */
32#include "gui_stuff.h"
33#include "plrdlg.h"
34
35#include "citizensinfo.h"
36
37
38static struct citizens_dialog *citizens_dialog_get(const struct city *pcity);
39static struct citizens_dialog
40 *citizens_dialog_create(const struct city *pcity);
44 const struct city *pcity,
45 const struct player_slot *pslot);
46
47static const char *col_nation(const struct city *pcity,
48 const struct player_slot *pslot);
49static const char *col_citizens(const struct city *pcity,
50 const struct player_slot *pslot);
51
52/*****************************************************************************
53 The layout of the citizens display.
54*****************************************************************************/
55static struct citizens_column {
56 bool show;
58 const char *title;
59 const char *(*func)(const struct city *, const struct player_slot *);
60 /* if type = COL_*TEXT */
61 const char *tagname; /* for save_options */
62} citizens_cols[] = {
63 {TRUE, COL_RIGHT_TEXT, N_("#"), col_citizens, "citizens"},
64 {TRUE, COL_FLAG, N_("Flag"), NULL, "flag"},
65 {TRUE, COL_TEXT, N_("Nation"), col_nation, "nation"}
66};
68#define CITIZENS_DLG_COL_STYLE (0 + num_citizens_cols)
69#define CITIZENS_DLG_COL_WEIGHT (1 + num_citizens_cols)
70#define CITIZENS_DLG_COL_ID (2 + num_citizens_cols)
71
72/*****************************************************************************
73 The citizens dialog.
74*****************************************************************************/
75struct citizens_dialog {
76 const struct city *pcity;
81};
82
83#define SPECLIST_TAG dialog
84#define SPECLIST_TYPE struct citizens_dialog
85#include "speclist.h"
86
87#define dialog_list_iterate(dialoglist, pdialog) \
88 TYPED_LIST_ITERATE(struct citizens_dialog, dialoglist, pdialog)
89#define dialog_list_iterate_end LIST_ITERATE_END
90
91static struct dialog_list *dialog_list;
92
93/*************************************************************************/
96static const char *col_nation(const struct city *pcity,
97 const struct player_slot *pslot)
98{
100}
101
102/*************************************************************************/
105static const char *col_citizens(const struct city *pcity,
106 const struct player_slot *pslot)
107{
108 citizens nationality = citizens_nation_get(pcity, pslot);
109
110 if (nationality == 0) {
111 return "-";
112 } else {
113 static char buf[8];
114
115 fc_snprintf(buf, sizeof(buf), "%d", nationality);
116
117 return buf;
118 }
119}
120
121/*************************************************************************/
127{
128 GtkTreeStore *store;
130 int i;
131
132 for (i = 0; i < num_citizens_cols; i++) {
133 switch (citizens_cols[i].type) {
134 case COL_FLAG:
136 break;
137 case COL_COLOR:
139 break;
140 case COL_BOOLEAN:
142 break;
143 case COL_TEXT:
144 case COL_RIGHT_TEXT:
146 break;
147 }
148 }
149 /* special (invisible rows) - Text style, weight and player id */
150 model_types[i++] = G_TYPE_INT; /* CITIZENS_DLG_COL_STYLE. */
151 model_types[i++] = G_TYPE_INT; /* CITIZENS_DLG_COL_WEIGHT. */
152 model_types[i++] = G_TYPE_INT; /* CITIZENS_DLG_COL_ID. */
153
155
156 return store;
157}
158
159/*************************************************************************/
163{
164 return 0;
165}
166
167/*************************************************************************/
171{
172 GtkWidget *frame, *sw;
173 struct citizens_dialog *pdialog = fc_malloc(sizeof(struct citizens_dialog));
174 int i;
175
176 pdialog->pcity = pcity;
177 pdialog->store = citizens_dialog_store_new();
178 pdialog->sort
180 g_object_unref(pdialog->store);
181
185
186 pdialog->list
189 gtk_widget_add_css_class(GTK_WIDGET(pdialog->list), "large-pixbufs");
190 g_object_unref(pdialog->sort);
191
192 for (i = 0; i < num_citizens_cols; i++) {
193 struct citizens_column *pcol;
194 GtkCellRenderer *renderer;
196
197 pcol = &citizens_cols[i];
198 col = NULL;
199
200 switch (pcol->type) {
201 case COL_FLAG:
202 renderer = gtk_cell_renderer_pixbuf_new();
204 "pixbuf", i, NULL);
205 break;
206 case COL_TEXT:
207 renderer = gtk_cell_renderer_text_new();
208 g_object_set(renderer, "style-set", TRUE, "weight-set", TRUE, NULL);
209
211 "text", i,
212 "style", CITIZENS_DLG_COL_STYLE,
213 "weight", CITIZENS_DLG_COL_WEIGHT,
214 NULL);
216 break;
217 case COL_RIGHT_TEXT:
218 renderer = gtk_cell_renderer_text_new();
219 g_object_set(renderer, "style-set", TRUE, "weight-set", TRUE, NULL);
220
222 "text", i,
223 "style", CITIZENS_DLG_COL_STYLE,
224 "weight", CITIZENS_DLG_COL_WEIGHT,
225 NULL);
227 g_object_set(renderer, "xalign", 1.0, NULL);
229 break;
230 case COL_COLOR:
231 case COL_BOOLEAN:
232 /* These are not used. */
233 fc_assert(pcol->type != COL_COLOR && pcol->type != COL_BOOLEAN);
234 continue;
235 }
236
237 if (col) {
239 }
240 }
241
244
251
252 frame = gtk_frame_new(_("Citizens"));
253 gtk_frame_set_child(GTK_FRAME(frame), sw);
254
255 pdialog->shell = frame;
256
258
260
261 return pdialog;
262}
263
264/*************************************************************************/
271
272/*************************************************************************/
279
280/*************************************************************************/
283static struct citizens_dialog *citizens_dialog_get(const struct city *pcity)
284{
286 if (pdialog->pcity == pcity) {
287 return pdialog;
288 }
290
291 return NULL;
292}
293
294/*************************************************************************/
298{
299 struct citizens_dialog *pdialog = citizens_dialog_get(pcity);
300
301 if (pdialog == NULL) {
302 return;
303 }
304
305 gtk_tree_store_clear(pdialog->store);
306 citizens_iterate(pcity, pslot, nationality) {
308
310 citizens_dialog_row(pdialog->store, &iter, pcity, pslot);
312}
313
314/*************************************************************************/
318 const struct city *pcity,
319 const struct player_slot *pslot)
320{
322 int style = PANGO_STYLE_NORMAL, weight = PANGO_WEIGHT_NORMAL;
323 int k;
324
325 for (k = 0; k < num_citizens_cols; k++) {
326 struct citizens_column *pcol = &citizens_cols[k];
327 switch (pcol->type) {
328 case COL_TEXT:
329 case COL_RIGHT_TEXT:
330 gtk_tree_store_set(store, it, k, pcol->func(pcity, pslot), -1);
331 break;
332 case COL_FLAG:
334 if (pixbuf != NULL) {
335 gtk_tree_store_set(store, it, k, pixbuf, -1);
337 }
338 break;
339 case COL_COLOR:
340 case COL_BOOLEAN:
341 /* These are not used. */
342 fc_assert(pcol->type != COL_COLOR && pcol->type != COL_BOOLEAN);
343 continue;
344 break;
345 }
346 }
347
348 if (city_owner(pcity)->slot == pslot) {
349 weight = PANGO_WEIGHT_BOLD;
350 style = PANGO_STYLE_NORMAL;
351 }
352
353 gtk_tree_store_set(store, it,
357 -1);
358}
359
360/*************************************************************************/
364{
365 struct citizens_dialog *pdialog = citizens_dialog_get(pcity);
366
367 if (pdialog == nullptr) {
368 return;
369 }
370
372
374
376 pdialog->shell);
377 free(pdialog);
378}
379
380/*************************************************************************/
384{
385 struct citizens_dialog *pdialog = citizens_dialog_get(pcity);
386
387 if (pdialog == nullptr) {
388 pdialog = citizens_dialog_create(pcity);
389 }
390
393
394 return pdialog->shell;
395}
citizens citizens_nation_get(const struct city *pcity, const struct player_slot *pslot)
Definition citizens.c:74
#define citizens_iterate_end
Definition citizens.h:54
#define citizens_iterate(_pcity, _pslot, _nationality)
Definition citizens.h:48
#define city_owner(_pcity_)
Definition city.h:564
char * incite_cost
Definition comments.c:77
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:78
unsigned char citizens
Definition fc_types.h:249
#define _(String)
Definition fcintl.h:67
#define N_(String)
Definition fcintl.h:69
#define CITIZENS_DLG_COL_STYLE
void citizens_dialog_init(void)
static const char * col_citizens(const struct city *pcity, const struct player_slot *pslot)
GtkWidget * citizens_dialog_display(const struct city *pcity)
static struct citizens_column citizens_cols[]
void citizens_dialog_refresh(const struct city *pcity)
#define dialog_list_iterate_end
static struct citizens_dialog * citizens_dialog_create(const struct city *pcity)
#define CITIZENS_DLG_COL_ID
static const int num_citizens_cols
#define CITIZENS_DLG_COL_WEIGHT
#define dialog_list_iterate(dialoglist, pdialog)
void citizens_dialog_close(const struct city *pcity)
static struct dialog_list * dialog_list
static GtkTreeStore * citizens_dialog_store_new(void)
static int citizens_dialog_default_sort_column(void)
static const char * col_nation(const struct city *pcity, const struct player_slot *pslot)
static struct citizens_dialog * citizens_dialog_get(const struct city *pcity)
static void citizens_dialog_row(GtkTreeStore *store, GtkTreeIter *it, const struct city *pcity, const struct player_slot *pslot)
void citizens_dialog_done(void)
GdkPixbuf * get_flag(const struct nation_type *nation)
Definition plrdlg.c:607
GType type
Definition repodlgs.c:1313
@ COL_TEXT
Definition unitselect.c:50
#define fc_assert(condition)
Definition log.h:177
#define fc_malloc(sz)
Definition mem.h:34
const char * nation_adjective_for_player(const struct player *pplayer)
Definition nation.c:169
struct nation_type * nation_of_player(const struct player *pplayer)
Definition nation.c:443
int player_slot_index(const struct player_slot *pslot)
Definition player.c:423
struct player * player_slot_get_player(const struct player_slot *pslot)
Definition player.c:432
player_dlg_column_type
@ COL_BOOLEAN
@ COL_FLAG
@ COL_RIGHT_TEXT
@ COL_COLOR
#define ARRAY_SIZE(x)
Definition shared.h:85
const char * tagname
enum player_dlg_column_type type
const char * title
GtkTreeStore * store
const struct city * pcity
GtkTreeModel * sort
GtkWidget * list
GtkWidget * shell
Definition city.h:318
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