Freeciv-3.3
Loading...
Searching...
No Matches
happiness.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#include "log.h"
23#include "mem.h"
24#include "support.h"
25
26/* common */
27#include "city.h"
28#include "game.h"
29#include "government.h"
30
31/* client */
32#include "text.h"
33#include "tilespec.h"
34
35/* client/gui-gtk-5.0 */
36#include "graphics.h"
37#include "gui_main.h"
38#include "gui_stuff.h"
39#include "happiness.h"
40#include "mapview.h"
41
42/* Semi-arbitrary number that controls the width of the happiness widget */
43#define HAPPINESS_PIX_WIDTH 30
44
45#define FEELING_WIDTH (HAPPINESS_PIX_WIDTH * tileset_small_sprite_width(tileset))
46#define FEELING_HEIGHT (tileset_small_sprite_height(tileset))
47
48#define NUM_HAPPINESS_MODIFIERS 6
49
51
52struct happiness_dialog {
53 struct city *pcity;
61};
62
63#define SPECLIST_TAG dialog
64#define SPECLIST_TYPE struct happiness_dialog
65#include "speclist.h"
66
67#define dialog_list_iterate(dialoglist, pdialog) \
68 TYPED_LIST_ITERATE(struct happiness_dialog, dialoglist, pdialog)
69#define dialog_list_iterate_end LIST_ITERATE_END
70
71static struct dialog_list *dialog_list;
72static struct happiness_dialog *get_happiness_dialog(struct city *pcity);
74 bool low_dlg,
75 GtkWidget *win);
77 int n_press,
78 double x, double y, gpointer data);
79
80/**********************************************************************/
87
88/**********************************************************************/
95
96/**********************************************************************/
100{
102 if (pdialog->pcity == pcity) {
103 return pdialog;
104 }
106
107 return NULL;
108}
109
110/**********************************************************************/
114 int n_press,
115 double x, double y, gpointer data)
116{
118 struct happiness_dialog *pdialog = g_object_get_data(G_OBJECT(w),
119 "pdialog");
120 GtkWidget *p, *label;
121 char buf[1024];
122
123 switch (GPOINTER_TO_UINT(data)) {
124 case CITIES:
126 break;
127 case LUXURIES:
129 break;
130 case BUILDINGS:
132 break;
133 case NATIONALITY:
135 break;
136 case UNITS:
138 break;
139 case WONDERS:
141 break;
142 default:
143 return TRUE;
144 }
145
146 p = gtk_popover_new();
147
149
150 label = gtk_label_new(buf);
151 /* FIXME: there is no font option corresponding to this style name.
152 * Remove?: */
153 gtk_widget_set_name(label, "city_happiness_label");
159
161
162 return TRUE;
163}
164
165/**********************************************************************/
169 bool low_dlg,
170 GtkWidget *win)
171{
172 int i;
173 struct happiness_dialog *pdialog;
174 GtkWidget *label, *table;
175 char buf[700];
176
177 static const char *happiness_label_str[NUM_HAPPINESS_MODIFIERS] = {
178 N_("Cities:"),
179 N_("Luxuries:"),
180 N_("Buildings:"),
181 N_("Nationality:"),
182 N_("Units:"),
183 N_("Wonders:"),
184 };
185 static bool happiness_label_str_done;
186
187 pdialog = fc_malloc(sizeof(struct happiness_dialog));
188 pdialog->pcity = pcity;
189
190 pdialog->shell = gtk_grid_new();
193
194 pdialog->cityname_label = gtk_frame_new(_("Happiness"));
195 gtk_grid_attach(GTK_GRID(pdialog->shell), pdialog->cityname_label, 0, 0, 1, 1);
196
203
206
208
209 for (i = 0; i < NUM_HAPPINESS_MODIFIERS; i++) {
210 GtkWidget *pic;
212
213 /* Set spacing between lines of citizens */
214
215 /* Happiness labels */
217 pdialog->happiness_label[i] = label;
218 gtk_widget_set_name(label, "city_label");
221
222 gtk_grid_attach(GTK_GRID(table), label, 0, i, 1, 1);
223
224 /* List of citizens */
229 pdialog->feeling_pics[i] = pic;
231 g_object_set_data(G_OBJECT(pic), "pdialog", pdialog);
232
234 g_signal_connect(controller, "pressed",
237
240
241 gtk_grid_attach(GTK_GRID(table), pic, 1, i, 1, 1);
242 }
243
244 /* TRANS: the width of this text defines the width of the city dialog.
245 * '%s' is either space or newline depending on screen real estate. */
246 fc_snprintf(buf, sizeof(buf),
247 _("Additional information is available%svia left "
248 "click on the citizens."), low_dlg ? "\n" : " ");
249 label = gtk_label_new(buf);
250 gtk_widget_set_name(label, "city_label");
254
258
259 pdialog->win = win;
260
261 return pdialog;
262}
263
264/**********************************************************************/
268 cairo_surface_t *dst, struct city *pcity,
269 enum citizen_feeling index)
270{
271 enum citizen_category categories[MAX_CITY_SIZE];
272 int i;
273 int num_citizens = get_city_citizen_types(pcity, index, categories);
275 cairo_t *cr;
276
277 cr = cairo_create(dst);
278
279 for (i = 0; i < num_citizens; i++) {
281 get_citizen_sprite(tileset, categories[i], i, pcity)->surface,
282 i * offset, 0);
283 cairo_rectangle(cr, i * offset, 0, offset, FEELING_HEIGHT);
284 cairo_fill(cr);
285 }
286
288
289 cairo_destroy(cr);
290}
291
292/**********************************************************************/
296{
297 int i;
299
300 for (i = 0; i < FEELING_LAST; i++) {
302 pdialog->feeling_surfaces[i], pdialog->pcity, i);
303 }
304}
305
306/**********************************************************************/
310{
312 int i;
313
314 if (pdialog == nullptr) {
315 /* City which is being investigated doesn't contain happiness tab */
316 return;
317 }
318
320
322
324 pdialog->shell);
325
326 for (i = 0; i < NUM_HAPPINESS_MODIFIERS; i++) {
328 }
329
330 free(pdialog);
331}
332
333/**********************************************************************/
citizen_category
Definition city.h:264
#define MAX_CITY_SIZE
Definition city.h:103
citizen_feeling
Definition city.h:275
@ FEELING_LAST
Definition city.h:282
int get_city_citizen_types(struct city *pcity, enum citizen_feeling idx, enum citizen_category *categories)
char * incite_cost
Definition comments.c:76
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
#define _(String)
Definition fcintl.h:67
#define N_(String)
Definition fcintl.h:69
void intl_slist(int n, const char **s, bool *done)
Definition gui_stuff.c:111
void happiness_dialog_init(void)
Definition happiness.c:86
#define FEELING_WIDTH
Definition happiness.c:45
void close_happiness_dialog(struct city *pcity)
Definition happiness.c:330
static struct happiness_dialog * get_happiness_dialog(struct city *pcity)
Definition happiness.c:102
void happiness_dialog_done(void)
Definition happiness.c:94
#define FEELING_HEIGHT
Definition happiness.c:46
static struct happiness_dialog * create_happiness_dialog(struct city *pcity, bool low_dlg, GtkWidget *win)
Definition happiness.c:198
#define dialog_list_iterate_end
Definition happiness.c:69
static gboolean show_happiness_popup(GtkWidget *w, GdkEventButton *ev, gpointer data)
Definition happiness.c:116
void refresh_happiness_dialog(struct city *pcity)
Definition happiness.c:317
#define dialog_list_iterate(dialoglist, pdialog)
Definition happiness.c:67
static struct dialog_list * dialog_list
Definition happiness.c:71
@ NATIONALITY
Definition happiness.c:50
@ UNITS
Definition happiness.c:50
@ BUILDINGS
Definition happiness.c:50
@ WONDERS
Definition happiness.c:50
@ CITIES
Definition happiness.c:50
@ LUXURIES
Definition happiness.c:50
GtkWidget * get_top_happiness_display(struct city *pcity, bool low_dlg, GtkWidget *win)
Definition happiness.c:356
static void refresh_feeling_surface(cairo_surface_t *dst, struct city *pcity, enum citizen_feeling index)
Definition happiness.c:292
#define NUM_HAPPINESS_MODIFIERS
Definition happiness.c:48
void picture_set_from_surface(GtkPicture *pic, cairo_surface_t *surf)
Definition sprite.c:544
#define NUM_HAPPINESS_MODIFIERS
Definition happiness.c:48
#define fc_malloc(sz)
Definition mem.h:34
const char * text_happiness_cities(const struct city *pcity)
Definition text.c:1947
#define ARRAY_SIZE(x)
Definition shared.h:85
#define MIN(x, y)
Definition shared.h:55
struct sprite int int y
Definition sprite_g.h:31
struct sprite int x
Definition sprite_g.h:31
Definition city.h:317
GtkWidget * win
Definition happiness.c:54
GtkWidget * cityname_label
Definition happiness.c:56
struct city * pcity
Definition happiness.c:53
GtkWidget * happiness_label[NUM_HAPPINESS_MODIFIERS]
Definition happiness.c:59
GtkWidget * shell
Definition happiness.c:55
cairo_surface_t * feeling_surfaces[NUM_HAPPINESS_MODIFIERS]
Definition happiness.c:57
GtkWidget * close
Definition happiness.c:60
GtkWidget * feeling_pics[NUM_HAPPINESS_MODIFIERS]
Definition happiness.c:57
int fc_snprintf(char *str, size_t n, const char *format,...)
Definition support.c:960
#define sz_strlcpy(dest, src)
Definition support.h:195
#define TRUE
Definition support.h:46
#define FALSE
Definition support.h:47
const char * text_happiness_nationality(const struct city *pcity)
Definition text.c:1875
const char * text_happiness_wonders(const struct city *pcity)
Definition text.c:1917
const char * text_happiness_units(const struct city *pcity)
Definition text.c:2081
const char * text_happiness_luxuries(const struct city *pcity)
Definition text.c:2120
const char * text_happiness_buildings(const struct city *pcity)
Definition text.c:1847
int tileset_small_sprite_width(const struct tileset *t)
Definition tilespec.c:927
struct sprite * get_citizen_sprite(const struct tileset *t, enum citizen_category type, int citizen_index, const struct city *pcity)
Definition tilespec.c:6946