1891
1913
playing_group = get_playing_group();
1892
1914
player_group = get_player_group();
1894
menus_set_active(safe_group, "SAVE_OPTIONS_ON_EXIT", save_options_on_exit);
1895
menus_set_sensitive(safe_group, "SERVER_OPTIONS", client.conn.established);
1897
menus_set_sensitive(safe_group, "GAME_SAVE_AS",
1898
can_client_access_hack()
1899
&& C_S_RUNNING <= client_state());
1900
menus_set_sensitive(safe_group, "GAME_SAVE",
1901
can_client_access_hack()
1902
&& C_S_RUNNING <= client_state());
1903
menus_set_sensitive(safe_group, "LEAVE",
1904
client.conn.established);
1906
if (!can_client_change_view()) {
1907
gtk_action_group_set_sensitive(safe_group, FALSE);
1908
gtk_action_group_set_sensitive(edit_group, FALSE);
1909
gtk_action_group_set_sensitive(unit_group, FALSE);
1910
gtk_action_group_set_sensitive(player_group, FALSE);
1911
gtk_action_group_set_sensitive(playing_group, FALSE);
1915
1916
if (get_num_units_in_focus() > 0) {
1916
1917
const struct tile *ptile = NULL;
1918
const struct unit_type *ptype = NULL;
1917
1919
punits = get_units_in_focus();
1918
1920
unit_list_iterate(punits, punit) {
1921
fc_assert((ptile==NULL) == (ptype==NULL));
1922
if (ptile || ptype) {
1920
1923
if (punit->tile != ptile) {
1921
1924
units_all_same_tile = FALSE;
1926
if (unit_type(punit) != ptype) {
1927
units_all_same_type = FALSE;
1925
1930
ptile = punit->tile;
1931
ptype = unit_type(punit);
1927
1933
} unit_list_iterate_end;
1930
if ((menu = find_action_menu(playing_group, "MENU_GOVERNMENT"))) {
1932
GtkWidget *item, *image;
1933
struct sprite *gsprite;
1936
/* Remove previous government entries. */
1937
list = gtk_container_get_children(GTK_CONTAINER(menu));
1938
for (iter = list; iter; iter = g_list_next(iter)) {
1939
if (g_object_get_data(G_OBJECT(iter->data), "government") != NULL
1940
|| GTK_IS_SEPARATOR_MENU_ITEM(iter->data)) {
1941
gtk_widget_destroy(GTK_WIDGET(iter->data));
1946
/* Add new government entries. */
1947
item = gtk_separator_menu_item_new();
1948
gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1949
gtk_widget_show(item);
1951
government_iterate(g) {
1952
if (g != game.government_during_revolution) {
1953
/* TRANS: %s is a government name */
1954
my_snprintf(buf, sizeof(buf), _("%s..."),
1955
government_name_translation(g));
1956
item = gtk_image_menu_item_new_with_label(buf);
1957
g_object_set_data(G_OBJECT(item), "government", g);
1959
if ((gsprite = get_government_sprite(tileset, g))) {
1960
image = gtk_image_new_from_pixbuf(sprite_get_pixbuf(gsprite));
1961
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image);
1962
gtk_widget_show(image);
1965
g_signal_connect(item, "activate",
1966
G_CALLBACK(government_callback), g);
1968
if (!can_change_to_government(client.conn.playing, g)) {
1969
gtk_widget_set_sensitive(item, FALSE);
1972
gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1973
gtk_widget_show(item);
1975
} government_iterate_end;
1978
if ((menu = find_action_menu(unit_group, "MENU_BUILD_BASE"))) {
1982
/* Remove previous base entries. */
1983
list = gtk_container_get_children(GTK_CONTAINER(menu));
1984
for (iter = list; iter; iter = g_list_next(iter)) {
1985
gtk_widget_destroy(GTK_WIDGET(iter->data));
1989
/* Add new base entries. */
1990
base_type_iterate(p) {
1992
item = gtk_menu_item_new_with_label(base_name_translation(p));
1994
g_signal_connect(item, "activate", G_CALLBACK(base_callback), p);
1997
gtk_widget_set_sensitive(item, can_units_do_base(punits,
2001
gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
2002
gtk_widget_show(item);
2004
} base_type_iterate_end;
2007
gtk_action_group_set_sensitive(safe_group, TRUE);
2008
1936
gtk_action_group_set_sensitive(edit_group,
2009
1937
editor_is_active());
2010
gtk_action_group_set_sensitive(player_group, client_has_player());
2011
1938
gtk_action_group_set_sensitive(playing_group, can_client_issue_orders()
2012
1939
&& !editor_is_active());
2013
1940
gtk_action_group_set_sensitive(unit_group, can_client_issue_orders()
2014
1941
&& !editor_is_active() && punits != NULL);
2016
menus_set_sensitive(playing_group, "TAX_RATE",
2017
game.info.changable_tax
2018
&& can_client_issue_orders());
2020
1943
menus_set_active(safe_group, "EDIT_MODE", game.info.is_edit_mode);
2021
1944
menus_set_sensitive(safe_group, "EDIT_MODE",
2022
1945
can_conn_enable_editing(&client.conn));
2023
1946
editgui_refresh();
2025
menus_set_active(safe_group, "SHOW_CITY_OUTLINES", draw_city_outlines);
2026
menus_set_active(safe_group, "SHOW_CITY_OUTPUT", draw_city_output);
2027
menus_set_active(safe_group, "SHOW_MAP_GRID", draw_map_grid);
2028
menus_set_active(safe_group, "SHOW_NATIONAL_BORDERS", draw_borders);
2029
menus_set_sensitive(safe_group, "SHOW_NATIONAL_BORDERS",
2030
game.info.borders > 0);
2031
menus_set_active(safe_group, "SHOW_CITY_FULL_BAR", draw_full_citybar);
2032
menus_set_active(safe_group, "SHOW_CITY_NAMES", draw_city_names);
2033
menus_set_active(safe_group, "SHOW_CITY_GROWTH", draw_city_growth);
2034
menus_set_active(safe_group, "SHOW_CITY_PRODUCTIONS",
2035
draw_city_productions);
2036
menus_set_active(safe_group, "SHOW_CITY_BUY_COST", draw_city_buycost);
2037
menus_set_active(safe_group, "SHOW_CITY_TRADE_ROUTES",
2038
draw_city_trade_routes);
2039
menus_set_active(safe_group, "SHOW_TERRAIN", draw_terrain);
2040
menus_set_active(safe_group, "SHOW_COASTLINE", draw_coastline);
2041
menus_set_active(safe_group, "SHOW_ROADS_RAILS", draw_roads_rails);
2042
menus_set_active(safe_group, "SHOW_IRRIGATION", draw_irrigation);
2043
menus_set_active(safe_group, "SHOW_MINES", draw_mines);
2044
menus_set_active(safe_group, "SHOW_FORTRESS_AIRBASE",
2045
draw_fortress_airbase);
2046
menus_set_active(safe_group, "SHOW_SPECIALS", draw_specials);
2047
menus_set_active(safe_group, "SHOW_POLLUTION", draw_pollution);
2048
menus_set_active(safe_group, "SHOW_CITIES", draw_cities);
2049
menus_set_active(safe_group, "SHOW_UNITS", draw_units);
2050
menus_set_active(safe_group, "SHOW_UNIT_SOLID_BG",
2051
solid_color_behind_units);
2052
menus_set_active(safe_group, "SHOW_UNIT_SHIELDS", draw_unit_shields);
2053
menus_set_active(safe_group, "SHOW_FOCUS_UNIT", draw_focus_unit);
2054
menus_set_active(safe_group, "SHOW_FOG_OF_WAR", draw_fog_of_war);
2055
if (tileset_use_hard_coded_fog(tileset)) {
2056
menus_set_visible(safe_group, "SHOW_BETTER_FOG_OF_WAR", TRUE, TRUE);
2057
menus_set_active(safe_group, "SHOW_BETTER_FOG_OF_WAR",
2058
gui_gtk2_better_fog);
2060
menus_set_visible(safe_group, "SHOW_BETTER_FOG_OF_WAR", FALSE, FALSE);
2063
view_menu_update_sensitivity();
2065
menus_set_active(safe_group, "FULL_SCREEN", fullscreen_mode);
1948
if (!can_client_issue_orders()) {
1952
/* Set government sensitivity. */
1953
if ((menu = find_action_menu(playing_group, "MENU_GOVERNMENT"))) {
1955
struct government *pgov;
1957
list = gtk_container_get_children(GTK_CONTAINER(menu));
1958
for (iter = list; NULL != iter; iter = g_list_next(iter)) {
1959
pgov = g_object_get_data(G_OBJECT(iter->data), "government");
1961
gtk_widget_set_sensitive(GTK_WIDGET(iter->data),
1962
can_change_to_government(client_player(),
2067
1973
/* Remaining part of this function: Update Unit, Work, and Combat menus */
2069
if (!can_client_issue_orders() || !punits) {
1975
/* Set base sensitivity. */
1976
if ((menu = find_action_menu(unit_group, "MENU_BUILD_BASE"))) {
1978
struct base_type *pbase;
1980
list = gtk_container_get_children(GTK_CONTAINER(menu));
1981
for (iter = list; NULL != iter; iter = g_list_next(iter)) {
1982
pbase = g_object_get_data(G_OBJECT(iter->data), "base");
1983
if (NULL != pbase) {
1984
gtk_widget_set_sensitive(GTK_WIDGET(iter->data),
1985
can_units_do_base(punits,
1986
base_number(pbase)));
2073
1992
/* Enable the button for adding to a city in all cases, so we
2074
1993
* get an eventual error message from the server if we try. */
2075
1994
menus_set_sensitive(unit_group, "BUILD_CITY",
2076
(can_units_do(punits, can_unit_add_or_build_city)
1995
(can_units_do(punits, unit_can_add_or_build_city)
2077
1996
|| can_units_do(punits, unit_can_help_build_wonder_here)));
2078
1997
menus_set_sensitive(unit_group, "GO_BUILD_CITY",
2079
1998
units_have_flag(punits, F_CITIES, TRUE));
2181
2101
menus_rename(unit_group, "BUILD_ROAD", _("Build _Road"));
2104
if (units_all_same_type) {
2105
struct unit *punit = unit_list_get(punits, 0);
2106
struct unit_type *to_unittype =
2107
can_upgrade_unittype(client_player(), unit_type(punit));
2109
/* TRANS: %s is a unit type. */
2110
fc_snprintf(acttext, sizeof(acttext), _("Upgr_ade to %s"),
2111
utype_name_translation(
2112
can_upgrade_unittype(client_player(), unit_type(punit))));
2119
if ('\0' != acttext[0]) {
2120
menus_rename(unit_group, "UNIT_UPGRADE", acttext);
2122
menus_rename(unit_group, "UNIT_UPGRADE", _("Upgr_ade"));
2125
if (units_can_convert(punits)) {
2126
menus_set_sensitive(unit_group, "UNIT_CONVERT", TRUE);
2127
if (units_all_same_type) {
2128
struct unit *punit = unit_list_get(punits, 0);
2129
/* TRANS: %s is a unit type. */
2130
fc_snprintf(acttext, sizeof(acttext), _("C_onvert to %s"),
2131
utype_name_translation(unit_type(punit)->converted_to));
2136
menus_set_sensitive(unit_group, "UNIT_CONVERT", FALSE);
2139
if ('\0' != acttext[0]) {
2140
menus_rename(unit_group, "UNIT_CONVERT", acttext);
2142
menus_rename(unit_group, "UNIT_CONVERT", _("C_onvert"));
2184
2145
if (units_all_same_tile) {
2185
2146
struct unit *punit = unit_list_get(punits, 0);
2187
2148
pterrain = tile_terrain(punit->tile);
2188
2149
if (pterrain->irrigation_result != T_NONE
2189
2150
&& pterrain->irrigation_result != pterrain) {
2190
my_snprintf(irrtext, sizeof(irrtext), _("Change to %s (_I)"),
2151
fc_snprintf(irrtext, sizeof(irrtext), _("Change to %s"),
2191
2152
get_tile_change_menu_text(punit->tile,
2192
2153
ACTIVITY_IRRIGATE));
2193
2154
} else if (tile_has_special(punit->tile, S_IRRIGATION)
2236
2197
menus_rename(unit_group, "CLEAN_POLLUTION", _("Clean _Pollution"));
2242
/****************************************************************
2244
*****************************************************************/
2245
void update_menus(void)
2201
/**************************************************************************
2202
Initialize menus (sensitivity, name, etc.) based on the
2203
current state and current ruleset, etc. Call menus_update().
2204
**************************************************************************/
2205
void real_menus_init(void)
2247
static guint callback_id = 0;
2249
if (NULL != ui_manager && 0 == callback_id) {
2250
callback_id = g_idle_add(update_menus_callback, &callback_id);
2207
GtkActionGroup *safe_group;
2208
GtkActionGroup *edit_group;
2209
GtkActionGroup *unit_group;
2210
GtkActionGroup *playing_group;
2211
GtkActionGroup *player_group;
2214
if (NULL == ui_manager) {
2218
safe_group = get_safe_group();
2219
edit_group = get_edit_group();
2220
unit_group = get_unit_group();
2221
playing_group = get_playing_group();
2222
player_group = get_player_group();
2224
menus_set_sensitive(safe_group, "GAME_SAVE_AS",
2225
can_client_access_hack()
2226
&& C_S_RUNNING <= client_state());
2227
menus_set_sensitive(safe_group, "GAME_SAVE",
2228
can_client_access_hack()
2229
&& C_S_RUNNING <= client_state());
2231
menus_set_active(safe_group, "SAVE_OPTIONS_ON_EXIT", save_options_on_exit);
2232
menus_set_sensitive(safe_group, "SERVER_OPTIONS", client.conn.established);
2234
menus_set_sensitive(safe_group, "LEAVE",
2235
client.conn.established);
2237
if (!can_client_change_view()) {
2238
gtk_action_group_set_sensitive(safe_group, FALSE);
2239
gtk_action_group_set_sensitive(edit_group, FALSE);
2240
gtk_action_group_set_sensitive(unit_group, FALSE);
2241
gtk_action_group_set_sensitive(player_group, FALSE);
2242
gtk_action_group_set_sensitive(playing_group, FALSE);
2246
if ((menu = find_action_menu(playing_group, "MENU_GOVERNMENT"))) {
2248
GtkWidget *item, *image;
2249
struct sprite *gsprite;
2252
/* Remove previous government entries. */
2253
list = gtk_container_get_children(GTK_CONTAINER(menu));
2254
for (iter = list; NULL != iter; iter = g_list_next(iter)) {
2255
if (g_object_get_data(G_OBJECT(iter->data), "government") != NULL
2256
|| GTK_IS_SEPARATOR_MENU_ITEM(iter->data)) {
2257
gtk_widget_destroy(GTK_WIDGET(iter->data));
2262
/* Add new government entries. */
2263
item = gtk_separator_menu_item_new();
2264
gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
2265
gtk_widget_show(item);
2267
governments_iterate(g) {
2268
if (g != game.government_during_revolution) {
2269
/* TRANS: %s is a government name */
2270
fc_snprintf(buf, sizeof(buf), _("%s..."),
2271
government_name_translation(g));
2272
item = gtk_image_menu_item_new_with_label(buf);
2273
g_object_set_data(G_OBJECT(item), "government", g);
2275
if ((gsprite = get_government_sprite(tileset, g))) {
2276
image = gtk_image_new_from_pixbuf(sprite_get_pixbuf(gsprite));
2277
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image);
2278
gtk_widget_show(image);
2281
g_signal_connect(item, "activate",
2282
G_CALLBACK(government_callback), g);
2283
gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
2284
gtk_widget_show(item);
2286
} governments_iterate_end;
2289
if ((menu = find_action_menu(unit_group, "MENU_BUILD_BASE"))) {
2293
/* Remove previous base entries. */
2294
list = gtk_container_get_children(GTK_CONTAINER(menu));
2295
for (iter = list; NULL != iter; iter = g_list_next(iter)) {
2296
gtk_widget_destroy(GTK_WIDGET(iter->data));
2300
/* Add new base entries. */
2301
base_type_iterate(p) {
2303
item = gtk_menu_item_new_with_label(base_name_translation(p));
2304
g_object_set_data(G_OBJECT(item), "base", p);
2305
g_signal_connect(item, "activate", G_CALLBACK(base_callback), p);
2306
gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
2307
gtk_widget_show(item);
2309
} base_type_iterate_end;
2312
gtk_action_group_set_sensitive(safe_group, TRUE);
2313
gtk_action_group_set_sensitive(player_group, client_has_player());
2315
menus_set_sensitive(playing_group, "TAX_RATE",
2316
game.info.changable_tax
2317
&& can_client_issue_orders());
2319
menus_set_active(safe_group, "SHOW_CITY_OUTLINES", draw_city_outlines);
2320
menus_set_active(safe_group, "SHOW_CITY_OUTPUT", draw_city_output);
2321
menus_set_active(safe_group, "SHOW_MAP_GRID", draw_map_grid);
2322
menus_set_active(safe_group, "SHOW_NATIONAL_BORDERS", draw_borders);
2323
menus_set_sensitive(safe_group, "SHOW_NATIONAL_BORDERS",
2324
BORDERS_DISABLED != game.info.borders);
2325
menus_set_active(safe_group, "SHOW_CITY_FULL_BAR", draw_full_citybar);
2326
menus_set_active(safe_group, "SHOW_CITY_NAMES", draw_city_names);
2327
menus_set_active(safe_group, "SHOW_CITY_GROWTH", draw_city_growth);
2328
menus_set_active(safe_group, "SHOW_CITY_PRODUCTIONS",
2329
draw_city_productions);
2330
menus_set_active(safe_group, "SHOW_CITY_BUY_COST", draw_city_buycost);
2331
menus_set_active(safe_group, "SHOW_CITY_TRADE_ROUTES",
2332
draw_city_trade_routes);
2333
menus_set_active(safe_group, "SHOW_TERRAIN", draw_terrain);
2334
menus_set_active(safe_group, "SHOW_COASTLINE", draw_coastline);
2335
menus_set_active(safe_group, "SHOW_ROADS_RAILS", draw_roads_rails);
2336
menus_set_active(safe_group, "SHOW_IRRIGATION", draw_irrigation);
2337
menus_set_active(safe_group, "SHOW_MINES", draw_mines);
2338
menus_set_active(safe_group, "SHOW_FORTRESS_AIRBASE",
2339
draw_fortress_airbase);
2340
menus_set_active(safe_group, "SHOW_SPECIALS", draw_specials);
2341
menus_set_active(safe_group, "SHOW_POLLUTION", draw_pollution);
2342
menus_set_active(safe_group, "SHOW_CITIES", draw_cities);
2343
menus_set_active(safe_group, "SHOW_UNITS", draw_units);
2344
menus_set_active(safe_group, "SHOW_UNIT_SOLID_BG",
2345
solid_color_behind_units);
2346
menus_set_active(safe_group, "SHOW_UNIT_SHIELDS", draw_unit_shields);
2347
menus_set_active(safe_group, "SHOW_FOCUS_UNIT", draw_focus_unit);
2348
menus_set_active(safe_group, "SHOW_FOG_OF_WAR", draw_fog_of_war);
2349
if (tileset_use_hard_coded_fog(tileset)) {
2350
menus_set_visible(safe_group, "SHOW_BETTER_FOG_OF_WAR", TRUE, TRUE);
2351
menus_set_active(safe_group, "SHOW_BETTER_FOG_OF_WAR",
2352
gui_gtk2_better_fog);
2354
menus_set_visible(safe_group, "SHOW_BETTER_FOG_OF_WAR", FALSE, FALSE);
2357
view_menu_update_sensitivity();
2359
menus_set_active(safe_group, "FULL_SCREEN", fullscreen_mode);