Freeciv-3.2
Loading...
Searching...
No Matches
menu.cpp
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// Qt
19#include <QActionGroup>
20#include <QApplication>
21#include <QFileDialog>
22#include <QMainWindow>
23#include <QMessageBox>
24#include <QScrollArea>
25#include <QStandardPaths>
26#include <QVBoxLayout>
27
28// utility
29#include "string_vector.h"
30
31// common
32#include "game.h"
33#include "government.h"
34#include "goto.h"
35#include "name_translation.h"
36#include "road.h"
37#include "unit.h"
38
39// client
40#include "connectdlg_common.h"
41#include "control.h"
42#include "helpdata.h"
43
44// gui-qt
45#include "fc_client.h"
46#include "chatline.h"
47#include "cityrep.h"
48#include "dialogs.h"
49#include "gotodlg.h"
50#include "gui_main.h"
51#include "hudwidget.h"
52#include "mapctrl.h"
53#include "messagedlg.h"
54#include "plrdlg.h"
55#include "ratesdlg.h"
56#include "repodlgs.h"
57#include "shortcuts.h"
58#include "spaceshipdlg.h"
59#include "sprite.h"
60
61#include "menu.h"
62
63static void enable_interface(bool enable);
64
65/**********************************************************************/
69{
70 city = pcity;
71 tile = nullptr;
72 trade_num = 0;
74}
75
76/**********************************************************************/
83
84/**********************************************************************/
88{
89 int i, s;
90 struct city *pcity;
93 if (s == 0) {
94 return;
95 }
96 for (i = 0; i < s; i++) {
98 add_city(pcity);
99 }
100}
101
102/**********************************************************************/
106{
107 struct city *pcity;
108 trade_city *tc;
109
110 foreach(pcity, virtual_cities) {
112 }
113 virtual_cities.clear();
114 foreach(tc, cities) {
115 delete tc;
116 }
117 cities.clear();
118 lines.clear();
119 gui()->mapview_wdg->repaint();
120}
121
122/**********************************************************************/
126{
127 trade_city *tc = new trade_city(pcity);
128
129 cities.append(tc);
130 gui()->infotab->chtwdg->append(QString(_("Adding city %1 to trade planning"))
131 .arg(tc->city->name));
132}
133
134/**********************************************************************/
138{
139 struct city *pcity;
140 trade_city *tc;
141
142 pcity = tile_city(ptile);
143
144 foreach (tc, cities) {
145 if (pcity != nullptr) {
146 if (tc->city == pcity) {
147 remove_city(pcity);
148 return;
149 }
150 }
151 if (tc->city->tile == ptile) {
152 remove_virtual_city(ptile);
153 return;
154 }
155 }
156
157 if (pcity != nullptr) {
158 add_city(pcity);
159 return;
160 }
161
162 pcity = create_city_virtual(client_player(), ptile, "Virtual");
163 add_city(pcity);
164 virtual_cities.append(pcity);
165}
166
167/**********************************************************************/
171{
172 trade_city *tc;
173
174 foreach (tc, cities) {
175 if (tc->city->tile == pcity->tile) {
176 cities.removeAll(tc);
177 gui()->infotab->chtwdg->append(
178 QString(_("Removing city %1 from trade planning"))
179 .arg(tc->city->name));
180 return;
181 }
182 }
183}
184
185/**********************************************************************/
189{
190 struct city *c;
191 trade_city *tc;
192
193 foreach (c, virtual_cities) {
194 if (c->tile == ptile) {
195 virtual_cities.removeAll(c);
196 gui()->infotab->chtwdg->append(
197 QString(_("Removing city %1 from trade planning")).arg(c->name));
198 }
199 }
200
201 foreach (tc, cities) {
202 if (tc->city->tile == ptile) {
203 cities.removeAll(tc);
204 return;
205 }
206 }
207}
208
209/**********************************************************************/
215{
217
218 foreach (ttc, cities) {
219 if (!have_cities_trade_route(tc->city, ttc->city)
220 && can_establish_trade_route(tc->city, ttc->city)) {
221 tc->poss_trade_num++;
222 tc->pos_cities.append(ttc->city);
223 }
224 tc->over_max = tc->trade_num + tc->poss_trade_num
225 - max_trade_routes(tc->city);
226 }
227}
228
229/**********************************************************************/
233{
234 trade_city *tc;
235 int i;
236 bool tdone;
237 int count = cities.size();
238 int *cities_ids = (int *)fc_malloc(sizeof(int) * count);
239 trade_city **cities_order = (trade_city **)fc_malloc(sizeof(trade_city *) * count);
240
241 for (i = 0; i < 100; i++) {
242 int n;
243
244 tdone = true;
245
246 for (n = 0; n < count; n++) {
247 cities_ids[n] = n;
249 }
251
252 cities.clear();
253 for (n = 0; n < count; n++) {
255 }
256
257 lines.clear();
258 foreach (tc, cities) {
259 tc->pos_cities.clear();
260 tc->new_tr_cities.clear();
261 tc->curr_tr_cities.clear();
262 }
263 foreach (tc, cities) {
265 tc->poss_trade_num = 0;
266 tc->pos_cities.clear();
267 tc->new_tr_cities.clear();
268 tc->curr_tr_cities.clear();
269 tc->done = false;
270 calculate_inner(tc);
271 }
272
274 discard();
276
277 foreach (tc, cities) {
278 if (!tc->done) {
279 tdone = false;
280 }
281 }
282 if (tdone) {
283 break;
284 }
285 }
286 foreach (tc, cities) {
287 if (!tc->done) {
288 char text[1024];
289 fc_snprintf(text, sizeof(text),
290 PL_("City %s - 1 free trade route.",
291 "City %s - %d free trade routes.",
292 max_trade_routes(tc->city) - tc->trade_num),
293 city_link(tc->city),
294 max_trade_routes(tc->city) - tc->trade_num);
296 }
297 }
298
301
302 gui()->mapview_wdg->repaint();
303}
304
305/**********************************************************************/
309int trade_generator::find_over_max(struct city *pcity = nullptr)
310{
311 trade_city *tc;
312 int max = 0;
313
314 foreach (tc, cities) {
315 if (pcity != tc->city) {
316 max = qMax(max, tc->over_max);
317 }
318 }
319 return max;
320}
321
322/**********************************************************************/
326{
327 trade_city *tc;
328 trade_city *rc = nullptr;
329 int max = 0;
330
331 foreach (tc, cities) {
332 if (max < tc->over_max) {
333 max = tc->over_max;
334 rc = tc;
335 }
336 }
337 return rc;
338}
339
340/**********************************************************************/
344{
345 trade_city *tc;
346 int j = 5;
347
348 for (int i = j; i > -j; i--) {
349 while ((tc = find_most_free())) {
350 if (!discard_one(tc)) {
351 if (!discard_any(tc, i)) {
352 break;
353 }
354 }
355 }
356 }
357}
358
359/**********************************************************************/
363{
364 tc->pos_cities.removeOne(ttc->city);
365 ttc->pos_cities.removeOne(tc->city);
366 tc->poss_trade_num--;
367 ttc->poss_trade_num--;
368 tc->over_max--;
369 ttc->over_max--;
370 check_if_done(tc, ttc);
371}
372
373/**********************************************************************/
377{
378 int best = 0;
379 int current_candidate = 0;
380 int best_id;
382
383 for (int i = cities.size() - 1 ; i >= 0; i--) {
384 ttc = cities.at(i);
386 if (current_candidate > best) {
387 best_id = i;
388 }
389 }
390 if (best == 0) {
391 return false;
392 }
393
394 ttc = cities.at(best_id);
395 discard_trade(tc, ttc);
396 return true;
397}
398
399/**********************************************************************/
403{
405
406 for (int i = cities.size() - 1 ; i >= 0; i--) {
407 ttc = cities.at(i);
408 if (tc->pos_cities.contains(ttc->city)
409 && ttc->pos_cities.contains(tc->city)
410 && ttc->over_max > freeroutes) {
411 discard_trade(tc, ttc);
412 return true;
413 }
414 }
415 return false;
416}
417
418/**********************************************************************/
424{
426
427 foreach (ttc, cities) {
428 if (ttc->done || ttc->over_max > 0
429 || tc == ttc || tc->done || tc->over_max > 0) {
430 continue;
431 }
432 if (tc->pos_cities.contains(ttc->city)
433 && ttc->pos_cities.contains(tc->city)) {
434 struct qtiles gilles;
435
436 tc->pos_cities.removeOne(ttc->city);
437 ttc->pos_cities.removeOne(tc->city);
438 tc->poss_trade_num--;
439 ttc->poss_trade_num--;
440 tc->new_tr_cities.append(ttc->city);
441 ttc->new_tr_cities.append(ttc->city);
442 tc->trade_num++;
443 ttc->trade_num++;
444 tc->over_max--;
445 ttc->over_max--;
446 check_if_done(tc, ttc);
447 gilles.t1 = tc->city->tile;
448 gilles.t2 = ttc->city->tile;
449 gilles.autocaravan = nullptr;
450 lines.append(gilles);
451 }
452 }
453}
454
455/**********************************************************************/
459{
460 trade_city *tc;
461
462 foreach (tc, cities) {
463 if (tc->done || tc->over_max > 0) {
464 continue;
465 }
467 }
468}
469
470/**********************************************************************/
474{
475 if (tc1->trade_num == max_trade_routes(tc1->city)) {
476 tc1->done = true;
477 }
478 if (tc2->trade_num == max_trade_routes(tc2->city)) {
479 tc2->done = true;
480 }
481}
482
483/**********************************************************************/
489
490/**********************************************************************/
497
498/**********************************************************************/
502{
503 unit_list.clear();
504}
505
506/**********************************************************************/
511{
513 return;
514 }
515 gui()->menu_bar->clear();
516 gui()->menu_bar->setup_menus();
517
519
520 // A new ruleset may have been loaded.
522}
523
524/**********************************************************************/
529{
530 if (C_S_RUNNING <= client_state()) {
531 gui()->menuBar()->setVisible(true);
532 if (!is_waiting_turn_change()) {
533 gui()->menu_bar->menus_sensitive();
534 gui()->menu_bar->update_airlift_menu();
535 gui()->menu_bar->update_roads_menu();
536 gui()->menu_bar->update_bases_menu();
539 gui()->unitinfo_wdg->update_actions(nullptr);
540 }
541 } else {
542 gui()->menuBar()->setVisible(false);
543 }
544}
545
546/**********************************************************************/
551static const char *get_tile_change_menu_text(struct tile *ptile,
552 enum unit_activity activity)
553{
554 struct tile *newtile = tile_virtual_new(ptile);
555 const char *text;
556
557 tile_apply_activity(newtile, activity, NULL);
558 text = tile_get_info_text(newtile, FALSE, 0);
560
561 return text;
562}
563
564/**********************************************************************/
568 QMenu(_("Government"), parent)
569{
570 // Register ourselves to get updates for free.
571 instances << this;
572 setAttribute(Qt::WA_TranslucentBackground);
573}
574
575/**********************************************************************/
579{
581 instances.remove(this);
582}
583
584/**********************************************************************/
589 struct government *gov, *revol_gov;
590 int gov_count, i;
591
592 // Clear any content
593 foreach(action, QWidget::actions()) {
595 action->deleteLater();
596 }
597 actions.clear();
598
600 actions.reserve(gov_count + 1);
601 action = addAction(_("Revolution..."));
602 connect(action, &QAction::triggered, this, &gov_menu::revolution);
603 actions.append(action);
604
605 addSeparator();
606
607 // Add an action for each government. There is no icon yet.
609 for (i = 0; i < gov_count; ++i) {
610 gov = government_by_number(i);
611 if (gov != revol_gov) { // Skip revolution government
612 // Defeat keyboard shortcut mnemonics
614 .replace("&", "&&"));
615 // We need to keep track of the gov <-> action mapping to be able to
616 // set enabled/disabled depending on available govs.
617 actions.append(action);
618 QObject::connect(action, &QAction::triggered, [this,i]() {
619 change_gov(i);
620 });
621 }
622 }
623}
624
625/**********************************************************************/
629{
630 struct government *gov, *revol_gov;
631 struct sprite *sprite;
632 int gov_count, i, j;
633
636 for (i = 0, j = 0; i < gov_count; i++) {
637 gov = government_by_number(i);
638 if (gov != revol_gov) { // Skip revolution government
640 if (sprite != NULL) {
641 actions[j + 1]->setIcon(QIcon(*(sprite->pm)));
642 }
643 actions[j + 1]->setEnabled(
645 j++;
646 } else {
647 actions[0]->setEnabled(!client_is_observer()
649 }
650 }
651}
652
653/**********************************************************************/
660
661/**********************************************************************/
668
669/**************************************************************************
670 Keeps track of all gov_menu instances.
671**************************************************************************/
673
674/**********************************************************************/
678{
679 foreach (gov_menu *m, instances) {
680 m->create();
681 }
682}
683
684/**********************************************************************/
688{
689 foreach (gov_menu *m, instances) {
690 m->update();
691 }
692}
693
694/**********************************************************************/
698 : QMenu(_("Go to and..."), parent)
699{
700 // Will need auto updates etc.
701 instances << this;
702}
703
704/**********************************************************************/
708{
709 // Updates are no longer needed.
710 instances.remove(this);
711}
712
713/**********************************************************************/
717{
718 // Clear menu item to action ID mapping.
719 items.clear();
720
721 // Remove the menu items
722 clear();
723}
724
725/**********************************************************************/
729{
730 QAction *item;
731 int tgt_kind_group;
732
733 // Group goto and perform action menu items by target kind.
735 action_iterate(act_id) {
736 struct action *paction = action_by_number(act_id);
738 .replace("&", "&&"));
739
740 if (action_id_get_actor_kind(act_id) != AAK_UNIT) {
741 // This action isn't performed by an unit.
742 continue;
743 }
744
746 // Wrong group.
747 continue;
748 }
749
750 if (action_id_has_complex_target(act_id)) {
752 items.insert(sub_target_menu->menuAction(), act_id);
753
754#define CREATE_SUB_ITEM(_menu_, _act_id_, _sub_tgt_id_, _sub_tgt_name_) \
755 { \
756 QAction *_sub_item_ = _menu_->addAction(_sub_tgt_name_); \
757 int _sub_target_id_ = _sub_tgt_id_; \
758 QObject::connect(_sub_item_, &QAction::triggered, \
759 [this, _act_id_, _sub_target_id_]() { \
760 start_go_act(_act_id_, _sub_target_id_); \
761 }); \
762 }
763
765 case ASTK_BUILDING:
771 break;
772 case ASTK_TECH:
778 break;
779 case ASTK_EXTRA:
781 extra_type_iterate(pextra) {
782 if (!actres_creates_extra(paction->result, pextra)
783 && !actres_removes_extra(paction->result, pextra)) {
784 // Not relevant
785 continue;
786 }
787
789 extra_number(pextra),
790 extra_name_translation(pextra));
792 break;
793 case ASTK_NONE:
794 // Should not be here.
796 break;
797 case ASTK_COUNT:
798 // Should not exits
800 break;
801 }
802 continue;
803 }
804
805#define ADD_OLD_SHORTCUT(wanted_action_id, sc_id) \
806 if (act_id == wanted_action_id) { \
807 item->setShortcut(QKeySequence(shortcut_to_string( \
808 fc_shortcuts::sc()->get_shortcut(sc_id)))); \
809 }
810
811 /* Create and add the menu item. It will be hidden or shown based on
812 * unit type. */
814 items.insert(item, act_id);
815
816 /* Add the keyboard shortcuts for "Go to and..." menu items that
817 * existed independently before the "Go to and..." menu arrived. */
821
822 QObject::connect(item, &QAction::triggered, [this,act_id]() {
823 start_go_act(act_id, NO_TARGET);
824 });
826 }
827}
828
829/**********************************************************************/
833{
834 bool can_do_something = false;
835
836 if (!actions_are_ready()) {
837 // Nothing to do.
838 return;
839 }
840
841 if (items.isEmpty()) {
842 // The goto and act menu needs menu items.
843 create();
844 }
845
846 /* Enable a menu item if it is theoretically possible that one of the
847 * selected units can perform it. Checking if the action can be performed
848 * at the current tile is pointless since it should be performed at the
849 * target tile. */
850 foreach(QAction *item, items.keys()) {
852 items.value(item), TRUE)) {
853 item->setVisible(true);
854 can_do_something = true;
855 } else {
856 item->setVisible(false);
857 }
858 }
859
860 if (can_do_something) {
861 // At least one menu item is enabled for one of the selected units.
862 setEnabled(true);
863 } else {
864 // No menu item is enabled any of the selected units.
865 setEnabled(false);
866 }
867}
868
869/**********************************************************************/
872void go_act_menu::start_go_act(int act_id, int sub_tgt_id)
873{
874 request_unit_goto(ORDER_PERFORM_ACTION, act_id, sub_tgt_id);
875}
876
877/**************************************************************************
878 Store all goto and act menu items so they can be updated etc
879**************************************************************************/
881
882/**********************************************************************/
886{
887 foreach (go_act_menu *m, instances) {
888 m->reset();
889 }
890}
891
892/**********************************************************************/
896{
897 foreach (go_act_menu *m, instances) {
898 m->update();
899 }
900}
901
902/**********************************************************************/
906{
908 struct tile *ptile = nullptr;
909 struct unit *zunit;
910 struct unit *qunit;
911
912 int i = 0;
913 qunit = punit;
914 foreach (fui, units_list.unit_list) {
915 zunit = unit_list_find(client_player()->units, fui->id);
916 i++;
917 if (i >= pos) {
918 punit = qunit;
919 return ptile;
920 }
921 if (zunit == nullptr) {
922 continue;
923 }
924
925 if (punit == zunit) { // Unit found
926 /* Unit was ordered to attack city so it might stay in
927 front of that city */
929 ptile = tile_before_end_path(punit, fui->ptile);
930 if (ptile == nullptr) {
931 ptile = fui->ptile;
932 }
933 } else {
934 ptile = fui->ptile;
935 }
936 // Unit found in transport
937 } else if (unit_contained_in(punit, zunit)) {
938 ptile = fui->ptile;
939 }
940 }
941 return nullptr;
942}
943
944/**********************************************************************/
947mr_menu::mr_menu() : QMenuBar()
948{
949}
950
951/**********************************************************************/
957{
958 QAction *act;
959 QMenu *sub_menu;
960 QMenu *main_menu;
962 int i;
963
964 delayed_order = false;
965 airlift_type_id = 0;
966 quick_airlifting = false;
967
968 // Game Menu
969 main_menu = this->addMenu(_("Game"));
970
971#ifdef __APPLE__
972 // On Mac, Qt would try to move menu entry named just "Options" to
973 // application menu, but as this is submenu and not an action
974 // 1) It would fail to appear in the destination
975 // 2) It's impossible to override the behavior with QAction::menuRule()
976 // We add an invisible character for the string comparison to fail.
977 sub_menu = main_menu->addMenu(QString("\u200B") + _("Options"));
978#else // __APPLE__
979 sub_menu = main_menu->addMenu(_("Options"));
980#endif // __APPLE__
981
982 act = sub_menu->addAction(_("Set local options"));
983 connect(act, &QAction::triggered, this, &mr_menu::local_options);
984 act = sub_menu->addAction(_("Server Options"));
985 connect(act, &QAction::triggered, this, &mr_menu::server_options);
986 act = sub_menu->addAction(_("Messages"));
987 connect(act, &QAction::triggered, this, &mr_menu::messages_options);
988 act = sub_menu->addAction(_("Shortcuts"));
989 connect(act, &QAction::triggered, this, &mr_menu::shortcut_options);
990 act = sub_menu->addAction(_("Load another tileset"));
991 connect(act, &QAction::triggered, this, &mr_menu::tileset_custom_load);
992 act = sub_menu->addAction(_("Save Options Now"));
993 act->setIcon(style()->standardIcon(QStyle::SP_DialogSaveButton));
994 connect(act, &QAction::triggered, this, &mr_menu::save_options_now);
995 act = sub_menu->addAction(_("Save Options on Exit"));
996 act->setCheckable(true);
997 act->setChecked(gui_options.save_options_on_exit);
998 main_menu->addSeparator();
999 act = main_menu->addAction(_("Save Game"));
1000 act->setShortcut(QKeySequence(tr("Ctrl+s")));
1001 act->setIcon(style()->standardIcon(QStyle::SP_DialogSaveButton));
1002 menu_list.insert(SAVE, act);
1003 connect(act, &QAction::triggered, this, &mr_menu::save_game);
1004 act = main_menu->addAction(_("Save Game As..."));
1005 menu_list.insert(SAVE, act);
1006 act->setIcon(style()->standardIcon(QStyle::SP_DialogSaveButton));
1007 connect(act, &QAction::triggered, this, &mr_menu::save_game_as);
1008 act = main_menu->addAction(_("Save Map to Image"));
1009 connect(act, &QAction::triggered, this, &mr_menu::save_image);
1010 main_menu->addSeparator();
1011 act = main_menu->addAction(_("Volume Up"));
1012 act->setShortcut(QKeySequence(tr(">")));
1013 connect(act, &QAction::triggered, this, &mr_menu::volume_up);
1014 act = main_menu->addAction(_("Volume Down"));
1015 act->setShortcut(QKeySequence(tr("<")));
1016 connect(act, &QAction::triggered, this, &mr_menu::volume_down);
1017 main_menu->addSeparator();
1018 act = main_menu->addAction(_("Leave game"));
1019 act->setIcon(style()->standardIcon(QStyle::SP_DialogDiscardButton));
1020 connect(act, &QAction::triggered, this, &mr_menu::back_to_menu);
1021 act = main_menu->addAction(_("Quit"));
1022 act->setIcon(style()->standardIcon(QStyle::SP_TitleBarCloseButton));
1023 connect(act, &QAction::triggered, this, &mr_menu::quit_game);
1024
1025 // View Menu
1026 main_menu = this->addMenu(Q_("?verb:View"));
1027 act = main_menu->addAction(_("Center View"));
1028 act->setShortcut(QKeySequence(shortcut_to_string(
1029 fc_shortcuts::sc()->get_shortcut(SC_CENTER_VIEW))));
1030 connect(act, &QAction::triggered, this, &mr_menu::slot_center_view);
1031 main_menu->addSeparator();
1032 act = main_menu->addAction(_("Fullscreen"));
1033 act->setShortcut(QKeySequence(shortcut_to_string(
1034 fc_shortcuts::sc()->get_shortcut(SC_FULLSCREEN))));
1035 act->setCheckable(true);
1036 act->setChecked(gui_options.gui_qt_fullscreen);
1037 connect(act, &QAction::triggered, this, &mr_menu::slot_fullscreen);
1038 main_menu->addSeparator();
1039 minimap_status = main_menu->addAction(_("Minimap"));
1040 minimap_status->setCheckable(true);
1042 fc_shortcuts::sc()->get_shortcut(SC_MINIMAP))));
1043 minimap_status->setChecked(true);
1044 connect(minimap_status, &QAction::triggered, this,
1046 osd_status = main_menu->addAction(_("Show new turn information"));
1047 osd_status->setCheckable(true);
1048 osd_status->setChecked(gui()->qt_settings.show_new_turn_text);
1049 connect(osd_status, &QAction::triggered, this,
1051 btlog_status = main_menu->addAction(_("Show combat detailed information"));
1052 btlog_status->setCheckable(true);
1053 btlog_status->setChecked(gui()->qt_settings.show_battle_log);
1054 connect(btlog_status, &QAction::triggered, this, &mr_menu::slot_battlelog);
1055 lock_status = main_menu->addAction(_("Lock interface"));
1056 lock_status->setCheckable(true);
1058 fc_shortcuts::sc()->get_shortcut(SC_IFACE_LOCK))));
1059 lock_status->setChecked(false);
1060 connect(lock_status, &QAction::triggered, this, &mr_menu::slot_lock);
1061 connect(minimap_status, &QAction::triggered, this, &mr_menu::slot_lock);
1062 main_menu->addSeparator();
1063 act = main_menu->addAction(_("Zoom in"));
1064 act->setShortcut(QKeySequence(shortcut_to_string(
1065 fc_shortcuts::sc()->get_shortcut(SC_ZOOM_IN))));
1066 connect(act, &QAction::triggered, this, &mr_menu::zoom_in);
1067 act = main_menu->addAction(_("Zoom default"));
1068 act->setShortcut(QKeySequence(shortcut_to_string(
1069 fc_shortcuts::sc()->get_shortcut(SC_ZOOM_RESET))));
1070 connect(act, &QAction::triggered, this, &mr_menu::zoom_reset);
1071 act = main_menu->addAction(_("Zoom out"));
1072 act->setShortcut(QKeySequence(shortcut_to_string(
1073 fc_shortcuts::sc()->get_shortcut(SC_ZOOM_OUT))));
1074 connect(act, &QAction::triggered, this, &mr_menu::zoom_out);
1075 scale_fonts_status = main_menu->addAction(_("Scale fonts"));
1076 connect(scale_fonts_status, &QAction::triggered, this,
1078 scale_fonts_status->setCheckable(true);
1079 scale_fonts_status->setChecked(true);
1080 main_menu->addSeparator();
1081 act = main_menu->addAction(_("City Outlines"));
1082 act->setCheckable(true);
1083 act->setChecked(gui_options.draw_city_outlines);
1084 connect(act, &QAction::triggered, this, &mr_menu::slot_city_outlines);
1085 act = main_menu->addAction(_("City Output"));
1086 act->setCheckable(true);
1087 act->setChecked(gui_options.draw_city_output);
1088 act->setShortcut(QKeySequence(shortcut_to_string(
1089 fc_shortcuts::sc()->get_shortcut(SC_CITY_OUTPUT))));
1090 connect(act, &QAction::triggered, this, &mr_menu::slot_city_output);
1091 act = main_menu->addAction(_("Map Grid"));
1092 act->setShortcut(QKeySequence(shortcut_to_string(
1093 fc_shortcuts::sc()->get_shortcut(SC_MAP_GRID))));
1094 act->setCheckable(true);
1095 act->setChecked(gui_options.draw_map_grid);
1096 connect(act, &QAction::triggered, this, &mr_menu::slot_map_grid);
1097 act = main_menu->addAction(_("National Borders"));
1098 act->setCheckable(true);
1099 act->setChecked(gui_options.draw_borders);
1100 act->setShortcut(QKeySequence(shortcut_to_string(
1101 fc_shortcuts::sc()->get_shortcut(SC_NAT_BORDERS))));
1102 connect(act, &QAction::triggered, this, &mr_menu::slot_borders);
1103 act = main_menu->addAction(_("Native Tiles"));
1104 act->setCheckable(true);
1105 act->setChecked(gui_options.draw_native);
1106 act->setShortcut(QKeySequence(tr("ctrl+shift+n")));
1107 connect(act, &QAction::triggered, this, &mr_menu::slot_native_tiles);
1108 act = main_menu->addAction(_("City Full Bar"));
1109 act->setCheckable(true);
1110 act->setShortcut(QKeySequence(shortcut_to_string(
1111 fc_shortcuts::sc()->get_shortcut(SC_SHOW_FULLBAR))));
1112 act->setChecked(gui_options.draw_full_citybar);
1113 connect(act, &QAction::triggered, this, &mr_menu::slot_fullbar);
1114 act = main_menu->addAction(_("City Names"));
1115 act->setCheckable(true);
1116 act->setChecked(gui_options.draw_city_names);
1117 act->setShortcut(QKeySequence(shortcut_to_string(
1118 fc_shortcuts::sc()->get_shortcut(SC_CITY_NAMES))));
1119 connect(act, &QAction::triggered, this, &mr_menu::slot_city_names);
1120 act = main_menu->addAction(_("City Growth"));
1121 act->setCheckable(true);
1122 act->setChecked(gui_options.draw_city_growth);
1123 act->setShortcut(QKeySequence(tr("ctrl+o")));
1124 connect(act, &QAction::triggered, this, &mr_menu::slot_city_growth);
1125 act = main_menu->addAction(_("City Production"));
1126 act->setCheckable(true);
1127 act->setChecked(gui_options.draw_city_productions);
1128 act->setShortcut(QKeySequence(shortcut_to_string(
1129 fc_shortcuts::sc()->get_shortcut(SC_CITY_PROD))));
1130 connect(act, &QAction::triggered, this, &mr_menu::slot_city_production);
1131 act = main_menu->addAction(_("City Buy Cost"));
1132 act->setCheckable(true);
1133 act->setChecked(gui_options.draw_city_buycost);
1134 connect(act, &QAction::triggered, this, &mr_menu::slot_city_buycost);
1135 act = main_menu->addAction(_("City Trade Routes"));
1136 act->setCheckable(true);
1137 act->setChecked(gui_options.draw_city_trade_routes);
1138 act->setShortcut(QKeySequence(shortcut_to_string(
1139 fc_shortcuts::sc()->get_shortcut(SC_TRADE_ROUTES))));
1140 connect(act, &QAction::triggered, this, &mr_menu::slot_city_trade_routes);
1141 act = main_menu->addAction(_("Unit Stack Size"));
1142 act->setCheckable(true);
1143 act->setChecked(gui_options.draw_unit_stack_size);
1144 act->setShortcut(QKeySequence(shortcut_to_string(
1145 fc_shortcuts::sc()->get_shortcut(SC_STACK_SIZE))));
1146 connect(act, &QAction::triggered, this, &mr_menu::slot_stack_size);
1147
1148 // Select Menu
1149 main_menu = this->addMenu(_("Select"));
1150 act = main_menu->addAction(_("Single Unit (Unselect Others)"));
1151 act->setShortcut(QKeySequence(tr("shift+z")));
1152 menu_list.insert(STANDARD, act);
1153 connect(act, &QAction::triggered, this, &mr_menu::slot_select_one);
1154 act = main_menu->addAction(_("All On Tile"));
1155 act->setShortcut(QKeySequence(tr("v")));
1156 menu_list.insert(STANDARD, act);
1157 connect(act, &QAction::triggered, this, &mr_menu::slot_select_all_tile);
1158 main_menu->addSeparator();
1159 act = main_menu->addAction(_("Same Type on Tile"));
1160 act->setShortcut(QKeySequence(tr("shift+v")));
1161 menu_list.insert(STANDARD, act);
1162 connect(act, &QAction::triggered, this, &mr_menu::slot_select_same_tile);
1163 act = main_menu->addAction(_("Same Type on Continent"));
1164 act->setShortcut(QKeySequence(tr("shift+c")));
1165 menu_list.insert(STANDARD, act);
1166 connect(act, &QAction::triggered, this,
1168 act = main_menu->addAction(_("Same Type Everywhere"));
1169 act->setShortcut(QKeySequence(tr("shift+x")));
1170 menu_list.insert(STANDARD, act);
1171 connect(act, &QAction::triggered, this,
1173 main_menu->addSeparator();
1174 act = main_menu->addAction(_("Wait"));
1175 act->setShortcut(QKeySequence(shortcut_to_string(
1176 fc_shortcuts::sc()->get_shortcut(SC_WAIT))));
1177 menu_list.insert(STANDARD, act);
1178 connect(act, &QAction::triggered, this, &mr_menu::slot_wait);
1179 act = main_menu->addAction(_("Done"));
1180 act->setShortcut(QKeySequence(shortcut_to_string(
1181 fc_shortcuts::sc()->get_shortcut(SC_DONE_MOVING))));
1182 menu_list.insert(STANDARD, act);
1183 connect(act, &QAction::triggered, this, &mr_menu::slot_done_moving);
1184
1185 act = main_menu->addAction(_("Advanced unit selection"));
1186 act->setShortcut(QKeySequence(tr("ctrl+e")));
1187 menu_list.insert(NOT_4_OBS, act);
1188 connect(act, &QAction::triggered, this, &mr_menu::slot_unit_filter);
1189
1190 // Unit Menu
1191 main_menu = this->addMenu(_("Unit"));
1192 act = main_menu->addAction(_("Go to Tile"));
1193 act->setShortcut(QKeySequence(shortcut_to_string(
1194 fc_shortcuts::sc()->get_shortcut(SC_GOTO))));
1195 menu_list.insert(STANDARD, act);
1196 connect(act, &QAction::triggered, this, &mr_menu::slot_unit_goto);
1197
1198 // The goto and act sub menu is handled as a separate object.
1199 main_menu->addMenu(new go_act_menu(this));
1200
1201 act = main_menu->addAction(_("Go to Nearest City"));
1202 act->setShortcut(QKeySequence(tr("shift+g")));
1203 menu_list.insert(GOTO_CITY, act);
1204 connect(act, &QAction::triggered, this, &mr_menu::slot_return_to_city);
1205 act = main_menu->addAction(_("Go to/Airlift to City..."));
1206 act->setShortcut(QKeySequence(shortcut_to_string(
1207 fc_shortcuts::sc()->get_shortcut(SC_GOTOAIRLIFT))));
1208 menu_list.insert(AIRLIFT, act);
1209 connect(act, &QAction::triggered, this, &mr_menu::slot_airlift);
1210 main_menu->addSeparator();
1211 act = main_menu->addAction(_("Auto Explore"));
1212 menu_list.insert(EXPLORE, act);
1213 act->setShortcut(QKeySequence(shortcut_to_string(
1214 fc_shortcuts::sc()->get_shortcut(SC_AUTOEXPLORE))));
1215 connect(act, &QAction::triggered, this, &mr_menu::slot_unit_explore);
1216 act = main_menu->addAction(_("Patrol"));
1217 menu_list.insert(STANDARD, act);
1218 act->setEnabled(false);
1219 act->setShortcut(QKeySequence(shortcut_to_string(
1220 fc_shortcuts::sc()->get_shortcut(SC_PATROL))));
1221 connect(act, &QAction::triggered, this, &mr_menu::slot_patrol);
1222 main_menu->addSeparator();
1223 act = main_menu->addAction(_("Sentry"));
1224 act->setShortcut(QKeySequence(shortcut_to_string(
1225 fc_shortcuts::sc()->get_shortcut(SC_SENTRY))));
1226 menu_list.insert(SENTRY, act);
1227 connect(act, &QAction::triggered, this, &mr_menu::slot_unit_sentry);
1228 act = main_menu->addAction(_("Unsentry All On Tile"));
1229 act->setShortcut(QKeySequence(shortcut_to_string(
1230 fc_shortcuts::sc()->get_shortcut(SC_UNSENTRY_TILE))));
1231 menu_list.insert(WAKEUP, act);
1232 connect(act, &QAction::triggered, this, &mr_menu::slot_unsentry);
1233 main_menu->addSeparator();
1234 act = main_menu->addAction(_("Load"));
1235 act->setShortcut(QKeySequence(shortcut_to_string(
1236 fc_shortcuts::sc()->get_shortcut(SC_BOARD))));
1237 menu_list.insert(BOARD, act);
1238 connect(act, &QAction::triggered, this, &mr_menu::slot_board);
1239 act = main_menu->addAction(_("Unload"));
1240 act->setShortcut(QKeySequence(shortcut_to_string(
1241 fc_shortcuts::sc()->get_shortcut(SC_DEBOARD))));
1242 menu_list.insert(DEBOARD, act);
1243 connect(act, &QAction::triggered, this, &mr_menu::slot_deboard);
1244 act = main_menu->addAction(_("Unload All From Transporter"));
1245 act->setShortcut(QKeySequence(tr("shift+t")));
1246 menu_list.insert(TRANSPORTER, act);
1247 connect(act, &QAction::triggered, this, &mr_menu::slot_unload_all);
1248 main_menu->addSeparator();
1249
1250 // Defeat keyboard shortcut mnemonics
1252 .replace("&", "&&"));
1253 menu_list.insert(HOMECITY, act);
1254 act->setShortcut(QKeySequence(shortcut_to_string(
1255 fc_shortcuts::sc()->get_shortcut(SC_SETHOME))));
1256 connect(act, &QAction::triggered, this, &mr_menu::slot_set_home);
1257 act = main_menu->addAction(_("Upgrade"));
1258 act->setShortcut(QKeySequence(shortcut_to_string(
1259 fc_shortcuts::sc()->get_shortcut(SC_UPGRADE_UNIT))));
1260 menu_list.insert(UPGRADE, act);
1261 connect(act, &QAction::triggered, this, &mr_menu::slot_upgrade);
1262 act = main_menu->addAction(_("Convert"));
1263 act->setShortcut(QKeySequence(tr("shift+o")));
1264 menu_list.insert(CONVERT, act);
1265 connect(act, &QAction::triggered, this, &mr_menu::slot_convert);
1266 act = main_menu->addAction(_("Disband"));
1267 act->setShortcut(QKeySequence(tr("shift+d")));
1268 menu_list.insert(DISBAND, act);
1269 connect(act, &QAction::triggered, this, &mr_menu::slot_disband);
1270
1271 // Combat Menu
1272 main_menu = this->addMenu(_("Combat"));
1273 act = main_menu->addAction(_("Fortify Unit"));
1274 menu_list.insert(FORTIFY, act);
1275 act->setShortcut(QKeySequence(shortcut_to_string(
1276 fc_shortcuts::sc()->get_shortcut(SC_FORTIFY))));
1277 connect(act, &QAction::triggered, this, &mr_menu::slot_unit_fortify);
1278 act = main_menu->addAction(QString(Q_(terrain_control.gui_type_base0))
1279 .replace("&", "&&"));
1280 menu_list.insert(FORTRESS, act);
1281 act->setShortcut(QKeySequence(tr("shift+f")));
1282 connect(act, &QAction::triggered, this, &mr_menu::slot_unit_fortress);
1283 act = main_menu->addAction(QString(Q_(terrain_control.gui_type_base1))
1284 .replace("&", "&&"));
1285 menu_list.insert(AIRBASE, act);
1286 act->setShortcut(QKeySequence(tr("shift+e")));
1287 connect(act, &QAction::triggered, this, &mr_menu::slot_unit_airbase);
1288 bases_menu = main_menu->addMenu(_("Build Base"));
1289 main_menu->addSeparator();
1290 act = main_menu->addAction(_("Paradrop"));
1291 menu_list.insert(PARADROP, act);
1292 act->setShortcut(QKeySequence(shortcut_to_string(
1293 fc_shortcuts::sc()->get_shortcut(SC_PARADROP))));
1294 connect(act, &QAction::triggered, this, &mr_menu::slot_paradrop);
1295 act = main_menu->addAction(_("Pillage"));
1296 menu_list.insert(PILLAGE, act);
1297 act->setShortcut(QKeySequence(tr("shift+p")));
1298 connect(act, &QAction::triggered, this, &mr_menu::slot_pillage);
1299 // TRANS: Menu item to bring up the action selection dialog.
1300 act = main_menu->addAction(_("Do..."));
1301 menu_list.insert(ORDER_DIPLOMAT_DLG, act);
1302 act->setShortcut(QKeySequence(shortcut_to_string(
1303 fc_shortcuts::sc()->get_shortcut(SC_DO))));
1304 connect(act, &QAction::triggered, this, &mr_menu::slot_action);
1305
1306 // Work Menu
1307 main_menu = this->addMenu(_("Work"));
1309 .replace("&", "&&"));
1310 act->setShortcut(QKeySequence(shortcut_to_string(
1311 fc_shortcuts::sc()->get_shortcut(SC_BUILDCITY))));
1312 menu_list.insert(BUILD, act);
1313 connect(act, &QAction::triggered, this, &mr_menu::slot_build_city);
1314 act = main_menu->addAction(_("Auto Settler"));
1315 act->setShortcut(QKeySequence(shortcut_to_string(
1316 fc_shortcuts::sc()->get_shortcut(SC_AUTOMATE))));
1317 menu_list.insert(AUTOSETTLER, act);
1318 connect(act, &QAction::triggered, this, &mr_menu::slot_auto_settler);
1319 main_menu->addSeparator();
1320 act = main_menu->addAction(_("Build Road"));
1321 menu_list.insert(ROAD, act);
1322 act->setShortcut(QKeySequence(shortcut_to_string(
1323 fc_shortcuts::sc()->get_shortcut(SC_BUILDROAD))));
1324 connect(act, &QAction::triggered, this, &mr_menu::slot_build_road);
1325 roads_menu = main_menu->addMenu(_("Build Path"));
1326 act = main_menu->addAction(_("Build Irrigation"));
1327 act->setShortcut(QKeySequence(shortcut_to_string(
1328 fc_shortcuts::sc()->get_shortcut(SC_BUILDIRRIGATION))));
1329 menu_list.insert(IRRIGATION, act);
1330 connect(act, &QAction::triggered, this, &mr_menu::slot_build_irrigation);
1331 act = main_menu->addAction(_("Cultivate"));
1332 act->setShortcut(QKeySequence(shortcut_to_string(
1333 fc_shortcuts::sc()->get_shortcut(SC_CULTIVATE))));
1334 menu_list.insert(CULTIVATE, act);
1335 connect(act, &QAction::triggered, this, &mr_menu::slot_cultivate);
1336 act = main_menu->addAction(_("Build Mine"));
1337 act->setShortcut(QKeySequence(shortcut_to_string(
1338 fc_shortcuts::sc()->get_shortcut(SC_BUILDMINE))));
1339 menu_list.insert(MINE, act);
1340 connect(act, &QAction::triggered, this, &mr_menu::slot_build_mine);
1341 act = main_menu->addAction(_("Plant"));
1342 act->setShortcut(QKeySequence(shortcut_to_string(
1343 fc_shortcuts::sc()->get_shortcut(SC_PLANT))));
1344 menu_list.insert(PLANT, act);
1345 connect(act, &QAction::triggered, this, &mr_menu::slot_plant);
1346 main_menu->addSeparator();
1347 act = main_menu->addAction(_("Connect With Road"));
1348 act->setShortcut(QKeySequence(tr("ctrl+r")));
1349 menu_list.insert(CONNECT_ROAD, act);
1350 connect(act, &QAction::triggered, this, &mr_menu::slot_conn_road);
1351 act = main_menu->addAction(_("Connect With Railroad"));
1352 menu_list.insert(CONNECT_RAIL, act);
1353 act->setShortcut(QKeySequence(tr("ctrl+l")));
1354 connect(act, &QAction::triggered, this, &mr_menu::slot_conn_rail);
1355 act = main_menu->addAction(_("Connect With Maglev"));
1356 menu_list.insert(CONNECT_MAGLEV, act);
1357 act->setShortcut(QKeySequence(tr("ctrl+m")));
1358 connect(act, &QAction::triggered, this, &mr_menu::slot_conn_maglev);
1359 act = main_menu->addAction(_("Connect With Irrigation"));
1360 menu_list.insert(CONNECT_IRRIGATION, act);
1361 act->setShortcut(QKeySequence(tr("ctrl+i")));
1362 connect(act, &QAction::triggered, this, &mr_menu::slot_conn_irrigation);
1363 main_menu->addSeparator();
1364 act = main_menu->addAction(_("Transform Terrain"));
1365 menu_list.insert(TRANSFORM, act);
1366 act->setShortcut(QKeySequence(shortcut_to_string(
1367 fc_shortcuts::sc()->get_shortcut(SC_TRANSFORM))));
1368 connect(act, &QAction::triggered, this, &mr_menu::slot_transform);
1369 act = main_menu->addAction(_("Clean"));
1370 menu_list.insert(CLEAN, act);
1371 act->setShortcut(QKeySequence(shortcut_to_string(
1372 fc_shortcuts::sc()->get_shortcut(SC_CLEAN))));
1373 connect(act, &QAction::triggered, this, &mr_menu::slot_clean);
1375 .replace("&", "&&"));
1376 act->setShortcut(QKeySequence(tr("b")));
1377 menu_list.insert(BUILD_WONDER, act);
1378 connect(act, &QAction::triggered, this, &mr_menu::slot_build_city);
1380 .replace("&", "&&"));
1381 act->setShortcut(QKeySequence(tr("r")));
1382 menu_list.insert(ORDER_TRADE_ROUTE, act);
1383 connect(act, &QAction::triggered, this, &mr_menu::slot_build_road);
1384
1385 // Multiplayer Menu
1386 multiplayer_menu = this->addMenu(_("Multiplayer"));
1387 act = multiplayer_menu->addAction(_("Delayed Goto"));
1388 act->setShortcut(QKeySequence(tr("z")));
1389 connect(act, &QAction::triggered, this, &mr_menu::slot_delayed_goto);
1390 act = multiplayer_menu->addAction(_("Delayed Orders Execute"));
1391 act->setShortcut(QKeySequence(tr("ctrl+z")));
1392 connect(act, &QAction::triggered, this, &mr_menu::slot_execute_orders);
1393 act = multiplayer_menu->addAction(_("Clear Orders"));
1394 act->setShortcut(QKeySequence(tr("ctrl+shift+c")));
1395 connect(act, &QAction::triggered, this, &mr_menu::slot_orders_clear);
1396 act = multiplayer_menu->addAction(_("Add all cities to trade planning"));
1397 connect(act, &QAction::triggered, this, &mr_menu::slot_trade_add_all);
1398 act = multiplayer_menu->addAction(_("Calculate trade planning"));
1399 connect(act, &QAction::triggered, this, &mr_menu::slot_calculate);
1400 act = multiplayer_menu->addAction(_("Add/Remove City"));
1401 act->setShortcut(QKeySequence(tr("ctrl+t")));
1402 connect(act, &QAction::triggered, this, &mr_menu::slot_trade_city);
1403 act = multiplayer_menu->addAction(_("Clear Trade Planning"));
1404 connect(act, &QAction::triggered, this, &mr_menu::slot_clear_trade);
1405 act = multiplayer_menu->addAction(_("Automatic caravan"));
1406 menu_list.insert(AUTOTRADEROUTE, act);
1407 connect(act, &QAction::triggered, this, &mr_menu::slot_autocaravan);
1408 act->setShortcut(QKeySequence(tr("ctrl+j")));
1409 act = multiplayer_menu->addAction(_("Set/Unset rally point"));
1410 act->setShortcut(QKeySequence(tr("shift+s")));
1411 connect(act, &QAction::triggered, this, &mr_menu::slot_rally);
1412 act = multiplayer_menu->addAction(_("Quick Airlift"));
1413 act->setShortcut(QKeySequence(tr("ctrl+y")));
1414 connect(act, &QAction::triggered, this, &mr_menu::slot_quickairlift);
1415 airlift_type = new QActionGroup(this);
1416 airlift_menu = multiplayer_menu->addMenu(_("Unit type for quickairlifting"));
1417
1418 // Default diplo
1419 action_vs_city = new QActionGroup(this);
1420 action_vs_unit = new QActionGroup(this);
1421 action_unit_menu = multiplayer_menu->addMenu(_("Default action vs unit"));
1422
1423 act = action_unit_menu->addAction(_("Ask"));
1424 act->setCheckable(true);
1425 act->setChecked(true);
1426 act->setData(-1);
1427 action_vs_unit->addAction(act);
1428 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_unit);
1429
1430 act = action_unit_menu->addAction(_("Bribe"));
1431 act->setCheckable(true);
1432 act->setChecked(false);
1433 act->setData(ACTION_SPY_BRIBE_UNIT);
1434 action_vs_unit->addAction(act);
1435 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_unit);
1436
1437 act = action_unit_menu->addAction(_("Sabotage"));
1438 act->setCheckable(true);
1439 act->setChecked(false);
1440 act->setData(ACTION_SPY_SABOTAGE_UNIT);
1441 action_vs_unit->addAction(act);
1442 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_unit);
1443
1444 act = action_unit_menu->addAction(_("Sabotage Unit Escape"));
1445 act->setCheckable(true);
1446 act->setChecked(false);
1447 act->setData(ACTION_SPY_SABOTAGE_UNIT_ESC);
1448 action_vs_unit->addAction(act);
1449 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_unit);
1450
1451 action_city_menu = multiplayer_menu->addMenu(_("Default action vs city"));
1452 act = action_city_menu->addAction(_("Ask"));
1453 act->setCheckable(true);
1454 act->setChecked(true);
1455 act->setData(-1);
1456 action_vs_city->addAction(act);
1457 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1458
1459 act = action_city_menu->addAction(_("Investigate city"));
1460 act->setCheckable(true);
1461 act->setChecked(false);
1462 act->setData(ACTION_SPY_INVESTIGATE_CITY);
1463 action_vs_city->addAction(act);
1464 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1465
1466 act = action_city_menu->addAction(_("Investigate city (spends the unit)"));
1467 act->setCheckable(true);
1468 act->setChecked(false);
1469 act->setData(ACTION_INV_CITY_SPEND);
1470 action_vs_city->addAction(act);
1471 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1472
1473 act = action_city_menu->addAction(_("Establish embassy"));
1474 act->setCheckable(true);
1475 act->setChecked(false);
1476 act->setData(ACTION_ESTABLISH_EMBASSY);
1477 action_vs_city->addAction(act);
1478 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1479
1480 act = action_city_menu->addAction(_("Become Ambassador"));
1481 act->setCheckable(true);
1482 act->setChecked(false);
1483 act->setData(ACTION_ESTABLISH_EMBASSY_STAY);
1484 action_vs_city->addAction(act);
1485 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1486
1487 act = action_city_menu->addAction(_("Steal technology"));
1488 act->setCheckable(true);
1489 act->setChecked(false);
1490 act->setData(ACTION_SPY_STEAL_TECH);
1491 action_vs_city->addAction(act);
1492 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1493
1494 act = action_city_menu->addAction(_("Steal technology and escape"));
1495 act->setCheckable(true);
1496 act->setChecked(false);
1497 act->setData(ACTION_SPY_STEAL_TECH_ESC);
1498 action_vs_city->addAction(act);
1499 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1500
1501 act = action_city_menu->addAction(_("Incite a revolt"));
1502 act->setCheckable(true);
1503 act->setChecked(false);
1504 act->setData(ACTION_SPY_INCITE_CITY);
1505 action_vs_city->addAction(act);
1506 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1507
1508 act = action_city_menu->addAction(_("Incite a Revolt and Escape"));
1509 act->setCheckable(true);
1510 act->setChecked(false);
1511 act->setData(ACTION_SPY_INCITE_CITY_ESC);
1512 action_vs_city->addAction(act);
1513 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1514
1515 act = action_city_menu->addAction(_("Poison city"));
1516 act->setCheckable(true);
1517 act->setChecked(false);
1518 act->setData(ACTION_SPY_POISON);
1519 action_vs_city->addAction(act);
1520 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1521
1522 act = action_city_menu->addAction(_("Poison City Escape"));
1523 act->setCheckable(true);
1524 act->setChecked(false);
1525 act->setData(ACTION_SPY_POISON_ESC);
1526 action_vs_city->addAction(act);
1527 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1528
1529 // Civilization menu
1530 main_menu = this->addMenu(_("Civilization"));
1531 act = main_menu->addAction(_("Tax Rates..."));
1532 menu_list.insert(NOT_4_OBS, act);
1533 connect(act, &QAction::triggered, this, &mr_menu::slot_popup_tax_rates);
1534 main_menu->addSeparator();
1535
1536 act = main_menu->addAction(_("Policies..."));
1537 menu_list.insert(MULTIPLIERS, act);
1538 connect(act, &QAction::triggered, this, &mr_menu::slot_popup_mult_rates);
1539 main_menu->addSeparator();
1540
1541 main_menu->addMenu(new class gov_menu(this));
1542 main_menu->addSeparator();
1543
1544 act = main_menu->addAction(Q_("?noun:View"));
1545 act->setShortcut(QKeySequence(tr("F1")));
1546 connect(act, &QAction::triggered, this, &mr_menu::slot_show_map);
1547
1548 act = main_menu->addAction(_("Units"));
1549 act->setShortcut(QKeySequence(tr("F2")));
1550 connect(act, &QAction::triggered, this, &mr_menu::slot_show_units_report);
1551
1552 act = main_menu->addAction(_("Nations"));
1553 act->setShortcut(QKeySequence(tr("F3")));
1554 connect(act, &QAction::triggered, this, &mr_menu::slot_show_nations);
1555
1556 act = main_menu->addAction(_("Cities"));
1557 act->setShortcut(QKeySequence(tr("F4")));
1558 connect(act, &QAction::triggered, this, &mr_menu::slot_show_cities);
1559
1560 act = main_menu->addAction(_("Economy"));
1561 act->setShortcut(QKeySequence(tr("F5")));
1562 connect(act, &QAction::triggered, this, &mr_menu::slot_show_eco_report);
1563
1564 act = main_menu->addAction(_("Research"));
1565 act->setShortcut(QKeySequence(tr("F6")));
1566 connect(act, &QAction::triggered, this, &mr_menu::slot_show_research_tab);
1567
1568 act = main_menu->addAction(_("Wonders of the World"));
1569 act->setShortcut(QKeySequence(tr("F7")));
1570 connect(act, &QAction::triggered, this, &mr_menu::slot_traveler);
1571
1572 act = main_menu->addAction(_("Top Cities"));
1573 act->setShortcut(QKeySequence(tr("F8")));
1574 menu_list.insert(TOP_CITIES, act);
1575 connect(act, &QAction::triggered, this, &mr_menu::slot_top_cities);
1576
1577 act = main_menu->addAction(_("Demographics"));
1578 act->setShortcut(QKeySequence(tr("F11")));
1579 connect(act, &QAction::triggered, this, &mr_menu::slot_demographics);
1580
1581 act = main_menu->addAction(_("Spaceship"));
1582 act->setShortcut(QKeySequence(tr("F12")));
1583 connect(act, &QAction::triggered, this, &mr_menu::slot_spaceship);
1584
1585 act = main_menu->addAction(_("Achievements"));
1586 connect(act, &QAction::triggered, this, &mr_menu::slot_achievements);
1587
1588 act = main_menu->addAction(_("Endgame report"));
1589 menu_list.insert(ENDGAME, act);
1590 connect(act, &QAction::triggered, this, &mr_menu::slot_endgame);
1591
1592 // Battle Groups Menu
1593 main_menu = this->addMenu(_("Battle Groups"));
1594
1595 act = main_menu->addAction(_("Select Battle Group 1"));
1596 act->setShortcut(QKeySequence(tr("Shift+F1")));
1597 connect(act, &QAction::triggered, this, &mr_menu::slot_bg1select);
1598
1599 act = main_menu->addAction(_("Assign Battle Group 1"));
1600 act->setShortcut(QKeySequence(tr("Ctrl+F1")));
1601 connect(act, &QAction::triggered, this, &mr_menu::slot_bg1assign);
1602
1603 act = main_menu->addAction(_("Append to Battle Group 1"));
1604 act->setShortcut(QKeySequence(tr("Ctrl+Shift+F1")));
1605 connect(act, &QAction::triggered, this, &mr_menu::slot_bg1append);
1606
1607 act = main_menu->addAction(_("Select Battle Group 2"));
1608 act->setShortcut(QKeySequence(tr("Shift+F2")));
1609 connect(act, &QAction::triggered, this, &mr_menu::slot_bg2select);
1610
1611 act = main_menu->addAction(_("Assign Battle Group 2"));
1612 act->setShortcut(QKeySequence(tr("Ctrl+F2")));
1613 connect(act, &QAction::triggered, this, &mr_menu::slot_bg2assign);
1614
1615 act = main_menu->addAction(_("Append to Battle Group 2"));
1616 act->setShortcut(QKeySequence(tr("Ctrl+Shift+F2")));
1617 connect(act, &QAction::triggered, this, &mr_menu::slot_bg2append);
1618
1619 act = main_menu->addAction(_("Select Battle Group 3"));
1620 act->setShortcut(QKeySequence(tr("Shift+F3")));
1621 connect(act, &QAction::triggered, this, &mr_menu::slot_bg3select);
1622
1623 act = main_menu->addAction(_("Assign Battle Group 3"));
1624 act->setShortcut(QKeySequence(tr("Ctrl+F3")));
1625 connect(act, &QAction::triggered, this, &mr_menu::slot_bg3assign);
1626
1627 act = main_menu->addAction(_("Append to Battle Group 3"));
1628 act->setShortcut(QKeySequence(tr("Ctrl+Shift+F3")));
1629 connect(act, &QAction::triggered, this, &mr_menu::slot_bg3append);
1630
1631 act = main_menu->addAction(_("Select Battle Group 4"));
1632 act->setShortcut(QKeySequence(tr("Shift+F4")));
1633 connect(act, &QAction::triggered, this, &mr_menu::slot_bg4select);
1634
1635 act = main_menu->addAction(_("Assign Battle Group 4"));
1636 act->setShortcut(QKeySequence(tr("Ctrl+F4")));
1637 connect(act, &QAction::triggered, this, &mr_menu::slot_bg4assign);
1638
1639 act = main_menu->addAction(_("Append to Battle Group 4"));
1640 act->setShortcut(QKeySequence(tr("Ctrl+Shift+F4")));
1641 connect(act, &QAction::triggered, this, &mr_menu::slot_bg4append);
1642
1643 // Help Menu
1644 main_menu = this->addMenu(_("Help"));
1645
1646 act = main_menu->addAction(Q_(HELP_OVERVIEW_ITEM));
1647 QObject::connect(act, &QAction::triggered, [this]() {
1649 });
1650
1651 act = main_menu->addAction(Q_(HELP_PLAYING_ITEM));
1652 QObject::connect(act, &QAction::triggered, [this]() {
1654 });
1655
1656 act = main_menu->addAction(Q_(HELP_TERRAIN_ITEM));
1657 QObject::connect(act, &QAction::triggered, [this]() {
1659 });
1660
1661 act = main_menu->addAction(Q_(HELP_ECONOMY_ITEM));
1662 QObject::connect(act, &QAction::triggered, [this]() {
1664 });
1665
1666 act = main_menu->addAction(Q_(HELP_CITIES_ITEM));
1667 QObject::connect(act, &QAction::triggered, [this]() {
1669 });
1670
1671 act = main_menu->addAction(Q_(HELP_IMPROVEMENTS_ITEM));
1672 QObject::connect(act, &QAction::triggered, [this]() {
1674 });
1675
1676 act = main_menu->addAction(Q_(HELP_WONDERS_ITEM));
1677 QObject::connect(act, &QAction::triggered, [this]() {
1679 });
1680
1681 act = main_menu->addAction(Q_(HELP_UNITS_ITEM));
1682 QObject::connect(act, &QAction::triggered, [this]() {
1684 });
1685
1686 act = main_menu->addAction(Q_(HELP_COMBAT_ITEM));
1687 QObject::connect(act, &QAction::triggered, [this]() {
1689 });
1690
1691 act = main_menu->addAction(Q_(HELP_ZOC_ITEM));
1692 QObject::connect(act, &QAction::triggered, [this]() {
1694 });
1695
1696 act = main_menu->addAction(Q_(HELP_GOVERNMENT_ITEM));
1697 QObject::connect(act, &QAction::triggered, [this]() {
1699 });
1700
1701 act = main_menu->addAction(Q_(HELP_MULTIPLIER_ITEM));
1702 QObject::connect(act, &QAction::triggered, [this]() {
1704 });
1705
1706 act = main_menu->addAction(Q_(HELP_DIPLOMACY_ITEM));
1707 QObject::connect(act, &QAction::triggered, [this]() {
1709 });
1710
1711 act = main_menu->addAction(Q_(HELP_TECHS_ITEM));
1712 QObject::connect(act, &QAction::triggered, [this]() {
1714 });
1715
1716 act = main_menu->addAction(Q_(HELP_SPACE_RACE_ITEM));
1717 QObject::connect(act, &QAction::triggered, [this]() {
1719 });
1720
1721 act = main_menu->addAction(Q_(HELP_RULESET_ITEM));
1722#ifdef __APPLE__
1723 // only needed on Mac, prevents qt from moving the menu item
1724 act->setMenuRole(QAction::NoRole);
1725#endif // __APPLE__
1726 QObject::connect(act, &QAction::triggered, [this]() {
1728 });
1729
1730 act = main_menu->addAction(Q_(HELP_TILESET_ITEM));
1731#ifdef __APPLE__
1732 // only needed on Mac, prevents qt from moving the menu item
1733 act->setMenuRole(QAction::NoRole);
1734#endif // __APPLE__
1735 QObject::connect(act, &QAction::triggered, [this]() {
1737 });
1738
1739 act = main_menu->addAction(Q_(HELP_MUSICSET_ITEM));
1740#ifdef __APPLE__
1741 // only needed on Mac, prevents qt from moving the menu item
1742 act->setMenuRole(QAction::NoRole);
1743#endif // __APPLE__
1744 QObject::connect(act, &QAction::triggered, [this]() {
1746 });
1747
1748 act = main_menu->addAction(Q_(HELP_NATIONS_ITEM));
1749#ifdef __APPLE__
1750 // only needed on Mac, prevents qt from moving the menu item
1751 act->setMenuRole(QAction::NoRole);
1752#endif // __APPLE__
1753 QObject::connect(act, &QAction::triggered, [this]() {
1755 });
1756
1757 main_menu->addSeparator();
1758
1759 act = main_menu->addAction(Q_(HELP_CONNECTING_ITEM));
1760 QObject::connect(act, &QAction::triggered, [this]() {
1762 });
1763
1764 act = main_menu->addAction(Q_(HELP_CONTROLS_ITEM));
1765 QObject::connect(act, &QAction::triggered, [this]() {
1767 });
1768
1769 act = main_menu->addAction(Q_(HELP_CMA_ITEM));
1770 QObject::connect(act, &QAction::triggered, [this]() {
1772 });
1773
1774 act = main_menu->addAction(Q_(HELP_CHATLINE_ITEM));
1775 QObject::connect(act, &QAction::triggered, [this]() {
1777 });
1778
1779 act = main_menu->addAction(Q_(HELP_WORKLIST_EDITOR_ITEM));
1780 QObject::connect(act, &QAction::triggered, [this]() {
1782 });
1783
1784 main_menu->addSeparator();
1785
1786 act = main_menu->addAction(Q_(HELP_LANGUAGES_ITEM));
1787 QObject::connect(act, &QAction::triggered, [this]() {
1789 });
1790
1791 act = main_menu->addAction(Q_(HELP_COPYING_ITEM));
1792 QObject::connect(act, &QAction::triggered, [this]() {
1794 });
1795
1796 act = main_menu->addAction(Q_(HELP_ABOUT_ITEM));
1797#ifdef __APPLE__
1798 // only needed on Mac, prevents qt from moving the menu item
1799 act->setMenuRole(QAction::NoRole);
1800#endif // __APPLE__
1801 QObject::connect(act, &QAction::triggered, [this]() {
1803 });
1804
1805 menus = this->findChildren<QMenu*>();
1806 for (i = 0; i < menus.count(); i++) {
1807 menus[i]->setAttribute(Qt::WA_TranslucentBackground);
1808 }
1809
1810 this->setVisible(false);
1811}
1812
1813/**********************************************************************/
1817{
1818 for (int i = 0; i < units_list.nr_units; i++) {
1819 units_list.unit_list.at(units_list.unit_list.count() - i -1)->ptile = ptile;
1820 }
1821}
1822
1823/**********************************************************************/
1829{
1830 foreach (QAction *a, m->actions()) {
1831 if (a->shortcut() == seq && a->isEnabled()) {
1832 a->activate(QAction::Trigger);
1833 return TRUE;
1834 }
1835 }
1836
1837 return FALSE;
1838}
1839
1840/**********************************************************************/
1844{
1848
1849 if (sid == SC_GOTO) {
1850 gui()->mapview_wdg->menu_click = true;
1852 return;
1853 }
1854 fcs = fc_shortcuts::sc()->get_shortcut(static_cast<shortcut_id>(sid));
1856
1858 foreach (const QMenu *m, menus) {
1860 return;
1861 }
1862 }
1863}
1864
1865/**********************************************************************/
1872{
1873 foreach (QAction *a, m->actions()) {
1874 if (a->shortcut() == seq && fcs->mouse == Qt::AllButtons) {
1875 *ret = a->text();
1876
1877 return TRUE;
1878 }
1879 }
1880
1881 return FALSE;
1882}
1883
1884/**********************************************************************/
1888{
1891
1894 foreach (const QMenu *m, menus) {
1895 QString ret;
1896
1897 if (shortcut_exist_inner(m, seq, fcs, &ret)) {
1898 return ret;
1899 }
1900 }
1901
1902 return QString();
1903}
1904
1905/**********************************************************************/
1911 QString *ret)
1912{
1913 foreach (QAction *a, m->actions()) {
1914 if (a->shortcut() == seq) {
1915 *ret = a->text() + " ("
1916 + a->shortcut().toString(QKeySequence::NativeText) + ")";
1917
1918 return TRUE;
1919 }
1920 }
1921
1922 return FALSE;
1923}
1924
1925/**********************************************************************/
1929{
1933
1934 fcs = fc_shortcuts::sc()->get_shortcut(static_cast<shortcut_id>(sid));
1936
1938 foreach (const QMenu *m, menus) {
1939 QString ret;
1940
1942 return ret;
1943 }
1944 }
1945
1946 return QString();
1947}
1948
1949/**********************************************************************/
1953{
1955 QAction *act;
1956
1957 airlift_menu->clear();
1958 if (client_is_observer()) {
1959 return;
1960 }
1961 unit_type_iterate(utype) {
1962 utype_id = utype_index(utype);
1963
1965 || !utype_can_do_action(utype, ACTION_AIRLIFT)) {
1966 continue;
1967 }
1970 continue;
1971 }
1972 // Defeat keyboard shortcut mnemonics
1973 act = airlift_menu->addAction(QString(utype_name_translation(utype))
1974 .replace("&", "&&"));
1975 act->setCheckable(true);
1976 act->setData(utype_id);
1977 if (airlift_type_id == utype_id) {
1978 act->setChecked(true);
1979 }
1980 connect(act, &QAction::triggered, this, &mr_menu::slot_quickairlift_set);
1981 airlift_type->addAction(act);
1983}
1984
1985/****************************************************************************
1986 Updates "build path" menu
1987****************************************************************************/
1989{
1990 QAction *act;
1991 struct unit_list *punits = nullptr;
1992 bool enabled = false;
1993
1994 foreach(act, roads_menu->actions()) {
1995 removeAction(act);
1996 act->deleteLater();
1997 }
1998 roads_menu->clear();
1999 roads_menu->setDisabled(true);
2000 if (client_is_observer()) {
2001 return;
2002 }
2003
2006 if (pextra->buildable) {
2007 int road_id;
2008
2009 // Defeat keyboard shortcut mnemonics
2010 act = roads_menu->addAction(QString(extra_name_translation(pextra))
2011 .replace("&", "&&"));
2012 road_id = pextra->id;
2013 act->setData(road_id);
2014 QObject::connect(act, &QAction::triggered, [this,road_id]() {
2016 });
2018 ACTIVITY_GEN_ROAD, pextra)) {
2019 act->setEnabled(true);
2020 enabled = true;
2021 } else {
2022 act->setDisabled(true);
2023 }
2024 }
2026
2027 if (enabled) {
2028 roads_menu->setEnabled(true);
2029 }
2030}
2031
2032/****************************************************************************
2033 Updates "build bases" menu
2034****************************************************************************/
2036{
2037 QAction *act;
2038 struct unit_list *punits = nullptr;
2039 bool enabled = false;
2040
2041 foreach(act, bases_menu->actions()) {
2042 removeAction(act);
2043 act->deleteLater();
2044 }
2045 bases_menu->clear();
2046 bases_menu->setDisabled(true);
2047
2048 if (client_is_observer()) {
2049 return;
2050 }
2051
2054 if (pextra->buildable) {
2055 int base_id;
2056
2057 // Defeat keyboard shortcut mnemonics
2058 act = bases_menu->addAction(QString(extra_name_translation(pextra))
2059 .replace("&", "&&"));
2060 base_id = pextra->id;
2061 act->setData(base_id);
2062 QObject::connect(act, &QAction::triggered, [this,base_id]() {
2064 });
2066 act->setEnabled(true);
2067 enabled = true;
2068 } else {
2069 act->setDisabled(true);
2070 }
2071 }
2073
2074 if (enabled) {
2075 bases_menu->setEnabled(true);
2076 }
2077}
2078
2079/**********************************************************************/
2083{
2084 QList <QAction * >values;
2086 QMultiHash <munit, QAction *>::iterator i;
2087 struct unit_list *punits = nullptr;
2088 struct road_type *proad;
2089 struct extra_type *tgt;
2090 bool any_cities = false;
2091 bool city_on_tile = false;
2092 bool units_all_same_tile = true;
2093 const struct tile *ptile = NULL;
2094 const struct unit_type *ptype = NULL;
2095
2096 players_iterate(pplayer) {
2097 if (city_list_size(pplayer->cities)) {
2098 any_cities = true;
2099 break;
2100 }
2102
2103 // Disable first all sensitive menus
2104 foreach(QAction *a, menu_list) {
2105 a->setEnabled(false);
2106 }
2107
2108 if (client_is_observer()) {
2109 multiplayer_menu->setDisabled(true);
2110 } else {
2111 multiplayer_menu->setDisabled(false);
2112 }
2113
2114 // Non unit menus
2115 keys = menu_list.keys();
2116 foreach (munit key, keys) {
2117 i = menu_list.find(key);
2118 while (i != menu_list.end() && i.key() == key) {
2119 switch (key) {
2120 case SAVE:
2122 i.value()->setEnabled(true);
2123 }
2124 break;
2125 case NOT_4_OBS:
2126 if (!client_is_observer()) {
2127 i.value()->setEnabled(true);
2128 }
2129 break;
2130 case MULTIPLIERS:
2131 if (!client_is_observer() && multiplier_count() > 0) {
2132 i.value()->setEnabled(true);
2133 i.value()->setVisible(true);
2134 } else {
2135 i.value()->setVisible(false);
2136 }
2137 break;
2138 case ENDGAME:
2139 if (gui()->is_repo_dlg_open("END")) {
2140 i.value()->setEnabled(true);
2141 i.value()->setVisible(true);
2142 } else {
2143 i.value()->setVisible(false);
2144 }
2145 break;
2146 case TOP_CITIES:
2147 i.value()->setEnabled(game.info.top_cities_count > 0);
2148 if (game.info.top_cities_count > 0) {
2149 i.value()->setText(QString(PL_("Top %1 City", "Top %1 Cities",
2151 .arg(game.info.top_cities_count));
2152 } else {
2153 i.value()->setText(QString(_("Top Cities")));
2154 }
2155 break;
2156 default:
2157 break;
2158 }
2159 i++;
2160 }
2161 }
2162
2164 return;
2165 }
2166
2169 if (tile_city(unit_tile(punit))) {
2170 city_on_tile = true;
2171 break;
2172 }
2174
2176 const struct unit_type *ntype;
2177
2178 fc_assert((ptile == NULL) == (ptype == NULL));
2179
2181
2182 // 'ntype == ptype' is correct check even when ptype is still nullptr
2183 if (ptile != nullptr && ntype == ptype && unit_tile(punit) != ptile) {
2184 units_all_same_tile = false;
2185 }
2186
2187 if (ptype == nullptr || ntype == ptype) {
2188 ptile = unit_tile(punit);
2189 ptype = ntype;
2190 }
2192
2193 keys = menu_list.keys();
2194 foreach(munit key, keys) {
2195 i = menu_list.find(key);
2196 while (i != menu_list.end() && i.key() == key) {
2197 switch (key) {
2198 case STANDARD:
2199 i.value()->setEnabled(true);
2200 break;
2201
2202 case EXPLORE:
2204 i.value()->setEnabled(true);
2205 }
2206 break;
2207
2208 case BOARD:
2209 if (units_can_load(punits)) {
2210 i.value()->setEnabled(true);
2211 }
2212 break;
2213
2214 case DEBOARD:
2215 if (units_can_unload(punits)) {
2216 i.value()->setEnabled(true);
2217 }
2218 break;
2219
2220 case TRANSPORTER:
2222 i.value()->setEnabled(true);
2223 }
2224 break;
2225
2226 case CONVERT:
2227 if (units_can_convert(&(wld.map), punits)) {
2228 i.value()->setEnabled(true);
2229 }
2230 break;
2231
2232 case MINE:
2234 i.value()->setEnabled(true);
2235 }
2236
2237 if (units_all_same_tile) {
2239 struct extra_type *pextra = NULL;
2240
2241 /* FIXME: this overloading doesn't work well with multiple focus
2242 * units. */
2246 if (pextra != NULL) {
2247 break;
2248 }
2250
2251 if (pextra != NULL) {
2252 i.value()->setText(
2253 // TRANS: Build mine of specific type
2254 QString(_("Build %1"))
2255 .arg(extra_name_translation(pextra))
2256 .replace("&", "&&"));
2257 } else {
2258 i.value()->setText(QString(_("Build Mine")));
2259 }
2260 } else {
2261 i.value()->setText(QString(_("Build Mine")));
2262 }
2263 }
2264 break;
2265
2266 case IRRIGATION:
2268 i.value()->setEnabled(true);
2269 }
2270 if (units_all_same_tile) {
2272 struct extra_type *pextra = NULL;
2273
2274 /* FIXME: this overloading doesn't work well with multiple focus
2275 * units. */
2279 if (pextra != NULL) {
2280 break;
2281 }
2283
2284 if (pextra != NULL) {
2285 i.value()->setText(
2286 // TRANS: Build irrigation of specific type
2287 QString(_("Build %1"))
2288 .arg(extra_name_translation(pextra))
2289 .replace("&", "&&"));
2290 } else {
2291 i.value()->setText(QString(_("Build Irrigation")));
2292 }
2293 } else {
2294 i.value()->setText(QString(_("Build Irrigation")));
2295 }
2296 }
2297 break;
2298
2299 case CULTIVATE:
2301 i.value()->setEnabled(true);
2302 }
2303 if (units_all_same_tile) {
2304 struct unit *punit = unit_list_get(punits, 0);
2305 struct tile *atile = unit_tile(punit);
2306 struct terrain *pterrain = tile_terrain(atile);
2307
2308 if (pterrain->cultivate_result != T_NONE) {
2309 i.value()->setText(
2310 // TRANS: Transform terrain to specific type
2311 QString(_("Cultivate to %1"))
2313 .replace("&", "&&"));
2314 } else {
2315 i.value()->setText(QString(_("Cultivate")));
2316 }
2317 } else {
2318 i.value()->setText(QString(_("Cultivate")));
2319 }
2320 break;
2321
2322 case PLANT:
2324 i.value()->setEnabled(true);
2325 }
2326 if (units_all_same_tile) {
2327 struct unit *punit = unit_list_get(punits, 0);
2328 struct tile *atile = unit_tile(punit);
2329 struct terrain *pterrain = tile_terrain(atile);
2330
2331 if (pterrain->plant_result != T_NONE) {
2332 i.value()->setText(
2333 // TRANS: Transform terrain to specific type
2334 QString(_("Plant to %1"))
2336 .replace("&", "&&"));
2337 } else {
2338 i.value()->setText(QString(_("Plant")));
2339 }
2340 } else {
2341 i.value()->setText(QString(_("Plant")));
2342 }
2343 break;
2344
2345 case TRANSFORM:
2347 i.value()->setEnabled(true);
2348 } else {
2349 break;
2350 }
2351 if (units_all_same_tile) {
2352 struct unit *punit = unit_list_get(punits, 0);
2353 struct tile *atile = unit_tile(punit);
2354 struct terrain *pterrain = tile_terrain(atile);
2355
2356 if (pterrain->transform_result != T_NONE
2357 && pterrain->transform_result != pterrain) {
2358 i.value()->setText(
2359 // TRANS: Transform terrain to specific type
2360 QString(_("Transform to %1"))
2362 .replace("&", "&&"));
2363 } else {
2364 i.value()->setText(_("Transform Terrain"));
2365 }
2366 }
2367 break;
2368
2369 case BUILD:
2372 i.value()->setEnabled(true);
2373 }
2374 if (city_on_tile
2376 i.value()->setText(
2378 .replace("&", "&&"));
2379 } else {
2380 i.value()->setText(
2382 .replace("&", "&&"));
2383 }
2384 break;
2385
2386 case ROAD:
2387 {
2388 struct extra_type *pextra = nullptr;
2389
2391 i.value()->setEnabled(true);
2392 }
2396 if (pextra != nullptr) {
2397 break;
2398 }
2400
2401 if (pextra != nullptr) {
2402 i.value()->setText(
2403 // TRANS: Build road of specific type
2404 QString(_("Build %1"))
2405 .arg(extra_name_translation(pextra))
2406 .replace("&", "&&"));
2407 }
2408 }
2409 break;
2410
2411 case FORTIFY:
2413 i.value()->setEnabled(true);
2414 }
2415 break;
2416
2417 case FORTRESS:
2419 i.value()->setEnabled(true);
2420 }
2421 break;
2422
2423 case AIRBASE:
2425 i.value()->setEnabled(true);
2426 }
2427 break;
2428
2429 case CLEAN:
2431 i.value()->setEnabled(true);
2432 }
2433 break;
2434
2435 case SENTRY:
2437 i.value()->setEnabled(true);
2438 }
2439 break;
2440
2441 case PARADROP:
2443 i.value()->setEnabled(true);
2445 .replace("&", "&&"));
2446 }
2447 break;
2448
2449 case PILLAGE:
2451 i.value()->setEnabled(true);
2452 }
2453 break;
2454
2455 case HOMECITY:
2457 i.value()->setEnabled(true);
2458 }
2459 break;
2460
2461 case WAKEUP:
2463 i.value()->setEnabled(true);
2464 }
2465 break;
2466
2467 case AUTOSETTLER:
2469 i.value()->setEnabled(true);
2470 }
2472 i.value()->setText(_("Auto Settler"));
2473 } else {
2474 i.value()->setText(_("Auto Worker"));
2475 }
2476 break;
2477 case CONNECT_ROAD:
2479 if (proad != NULL) {
2480 tgt = road_extra_get(proad);
2481 } else {
2482 break;
2483 }
2485 i.value()->setEnabled(true);
2486 }
2487 break;
2488
2489 case DISBAND:
2491 i.value()->setEnabled(true);
2492 }
2493 break;
2494
2495 case CONNECT_RAIL:
2497 if (proad != NULL) {
2498 tgt = road_extra_get(proad);
2499 } else {
2500 break;
2501 }
2503 i.value()->setEnabled(true);
2504 }
2505 break;
2506
2507 case CONNECT_MAGLEV:
2509 if (proad != NULL) {
2510 tgt = road_extra_get(proad);
2511 } else {
2512 break;
2513 }
2515 i.value()->setEnabled(true);
2516 }
2517 break;
2518
2519 case CONNECT_IRRIGATION:
2520 {
2522
2523 if (extra_type_list_size(extras) > 0) {
2524 struct extra_type *pextra;
2525
2528 i.value()->setEnabled(true);
2529 }
2530 }
2531 }
2532 break;
2533
2534 case GOTO_CITY:
2535 if (any_cities) {
2536 i.value()->setEnabled(true);
2537 }
2538 break;
2539
2540 case AIRLIFT:
2541 if (any_cities) {
2542 i.value()->setEnabled(true);
2543 }
2544 break;
2545
2546 case BUILD_WONDER:
2547 i.value()->setText(
2549 .replace("&", "&&"));
2551 i.value()->setEnabled(true);
2552 }
2553 break;
2554
2555 case AUTOTRADEROUTE:
2557 i.value()->setEnabled(true);
2558 }
2559 break;
2560
2561 case ORDER_TRADE_ROUTE:
2562 i.value()->setText(
2564 .replace("&", "&&"));
2566 i.value()->setEnabled(true);
2567 }
2568 break;
2569
2570 case ORDER_DIPLOMAT_DLG:
2572 i.value()->setEnabled(true);
2573 }
2574 break;
2575
2576 case UPGRADE:
2577 if (units_can_upgrade(&(wld.map), punits)) {
2578 i.value()->setEnabled(true);
2579 }
2580 break;
2581 default:
2582 break;
2583 }
2584
2585 i++;
2586 }
2587 }
2588}
2589
2590/**********************************************************************/
2597
2598/**********************************************************************/
2607
2608/**********************************************************************/
2615
2616/**********************************************************************/
2620{
2621 ::gui()->game_tab_widget->setCurrentIndex(0);
2622}
2623
2624/**********************************************************************/
2631
2632/**********************************************************************/
2636{
2637 popup_players_dialog(false);
2638}
2639
2640/**********************************************************************/
2647
2648/**********************************************************************/
2652{
2654 /* FIXME: this can provide different actions for different units...
2655 * not good! */
2656 /* Enable the button for adding to a city in all cases, so we
2657 get an eventual error message from the server if we try. */
2662 }
2664}
2665
2666/**********************************************************************/
2670{
2672 struct extra_type *pextra;
2673
2676
2677 if (pextra != NULL) {
2679 }
2681}
2682
2683/**********************************************************************/
2698
2699/**********************************************************************/
2703{
2705
2706 if (prail != NULL) {
2707 struct extra_type *tgt;
2708
2709 tgt = road_extra_get(prail);
2711 }
2712}
2713
2714/**********************************************************************/
2718{
2720
2721 if (pmaglev != NULL) {
2722 struct extra_type *tgt;
2723
2724 tgt = road_extra_get(pmaglev);
2726 }
2727}
2728
2729/**********************************************************************/
2736
2737/**********************************************************************/
2744
2745/**********************************************************************/
2749{
2751
2752 if (proad != NULL) {
2753 struct extra_type *tgt;
2754
2755 tgt = road_extra_get(proad);
2757 }
2758}
2759
2760/**********************************************************************/
2767
2768/**********************************************************************/
2779
2780/**********************************************************************/
2784{
2786}
2787
2788/**********************************************************************/
2795
2796/**********************************************************************/
2803
2804/**********************************************************************/
2808{
2810 /* FIXME: this can provide different actions for different units...
2811 * not good! */
2813 EC_ROAD,
2815 punit);
2816 bool building_road = false;
2817
2818 if (tgt != NULL
2821 building_road = true;
2822 }
2823
2826 }
2828}
2829
2830/**********************************************************************/
2837
2838/**********************************************************************/
2845
2846/**********************************************************************/
2850{
2851 key_unit_mine();
2852}
2853
2854/**********************************************************************/
2858{
2860}
2861
2862/**********************************************************************/
2869
2870/**********************************************************************/
2877
2878/**********************************************************************/
2882{
2884}
2885
2886/**********************************************************************/
2893
2894/**********************************************************************/
2898{
2899 delayed_order = false;
2900 units_list.clear();
2901}
2902
2903/**********************************************************************/
2907{
2908 gui()->rallies.hover_tile = false;
2909 gui()->rallies.hover_city = true;
2910}
2911
2912/**********************************************************************/
2916{
2917 gui()->trade_gen.hover_city = true;
2918}
2919
2920/**********************************************************************/
2924{
2925 gui()->trade_gen.add_all_cities();
2926}
2927
2928/**********************************************************************/
2932{
2933 gui()->trade_gen.calculate();
2934}
2935
2936/**********************************************************************/
2940{
2941 gui()->trade_gen.clear_trade_planing();
2942}
2943
2944/**********************************************************************/
2948{
2949 qtiles gilles;
2950 struct unit *punit;
2951 struct city *homecity;
2952 struct tile *home_tile;
2953 struct tile *dest_tile;
2954 bool sent = false;
2955
2957 homecity = game_city_by_number(punit->homecity);
2958 home_tile = homecity->tile;
2959 foreach(gilles, gui()->trade_gen.lines) {
2960 if ((gilles.t1 == home_tile || gilles.t2 == home_tile)
2961 && gilles.autocaravan == nullptr) {
2962 // Send caravan
2963 if (gilles.t1 == home_tile) {
2964 dest_tile = gilles.t2;
2965 } else {
2966 dest_tile = gilles.t1;
2967 }
2968 if (send_goto_tile(punit, dest_tile)) {
2969 int i;
2970 i = gui()->trade_gen.lines.indexOf(gilles);
2971 gilles = gui()->trade_gen.lines.takeAt(i);
2972 gilles.autocaravan = punit;
2973 gui()->trade_gen.lines.append(gilles);
2974 sent = true;
2975 break;
2976 }
2977 }
2978 }
2979
2980 if (!sent) {
2981 gui()->infotab->chtwdg->append(_("Didn't find any trade route"
2982 " to establish"));
2983 }
2984}
2985
2986/**********************************************************************/
2990{
2991 QVariant v;
2992 QAction *act;
2993
2995 v = act->data();
2996 airlift_type_id = v.toInt();
2997}
2998
2999/**********************************************************************/
3003{
3004 QAction *act;
3005
3007 qdef_act::action()->vs_unit_set(act->data().toInt());
3008}
3009
3010/**********************************************************************/
3014{
3015 QAction *act;
3016
3018 qdef_act::action()->vs_city_set(act->data().toInt());
3019}
3020
3021/**********************************************************************/
3025{
3026 quick_airlifting = true;
3027}
3028
3029/**********************************************************************/
3033{
3035 int i = 0;
3037
3038 delayed_order = true;
3039 dg = D_GOTO;
3040
3041 struct unit_list *punits = get_units_in_focus();
3042 if (unit_list_size(punits) == 0) {
3043 return;
3044 }
3045 if (hover_state != HOVER_GOTO) {
3051 }
3053 i++;
3058}
3059
3060/**********************************************************************/
3064{
3066 struct unit *punit;
3067 struct tile *last_tile;
3068 struct tile *new_tile;
3069 int i = 0;
3070
3071 foreach (fui, units_list.unit_list) {
3072 i++;
3073 punit = unit_list_find(client_player()->units, fui->id);
3074 if (punit == nullptr) {
3075 continue;
3076 }
3077 last_tile = punit->tile;
3079 if (new_tile != nullptr) {
3080 punit->tile = new_tile;
3081 }
3082 if (is_tiles_adjacent(punit->tile, fui->ptile)) {
3085 punit->tile,
3086 fui->ptile));
3087 } else {
3088 send_attack_tile(punit, fui->ptile);
3089 }
3090 punit->tile = last_tile;
3091 }
3092 units_list.clear();
3093}
3094
3095/**********************************************************************/
3104
3105/**********************************************************************/
3109{
3111}
3112
3113/**********************************************************************/
3122
3123/**********************************************************************/
3127{
3129}
3130
3131/**********************************************************************/
3138
3139/**********************************************************************/
3148
3149/**********************************************************************/
3156
3157/**********************************************************************/
3164
3165/**********************************************************************/
3172
3173/**********************************************************************/
3177{
3178 key_unit_goto();
3179}
3180
3181/**********************************************************************/
3188
3189/**********************************************************************/
3196
3197/**********************************************************************/
3201{
3202 if (gui()->interface_locked) {
3203 enable_interface(false);
3204 } else {
3205 enable_interface(true);
3206 }
3207 gui()->interface_locked = !gui()->interface_locked;
3208}
3209
3210/**********************************************************************/
3214{
3218 int i;
3219
3220 lc = gui()->findChildren<close_widget *>();
3221 lm = gui()->findChildren<move_widget *>();
3222 lr = gui()->findChildren<resize_widget *>();
3223
3224 for (i = 0; i < lc.size(); ++i) {
3225 lc.at(i)->setVisible(!enable);
3226 }
3227 for (i = 0; i < lm.size(); ++i) {
3228 lm.at(i)->setVisible(!enable);
3229 }
3230 for (i = 0; i < lr.size(); ++i) {
3231 lr.at(i)->setVisible(!enable);
3232 }
3233}
3234
3235/**********************************************************************/
3239{
3241
3242 gui()->apply_fullscreen();
3243}
3244
3245/**********************************************************************/
3249{
3250 if (minimap_status->isChecked()) {
3251 ::gui()->minimapview_wdg->show();
3252 } else {
3253 ::gui()->minimapview_wdg->hide();
3254 }
3255}
3256
3257/**********************************************************************/
3261{
3262 if (osd_status->isChecked()) {
3263 gui()->qt_settings.show_new_turn_text = true;
3264 } else {
3265 gui()->qt_settings.show_new_turn_text = false;
3266 }
3267}
3268
3269/**********************************************************************/
3273{
3274 if (btlog_status->isChecked()) {
3275 gui()->qt_settings.show_battle_log = true;
3276 } else {
3277 gui()->qt_settings.show_battle_log = false;
3278 }
3279}
3280
3281/**********************************************************************/
3288
3289/**********************************************************************/
3296
3297/**********************************************************************/
3304
3305/**********************************************************************/
3312
3313/**********************************************************************/
3317{
3318 gui()->map_scale = gui()->map_scale * 1.2f;
3319 tilespec_reread(tileset_basename(tileset), true, gui()->map_scale);
3320}
3321
3322/**********************************************************************/
3326{
3327 QFont *qf;
3328
3329 gui()->map_scale = 1.0f;
3331 qf->setPointSize(fc_font::instance()->city_fontsize);
3333 qf->setPointSize(fc_font::instance()->prod_fontsize);
3334 tilespec_reread(tileset_basename(tileset), true, gui()->map_scale);
3335}
3336
3337/**********************************************************************/
3341{
3342 QFont *qf;
3343
3344 if (scale_fonts_status->isChecked()) {
3345 gui()->map_font_scale = true;
3346 } else {
3348 qf->setPointSize(fc_font::instance()->city_fontsize);
3350 qf->setPointSize(fc_font::instance()->prod_fontsize);
3351 gui()->map_font_scale = false;
3352 }
3354}
3355
3356/**********************************************************************/
3360{
3361 gui()->map_scale = gui()->map_scale / 1.2f;
3362 tilespec_reread(tileset_basename(tileset), true, gui()->map_scale);
3363}
3364
3365/**********************************************************************/
3372
3373/**********************************************************************/
3380
3381/**********************************************************************/
3388
3389/**********************************************************************/
3396
3397/**********************************************************************/
3404
3405/**********************************************************************/
3412
3413/**********************************************************************/
3420
3421/**********************************************************************/
3428
3429/**********************************************************************/
3433{
3434 key_unit_done();
3435}
3436
3437/**********************************************************************/
3444
3445/**********************************************************************/
3452
3453/**********************************************************************/
3462
3463/**********************************************************************/
3472
3473/**********************************************************************/
3480
3481/**********************************************************************/
3485{
3486 key_unit_wait();
3487}
3488
3489/**********************************************************************/
3493{
3495
3496 uhs = new unit_hud_selector(gui()->central_wdg);
3497 uhs->show_me();
3498}
3499
3500/**********************************************************************/
3507
3508/**********************************************************************/
3515
3516/**********************************************************************/
3523
3524/**********************************************************************/
3531
3532/**********************************************************************/
3539
3540/**********************************************************************/
3547
3548/**********************************************************************/
3555
3556/**********************************************************************/
3563
3564/**********************************************************************/
3571
3572/**********************************************************************/
3579
3580/**********************************************************************/
3587
3588/**********************************************************************/
3595
3596/**********************************************************************/
3603
3604/**********************************************************************/
3611
3612/**********************************************************************/
3619
3620/**********************************************************************/
3627
3628/**********************************************************************/
3635
3636/**********************************************************************/
3640{
3641 QDialog *dialog = new QDialog(this);
3642 QLabel *label;
3643 QPushButton *but;
3645 const struct strvec *tlset_list;
3646 const struct option *poption;
3648 QString s;
3649
3650 sl << "default_tileset_overhead_name" << "default_tileset_iso_name"
3651 << "default_tileset_hex_name" << "default_tileset_isohex_name";
3652 layout = new QVBoxLayout;
3653 dialog->setWindowTitle(_("Available tilesets"));
3654 label = new QLabel;
3655 label->setText(_("Some tilesets might not be compatible with current"
3656 " map topology!"));
3657 layout->addWidget(label);
3658
3659 foreach (s, sl) {
3661
3662 on_bytes = s.toUtf8();
3665 strvec_iterate(tlset_list, value) {
3666 but = new QPushButton(value);
3667 connect(but, &QAbstractButton::clicked, this, &mr_menu::load_new_tileset);
3668 layout->addWidget(but);
3670 }
3671 dialog->setSizeGripEnabled(true);
3672 dialog->setLayout(layout);
3673 dialog->show();
3674}
3675
3676/**********************************************************************/
3680{
3681 QPushButton *but;
3683
3685 tn_bytes = but->text().toUtf8();
3686 tilespec_reread(tn_bytes.data(), true, 1.0f);
3687 gui()->map_scale = 1.0f;
3688 but->parentWidget()->close();
3689}
3690
3691/**********************************************************************/
3695{
3696 gui()->trade_gen.calculate();
3697}
3698
3699/**********************************************************************/
3706
3707/**********************************************************************/
3714
3715/**********************************************************************/
3718void mr_menu::slot_help(const QString &topic)
3719{
3720 popup_help_dialog_typed(Q_(topic.toStdString().c_str()), HELP_ANY);
3721}
3722
3723/****************************************************************
3724 Actions "BUILD_PATH_*"
3725*****************************************************************/
3738
3739/****************************************************************
3740 Actions "BUILD_BASE_*"
3741*****************************************************************/
3743{
3746 if (pextra->buildable && pextra->id == id
3748 pextra)) {
3750 }
3753}
3754
3755
3756
3757/**********************************************************************/
3761{
3762 gui()->popup_client_options();
3763}
3764
3765/**********************************************************************/
3772
3773/**********************************************************************/
3777{
3778 gui()->pr_options->popup_server_options();
3779}
3780
3781/**********************************************************************/
3788
3789/**********************************************************************/
3796
3797/**********************************************************************/
3801{
3803}
3804
3805/**********************************************************************/
3809{
3812 QString path, storage_path;
3813 hud_message_box *saved = new hud_message_box(gui()->central_wdg);
3814 bool map_saved;
3816
3819 current_width = gui()->mapview_wdg->width();
3820 current_height = gui()->mapview_wdg->height();
3821 if (tileset_hex_width(tileset) > 0) {
3822 full_size_y = full_size_y * 11 / 20;
3823 } else if (tileset_is_isometric(tileset)) {
3825 }
3827 img_name = QString("Freeciv-Turn%1").arg(game.info.turn);
3828 if (client_has_player()) {
3829 img_name = img_name + "-"
3831 }
3833 path = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
3834 if (!storage_path.isEmpty() && QDir(storage_path).isReadable()) {
3836 } else if (!path.isEmpty()) {
3837 img_name = path + DIR_SEPARATOR + img_name;
3838 } else {
3839 img_name = QStandardPaths::writableLocation(QStandardPaths::HomeLocation)
3841 }
3842 map_saved = mapview.store->map_pixmap.save(img_name, "png");
3844 saved->setStandardButtons(QMessageBox::Ok);
3845 saved->setDefaultButton(QMessageBox::Cancel);
3846 saved->setAttribute(Qt::WA_DeleteOnClose);
3847 if (map_saved) {
3848 saved->set_text_title("Image saved as:\n" + img_name, _("Success"));
3849 } else {
3850 saved->set_text_title(_("Failed to save image of the map"), _("Error"));
3851 }
3852 saved->show();
3853}
3854
3855/**********************************************************************/
3859{
3861}
3862
3863/**********************************************************************/
3867{
3868 QString str;
3869 QString current_file;
3870 QString location;
3871
3873 location = dirname;
3874 // choose last location
3876
3877 str = QString(_("Save Games"))
3878 + QString(" (*.sav *.sav.bz2 *.sav.gz *.sav.xz)");
3879 current_file = QFileDialog::getSaveFileName(gui()->central_wdg,
3880 _("Save Game As..."),
3881 location, str);
3882 if (!current_file.isEmpty()) {
3884
3885 cf_bytes = current_file.toUtf8();
3886 send_save_game(cf_bytes.data());
3887 }
3888}
3889
3890/**********************************************************************/
3894{
3896
3897 if (is_server_running()) {
3898 ask = new hud_message_box(gui()->central_wdg);
3899 ask->set_text_title(_("Leaving a local game will end it!"), "Leave game");
3900 ask->setStandardButtons(QMessageBox::Cancel | QMessageBox::Ok);
3901 ask->setDefaultButton(QMessageBox::Cancel);
3902 ask->setAttribute(Qt::WA_DeleteOnClose);
3903
3904 connect(ask, &hud_message_box::accepted, [=]() {
3905 if (client.conn.used) {
3906 gui()->infotab->msgwdg->clr();
3907 disconnect_from_server(TRUE);
3908 }
3909 });
3910 ask->show();
3911 } else {
3913 }
3914}
3915
3916/**********************************************************************/
3927
3928/**********************************************************************/
3939
3940/**********************************************************************/
3944{
3945 hud_message_box* ask = new hud_message_box(gui()->central_wdg);
3946
3947 ask->setIcon(QMessageBox::Warning);
3948 ask->setStandardButtons(QMessageBox::Cancel | QMessageBox::Ok);
3949 ask->setDefaultButton(QMessageBox::Cancel);
3950 ask->setAttribute(Qt::WA_DeleteOnClose);
3951 return (ask->set_text_title(_("Selection will cancel current assignments!"),
3952 _("Confirm Disruptive Selection"), true)
3953 == QMessageBox::Ok);
3954}
3955
3956/**********************************************************************/
3960{
3961 struct tile *ptile;
3963 if (get_city_bonus(pcity, EFT_AIRLIFT) > 0) {
3964 ptile = city_tile(pcity);
3965 unit_list_iterate(ptile->units, punit) {
3966 if (punit->utype == utype_by_number(ut)) {
3968 break;
3969 }
3971 }
3973}
const char * action_name_translation(const struct action *action)
Definition actions.c:1991
const char * action_id_name_translation(action_id act_id)
Definition actions.c:2011
enum action_sub_target_kind action_get_sub_target_kind(const struct action *paction)
Definition actions.c:1880
bool actions_are_ready(void)
Definition actions.c:1717
static struct action * action_by_number(action_id act_id)
Definition actions.h:635
#define action_iterate_end
Definition actions.h:465
#define action_id_get_actor_kind(act_id)
Definition actions.h:648
#define action_iterate(_act_)
Definition actions.h:461
#define ACTION_ANY
Definition actions.h:308
#define action_id_get_target_kind(act_id)
Definition actions.h:652
#define action_id_has_complex_target(act_id)
Definition actions.h:670
#define ACTION_NONE
Definition actions.h:311
bool actres_removes_extra(enum action_result result, const struct extra_type *pextra)
Definition actres.c:803
bool actres_creates_extra(enum action_result result, const struct extra_type *pextra)
Definition actres.c:782
#define str
Definition astring.c:76
#define n
Definition astring.c:77
void output_window_append(const struct ft_color color, const char *featured_text)
struct city * create_city_virtual(struct player *pplayer, struct tile *ptile, const char *name)
Definition city.c:3430
void destroy_city_virtual(struct city *pcity)
Definition city.c:3516
static bool is_non_allied_city_tile(const struct tile *ptile, const struct player *pplayer)
Definition city.h:770
#define city_list_iterate(citylist, pcity)
Definition city.h:508
#define city_tile(_pcity_)
Definition city.h:564
#define city_list_iterate_end
Definition city.h:510
static fc_font * instance()
Definition fonts.cpp:41
QFont * get_font(QString name)
Definition fonts.cpp:63
static fc_shortcuts * sc()
fc_shortcut * get_shortcut(shortcut_id id)
static void update_all()
Definition menu.cpp:895
virtual ~go_act_menu()
Definition menu.cpp:707
void start_go_act(int act_id, int sub_tgt_id)
Definition menu.cpp:872
void reset()
Definition menu.cpp:716
static QSet< go_act_menu * > instances
Definition menu.h:237
void update()
Definition menu.cpp:832
go_act_menu(QWidget *parent=nullptr)
Definition menu.cpp:697
static void reset_all()
Definition menu.cpp:885
void create()
Definition menu.cpp:728
QMap< QAction *, int > items
Definition menu.h:239
static QSet< gov_menu * > instances
Definition menu.h:212
virtual ~gov_menu()
Definition menu.cpp:578
static void create_all()
Definition menu.cpp:677
void revolution()
Definition menu.cpp:656
QVector< QAction * > actions
Definition menu.h:214
static void update_all()
Definition menu.cpp:687
void change_gov(int target_gov)
Definition menu.cpp:664
gov_menu(QWidget *parent=0)
Definition menu.cpp:567
void create()
Definition menu.cpp:587
void update()
Definition menu.cpp:628
bool shortcut_2_menustring_inner(const QMenu *m, QKeySequence seq, QString *ret)
Definition menu.cpp:1910
void slot_unit_sentry()
Definition menu.cpp:2873
QActionGroup * action_vs_city
Definition menu.h:267
void slot_bg3select()
Definition menu.cpp:3591
void slot_traveler()
Definition menu.cpp:3535
bool execute_shortcut_inner(const QMenu *m, QKeySequence seq)
Definition menu.cpp:1828
void slot_delayed_goto()
Definition menu.cpp:3032
void zoom_in()
Definition menu.cpp:3316
void slot_autocaravan()
Definition menu.cpp:2947
QMenu * multiplayer_menu
Definition menu.h:264
void slot_build_irrigation()
Definition menu.cpp:2833
void volume_up()
Definition menu.cpp:3919
void slot_execute_orders()
Definition menu.cpp:3063
void update_bases_menu()
Definition menu.cpp:2035
QString shortcut_exist(fc_shortcut *fcs)
Definition menu.cpp:1887
void tileset_custom_load()
Definition menu.cpp:3639
void update_roads_menu()
Definition menu.cpp:1988
void slot_calculate()
Definition menu.cpp:2931
void slot_conn_road()
Definition menu.cpp:2748
void slot_conn_irrigation()
Definition menu.cpp:2686
QMenu * bases_menu
Definition menu.h:263
QActionGroup * airlift_type
Definition menu.h:266
void slot_quickairlift_set()
Definition menu.cpp:2989
void slot_battlelog()
Definition menu.cpp:3272
QMultiHash< munit, QAction * > menu_list
Definition menu.h:271
void slot_trade_add_all()
Definition menu.cpp:2923
void update_airlift_menu()
Definition menu.cpp:1952
void slot_show_cities()
Definition menu.cpp:2643
void slot_transform()
Definition menu.cpp:2763
void slot_top_cities()
Definition menu.cpp:3527
void slot_action_vs_unit()
Definition menu.cpp:3002
void slot_achievements()
Definition menu.cpp:3511
void slot_show_research_tab()
Definition menu.cpp:2593
void shortcut_options()
Definition menu.cpp:3768
void slot_city_output()
Definition menu.cpp:3384
void slot_show_eco_report()
Definition menu.cpp:2611
QMenu * airlift_menu
Definition menu.h:262
QAction * osd_status
Definition menu.h:287
void slot_bg1select()
Definition menu.cpp:3543
void slot_unload_all()
Definition menu.cpp:3152
void slot_airlift()
Definition menu.cpp:3126
void slot_select_same_continent()
Definition menu.cpp:3456
void slot_city_production()
Definition menu.cpp:3392
void slot_set_home()
Definition menu.cpp:3134
QAction * lock_status
Definition menu.h:286
void slot_native_tiles()
Definition menu.cpp:3292
void slot_unit_explore()
Definition menu.cpp:3184
void slot_bg4assign()
Definition menu.cpp:3623
void slot_bg1append()
Definition menu.cpp:3559
void slot_upgrade()
Definition menu.cpp:3168
void execute_shortcut(int sid)
Definition menu.cpp:1843
void slot_popup_mult_rates()
Definition menu.cpp:3710
void slot_select_same_everywhere()
Definition menu.cpp:3466
void volume_down()
Definition menu.cpp:3931
void slot_map_grid()
Definition menu.cpp:3424
void slot_unit_filter()
Definition menu.cpp:3492
void slot_bg2select()
Definition menu.cpp:3567
void slot_done_moving()
Definition menu.cpp:3432
void calc_trade_routes()
Definition menu.cpp:3694
void slot_city_buycost()
Definition menu.cpp:3300
void slot_action()
Definition menu.cpp:2791
void slot_bg4append()
Definition menu.cpp:3631
QMenu * roads_menu
Definition menu.h:265
QAction * minimap_status
Definition menu.h:284
bool shortcut_exist_inner(const QMenu *m, QKeySequence seq, fc_shortcut *fcs, QString *ret)
Definition menu.cpp:1870
void slot_select_all_tile()
Definition menu.cpp:3440
void save_game()
Definition menu.cpp:3858
struct tile * find_last_unit_pos(struct unit *punit, int pos)
Definition menu.cpp:905
void save_image()
Definition menu.cpp:3808
void slot_pillage()
Definition menu.cpp:2783
void slot_clean()
Definition menu.cpp:2669
void zoom_reset()
Definition menu.cpp:3325
void slot_board()
Definition menu.cpp:3098
void slot_center_view()
Definition menu.cpp:3192
void slot_build_mine()
Definition menu.cpp:2849
void server_options()
Definition menu.cpp:3776
void load_new_tileset()
Definition menu.cpp:3679
void set_tile_for_order(struct tile *ptile)
Definition menu.cpp:1816
void slot_fullscreen()
Definition menu.cpp:3238
void slot_bg4select()
Definition menu.cpp:3615
void slot_show_nations()
Definition menu.cpp:2635
void slot_build_road()
Definition menu.cpp:2807
void slot_unsentry()
Definition menu.cpp:3160
void slot_show_new_turn_text()
Definition menu.cpp:3260
void local_options()
Definition menu.cpp:3760
bool delayed_order
Definition menu.h:291
void slot_borders()
Definition menu.cpp:3284
void slot_clear_trade()
Definition menu.cpp:2939
void zoom_scale_fonts()
Definition menu.cpp:3340
void slot_conn_rail()
Definition menu.cpp:2702
void slot_select_same_tile()
Definition menu.cpp:3476
void slot_convert()
Definition menu.cpp:2881
QMenu * action_unit_menu
Definition menu.h:269
QActionGroup * action_vs_unit
Definition menu.h:268
void slot_endgame()
Definition menu.cpp:3519
void slot_bg2assign()
Definition menu.cpp:3575
void slot_select_one()
Definition menu.cpp:3448
void menus_sensitive()
Definition menu.cpp:2082
void messages_options()
Definition menu.cpp:3784
void slot_unit_goto()
Definition menu.cpp:3176
void slot_cultivate()
Definition menu.cpp:2841
void slot_stack_size()
Definition menu.cpp:3408
void slot_conn_maglev()
Definition menu.cpp:2717
void slot_patrol()
Definition menu.cpp:3108
void slot_unit_fortress()
Definition menu.cpp:2732
void slot_wait()
Definition menu.cpp:3484
void slot_demographics()
Definition menu.cpp:3503
void slot_build_city()
Definition menu.cpp:2651
void slot_city_growth()
Definition menu.cpp:3308
void slot_city_trade_routes()
Definition menu.cpp:3400
void slot_rally()
Definition menu.cpp:2906
void slot_plant()
Definition menu.cpp:2857
void slot_paradrop()
Definition menu.cpp:2771
void slot_build_path(int id)
Definition menu.cpp:3726
void slot_bg1assign()
Definition menu.cpp:3551
void slot_return_to_city()
Definition menu.cpp:3116
Unit_type_id airlift_type_id
Definition menu.h:293
void slot_show_map()
Definition menu.cpp:2619
void slot_bg3assign()
Definition menu.cpp:3599
QAction * scale_fonts_status
Definition menu.h:285
void slot_minimap_view()
Definition menu.cpp:3248
void slot_trade_city()
Definition menu.cpp:2915
void quit_game()
Definition menu.cpp:3800
void slot_help(const QString &topic)
Definition menu.cpp:3718
void save_game_as()
Definition menu.cpp:3866
void slot_bg2append()
Definition menu.cpp:3583
bool quick_airlifting
Definition menu.h:292
void slot_spaceship()
Definition menu.cpp:2601
void slot_city_names()
Definition menu.cpp:3368
QMenu * action_city_menu
Definition menu.h:270
void save_options_now()
Definition menu.cpp:3792
QAction * btlog_status
Definition menu.h:288
void slot_unit_fortify()
Definition menu.cpp:2865
void slot_show_units_report()
Definition menu.cpp:2627
void slot_quickairlift()
Definition menu.cpp:3024
QString shortcut_2_menustring(int sid)
Definition menu.cpp:1928
void slot_lock()
Definition menu.cpp:3200
void back_to_menu()
Definition menu.cpp:3893
void slot_deboard()
Definition menu.cpp:3142
void slot_popup_tax_rates()
Definition menu.cpp:3702
void slot_auto_settler()
Definition menu.cpp:2799
void slot_build_base(int id)
Definition menu.cpp:3742
qfc_units_list units_list
Definition menu.h:272
void setup_menus()
Definition menu.cpp:956
mr_menu()
Definition menu.cpp:947
void slot_bg3append()
Definition menu.cpp:3607
void slot_action_vs_city()
Definition menu.cpp:3013
void zoom_out()
Definition menu.cpp:3359
void slot_disband()
Definition menu.cpp:2889
void slot_unit_airbase()
Definition menu.cpp:2740
void slot_fullbar()
Definition menu.cpp:3416
void slot_city_outlines()
Definition menu.cpp:3376
bool confirm_disruptive_selection()
Definition menu.cpp:3943
void slot_orders_clear()
Definition menu.cpp:2897
static qdef_act * action()
Definition dialogs.cpp:1038
void vs_city_set(int i)
Definition dialogs.cpp:1060
void vs_unit_set(int i)
Definition dialogs.cpp:1068
QList< qfc_delayed_unit_item * > unit_list
Definition menu.h:131
void add(qfc_delayed_unit_item *fui)
Definition menu.cpp:493
int nr_units
Definition menu.h:132
void clear()
Definition menu.cpp:501
bool done
Definition menu.h:143
unsigned trade_num
Definition menu.h:146
int poss_trade_num
Definition menu.h:145
QList< struct city * > pos_cities
Definition menu.h:149
QList< struct city * > new_tr_cities
Definition menu.h:148
int over_max
Definition menu.h:144
trade_city(struct city *pcity)
Definition menu.cpp:68
QList< struct city * > curr_tr_cities
Definition menu.h:147
struct city * city
Definition menu.h:150
void calculate_inner(trade_city *tc)
Definition menu.cpp:214
bool discard_one(trade_city *tc)
Definition menu.cpp:376
void add_city(struct city *pcity)
Definition menu.cpp:125
void find_certain_routes()
Definition menu.cpp:458
QList< trade_city * > cities
Definition menu.h:182
void find_certain_routes_inner(trade_city *tc)
Definition menu.cpp:423
trade_city * find_most_free()
Definition menu.cpp:325
void discard_trade(trade_city *tc1, trade_city *tc2)
Definition menu.cpp:362
void add_tile(struct tile *ptile)
Definition menu.cpp:137
void remove_virtual_city(struct tile *ptile)
Definition menu.cpp:188
bool hover_city
Definition menu.h:179
void add_all_cities()
Definition menu.cpp:87
void clear_trade_planing()
Definition menu.cpp:105
void discard()
Definition menu.cpp:343
void remove_city(struct city *pcity)
Definition menu.cpp:170
QList< qtiles > lines
Definition menu.h:180
bool discard_any(trade_city *tc, int freeroutes)
Definition menu.cpp:402
void check_if_done(trade_city *tc1, trade_city *tc2)
Definition menu.cpp:473
QList< struct city * > virtual_cities
Definition menu.h:181
int find_over_max(struct city *pcity)
Definition menu.cpp:309
void calculate()
Definition menu.cpp:232
bool client_is_observer(void)
struct civclient client
enum client_states client_state(void)
bool is_waiting_turn_change(void)
void send_report_request(enum report_type type)
bool can_client_issue_orders(void)
bool client_has_player(void)
#define client_player()
@ C_S_RUNNING
Definition client_main.h:47
bool can_units_do_connect(struct unit_list *punits, enum unit_activity activity, struct extra_type *tgt)
Definition climisc.c:1241
void disconnect_from_server(bool leaving_sound)
Definition clinet.c:306
char * incite_cost
Definition comments.c:75
@ REPORT_DEMOGRAPHIC
Definition conn_types.h:53
@ REPORT_WONDERS_OF_THE_WORLD_LONG
Definition conn_types.h:51
@ REPORT_ACHIEVEMENTS
Definition conn_types.h:54
@ REPORT_TOP_CITIES
Definition conn_types.h:52
void send_save_game(const char *filename)
bool is_server_running(void)
bool can_client_access_hack(void)
void key_unit_sentry(void)
Definition control.c:3756
void request_unit_airlift(struct unit *punit, struct city *pcity)
Definition control.c:1543
void key_city_output_toggle(void)
Definition control.c:3853
void request_unit_return(struct unit *punit)
Definition control.c:1552
void request_unit_caravan_action(struct unit *punit, action_id action)
Definition control.c:2223
void key_unit_auto_explore(void)
Definition control.c:3577
void key_unit_auto_settle(void)
Definition control.c:3590
void key_unit_connect(enum unit_activity activity, struct extra_type *tgt)
Definition control.c:3375
void key_city_full_bar_toggle(void)
Definition control.c:3885
void key_map_native_toggle(void)
Definition control.c:3877
void request_unit_goto(enum unit_orders last_order, action_id act_id, int sub_tgt_id)
Definition control.c:1130
void key_unit_paradrop(void)
Definition control.c:3479
struct unit_list * get_units_in_focus(void)
Definition control.c:177
void request_center_focus_unit(void)
Definition control.c:2750
void key_city_productions_toggle(void)
Definition control.c:3919
void key_unit_plant(void)
Definition control.c:3696
void key_unit_fortress(void)
Definition control.c:3624
void key_unit_mine(void)
Definition control.c:3688
void key_unit_pillage(void)
Definition control.c:3708
void request_unit_unload(struct unit *pcargo)
Definition control.c:2194
void request_new_unit_activity_targeted(struct unit *punit, enum unit_activity act, struct extra_type *tgt)
Definition control.c:1938
void key_unit_irrigate(void)
Definition control.c:3668
void request_unit_build_city(struct unit *punit)
Definition control.c:1817
void key_unit_unload_all(void)
Definition control.c:3517
void key_city_outlines_toggle(void)
Definition control.c:3845
void key_unit_homecity(void)
Definition control.c:3641
void set_hover_state(struct unit_list *punits, enum cursor_hover_state state, enum unit_activity activity, struct extra_type *tgt, int last_tgt, int last_sub_tgt, action_id action, enum unit_orders order)
Definition control.c:290
void key_unit_patrol(void)
Definition control.c:3487
void key_unit_wakeup_others(void)
Definition control.c:3550
enum cursor_hover_state hover_state
Definition control.c:89
void key_unit_stack_size_toggle(void)
Definition control.c:3936
void key_unit_wait(void)
Definition control.c:3542
void key_unit_select_battlegroup(int battlegroup, bool append)
Definition control.c:3819
void key_map_grid_toggle(void)
Definition control.c:3861
struct unit * head_of_units_in_focus(void)
Definition control.c:410
void key_city_growth_toggle(void)
Definition control.c:3902
void key_unit_action_select_tgt(void)
Definition control.c:3406
void key_city_buycost_toggle(void)
Definition control.c:3911
int get_num_units_in_focus(void)
Definition control.c:185
void key_unit_transform(void)
Definition control.c:3768
void request_move_unit_direction(struct unit *punit, int dir)
Definition control.c:1879
void key_unit_done(void)
Definition control.c:3463
void key_city_trade_routes_toggle(void)
Definition control.c:3928
void key_city_names_toggle(void)
Definition control.c:3893
void request_unit_select(struct unit_list *punits, enum unit_select_type_mode seltype, enum unit_select_location_mode selloc)
Definition control.c:1621
void key_unit_airbase(void)
Definition control.c:3560
void key_unit_goto(void)
Definition control.c:3471
void control_mouse_cursor(struct tile *ptile)
Definition control.c:1215
void key_unit_convert(void)
Definition control.c:3602
void key_unit_fortify(void)
Definition control.c:3612
void key_unit_assign_battlegroup(int battlegroup, bool append)
Definition control.c:3780
void key_unit_cultivate(void)
Definition control.c:3676
void key_map_borders_toggle(void)
Definition control.c:3869
#define can_unit_do_activity_targeted_client(_punit_, _act_, _tgt_)
Definition control.h:43
#define can_units_do_activity_targeted_client(_punits_, _act_, _tgt_)
Definition control.h:47
@ HOVER_GOTO
Definition control.h:27
#define can_units_do_activity_client(_punits_, _act_)
Definition control.h:45
bool qtg_request_transport(struct unit *pcargo, struct tile *ptile)
Definition dialogs.cpp:4874
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
int get_city_bonus(const struct city *pcity, enum effect_type effect_type)
Definition effects.c:846
struct extra_type * next_extra_for_tile(const struct tile *ptile, enum extra_cause cause, const struct player *pplayer, const struct unit *punit)
Definition extras.c:765
int extra_number(const struct extra_type *pextra)
Definition extras.c:161
struct extra_type_list * extra_type_list_by_cause(enum extra_cause cause)
Definition extras.c:249
struct extra_type * prev_extra_in_tile(const struct tile *ptile, enum extra_rmcause rmcause, const struct player *pplayer, const struct unit *punit)
Definition extras.c:790
static struct extra_type extras[MAX_EXTRA_TYPES]
Definition extras.c:31
const char * extra_name_translation(const struct extra_type *pextra)
Definition extras.c:194
#define extra_type_iterate(_p)
Definition extras.h:315
#define extra_type_iterate_end
Definition extras.h:321
#define extra_type_by_cause_iterate_end
Definition extras.h:339
#define extra_type_by_cause_iterate(_cause, _extra)
Definition extras.h:333
#define NO_TARGET
Definition fc_types.h:354
int Unit_type_id
Definition fc_types.h:382
#define Q_(String)
Definition fcintl.h:70
#define PL_(String1, String2, n)
Definition fcintl.h:71
#define _(String)
Definition fcintl.h:67
const struct ft_color ftc_client
const char * city_link(const struct city *pcity)
struct civ_game game
Definition game.c:62
struct world wld
Definition game.c:63
struct city * game_city_by_number(int id)
Definition game.c:107
struct tile * tile_before_end_path(struct unit *punit, struct tile *ptile)
Definition goto.c:2011
bool send_attack_tile(struct unit *punit, struct tile *ptile)
Definition goto.c:1621
bool send_goto_tile(struct unit *punit, struct tile *ptile)
Definition goto.c:1551
void enter_goto_state(struct unit_list *punits)
Definition goto.c:1001
const char * government_name_translation(const struct government *pgovern)
Definition government.c:143
bool untargeted_revolution_allowed(void)
Definition government.c:570
Government_type_id government_count(void)
Definition government.c:71
struct government * government_by_number(const Government_type_id gov)
Definition government.c:103
bool can_change_to_government(struct player *pplayer, const struct government *gov)
Definition government.c:170
static PangoLayout * layout
Definition canvas.c:325
void city_report_dialog_popup(bool raise)
Definition cityrep.c:292
void popup_upgrade_dialog(struct unit_list *punits)
Definition dialogs.c:1435
void popup_disband_dialog(struct unit_list *punits)
Definition dialogs.c:1473
static struct tile * pos
Definition finddlg.c:53
void popup_multiplier_dialog(void)
Definition gamedlgs.c:383
void popup_rates_dialog(void)
Definition gamedlgs.c:533
void popup_goto_dialog(void)
Definition gotodlg.c:258
void popup_quit_dialog(void)
Definition gui_main.c:2348
void popup_help_dialog_typed(const char *item, enum help_page_type htype)
Definition helpdlg.c:197
void create_line_at_mouse_pos(void)
Definition mapctrl.c:355
void update_city_descriptions(void)
Definition mapview.c:488
static const char * get_tile_change_menu_text(struct tile *ptile, enum unit_activity activity)
Definition menu.c:2370
#define CREATE_SUB_ITEM(_sub_target_, _sub_target_key_, _sub_target_name_)
void popup_messageopt_dialog(void)
Definition messagedlg.c:51
void popup_players_dialog(bool raise)
Definition plrdlg.c:91
void science_report_dialog_popup(bool raise)
Definition repodlgs.c:716
void economy_report_dialog_popup(bool raise)
Definition repodlgs.c:1243
void popup_spaceship_dialog(struct player *pplayer)
delay_order
Definition menu.h:82
@ D_GOTO
Definition menu.h:83
munit
Definition menu.h:39
@ AIRLIFT
Definition menu.h:69
@ CONNECT_RAIL
Definition menu.h:65
@ TRANSFORM
Definition menu.h:51
@ FORTIFY
Definition menu.h:56
@ GOTO_CITY
Definition menu.h:68
@ TRANSPORTER
Definition menu.h:44
@ BUILD
Definition menu.h:54
@ IRRIGATION
Definition menu.h:49
@ CONNECT_IRRIGATION
Definition menu.h:67
@ CONNECT_ROAD
Definition menu.h:64
@ HOMECITY
Definition menu.h:61
@ CONVERT
Definition menu.h:46
@ PILLAGE
Definition menu.h:53
@ TOP_CITIES
Definition menu.h:79
@ BUILD_WONDER
Definition menu.h:70
@ DISBAND
Definition menu.h:45
@ DEBOARD
Definition menu.h:43
@ CLEAN
Definition menu.h:59
@ NOT_4_OBS
Definition menu.h:75
@ UPGRADE
Definition menu.h:74
@ SAVE
Definition menu.h:78
@ MULTIPLIERS
Definition menu.h:76
@ PLANT
Definition menu.h:48
@ ORDER_TRADE_ROUTE
Definition menu.h:72
@ WAKEUP
Definition menu.h:62
@ MINE
Definition menu.h:47
@ SENTRY
Definition menu.h:60
@ ORDER_DIPLOMAT_DLG
Definition menu.h:73
@ EXPLORE
Definition menu.h:41
@ STANDARD
Definition menu.h:40
@ ROAD
Definition menu.h:55
@ CONNECT_MAGLEV
Definition menu.h:66
@ CULTIVATE
Definition menu.h:50
@ PARADROP
Definition menu.h:52
@ AUTOSETTLER
Definition menu.h:63
@ BOARD
Definition menu.h:42
@ FORTRESS
Definition menu.h:57
@ ENDGAME
Definition menu.h:77
@ AUTOTRADEROUTE
Definition menu.h:71
@ AIRBASE
Definition menu.h:58
#define enable(id)
Definition widget.h:223
void popup_revolution_dialog(void)
Definition dialogs.c:112
#define HELP_MUSICSET_ITEM
#define HELP_CITIES_ITEM
#define HELP_TERRAIN_ITEM
#define HELP_LANGUAGES_ITEM
#define HELP_CONNECTING_ITEM
#define HELP_TILESET_ITEM
#define HELP_CHATLINE_ITEM
#define HELP_RULESET_ITEM
#define HELP_GOVERNMENT_ITEM
#define HELP_ABOUT_ITEM
#define HELP_MULTIPLIER_ITEM
#define HELP_PLAYING_ITEM
#define HELP_IMPROVEMENTS_ITEM
#define HELP_UNITS_ITEM
#define HELP_ZOC_ITEM
#define HELP_WORKLIST_EDITOR_ITEM
#define HELP_WONDERS_ITEM
#define HELP_COMBAT_ITEM
#define HELP_SPACE_RACE_ITEM
#define HELP_COPYING_ITEM
#define HELP_OVERVIEW_ITEM
#define HELP_NATIONS_ITEM
#define HELP_TECHS_ITEM
#define HELP_DIPLOMACY_ITEM
#define HELP_ECONOMY_ITEM
@ HELP_ANY
Definition helpdlg_g.h:20
#define HELP_CMA_ITEM
#define HELP_CONTROLS_ITEM
bool has_player_unit_type(Unit_type_id utype)
Definition hudwidget.cpp:60
Impr_type_id improvement_number(const struct impr_type *pimprove)
const char * improvement_name_translation(const struct impr_type *pimprove)
#define improvement_iterate_end
#define improvement_iterate(_p)
#define fc_assert(condition)
Definition log.h:176
int get_direction_for_step(const struct civ_map *nmap, const struct tile *start_tile, const struct tile *end_tile)
Definition map.c:1347
bool is_tiles_adjacent(const struct tile *tile0, const struct tile *tile1)
Definition map.c:931
struct terrain_misc terrain_control
Definition map.c:69
struct view mapview
bool map_canvas_resized(int width, int height)
#define fc_malloc(sz)
Definition mem.h:34
#define ADD_OLD_SHORTCUT(wanted_action_id, sc_id)
static void enable_interface(bool enable)
Definition menu.cpp:3213
void multiairlift(struct city *acity, Unit_type_id ut)
Definition menu.cpp:3959
void real_menus_init(void)
Definition menu.cpp:510
static const char * get_tile_change_menu_text(struct tile *ptile, enum unit_activity activity)
Definition menu.cpp:551
void real_menus_update(void)
Definition menu.cpp:528
static mpgui * gui
Definition mpgui_qt.cpp:52
Multiplier_type_id multiplier_count(void)
Definition multipliers.c:88
const char *const city_productions
Definition fonts.h:33
const char *const city_names
Definition fonts.h:32
const char * nation_plural_for_player(const struct player *pplayer)
Definition nation.c:178
void option_changed(struct option *poption)
Definition options.c:752
const struct option_set * client_optset
Definition options.c:1284
void options_save(option_save_log_callback log_cb)
Definition options.c:6144
struct client_options gui_options
Definition options.c:72
struct option * optset_option_by_name(const struct option_set *poptset, const char *name)
Definition options.c:435
void popup_shortcuts_dialog()
void toggle_units_report(bool)
#define players_iterate_end
Definition player.h:537
#define players_iterate(_pplayer)
Definition player.h:532
void popup_endgame_report()
struct extra_type * road_extra_get(const struct road_type *proad)
Definition road.c:42
struct road_type * road_by_gui_type(enum road_gui_type gui_type)
Definition road.c:180
const struct strvec * get_save_dirs(void)
Definition shared.c:941
void array_shuffle(int *array, int n)
Definition shared.c:2010
char * freeciv_storage_dir(void)
Definition shared.c:678
#define DIR_SEPARATOR
Definition shared.h:127
#define CLIP(lower, current, upper)
Definition shared.h:57
QString shortcut_to_string(fc_shortcut *sc)
shortcut_id
Definition shortcuts.h:33
@ SC_PARADROP
Definition shortcuts.h:95
@ SC_UPGRADE_UNIT
Definition shortcuts.h:63
@ SC_BUILDIRRIGATION
Definition shortcuts.h:67
@ SC_BUILDCITY
Definition shortcuts.h:70
@ SC_DONE_MOVING
Definition shortcuts.h:57
@ SC_BUILDROAD
Definition shortcuts.h:69
@ SC_UNSENTRY_TILE
Definition shortcuts.h:61
@ SC_CULTIVATE
Definition shortcuts.h:68
@ SC_DO
Definition shortcuts.h:62
@ SC_CENTER_VIEW
Definition shortcuts.h:36
@ SC_SENTRY
Definition shortcuts.h:71
@ SC_GOBUILDCITY
Definition shortcuts.h:92
@ SC_NUKE
Definition shortcuts.h:76
@ SC_AUTOEXPLORE
Definition shortcuts.h:59
@ SC_SETHOME
Definition shortcuts.h:64
@ SC_PLANT
Definition shortcuts.h:66
@ SC_BUILDMINE
Definition shortcuts.h:65
@ SC_FULLSCREEN
Definition shortcuts.h:37
@ SC_TRADE_ROUTES
Definition shortcuts.h:54
@ SC_CITY_OUTPUT
Definition shortcuts.h:39
@ SC_TRANSFORM
Definition shortcuts.h:75
@ SC_STACK_SIZE
Definition shortcuts.h:94
@ SC_FORTIFY
Definition shortcuts.h:72
@ SC_ZOOM_IN
Definition shortcuts.h:87
@ SC_GOJOINCITY
Definition shortcuts.h:93
@ SC_MAP_GRID
Definition shortcuts.h:40
@ SC_MINIMAP
Definition shortcuts.h:38
@ SC_CITY_PROD
Definition shortcuts.h:55
@ SC_PATROL
Definition shortcuts.h:60
@ SC_GOTO
Definition shortcuts.h:73
@ SC_GOTOAIRLIFT
Definition shortcuts.h:58
@ SC_WAIT
Definition shortcuts.h:74
@ SC_IFACE_LOCK
Definition shortcuts.h:80
@ SC_DEBOARD
Definition shortcuts.h:78
@ SC_ZOOM_RESET
Definition shortcuts.h:91
@ SC_ZOOM_OUT
Definition shortcuts.h:88
@ SC_AUTOMATE
Definition shortcuts.h:81
@ SC_CITY_NAMES
Definition shortcuts.h:56
@ SC_BOARD
Definition shortcuts.h:77
@ SC_CLEAN
Definition shortcuts.h:82
@ SC_NAT_BORDERS
Definition shortcuts.h:41
@ SC_SHOW_FULLBAR
Definition shortcuts.h:86
#define strvec_iterate(psv, str)
#define strvec_iterate_end
QPixmap map_pixmap
Definition canvas.h:25
Definition city.h:320
char * name
Definition city.h:321
struct tile * tile
Definition city.h:322
struct packet_game_info info
Definition game.h:89
bool ruleset_ready
Definition game.h:119
struct civ_game::@31::@34 client
struct government * government_during_revolution
Definition game.h:94
int xsize
Definition map_types.h:78
int ysize
Definition map_types.h:78
struct connection conn
Definition client_main.h:96
bool gui_qt_fullscreen
Definition options.h:405
bool draw_native
Definition options.h:215
bool draw_city_output
Definition options.h:194
bool draw_city_names
Definition options.h:196
bool draw_city_productions
Definition options.h:198
bool draw_borders
Definition options.h:214
bool draw_city_buycost
Definition options.h:199
bool draw_unit_stack_size
Definition options.h:218
bool draw_city_trade_routes
Definition options.h:200
bool unit_selection_clears_orders
Definition options.h:175
bool save_options_on_exit
Definition options.h:125
int sound_effects_volume
Definition options.h:190
bool draw_map_grid
Definition options.h:195
bool draw_city_growth
Definition options.h:197
bool draw_city_outlines
Definition options.h:193
bool draw_full_citybar
Definition options.h:216
struct player * playing
Definition connection.h:151
Definition climisc.h:82
struct city_list * cities
Definition player.h:279
Definition menu.h:160
QPixmap * pm
Definition sprite.h:25
struct terrain * cultivate_result
Definition terrain.h:215
struct terrain * plant_result
Definition terrain.h:218
struct terrain * transform_result
Definition terrain.h:229
Definition tile.h:50
struct unit_list * units
Definition tile.h:58
Definition unit.h:138
int id
Definition unit.h:145
struct tile * tile
Definition unit.h:140
int homecity
Definition unit.h:146
const struct unit_type * utype
Definition unit.h:139
struct canvas * store
struct civ_map map
int fc_snprintf(char *str, size_t n, const char *format,...)
Definition support.c:974
#define TRUE
Definition support.h:46
#define FALSE
Definition support.h:47
const char * advance_name_translation(const struct advance *padvance)
Definition tech.c:290
Tech_type_id advance_number(const struct advance *padvance)
Definition tech.c:98
#define advance_iterate(_p)
Definition tech.h:275
#define advance_iterate_end
Definition tech.h:276
#define T_NONE
Definition terrain.h:56
void tile_virtual_destroy(struct tile *vtile)
Definition tile.c:1033
bool tile_apply_activity(struct tile *ptile, Activity_type_id act, struct extra_type *tgt)
Definition tile.c:681
struct tile * tile_virtual_new(const struct tile *ptile)
Definition tile.c:981
const char * tile_get_info_text(const struct tile *ptile, bool include_nuisances, int linebreaks)
Definition tile.c:771
struct city * tile_city(const struct tile *ptile)
Definition tile.c:83
#define tile_terrain(_tile)
Definition tile.h:114
struct sprite * get_government_sprite(const struct tileset *t, const struct government *gov)
Definition tilespec.c:6794
int tileset_hex_width(const struct tileset *t)
Definition tilespec.c:721
const struct strvec * get_tileset_list(const struct option *poption)
Definition tilespec.c:1103
bool tileset_is_isometric(const struct tileset *t)
Definition tilespec.c:712
const char * tileset_basename(const struct tileset *t)
Definition tilespec.c:704
int tileset_tile_height(const struct tileset *t)
Definition tilespec.c:765
int tileset_tile_width(const struct tileset *t)
Definition tilespec.c:753
bool tilespec_reread(const char *new_tileset_name, bool game_fully_initialized, float scale)
Definition tilespec.c:1355
int city_num_trade_routes(const struct city *pcity)
unsigned max_trade_routes(const struct city *pcity)
Definition traderoutes.c:48
bool can_establish_trade_route(const struct city *pc1, const struct city *pc2)
bool have_cities_trade_route(const struct city *pc1, const struct city *pc2)
bool unit_can_est_trade_route_here(const struct unit *punit)
Definition unit.c:292
bool unit_can_add_or_build_city(const struct civ_map *nmap, const struct unit *punit)
Definition unit.c:456
bool can_unit_change_homecity(const struct civ_map *nmap, const struct unit *punit)
Definition unit.c:489
bool unit_contained_in(const struct unit *pcargo, const struct unit *ptrans)
Definition unit.c:2528
bool can_unit_do_autosettlers(const struct unit *punit)
Definition unit.c:614
bool can_unit_paradrop(const struct civ_map *nmap, const struct unit *punit)
Definition unit.c:830
bool unit_can_help_build_wonder_here(const struct civ_map *nmap, const struct unit *punit)
Definition unit.c:266
#define unit_tile(_pu)
Definition unit.h:397
@ ORDER_LAST
Definition unit.h:49
@ ORDER_PERFORM_ACTION
Definition unit.h:47
#define unit_owner(_pu)
Definition unit.h:396
bool units_can_convert(const struct civ_map *nmap, const struct unit_list *punits)
Definition unitlist.c:349
bool units_are_occupied(const struct unit_list *punits)
Definition unitlist.c:273
bool can_units_do_base_gui(const struct unit_list *punits, enum base_gui_type base_gui)
Definition unitlist.c:180
bool units_contain_cityfounder(const struct unit_list *punits)
Definition unitlist.c:217
bool can_units_do_any_road(const struct civ_map *nmap, const struct unit_list *punits)
Definition unitlist.c:161
struct unit * unit_list_find(const struct unit_list *punitlist, int unit_id)
Definition unitlist.c:30
bool units_can_upgrade(const struct civ_map *nmap, const struct unit_list *punits)
Definition unitlist.c:334
bool units_can_unload(const struct unit_list *punits)
Definition unitlist.c:301
bool units_have_activity_on_tile(const struct unit_list *punits, enum unit_activity activity)
Definition unitlist.c:318
bool units_have_type_flag(const struct unit_list *punits, enum unit_type_flag_id flag, bool has_flag)
Definition unitlist.c:202
bool can_units_do(const struct unit_list *punits, bool(can_fn)(const struct unit *punit))
Definition unitlist.c:95
bool units_can_do_action(const struct unit_list *punits, action_id act_id, bool can_do)
Definition unitlist.c:239
bool units_can_load(const struct unit_list *punits)
Definition unitlist.c:287
bool can_units_do_on_map(const struct civ_map *nmap, const struct unit_list *punits, bool(can_fn)(const struct civ_map *nmap, const struct unit *punit))
Definition unitlist.c:111
#define unit_list_iterate(unitlist, punit)
Definition unitlist.h:31
#define unit_list_iterate_end
Definition unitlist.h:33
const struct unit_type * unit_type_get(const struct unit *punit)
Definition unittype.c:123
struct unit_type * utype_by_number(const Unit_type_id id)
Definition unittype.c:112
Unit_type_id utype_index(const struct unit_type *punittype)
Definition unittype.c:91
bool can_player_build_unit_now(const struct player *p, const struct unit_type *punittype)
Definition unittype.c:2078
const char * utype_name_translation(const struct unit_type *punittype)
Definition unittype.c:1560
bool utype_can_do_action(const struct unit_type *putype, const action_id act_id)
Definition unittype.c:371
#define unit_type_iterate(_p)
Definition unittype.h:855
#define unit_type_iterate_end
Definition unittype.h:862