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 "audio.h"
41#include "connectdlg_common.h"
42#include "control.h"
43#include "helpdata.h"
44
45// gui-qt
46#include "fc_client.h"
47#include "chatline.h"
48#include "cityrep.h"
49#include "dialogs.h"
50#include "gotodlg.h"
51#include "gui_main.h"
52#include "hudwidget.h"
53#include "mapctrl.h"
54#include "messagedlg.h"
55#include "plrdlg.h"
56#include "ratesdlg.h"
57#include "repodlgs.h"
58#include "shortcuts.h"
59#include "spaceshipdlg.h"
60#include "sprite.h"
61
62#include "menu.h"
63
64static void enable_interface(bool enable);
65
66/**********************************************************************/
70{
71 city = pcity;
72 tile = nullptr;
73 trade_num = 0;
75}
76
77/**********************************************************************/
84
85/**********************************************************************/
89{
90 int i, s;
91 struct city *pcity;
94 if (s == 0) {
95 return;
96 }
97 for (i = 0; i < s; i++) {
99 add_city(pcity);
100 }
101}
102
103/**********************************************************************/
107{
108 struct city *pcity;
109 trade_city *tc;
110
111 foreach(pcity, virtual_cities) {
113 }
114 virtual_cities.clear();
115 foreach(tc, cities) {
116 delete tc;
117 }
118 cities.clear();
119 lines.clear();
120 gui()->mapview_wdg->repaint();
121}
122
123/**********************************************************************/
127{
128 trade_city *tc = new trade_city(pcity);
129
130 cities.append(tc);
131 gui()->infotab->chtwdg->append(QString(_("Adding city %1 to trade planning"))
132 .arg(tc->city->name));
133}
134
135/**********************************************************************/
139{
140 struct city *pcity;
141 trade_city *tc;
142
143 pcity = tile_city(ptile);
144
145 foreach (tc, cities) {
146 if (pcity != nullptr) {
147 if (tc->city == pcity) {
148 remove_city(pcity);
149 return;
150 }
151 }
152 if (tc->city->tile == ptile) {
153 remove_virtual_city(ptile);
154 return;
155 }
156 }
157
158 if (pcity != nullptr) {
159 add_city(pcity);
160 return;
161 }
162
163 pcity = create_city_virtual(client_player(), ptile, "Virtual");
164 add_city(pcity);
165 virtual_cities.append(pcity);
166}
167
168/**********************************************************************/
172{
173 trade_city *tc;
174
175 foreach (tc, cities) {
176 if (tc->city->tile == pcity->tile) {
177 cities.removeAll(tc);
178 gui()->infotab->chtwdg->append(
179 QString(_("Removing city %1 from trade planning"))
180 .arg(tc->city->name));
181 return;
182 }
183 }
184}
185
186/**********************************************************************/
190{
191 struct city *c;
192 trade_city *tc;
193
194 foreach (c, virtual_cities) {
195 if (c->tile == ptile) {
196 virtual_cities.removeAll(c);
197 gui()->infotab->chtwdg->append(
198 QString(_("Removing city %1 from trade planning")).arg(c->name));
199 }
200 }
201
202 foreach (tc, cities) {
203 if (tc->city->tile == ptile) {
204 cities.removeAll(tc);
205 return;
206 }
207 }
208}
209
210/**********************************************************************/
216{
218
219 foreach (ttc, cities) {
220 if (!have_cities_trade_route(tc->city, ttc->city)
221 && can_establish_trade_route(tc->city, ttc->city)) {
222 tc->poss_trade_num++;
223 tc->pos_cities.append(ttc->city);
224 }
225 tc->over_max = tc->trade_num + tc->poss_trade_num
226 - max_trade_routes(tc->city);
227 }
228}
229
230/**********************************************************************/
234{
235 trade_city *tc;
236 int i;
237 bool tdone;
238 int count = cities.size();
239 int *cities_ids = (int *)fc_malloc(sizeof(int) * count);
240 trade_city **cities_order = (trade_city **)fc_malloc(sizeof(trade_city *) * count);
241
242 for (i = 0; i < 100; i++) {
243 int n;
244
245 tdone = true;
246
247 for (n = 0; n < count; n++) {
248 cities_ids[n] = n;
250 }
252
253 cities.clear();
254 for (n = 0; n < count; n++) {
256 }
257
258 lines.clear();
259 foreach (tc, cities) {
260 tc->pos_cities.clear();
261 tc->new_tr_cities.clear();
262 tc->curr_tr_cities.clear();
263 }
264 foreach (tc, cities) {
266 tc->poss_trade_num = 0;
267 tc->pos_cities.clear();
268 tc->new_tr_cities.clear();
269 tc->curr_tr_cities.clear();
270 tc->done = false;
271 calculate_inner(tc);
272 }
273
275 discard();
277
278 foreach (tc, cities) {
279 if (!tc->done) {
280 tdone = false;
281 }
282 }
283 if (tdone) {
284 break;
285 }
286 }
287 foreach (tc, cities) {
288 if (!tc->done) {
289 char text[1024];
290 fc_snprintf(text, sizeof(text),
291 PL_("City %s - 1 free trade route.",
292 "City %s - %d free trade routes.",
293 max_trade_routes(tc->city) - tc->trade_num),
294 city_link(tc->city),
295 max_trade_routes(tc->city) - tc->trade_num);
297 }
298 }
299
302
303 gui()->mapview_wdg->repaint();
304}
305
306/**********************************************************************/
310int trade_generator::find_over_max(struct city *pcity = nullptr)
311{
312 trade_city *tc;
313 int max = 0;
314
315 foreach (tc, cities) {
316 if (pcity != tc->city) {
317 max = qMax(max, tc->over_max);
318 }
319 }
320 return max;
321}
322
323/**********************************************************************/
327{
328 trade_city *tc;
329 trade_city *rc = nullptr;
330 int max = 0;
331
332 foreach (tc, cities) {
333 if (max < tc->over_max) {
334 max = tc->over_max;
335 rc = tc;
336 }
337 }
338 return rc;
339}
340
341/**********************************************************************/
345{
346 trade_city *tc;
347 int j = 5;
348
349 for (int i = j; i > -j; i--) {
350 while ((tc = find_most_free())) {
351 if (!discard_one(tc)) {
352 if (!discard_any(tc, i)) {
353 break;
354 }
355 }
356 }
357 }
358}
359
360/**********************************************************************/
364{
365 tc->pos_cities.removeOne(ttc->city);
366 ttc->pos_cities.removeOne(tc->city);
367 tc->poss_trade_num--;
368 ttc->poss_trade_num--;
369 tc->over_max--;
370 ttc->over_max--;
371 check_if_done(tc, ttc);
372}
373
374/**********************************************************************/
378{
379 int best = 0;
380 int current_candidate = 0;
381 int best_id;
383
384 for (int i = cities.size() - 1 ; i >= 0; i--) {
385 ttc = cities.at(i);
387 if (current_candidate > best) {
388 best_id = i;
389 }
390 }
391 if (best == 0) {
392 return false;
393 }
394
395 ttc = cities.at(best_id);
396 discard_trade(tc, ttc);
397 return true;
398}
399
400/**********************************************************************/
404{
406
407 for (int i = cities.size() - 1 ; i >= 0; i--) {
408 ttc = cities.at(i);
409 if (tc->pos_cities.contains(ttc->city)
410 && ttc->pos_cities.contains(tc->city)
411 && ttc->over_max > freeroutes) {
412 discard_trade(tc, ttc);
413 return true;
414 }
415 }
416 return false;
417}
418
419/**********************************************************************/
425{
427
428 foreach (ttc, cities) {
429 if (ttc->done || ttc->over_max > 0
430 || tc == ttc || tc->done || tc->over_max > 0) {
431 continue;
432 }
433 if (tc->pos_cities.contains(ttc->city)
434 && ttc->pos_cities.contains(tc->city)) {
435 struct qtiles gilles;
436
437 tc->pos_cities.removeOne(ttc->city);
438 ttc->pos_cities.removeOne(tc->city);
439 tc->poss_trade_num--;
440 ttc->poss_trade_num--;
441 tc->new_tr_cities.append(ttc->city);
442 ttc->new_tr_cities.append(ttc->city);
443 tc->trade_num++;
444 ttc->trade_num++;
445 tc->over_max--;
446 ttc->over_max--;
447 check_if_done(tc, ttc);
448 gilles.t1 = tc->city->tile;
449 gilles.t2 = ttc->city->tile;
450 gilles.autocaravan = nullptr;
451 lines.append(gilles);
452 }
453 }
454}
455
456/**********************************************************************/
460{
461 trade_city *tc;
462
463 foreach (tc, cities) {
464 if (tc->done || tc->over_max > 0) {
465 continue;
466 }
468 }
469}
470
471/**********************************************************************/
475{
476 if (tc1->trade_num == max_trade_routes(tc1->city)) {
477 tc1->done = true;
478 }
479 if (tc2->trade_num == max_trade_routes(tc2->city)) {
480 tc2->done = true;
481 }
482}
483
484/**********************************************************************/
490
491/**********************************************************************/
498
499/**********************************************************************/
503{
504 unit_list.clear();
505}
506
507/**********************************************************************/
512{
514 return;
515 }
516 gui()->menu_bar->clear();
517 gui()->menu_bar->setup_menus();
518
520
521 // A new ruleset may have been loaded.
523}
524
525/**********************************************************************/
530{
531 if (C_S_RUNNING <= client_state()) {
532 gui()->menuBar()->setVisible(true);
533 if (!is_waiting_turn_change()) {
534 gui()->menu_bar->menus_sensitive();
535 gui()->menu_bar->update_airlift_menu();
536 gui()->menu_bar->update_roads_menu();
537 gui()->menu_bar->update_bases_menu();
540 gui()->unitinfo_wdg->update_actions(nullptr);
541 }
542 } else {
543 gui()->menuBar()->setVisible(false);
544 }
545}
546
547/**********************************************************************/
552static const char *get_tile_change_menu_text(struct tile *ptile,
553 enum unit_activity activity)
554{
555 struct tile *newtile = tile_virtual_new(ptile);
556 const char *text;
557
558 tile_apply_activity(newtile, activity, NULL);
559 text = tile_get_info_text(newtile, FALSE, 0);
561
562 return text;
563}
564
565/**********************************************************************/
569 QMenu(_("Government"), parent)
570{
571 // Register ourselves to get updates for free.
572 instances << this;
573 setAttribute(Qt::WA_TranslucentBackground);
574}
575
576/**********************************************************************/
580{
582 instances.remove(this);
583}
584
585/**********************************************************************/
590 struct government *gov, *revol_gov;
591 int gov_count, i;
592
593 // Clear any content
594 foreach(action, QWidget::actions()) {
596 action->deleteLater();
597 }
598 actions.clear();
599
601 actions.reserve(gov_count + 1);
602 action = addAction(_("Revolution..."));
603 connect(action, &QAction::triggered, this, &gov_menu::revolution);
604 actions.append(action);
605
606 addSeparator();
607
608 // Add an action for each government. There is no icon yet.
610 for (i = 0; i < gov_count; ++i) {
611 gov = government_by_number(i);
612 if (gov != revol_gov) { // Skip revolution government
613 // Defeat keyboard shortcut mnemonics
615 .replace("&", "&&"));
616 // We need to keep track of the gov <-> action mapping to be able to
617 // set enabled/disabled depending on available govs.
618 actions.append(action);
619 QObject::connect(action, &QAction::triggered, [this,i]() {
620 change_gov(i);
621 });
622 }
623 }
624}
625
626/**********************************************************************/
630{
631 struct government *gov, *revol_gov;
632 struct sprite *sprite;
633 int gov_count, i, j;
634
637 for (i = 0, j = 0; i < gov_count; i++) {
638 gov = government_by_number(i);
639 if (gov != revol_gov) { // Skip revolution government
641 if (sprite != NULL) {
642 actions[j + 1]->setIcon(QIcon(*(sprite->pm)));
643 }
644 actions[j + 1]->setEnabled(
646 j++;
647 } else {
648 actions[0]->setEnabled(!client_is_observer()
650 }
651 }
652}
653
654/**********************************************************************/
661
662/**********************************************************************/
669
670/**************************************************************************
671 Keeps track of all gov_menu instances.
672**************************************************************************/
674
675/**********************************************************************/
679{
680 foreach (gov_menu *m, instances) {
681 m->create();
682 }
683}
684
685/**********************************************************************/
689{
690 foreach (gov_menu *m, instances) {
691 m->update();
692 }
693}
694
695/**********************************************************************/
699 : QMenu(_("Go to and..."), parent)
700{
701 // Will need auto updates etc.
702 instances << this;
703}
704
705/**********************************************************************/
709{
710 // Updates are no longer needed.
711 instances.remove(this);
712}
713
714/**********************************************************************/
718{
719 // Clear menu item to action ID mapping.
720 items.clear();
721
722 // Remove the menu items
723 clear();
724}
725
726/**********************************************************************/
730{
731 QAction *item;
732 int tgt_kind_group;
733
734 // Group goto and perform action menu items by target kind.
736 action_iterate(act_id) {
737 struct action *paction = action_by_number(act_id);
739 .replace("&", "&&"));
740
741 if (action_id_get_actor_kind(act_id) != AAK_UNIT) {
742 // This action isn't performed by an unit.
743 continue;
744 }
745
747 // Wrong group.
748 continue;
749 }
750
751 if (action_id_has_complex_target(act_id)) {
753 items.insert(sub_target_menu->menuAction(), act_id);
754
755#define CREATE_SUB_ITEM(_menu_, _act_id_, _sub_tgt_id_, _sub_tgt_name_) \
756 { \
757 QAction *_sub_item_ = _menu_->addAction(_sub_tgt_name_); \
758 int _sub_target_id_ = _sub_tgt_id_; \
759 QObject::connect(_sub_item_, &QAction::triggered, \
760 [this, _act_id_, _sub_target_id_]() { \
761 start_go_act(_act_id_, _sub_target_id_); \
762 }); \
763 }
764
766 case ASTK_BUILDING:
772 break;
773 case ASTK_TECH:
779 break;
780 case ASTK_EXTRA:
782 extra_type_iterate(pextra) {
783 if (!actres_creates_extra(paction->result, pextra)
784 && !actres_removes_extra(paction->result, pextra)) {
785 // Not relevant
786 continue;
787 }
788
790 extra_number(pextra),
791 extra_name_translation(pextra));
793 break;
794 case ASTK_NONE:
795 // Should not be here.
797 break;
798 case ASTK_COUNT:
799 // Should not exits
801 break;
802 }
803 continue;
804 }
805
806#define ADD_OLD_SHORTCUT(wanted_action_id, sc_id) \
807 if (act_id == wanted_action_id) { \
808 item->setShortcut(QKeySequence(shortcut_to_string( \
809 fc_shortcuts::sc()->get_shortcut(sc_id)))); \
810 }
811
812 /* Create and add the menu item. It will be hidden or shown based on
813 * unit type. */
815 items.insert(item, act_id);
816
817 /* Add the keyboard shortcuts for "Go to and..." menu items that
818 * existed independently before the "Go to and..." menu arrived. */
822
823 QObject::connect(item, &QAction::triggered, [this,act_id]() {
824 start_go_act(act_id, NO_TARGET);
825 });
827 }
828}
829
830/**********************************************************************/
834{
835 bool can_do_something = false;
836
837 if (!actions_are_ready()) {
838 // Nothing to do.
839 return;
840 }
841
842 if (items.isEmpty()) {
843 // The goto and act menu needs menu items.
844 create();
845 }
846
847 /* Enable a menu item if it is theoretically possible that one of the
848 * selected units can perform it. Checking if the action can be performed
849 * at the current tile is pointless since it should be performed at the
850 * target tile. */
851 foreach(QAction *item, items.keys()) {
853 items.value(item), TRUE)) {
854 item->setVisible(true);
855 can_do_something = true;
856 } else {
857 item->setVisible(false);
858 }
859 }
860
861 if (can_do_something) {
862 // At least one menu item is enabled for one of the selected units.
863 setEnabled(true);
864 } else {
865 // No menu item is enabled any of the selected units.
866 setEnabled(false);
867 }
868}
869
870/**********************************************************************/
873void go_act_menu::start_go_act(int act_id, int sub_tgt_id)
874{
875 request_unit_goto(ORDER_PERFORM_ACTION, act_id, sub_tgt_id);
876}
877
878/**************************************************************************
879 Store all goto and act menu items so they can be updated etc
880**************************************************************************/
882
883/**********************************************************************/
887{
888 foreach (go_act_menu *m, instances) {
889 m->reset();
890 }
891}
892
893/**********************************************************************/
897{
898 foreach (go_act_menu *m, instances) {
899 m->update();
900 }
901}
902
903/**********************************************************************/
907{
909 struct tile *ptile = nullptr;
910 struct unit *zunit;
911 struct unit *qunit;
912
913 int i = 0;
914 qunit = punit;
915 foreach (fui, units_list.unit_list) {
916 zunit = unit_list_find(client_player()->units, fui->id);
917 i++;
918 if (i >= pos) {
919 punit = qunit;
920 return ptile;
921 }
922 if (zunit == nullptr) {
923 continue;
924 }
925
926 if (punit == zunit) { // Unit found
927 /* Unit was ordered to attack city so it might stay in
928 front of that city */
930 ptile = tile_before_end_path(punit, fui->ptile);
931 if (ptile == nullptr) {
932 ptile = fui->ptile;
933 }
934 } else {
935 ptile = fui->ptile;
936 }
937 // Unit found in transport
938 } else if (unit_contained_in(punit, zunit)) {
939 ptile = fui->ptile;
940 }
941 }
942 return nullptr;
943}
944
945/**********************************************************************/
948mr_menu::mr_menu() : QMenuBar()
949{
950}
951
952/**********************************************************************/
958{
959 QAction *act;
960 QMenu *sub_menu;
961 QMenu *main_menu;
963 int i;
964
965 delayed_order = false;
966 airlift_type_id = 0;
967 quick_airlifting = false;
968
969 // Game Menu
970 main_menu = this->addMenu(_("Game"));
971
972#ifdef __APPLE__
973 // On Mac, Qt would try to move menu entry named just "Options" to
974 // application menu, but as this is submenu and not an action
975 // 1) It would fail to appear in the destination
976 // 2) It's impossible to override the behavior with QAction::menuRule()
977 // We add an invisible character for the string comparison to fail.
978 sub_menu = main_menu->addMenu(QString("\u200B") + _("Options"));
979#else // __APPLE__
980 sub_menu = main_menu->addMenu(_("Options"));
981#endif // __APPLE__
982
983 act = sub_menu->addAction(_("Set local options"));
984 connect(act, &QAction::triggered, this, &mr_menu::local_options);
985 act = sub_menu->addAction(_("Server Options"));
986 connect(act, &QAction::triggered, this, &mr_menu::server_options);
987 act = sub_menu->addAction(_("Messages"));
988 connect(act, &QAction::triggered, this, &mr_menu::messages_options);
989 act = sub_menu->addAction(_("Shortcuts"));
990 connect(act, &QAction::triggered, this, &mr_menu::shortcut_options);
991 act = sub_menu->addAction(_("Load another tileset"));
992 connect(act, &QAction::triggered, this, &mr_menu::tileset_custom_load);
993 act = sub_menu->addAction(_("Save Options Now"));
994 act->setIcon(style()->standardIcon(QStyle::SP_DialogSaveButton));
995 connect(act, &QAction::triggered, this, &mr_menu::save_options_now);
996 act = sub_menu->addAction(_("Save Options on Exit"));
997 act->setCheckable(true);
998 act->setChecked(gui_options.save_options_on_exit);
999 connect(act, &QAction::triggered, this, &mr_menu::save_options_exit);
1000 main_menu->addSeparator();
1001 act = main_menu->addAction(_("Save Game"));
1002 act->setShortcut(QKeySequence(tr("Ctrl+s")));
1003 act->setIcon(style()->standardIcon(QStyle::SP_DialogSaveButton));
1004 menu_list.insert(SAVE, act);
1005 connect(act, &QAction::triggered, this, &mr_menu::save_game);
1006 act = main_menu->addAction(_("Save Game As..."));
1007 menu_list.insert(SAVE, act);
1008 act->setIcon(style()->standardIcon(QStyle::SP_DialogSaveButton));
1009 connect(act, &QAction::triggered, this, &mr_menu::save_game_as);
1010 act = main_menu->addAction(_("Save Map to Image"));
1011 connect(act, &QAction::triggered, this, &mr_menu::save_image);
1012 main_menu->addSeparator();
1013 act = main_menu->addAction(_("Volume Up"));
1014 menu_list.insert(AUDIO, act);
1015 act->setShortcut(QKeySequence(tr(">")));
1016 connect(act, &QAction::triggered, this, &mr_menu::volume_up);
1017 act = main_menu->addAction(_("Volume Down"));
1018 menu_list.insert(AUDIO, act);
1019 act->setShortcut(QKeySequence(tr("<")));
1020 connect(act, &QAction::triggered, this, &mr_menu::volume_down);
1021 main_menu->addSeparator();
1022 act = main_menu->addAction(_("Leave game"));
1023 act->setIcon(style()->standardIcon(QStyle::SP_DialogDiscardButton));
1024 connect(act, &QAction::triggered, this, &mr_menu::back_to_menu);
1025 act = main_menu->addAction(_("Quit"));
1026 act->setIcon(style()->standardIcon(QStyle::SP_TitleBarCloseButton));
1027 connect(act, &QAction::triggered, this, &mr_menu::quit_game);
1028
1029 // View Menu
1030 main_menu = this->addMenu(Q_("?verb:View"));
1031 act = main_menu->addAction(_("Center View"));
1032 act->setShortcut(QKeySequence(shortcut_to_string(
1033 fc_shortcuts::sc()->get_shortcut(SC_CENTER_VIEW))));
1034 connect(act, &QAction::triggered, this, &mr_menu::slot_center_view);
1035 main_menu->addSeparator();
1036 act = main_menu->addAction(_("Fullscreen"));
1037 act->setShortcut(QKeySequence(shortcut_to_string(
1038 fc_shortcuts::sc()->get_shortcut(SC_FULLSCREEN))));
1039 act->setCheckable(true);
1040 act->setChecked(gui_options.gui_qt_fullscreen);
1041 connect(act, &QAction::triggered, this, &mr_menu::slot_fullscreen);
1042 main_menu->addSeparator();
1043 minimap_status = main_menu->addAction(_("Minimap"));
1044 minimap_status->setCheckable(true);
1046 fc_shortcuts::sc()->get_shortcut(SC_MINIMAP))));
1047 minimap_status->setChecked(true);
1048 connect(minimap_status, &QAction::triggered, this,
1050 osd_status = main_menu->addAction(_("Show new turn information"));
1051 osd_status->setCheckable(true);
1052 osd_status->setChecked(gui()->qt_settings.show_new_turn_text);
1053 connect(osd_status, &QAction::triggered, this,
1055 btlog_status = main_menu->addAction(_("Show combat detailed information"));
1056 btlog_status->setCheckable(true);
1057 btlog_status->setChecked(gui()->qt_settings.show_battle_log);
1058 connect(btlog_status, &QAction::triggered, this, &mr_menu::slot_battlelog);
1059 lock_status = main_menu->addAction(_("Lock interface"));
1060 lock_status->setCheckable(true);
1062 fc_shortcuts::sc()->get_shortcut(SC_IFACE_LOCK))));
1063 lock_status->setChecked(false);
1064 connect(lock_status, &QAction::triggered, this, &mr_menu::slot_lock);
1065 connect(minimap_status, &QAction::triggered, this, &mr_menu::slot_lock);
1066 main_menu->addSeparator();
1067 act = main_menu->addAction(_("Zoom in"));
1068 act->setShortcut(QKeySequence(shortcut_to_string(
1069 fc_shortcuts::sc()->get_shortcut(SC_ZOOM_IN))));
1070 connect(act, &QAction::triggered, this, &mr_menu::zoom_in);
1071 act = main_menu->addAction(_("Zoom default"));
1072 act->setShortcut(QKeySequence(shortcut_to_string(
1073 fc_shortcuts::sc()->get_shortcut(SC_ZOOM_RESET))));
1074 connect(act, &QAction::triggered, this, &mr_menu::zoom_reset);
1075 act = main_menu->addAction(_("Zoom out"));
1076 act->setShortcut(QKeySequence(shortcut_to_string(
1077 fc_shortcuts::sc()->get_shortcut(SC_ZOOM_OUT))));
1078 connect(act, &QAction::triggered, this, &mr_menu::zoom_out);
1079 scale_fonts_status = main_menu->addAction(_("Scale fonts"));
1080 connect(scale_fonts_status, &QAction::triggered, this,
1082 scale_fonts_status->setCheckable(true);
1083 scale_fonts_status->setChecked(true);
1084 main_menu->addSeparator();
1085 act = main_menu->addAction(_("City Outlines"));
1086 act->setCheckable(true);
1087 act->setChecked(gui_options.draw_city_outlines);
1088 connect(act, &QAction::triggered, this, &mr_menu::slot_city_outlines);
1089 act = main_menu->addAction(_("City Output"));
1090 act->setCheckable(true);
1091 act->setChecked(gui_options.draw_city_output);
1092 act->setShortcut(QKeySequence(shortcut_to_string(
1093 fc_shortcuts::sc()->get_shortcut(SC_CITY_OUTPUT))));
1094 connect(act, &QAction::triggered, this, &mr_menu::slot_city_output);
1095 act = main_menu->addAction(_("Map Grid"));
1096 act->setShortcut(QKeySequence(shortcut_to_string(
1097 fc_shortcuts::sc()->get_shortcut(SC_MAP_GRID))));
1098 act->setCheckable(true);
1099 act->setChecked(gui_options.draw_map_grid);
1100 connect(act, &QAction::triggered, this, &mr_menu::slot_map_grid);
1101 act = main_menu->addAction(_("National Borders"));
1102 act->setCheckable(true);
1103 act->setChecked(gui_options.draw_borders);
1104 act->setShortcut(QKeySequence(shortcut_to_string(
1105 fc_shortcuts::sc()->get_shortcut(SC_NAT_BORDERS))));
1106 connect(act, &QAction::triggered, this, &mr_menu::slot_borders);
1107 act = main_menu->addAction(_("Native Tiles"));
1108 act->setCheckable(true);
1109 act->setChecked(gui_options.draw_native);
1110 act->setShortcut(QKeySequence(tr("ctrl+shift+n")));
1111 connect(act, &QAction::triggered, this, &mr_menu::slot_native_tiles);
1112 act = main_menu->addAction(_("City Full Bar"));
1113 act->setCheckable(true);
1114 act->setShortcut(QKeySequence(shortcut_to_string(
1115 fc_shortcuts::sc()->get_shortcut(SC_SHOW_FULLBAR))));
1116 act->setChecked(gui_options.draw_full_citybar);
1117 connect(act, &QAction::triggered, this, &mr_menu::slot_fullbar);
1118 act = main_menu->addAction(_("City Names"));
1119 act->setCheckable(true);
1120 act->setChecked(gui_options.draw_city_names);
1121 act->setShortcut(QKeySequence(shortcut_to_string(
1122 fc_shortcuts::sc()->get_shortcut(SC_CITY_NAMES))));
1123 connect(act, &QAction::triggered, this, &mr_menu::slot_city_names);
1124 act = main_menu->addAction(_("City Growth"));
1125 act->setCheckable(true);
1126 act->setChecked(gui_options.draw_city_growth);
1127 act->setShortcut(QKeySequence(tr("ctrl+o")));
1128 connect(act, &QAction::triggered, this, &mr_menu::slot_city_growth);
1129 act = main_menu->addAction(_("City Production"));
1130 act->setCheckable(true);
1131 act->setChecked(gui_options.draw_city_productions);
1132 act->setShortcut(QKeySequence(shortcut_to_string(
1133 fc_shortcuts::sc()->get_shortcut(SC_CITY_PROD))));
1134 connect(act, &QAction::triggered, this, &mr_menu::slot_city_production);
1135 act = main_menu->addAction(_("City Buy Cost"));
1136 act->setCheckable(true);
1137 act->setChecked(gui_options.draw_city_buycost);
1138 connect(act, &QAction::triggered, this, &mr_menu::slot_city_buycost);
1139 act = main_menu->addAction(_("City Trade Routes"));
1140 act->setCheckable(true);
1141 act->setChecked(gui_options.draw_city_trade_routes);
1142 act->setShortcut(QKeySequence(shortcut_to_string(
1143 fc_shortcuts::sc()->get_shortcut(SC_TRADE_ROUTES))));
1144 connect(act, &QAction::triggered, this, &mr_menu::slot_city_trade_routes);
1145 act = main_menu->addAction(_("Unit Stack Size"));
1146 act->setCheckable(true);
1147 act->setChecked(gui_options.draw_unit_stack_size);
1148 act->setShortcut(QKeySequence(shortcut_to_string(
1149 fc_shortcuts::sc()->get_shortcut(SC_STACK_SIZE))));
1150 connect(act, &QAction::triggered, this, &mr_menu::slot_stack_size);
1151
1152 // Select Menu
1153 main_menu = this->addMenu(_("Select"));
1154 act = main_menu->addAction(_("Single Unit (Unselect Others)"));
1155 act->setShortcut(QKeySequence(tr("shift+z")));
1156 menu_list.insert(STANDARD, act);
1157 connect(act, &QAction::triggered, this, &mr_menu::slot_select_one);
1158 act = main_menu->addAction(_("All On Tile"));
1159 act->setShortcut(QKeySequence(tr("v")));
1160 menu_list.insert(STANDARD, act);
1161 connect(act, &QAction::triggered, this, &mr_menu::slot_select_all_tile);
1162 main_menu->addSeparator();
1163 act = main_menu->addAction(_("Same Type on Tile"));
1164 act->setShortcut(QKeySequence(tr("shift+v")));
1165 menu_list.insert(STANDARD, act);
1166 connect(act, &QAction::triggered, this, &mr_menu::slot_select_same_tile);
1167 act = main_menu->addAction(_("Same Type on Continent"));
1168 act->setShortcut(QKeySequence(tr("shift+c")));
1169 menu_list.insert(STANDARD, act);
1170 connect(act, &QAction::triggered, this,
1172 act = main_menu->addAction(_("Same Type Everywhere"));
1173 act->setShortcut(QKeySequence(tr("shift+x")));
1174 menu_list.insert(STANDARD, act);
1175 connect(act, &QAction::triggered, this,
1177 main_menu->addSeparator();
1178 act = main_menu->addAction(_("Wait"));
1179 act->setShortcut(QKeySequence(shortcut_to_string(
1180 fc_shortcuts::sc()->get_shortcut(SC_WAIT))));
1181 menu_list.insert(STANDARD, act);
1182 connect(act, &QAction::triggered, this, &mr_menu::slot_wait);
1183 act = main_menu->addAction(_("Done"));
1184 act->setShortcut(QKeySequence(shortcut_to_string(
1185 fc_shortcuts::sc()->get_shortcut(SC_DONE_MOVING))));
1186 menu_list.insert(STANDARD, act);
1187 connect(act, &QAction::triggered, this, &mr_menu::slot_done_moving);
1188
1189 act = main_menu->addAction(_("Advanced unit selection"));
1190 act->setShortcut(QKeySequence(tr("ctrl+e")));
1191 menu_list.insert(NOT_4_OBS, act);
1192 connect(act, &QAction::triggered, this, &mr_menu::slot_unit_filter);
1193
1194 // Unit Menu
1195 main_menu = this->addMenu(_("Unit"));
1196 act = main_menu->addAction(_("Go to Tile"));
1197 act->setShortcut(QKeySequence(shortcut_to_string(
1198 fc_shortcuts::sc()->get_shortcut(SC_GOTO))));
1199 menu_list.insert(STANDARD, act);
1200 connect(act, &QAction::triggered, this, &mr_menu::slot_unit_goto);
1201
1202 // The goto and act sub menu is handled as a separate object.
1203 main_menu->addMenu(new go_act_menu(this));
1204
1205 act = main_menu->addAction(_("Go to Nearest City"));
1206 act->setShortcut(QKeySequence(tr("shift+g")));
1207 menu_list.insert(GOTO_CITY, act);
1208 connect(act, &QAction::triggered, this, &mr_menu::slot_return_to_city);
1209 act = main_menu->addAction(_("Go to/Airlift to City..."));
1210 act->setShortcut(QKeySequence(shortcut_to_string(
1211 fc_shortcuts::sc()->get_shortcut(SC_GOTOAIRLIFT))));
1212 menu_list.insert(AIRLIFT, act);
1213 connect(act, &QAction::triggered, this, &mr_menu::slot_airlift);
1214 main_menu->addSeparator();
1215 act = main_menu->addAction(_("Auto Explore"));
1216 menu_list.insert(EXPLORE, act);
1217 act->setShortcut(QKeySequence(shortcut_to_string(
1218 fc_shortcuts::sc()->get_shortcut(SC_AUTOEXPLORE))));
1219 connect(act, &QAction::triggered, this, &mr_menu::slot_unit_explore);
1220 act = main_menu->addAction(_("Patrol"));
1221 menu_list.insert(STANDARD, act);
1222 act->setEnabled(false);
1223 act->setShortcut(QKeySequence(shortcut_to_string(
1224 fc_shortcuts::sc()->get_shortcut(SC_PATROL))));
1225 connect(act, &QAction::triggered, this, &mr_menu::slot_patrol);
1226 main_menu->addSeparator();
1227 act = main_menu->addAction(_("Sentry"));
1228 act->setShortcut(QKeySequence(shortcut_to_string(
1229 fc_shortcuts::sc()->get_shortcut(SC_SENTRY))));
1230 menu_list.insert(SENTRY, act);
1231 connect(act, &QAction::triggered, this, &mr_menu::slot_unit_sentry);
1232 act = main_menu->addAction(_("Unsentry All On Tile"));
1233 act->setShortcut(QKeySequence(shortcut_to_string(
1234 fc_shortcuts::sc()->get_shortcut(SC_UNSENTRY_TILE))));
1235 menu_list.insert(WAKEUP, act);
1236 connect(act, &QAction::triggered, this, &mr_menu::slot_unsentry);
1237 main_menu->addSeparator();
1238 act = main_menu->addAction(_("Load"));
1239 act->setShortcut(QKeySequence(shortcut_to_string(
1240 fc_shortcuts::sc()->get_shortcut(SC_BOARD))));
1241 menu_list.insert(BOARD, act);
1242 connect(act, &QAction::triggered, this, &mr_menu::slot_board);
1243 act = main_menu->addAction(_("Unload"));
1244 act->setShortcut(QKeySequence(shortcut_to_string(
1245 fc_shortcuts::sc()->get_shortcut(SC_DEBOARD))));
1246 menu_list.insert(DEBOARD, act);
1247 connect(act, &QAction::triggered, this, &mr_menu::slot_deboard);
1248 act = main_menu->addAction(_("Unload All From Transporter"));
1249 act->setShortcut(QKeySequence(tr("shift+t")));
1250 menu_list.insert(TRANSPORTER, act);
1251 connect(act, &QAction::triggered, this, &mr_menu::slot_unload_all);
1252 main_menu->addSeparator();
1253
1254 // Defeat keyboard shortcut mnemonics
1256 .replace("&", "&&"));
1257 menu_list.insert(HOMECITY, act);
1258 act->setShortcut(QKeySequence(shortcut_to_string(
1259 fc_shortcuts::sc()->get_shortcut(SC_SETHOME))));
1260 connect(act, &QAction::triggered, this, &mr_menu::slot_set_home);
1261 act = main_menu->addAction(_("Upgrade"));
1262 act->setShortcut(QKeySequence(shortcut_to_string(
1263 fc_shortcuts::sc()->get_shortcut(SC_UPGRADE_UNIT))));
1264 menu_list.insert(UPGRADE, act);
1265 connect(act, &QAction::triggered, this, &mr_menu::slot_upgrade);
1266 act = main_menu->addAction(_("Convert"));
1267 act->setShortcut(QKeySequence(tr("shift+o")));
1268 menu_list.insert(CONVERT, act);
1269 connect(act, &QAction::triggered, this, &mr_menu::slot_convert);
1270 act = main_menu->addAction(_("Disband"));
1271 act->setShortcut(QKeySequence(tr("shift+d")));
1272 menu_list.insert(DISBAND, act);
1273 connect(act, &QAction::triggered, this, &mr_menu::slot_disband);
1274
1275 // Combat Menu
1276 main_menu = this->addMenu(_("Combat"));
1277 act = main_menu->addAction(_("Fortify Unit"));
1278 menu_list.insert(FORTIFY, act);
1279 act->setShortcut(QKeySequence(shortcut_to_string(
1280 fc_shortcuts::sc()->get_shortcut(SC_FORTIFY))));
1281 connect(act, &QAction::triggered, this, &mr_menu::slot_unit_fortify);
1282 act = main_menu->addAction(QString(Q_(terrain_control.gui_type_base0))
1283 .replace("&", "&&"));
1284 menu_list.insert(FORTRESS, act);
1285 act->setShortcut(QKeySequence(tr("shift+f")));
1286 connect(act, &QAction::triggered, this, &mr_menu::slot_unit_fortress);
1287 act = main_menu->addAction(QString(Q_(terrain_control.gui_type_base1))
1288 .replace("&", "&&"));
1289 menu_list.insert(AIRBASE, act);
1290 act->setShortcut(QKeySequence(tr("shift+e")));
1291 connect(act, &QAction::triggered, this, &mr_menu::slot_unit_airbase);
1292 bases_menu = main_menu->addMenu(_("Build Base"));
1293 main_menu->addSeparator();
1294 act = main_menu->addAction(_("Paradrop"));
1295 menu_list.insert(PARADROP, act);
1296 act->setShortcut(QKeySequence(shortcut_to_string(
1297 fc_shortcuts::sc()->get_shortcut(SC_PARADROP))));
1298 connect(act, &QAction::triggered, this, &mr_menu::slot_paradrop);
1299 act = main_menu->addAction(_("Pillage"));
1300 menu_list.insert(PILLAGE, act);
1301 act->setShortcut(QKeySequence(tr("shift+p")));
1302 connect(act, &QAction::triggered, this, &mr_menu::slot_pillage);
1303 // TRANS: Menu item to bring up the action selection dialog.
1304 act = main_menu->addAction(_("Do..."));
1305 menu_list.insert(ORDER_DIPLOMAT_DLG, act);
1306 act->setShortcut(QKeySequence(shortcut_to_string(
1307 fc_shortcuts::sc()->get_shortcut(SC_DO))));
1308 connect(act, &QAction::triggered, this, &mr_menu::slot_action);
1309
1310 // Work Menu
1311 main_menu = this->addMenu(_("Work"));
1313 .replace("&", "&&"));
1314 act->setShortcut(QKeySequence(shortcut_to_string(
1315 fc_shortcuts::sc()->get_shortcut(SC_BUILDCITY))));
1316 menu_list.insert(BUILD, act);
1317 connect(act, &QAction::triggered, this, &mr_menu::slot_build_city);
1318 act = main_menu->addAction(_("Auto Settler"));
1319 act->setShortcut(QKeySequence(shortcut_to_string(
1320 fc_shortcuts::sc()->get_shortcut(SC_AUTOMATE))));
1321 menu_list.insert(AUTOSETTLER, act);
1322 connect(act, &QAction::triggered, this, &mr_menu::slot_auto_settler);
1323 main_menu->addSeparator();
1324 act = main_menu->addAction(_("Build Road"));
1325 menu_list.insert(ROAD, act);
1326 act->setShortcut(QKeySequence(shortcut_to_string(
1327 fc_shortcuts::sc()->get_shortcut(SC_BUILDROAD))));
1328 connect(act, &QAction::triggered, this, &mr_menu::slot_build_road);
1329 roads_menu = main_menu->addMenu(_("Build Path"));
1330 act = main_menu->addAction(_("Build Irrigation"));
1331 act->setShortcut(QKeySequence(shortcut_to_string(
1332 fc_shortcuts::sc()->get_shortcut(SC_BUILDIRRIGATION))));
1333 menu_list.insert(IRRIGATION, act);
1334 connect(act, &QAction::triggered, this, &mr_menu::slot_build_irrigation);
1335 act = main_menu->addAction(_("Cultivate"));
1336 act->setShortcut(QKeySequence(shortcut_to_string(
1337 fc_shortcuts::sc()->get_shortcut(SC_CULTIVATE))));
1338 menu_list.insert(CULTIVATE, act);
1339 connect(act, &QAction::triggered, this, &mr_menu::slot_cultivate);
1340 act = main_menu->addAction(_("Build Mine"));
1341 act->setShortcut(QKeySequence(shortcut_to_string(
1342 fc_shortcuts::sc()->get_shortcut(SC_BUILDMINE))));
1343 menu_list.insert(MINE, act);
1344 connect(act, &QAction::triggered, this, &mr_menu::slot_build_mine);
1345 act = main_menu->addAction(_("Plant"));
1346 act->setShortcut(QKeySequence(shortcut_to_string(
1347 fc_shortcuts::sc()->get_shortcut(SC_PLANT))));
1348 menu_list.insert(PLANT, act);
1349 connect(act, &QAction::triggered, this, &mr_menu::slot_plant);
1350 main_menu->addSeparator();
1351 act = main_menu->addAction(_("Connect With Road"));
1352 act->setShortcut(QKeySequence(tr("ctrl+r")));
1353 menu_list.insert(CONNECT_ROAD, act);
1354 connect(act, &QAction::triggered, this, &mr_menu::slot_conn_road);
1355 act = main_menu->addAction(_("Connect With Railroad"));
1356 menu_list.insert(CONNECT_RAIL, act);
1357 act->setShortcut(QKeySequence(tr("ctrl+l")));
1358 connect(act, &QAction::triggered, this, &mr_menu::slot_conn_rail);
1359 act = main_menu->addAction(_("Connect With Maglev"));
1360 menu_list.insert(CONNECT_MAGLEV, act);
1361 act->setShortcut(QKeySequence(tr("ctrl+m")));
1362 connect(act, &QAction::triggered, this, &mr_menu::slot_conn_maglev);
1363 act = main_menu->addAction(_("Connect With Irrigation"));
1364 menu_list.insert(CONNECT_IRRIGATION, act);
1365 act->setShortcut(QKeySequence(tr("ctrl+i")));
1366 connect(act, &QAction::triggered, this, &mr_menu::slot_conn_irrigation);
1367 main_menu->addSeparator();
1368 act = main_menu->addAction(_("Transform Terrain"));
1369 menu_list.insert(TRANSFORM, act);
1370 act->setShortcut(QKeySequence(shortcut_to_string(
1371 fc_shortcuts::sc()->get_shortcut(SC_TRANSFORM))));
1372 connect(act, &QAction::triggered, this, &mr_menu::slot_transform);
1373 act = main_menu->addAction(_("Clean"));
1374 menu_list.insert(CLEAN, act);
1375 act->setShortcut(QKeySequence(shortcut_to_string(
1376 fc_shortcuts::sc()->get_shortcut(SC_CLEAN))));
1377 connect(act, &QAction::triggered, this, &mr_menu::slot_clean);
1379 .replace("&", "&&"));
1380 act->setShortcut(QKeySequence(tr("b")));
1381 menu_list.insert(BUILD_WONDER, act);
1382 connect(act, &QAction::triggered, this, &mr_menu::slot_build_city);
1384 .replace("&", "&&"));
1385 act->setShortcut(QKeySequence(tr("r")));
1386 menu_list.insert(ORDER_TRADE_ROUTE, act);
1387 connect(act, &QAction::triggered, this, &mr_menu::slot_build_road);
1388
1389 // Multiplayer Menu
1390 multiplayer_menu = this->addMenu(_("Multiplayer"));
1391 act = multiplayer_menu->addAction(_("Delayed Goto"));
1392 act->setShortcut(QKeySequence(tr("z")));
1393 connect(act, &QAction::triggered, this, &mr_menu::slot_delayed_goto);
1394 act = multiplayer_menu->addAction(_("Delayed Orders Execute"));
1395 act->setShortcut(QKeySequence(tr("ctrl+z")));
1396 connect(act, &QAction::triggered, this, &mr_menu::slot_execute_orders);
1397 act = multiplayer_menu->addAction(_("Clear Orders"));
1398 act->setShortcut(QKeySequence(tr("ctrl+shift+c")));
1399 connect(act, &QAction::triggered, this, &mr_menu::slot_orders_clear);
1400 act = multiplayer_menu->addAction(_("Add all cities to trade planning"));
1401 connect(act, &QAction::triggered, this, &mr_menu::slot_trade_add_all);
1402 act = multiplayer_menu->addAction(_("Calculate trade planning"));
1403 connect(act, &QAction::triggered, this, &mr_menu::slot_calculate);
1404 act = multiplayer_menu->addAction(_("Add/Remove City"));
1405 act->setShortcut(QKeySequence(tr("ctrl+t")));
1406 connect(act, &QAction::triggered, this, &mr_menu::slot_trade_city);
1407 act = multiplayer_menu->addAction(_("Clear Trade Planning"));
1408 connect(act, &QAction::triggered, this, &mr_menu::slot_clear_trade);
1409 act = multiplayer_menu->addAction(_("Automatic caravan"));
1410 menu_list.insert(AUTOTRADEROUTE, act);
1411 connect(act, &QAction::triggered, this, &mr_menu::slot_autocaravan);
1412 act->setShortcut(QKeySequence(tr("ctrl+j")));
1413 act = multiplayer_menu->addAction(_("Set/Unset rally point"));
1414 act->setShortcut(QKeySequence(tr("shift+s")));
1415 connect(act, &QAction::triggered, this, &mr_menu::slot_rally);
1416 act = multiplayer_menu->addAction(_("Quick Airlift"));
1417 act->setShortcut(QKeySequence(tr("ctrl+y")));
1418 connect(act, &QAction::triggered, this, &mr_menu::slot_quickairlift);
1419 airlift_type = new QActionGroup(this);
1420 airlift_menu = multiplayer_menu->addMenu(_("Unit type for quickairlifting"));
1421
1422 // Default diplo
1423 action_vs_city = new QActionGroup(this);
1424 action_vs_unit = new QActionGroup(this);
1425 action_unit_menu = multiplayer_menu->addMenu(_("Default action vs unit"));
1426
1427 act = action_unit_menu->addAction(_("Ask"));
1428 act->setCheckable(true);
1429 act->setChecked(true);
1430 act->setData(-1);
1431 action_vs_unit->addAction(act);
1432 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_unit);
1433
1434 act = action_unit_menu->addAction(_("Bribe"));
1435 act->setCheckable(true);
1436 act->setChecked(false);
1437 act->setData(ACTION_SPY_BRIBE_UNIT);
1438 action_vs_unit->addAction(act);
1439 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_unit);
1440
1441 act = action_unit_menu->addAction(_("Sabotage"));
1442 act->setCheckable(true);
1443 act->setChecked(false);
1444 act->setData(ACTION_SPY_SABOTAGE_UNIT);
1445 action_vs_unit->addAction(act);
1446 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_unit);
1447
1448 act = action_unit_menu->addAction(_("Sabotage Unit Escape"));
1449 act->setCheckable(true);
1450 act->setChecked(false);
1451 act->setData(ACTION_SPY_SABOTAGE_UNIT_ESC);
1452 action_vs_unit->addAction(act);
1453 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_unit);
1454
1455 action_city_menu = multiplayer_menu->addMenu(_("Default action vs city"));
1456 act = action_city_menu->addAction(_("Ask"));
1457 act->setCheckable(true);
1458 act->setChecked(true);
1459 act->setData(-1);
1460 action_vs_city->addAction(act);
1461 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1462
1463 act = action_city_menu->addAction(_("Investigate city"));
1464 act->setCheckable(true);
1465 act->setChecked(false);
1466 act->setData(ACTION_SPY_INVESTIGATE_CITY);
1467 action_vs_city->addAction(act);
1468 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1469
1470 act = action_city_menu->addAction(_("Investigate city (spends the unit)"));
1471 act->setCheckable(true);
1472 act->setChecked(false);
1473 act->setData(ACTION_INV_CITY_SPEND);
1474 action_vs_city->addAction(act);
1475 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1476
1477 act = action_city_menu->addAction(_("Establish embassy"));
1478 act->setCheckable(true);
1479 act->setChecked(false);
1480 act->setData(ACTION_ESTABLISH_EMBASSY);
1481 action_vs_city->addAction(act);
1482 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1483
1484 act = action_city_menu->addAction(_("Become Ambassador"));
1485 act->setCheckable(true);
1486 act->setChecked(false);
1487 act->setData(ACTION_ESTABLISH_EMBASSY_STAY);
1488 action_vs_city->addAction(act);
1489 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1490
1491 act = action_city_menu->addAction(_("Steal technology"));
1492 act->setCheckable(true);
1493 act->setChecked(false);
1494 act->setData(ACTION_SPY_STEAL_TECH);
1495 action_vs_city->addAction(act);
1496 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1497
1498 act = action_city_menu->addAction(_("Steal technology and escape"));
1499 act->setCheckable(true);
1500 act->setChecked(false);
1501 act->setData(ACTION_SPY_STEAL_TECH_ESC);
1502 action_vs_city->addAction(act);
1503 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1504
1505 act = action_city_menu->addAction(_("Incite a revolt"));
1506 act->setCheckable(true);
1507 act->setChecked(false);
1508 act->setData(ACTION_SPY_INCITE_CITY);
1509 action_vs_city->addAction(act);
1510 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1511
1512 act = action_city_menu->addAction(_("Incite a Revolt and Escape"));
1513 act->setCheckable(true);
1514 act->setChecked(false);
1515 act->setData(ACTION_SPY_INCITE_CITY_ESC);
1516 action_vs_city->addAction(act);
1517 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1518
1519 act = action_city_menu->addAction(_("Poison city"));
1520 act->setCheckable(true);
1521 act->setChecked(false);
1522 act->setData(ACTION_SPY_POISON);
1523 action_vs_city->addAction(act);
1524 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1525
1526 act = action_city_menu->addAction(_("Poison City Escape"));
1527 act->setCheckable(true);
1528 act->setChecked(false);
1529 act->setData(ACTION_SPY_POISON_ESC);
1530 action_vs_city->addAction(act);
1531 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1532
1533 // Civilization menu
1534 main_menu = this->addMenu(_("Civilization"));
1535 act = main_menu->addAction(_("Tax Rates..."));
1536 menu_list.insert(NOT_4_OBS, act);
1537 connect(act, &QAction::triggered, this, &mr_menu::slot_popup_tax_rates);
1538 main_menu->addSeparator();
1539
1540 act = main_menu->addAction(_("Policies..."));
1541 menu_list.insert(MULTIPLIERS, act);
1542 connect(act, &QAction::triggered, this, &mr_menu::slot_popup_mult_rates);
1543 main_menu->addSeparator();
1544
1545 main_menu->addMenu(new class gov_menu(this));
1546 main_menu->addSeparator();
1547
1548 act = main_menu->addAction(Q_("?noun:View"));
1549 act->setShortcut(QKeySequence(tr("F1")));
1550 connect(act, &QAction::triggered, this, &mr_menu::slot_show_map);
1551
1552 act = main_menu->addAction(_("Units"));
1553 act->setShortcut(QKeySequence(tr("F2")));
1554 connect(act, &QAction::triggered, this, &mr_menu::slot_show_units_report);
1555
1556 act = main_menu->addAction(_("Nations"));
1557 act->setShortcut(QKeySequence(tr("F3")));
1558 connect(act, &QAction::triggered, this, &mr_menu::slot_show_nations);
1559
1560 act = main_menu->addAction(_("Cities"));
1561 act->setShortcut(QKeySequence(tr("F4")));
1562 connect(act, &QAction::triggered, this, &mr_menu::slot_show_cities);
1563
1564 act = main_menu->addAction(_("Economy"));
1565 act->setShortcut(QKeySequence(tr("F5")));
1566 connect(act, &QAction::triggered, this, &mr_menu::slot_show_eco_report);
1567
1568 act = main_menu->addAction(_("Research"));
1569 act->setShortcut(QKeySequence(tr("F6")));
1570 connect(act, &QAction::triggered, this, &mr_menu::slot_show_research_tab);
1571
1572 act = main_menu->addAction(_("Wonders of the World"));
1573 act->setShortcut(QKeySequence(tr("F7")));
1574 connect(act, &QAction::triggered, this, &mr_menu::slot_traveler);
1575
1576 act = main_menu->addAction(_("Top Cities"));
1577 act->setShortcut(QKeySequence(tr("F8")));
1578 menu_list.insert(TOP_CITIES, act);
1579 connect(act, &QAction::triggered, this, &mr_menu::slot_top_cities);
1580
1581 act = main_menu->addAction(_("Demographics"));
1582 act->setShortcut(QKeySequence(tr("F11")));
1583 connect(act, &QAction::triggered, this, &mr_menu::slot_demographics);
1584
1585 act = main_menu->addAction(_("Spaceship"));
1586 act->setShortcut(QKeySequence(tr("F12")));
1587 connect(act, &QAction::triggered, this, &mr_menu::slot_spaceship);
1588
1589 act = main_menu->addAction(_("Achievements"));
1590 connect(act, &QAction::triggered, this, &mr_menu::slot_achievements);
1591
1592 act = main_menu->addAction(_("Endgame report"));
1593 menu_list.insert(ENDGAME, act);
1594 connect(act, &QAction::triggered, this, &mr_menu::slot_endgame);
1595
1596 // Battle Groups Menu
1597 main_menu = this->addMenu(_("Battle Groups"));
1598
1599 act = main_menu->addAction(_("Select Battle Group 1"));
1600 act->setShortcut(QKeySequence(tr("Shift+F1")));
1601 connect(act, &QAction::triggered, this, &mr_menu::slot_bg1select);
1602
1603 act = main_menu->addAction(_("Assign Battle Group 1"));
1604 act->setShortcut(QKeySequence(tr("Ctrl+F1")));
1605 connect(act, &QAction::triggered, this, &mr_menu::slot_bg1assign);
1606
1607 act = main_menu->addAction(_("Append to Battle Group 1"));
1608 act->setShortcut(QKeySequence(tr("Ctrl+Shift+F1")));
1609 connect(act, &QAction::triggered, this, &mr_menu::slot_bg1append);
1610
1611 act = main_menu->addAction(_("Select Battle Group 2"));
1612 act->setShortcut(QKeySequence(tr("Shift+F2")));
1613 connect(act, &QAction::triggered, this, &mr_menu::slot_bg2select);
1614
1615 act = main_menu->addAction(_("Assign Battle Group 2"));
1616 act->setShortcut(QKeySequence(tr("Ctrl+F2")));
1617 connect(act, &QAction::triggered, this, &mr_menu::slot_bg2assign);
1618
1619 act = main_menu->addAction(_("Append to Battle Group 2"));
1620 act->setShortcut(QKeySequence(tr("Ctrl+Shift+F2")));
1621 connect(act, &QAction::triggered, this, &mr_menu::slot_bg2append);
1622
1623 act = main_menu->addAction(_("Select Battle Group 3"));
1624 act->setShortcut(QKeySequence(tr("Shift+F3")));
1625 connect(act, &QAction::triggered, this, &mr_menu::slot_bg3select);
1626
1627 act = main_menu->addAction(_("Assign Battle Group 3"));
1628 act->setShortcut(QKeySequence(tr("Ctrl+F3")));
1629 connect(act, &QAction::triggered, this, &mr_menu::slot_bg3assign);
1630
1631 act = main_menu->addAction(_("Append to Battle Group 3"));
1632 act->setShortcut(QKeySequence(tr("Ctrl+Shift+F3")));
1633 connect(act, &QAction::triggered, this, &mr_menu::slot_bg3append);
1634
1635 act = main_menu->addAction(_("Select Battle Group 4"));
1636 act->setShortcut(QKeySequence(tr("Shift+F4")));
1637 connect(act, &QAction::triggered, this, &mr_menu::slot_bg4select);
1638
1639 act = main_menu->addAction(_("Assign Battle Group 4"));
1640 act->setShortcut(QKeySequence(tr("Ctrl+F4")));
1641 connect(act, &QAction::triggered, this, &mr_menu::slot_bg4assign);
1642
1643 act = main_menu->addAction(_("Append to Battle Group 4"));
1644 act->setShortcut(QKeySequence(tr("Ctrl+Shift+F4")));
1645 connect(act, &QAction::triggered, this, &mr_menu::slot_bg4append);
1646
1647 // Help Menu
1648 main_menu = this->addMenu(_("Help"));
1649
1650 act = main_menu->addAction(Q_(HELP_OVERVIEW_ITEM));
1651 QObject::connect(act, &QAction::triggered, [this]() {
1653 });
1654
1655 act = main_menu->addAction(Q_(HELP_PLAYING_ITEM));
1656 QObject::connect(act, &QAction::triggered, [this]() {
1658 });
1659
1660 act = main_menu->addAction(Q_(HELP_TERRAIN_ITEM));
1661 QObject::connect(act, &QAction::triggered, [this]() {
1663 });
1664
1665 act = main_menu->addAction(Q_(HELP_ECONOMY_ITEM));
1666 QObject::connect(act, &QAction::triggered, [this]() {
1668 });
1669
1670 act = main_menu->addAction(Q_(HELP_CITIES_ITEM));
1671 QObject::connect(act, &QAction::triggered, [this]() {
1673 });
1674
1675 act = main_menu->addAction(Q_(HELP_IMPROVEMENTS_ITEM));
1676 QObject::connect(act, &QAction::triggered, [this]() {
1678 });
1679
1680 act = main_menu->addAction(Q_(HELP_WONDERS_ITEM));
1681 QObject::connect(act, &QAction::triggered, [this]() {
1683 });
1684
1685 act = main_menu->addAction(Q_(HELP_UNITS_ITEM));
1686 QObject::connect(act, &QAction::triggered, [this]() {
1688 });
1689
1690 act = main_menu->addAction(Q_(HELP_COMBAT_ITEM));
1691 QObject::connect(act, &QAction::triggered, [this]() {
1693 });
1694
1695 act = main_menu->addAction(Q_(HELP_ZOC_ITEM));
1696 QObject::connect(act, &QAction::triggered, [this]() {
1698 });
1699
1700 act = main_menu->addAction(Q_(HELP_GOVERNMENT_ITEM));
1701 QObject::connect(act, &QAction::triggered, [this]() {
1703 });
1704
1705 act = main_menu->addAction(Q_(HELP_MULTIPLIER_ITEM));
1706 QObject::connect(act, &QAction::triggered, [this]() {
1708 });
1709
1710 act = main_menu->addAction(Q_(HELP_DIPLOMACY_ITEM));
1711 QObject::connect(act, &QAction::triggered, [this]() {
1713 });
1714
1715 act = main_menu->addAction(Q_(HELP_TECHS_ITEM));
1716 QObject::connect(act, &QAction::triggered, [this]() {
1718 });
1719
1720 act = main_menu->addAction(Q_(HELP_SPACE_RACE_ITEM));
1721 QObject::connect(act, &QAction::triggered, [this]() {
1723 });
1724
1725 act = main_menu->addAction(Q_(HELP_RULESET_ITEM));
1726#ifdef __APPLE__
1727 // only needed on Mac, prevents qt from moving the menu item
1728 act->setMenuRole(QAction::NoRole);
1729#endif // __APPLE__
1730 QObject::connect(act, &QAction::triggered, [this]() {
1732 });
1733
1734 act = main_menu->addAction(Q_(HELP_TILESET_ITEM));
1735#ifdef __APPLE__
1736 // only needed on Mac, prevents qt from moving the menu item
1737 act->setMenuRole(QAction::NoRole);
1738#endif // __APPLE__
1739 QObject::connect(act, &QAction::triggered, [this]() {
1741 });
1742
1743 act = main_menu->addAction(Q_(HELP_MUSICSET_ITEM));
1744#ifdef __APPLE__
1745 // only needed on Mac, prevents qt from moving the menu item
1746 act->setMenuRole(QAction::NoRole);
1747#endif // __APPLE__
1748 QObject::connect(act, &QAction::triggered, [this]() {
1750 });
1751
1752 act = main_menu->addAction(Q_(HELP_NATIONS_ITEM));
1753#ifdef __APPLE__
1754 // only needed on Mac, prevents qt from moving the menu item
1755 act->setMenuRole(QAction::NoRole);
1756#endif // __APPLE__
1757 QObject::connect(act, &QAction::triggered, [this]() {
1759 });
1760
1761 main_menu->addSeparator();
1762
1763 act = main_menu->addAction(Q_(HELP_CONNECTING_ITEM));
1764 QObject::connect(act, &QAction::triggered, [this]() {
1766 });
1767
1768 act = main_menu->addAction(Q_(HELP_CONTROLS_ITEM));
1769 QObject::connect(act, &QAction::triggered, [this]() {
1771 });
1772
1773 act = main_menu->addAction(Q_(HELP_CMA_ITEM));
1774 QObject::connect(act, &QAction::triggered, [this]() {
1776 });
1777
1778 act = main_menu->addAction(Q_(HELP_CHATLINE_ITEM));
1779 QObject::connect(act, &QAction::triggered, [this]() {
1781 });
1782
1783 act = main_menu->addAction(Q_(HELP_WORKLIST_EDITOR_ITEM));
1784 QObject::connect(act, &QAction::triggered, [this]() {
1786 });
1787
1788 main_menu->addSeparator();
1789
1790 act = main_menu->addAction(Q_(HELP_LANGUAGES_ITEM));
1791 QObject::connect(act, &QAction::triggered, [this]() {
1793 });
1794
1795 act = main_menu->addAction(Q_(HELP_COPYING_ITEM));
1796 QObject::connect(act, &QAction::triggered, [this]() {
1798 });
1799
1800 act = main_menu->addAction(Q_(HELP_ABOUT_ITEM));
1801#ifdef __APPLE__
1802 // only needed on Mac, prevents qt from moving the menu item
1803 act->setMenuRole(QAction::NoRole);
1804#endif // __APPLE__
1805 QObject::connect(act, &QAction::triggered, [this]() {
1807 });
1808
1809 menus = this->findChildren<QMenu*>();
1810 for (i = 0; i < menus.count(); i++) {
1811 menus[i]->setAttribute(Qt::WA_TranslucentBackground);
1812 }
1813
1814 this->setVisible(false);
1815}
1816
1817/**********************************************************************/
1821{
1822 for (int i = 0; i < units_list.nr_units; i++) {
1823 units_list.unit_list.at(units_list.unit_list.count() - i -1)->ptile = ptile;
1824 }
1825}
1826
1827/**********************************************************************/
1833{
1834 foreach (QAction *a, m->actions()) {
1835 if (a->shortcut() == seq && a->isEnabled()) {
1836 a->activate(QAction::Trigger);
1837 return TRUE;
1838 }
1839 }
1840
1841 return FALSE;
1842}
1843
1844/**********************************************************************/
1848{
1852
1853 if (sid == SC_GOTO) {
1854 gui()->mapview_wdg->menu_click = true;
1856 return;
1857 }
1858 fcs = fc_shortcuts::sc()->get_shortcut(static_cast<shortcut_id>(sid));
1860
1862 foreach (const QMenu *m, menus) {
1864 return;
1865 }
1866 }
1867}
1868
1869/**********************************************************************/
1876{
1877 foreach (QAction *a, m->actions()) {
1878 if (a->shortcut() == seq && fcs->mouse == Qt::AllButtons) {
1879 *ret = a->text();
1880
1881 return TRUE;
1882 }
1883 }
1884
1885 return FALSE;
1886}
1887
1888/**********************************************************************/
1892{
1895
1898 foreach (const QMenu *m, menus) {
1899 QString ret;
1900
1901 if (shortcut_exist_inner(m, seq, fcs, &ret)) {
1902 return ret;
1903 }
1904 }
1905
1906 return QString();
1907}
1908
1909/**********************************************************************/
1915 QString *ret)
1916{
1917 foreach (QAction *a, m->actions()) {
1918 if (a->shortcut() == seq) {
1919 *ret = a->text() + " ("
1920 + a->shortcut().toString(QKeySequence::NativeText) + ")";
1921
1922 return TRUE;
1923 }
1924 }
1925
1926 return FALSE;
1927}
1928
1929/**********************************************************************/
1933{
1937
1938 fcs = fc_shortcuts::sc()->get_shortcut(static_cast<shortcut_id>(sid));
1940
1942 foreach (const QMenu *m, menus) {
1943 QString ret;
1944
1946 return ret;
1947 }
1948 }
1949
1950 return QString();
1951}
1952
1953/**********************************************************************/
1957{
1959 QAction *act;
1960
1961 airlift_menu->clear();
1962 if (client_is_observer()) {
1963 return;
1964 }
1965 unit_type_iterate(utype) {
1966 utype_id = utype_index(utype);
1967
1969 || !utype_can_do_action(utype, ACTION_AIRLIFT)) {
1970 continue;
1971 }
1974 continue;
1975 }
1976 // Defeat keyboard shortcut mnemonics
1977 act = airlift_menu->addAction(QString(utype_name_translation(utype))
1978 .replace("&", "&&"));
1979 act->setCheckable(true);
1980 act->setData(utype_id);
1981 if (airlift_type_id == utype_id) {
1982 act->setChecked(true);
1983 }
1984 connect(act, &QAction::triggered, this, &mr_menu::slot_quickairlift_set);
1985 airlift_type->addAction(act);
1987}
1988
1989/****************************************************************************
1990 Updates "build path" menu
1991****************************************************************************/
1993{
1994 QAction *act;
1995 struct unit_list *punits = nullptr;
1996 bool enabled = false;
1997
1998 foreach(act, roads_menu->actions()) {
1999 removeAction(act);
2000 act->deleteLater();
2001 }
2002 roads_menu->clear();
2003 roads_menu->setDisabled(true);
2004 if (client_is_observer()) {
2005 return;
2006 }
2007
2010 if (pextra->buildable) {
2011 int road_id;
2012
2013 // Defeat keyboard shortcut mnemonics
2014 act = roads_menu->addAction(QString(extra_name_translation(pextra))
2015 .replace("&", "&&"));
2016 road_id = pextra->id;
2017 act->setData(road_id);
2018 QObject::connect(act, &QAction::triggered, [this,road_id]() {
2020 });
2022 ACTIVITY_GEN_ROAD, pextra)) {
2023 act->setEnabled(true);
2024 enabled = true;
2025 } else {
2026 act->setDisabled(true);
2027 }
2028 }
2030
2031 if (enabled) {
2032 roads_menu->setEnabled(true);
2033 }
2034}
2035
2036/****************************************************************************
2037 Updates "build bases" menu
2038****************************************************************************/
2040{
2041 QAction *act;
2042 struct unit_list *punits = nullptr;
2043 bool enabled = false;
2044
2045 foreach(act, bases_menu->actions()) {
2046 removeAction(act);
2047 act->deleteLater();
2048 }
2049 bases_menu->clear();
2050 bases_menu->setDisabled(true);
2051
2052 if (client_is_observer()) {
2053 return;
2054 }
2055
2058 if (pextra->buildable) {
2059 int base_id;
2060
2061 // Defeat keyboard shortcut mnemonics
2062 act = bases_menu->addAction(QString(extra_name_translation(pextra))
2063 .replace("&", "&&"));
2064 base_id = pextra->id;
2065 act->setData(base_id);
2066 QObject::connect(act, &QAction::triggered, [this,base_id]() {
2068 });
2070 act->setEnabled(true);
2071 enabled = true;
2072 } else {
2073 act->setDisabled(true);
2074 }
2075 }
2077
2078 if (enabled) {
2079 bases_menu->setEnabled(true);
2080 }
2081}
2082
2083/**********************************************************************/
2087{
2088 QList <QAction * >values;
2090 QMultiHash <munit, QAction *>::iterator i;
2091 struct unit_list *punits = nullptr;
2092 struct road_type *proad;
2093 struct extra_type *tgt;
2094 bool any_cities = false;
2095 bool city_on_tile = false;
2096 bool units_all_same_tile = true;
2097 const struct tile *ptile = NULL;
2098 const struct unit_type *ptype = NULL;
2099
2100 players_iterate(pplayer) {
2101 if (city_list_size(pplayer->cities)) {
2102 any_cities = true;
2103 break;
2104 }
2106
2107 // Disable first all sensitive menus
2108 foreach(QAction *a, menu_list) {
2109 a->setEnabled(false);
2110 }
2111
2112 if (client_is_observer()) {
2113 multiplayer_menu->setDisabled(true);
2114 } else {
2115 multiplayer_menu->setDisabled(false);
2116 }
2117
2118 // Non unit menus
2119 keys = menu_list.keys();
2120 foreach (munit key, keys) {
2121 i = menu_list.find(key);
2122 while (i != menu_list.end() && i.key() == key) {
2123 switch (key) {
2124 case SAVE:
2126 i.value()->setEnabled(true);
2127 }
2128 break;
2129 case NOT_4_OBS:
2130 if (!client_is_observer()) {
2131 i.value()->setEnabled(true);
2132 }
2133 break;
2134 case MULTIPLIERS:
2135 if (!client_is_observer() && multiplier_count() > 0) {
2136 i.value()->setEnabled(true);
2137 i.value()->setVisible(true);
2138 } else {
2139 i.value()->setVisible(false);
2140 }
2141 break;
2142 case ENDGAME:
2143 if (gui()->is_repo_dlg_open("END")) {
2144 i.value()->setEnabled(true);
2145 i.value()->setVisible(true);
2146 } else {
2147 i.value()->setVisible(false);
2148 }
2149 break;
2150 case TOP_CITIES:
2151 i.value()->setEnabled(game.info.top_cities_count > 0);
2152 if (game.info.top_cities_count > 0) {
2153 i.value()->setText(QString(PL_("Top %1 City", "Top %1 Cities",
2155 .arg(game.info.top_cities_count));
2156 } else {
2157 i.value()->setText(QString(_("Top Cities")));
2158 }
2159 break;
2160 case AUDIO:
2161 i.value()->setEnabled(!audio_is_dummy_plugin());
2162 break;
2163 default:
2164 break;
2165 }
2166 i++;
2167 }
2168 }
2169
2171 return;
2172 }
2173
2176 if (tile_city(unit_tile(punit))) {
2177 city_on_tile = true;
2178 break;
2179 }
2181
2183 const struct unit_type *ntype;
2184
2185 fc_assert((ptile == NULL) == (ptype == NULL));
2186
2188
2189 // 'ntype == ptype' is correct check even when ptype is still nullptr
2190 if (ptile != nullptr && ntype == ptype && unit_tile(punit) != ptile) {
2191 units_all_same_tile = false;
2192 }
2193
2194 if (ptype == nullptr || ntype == ptype) {
2195 ptile = unit_tile(punit);
2196 ptype = ntype;
2197 }
2199
2200 keys = menu_list.keys();
2201 foreach(munit key, keys) {
2202 i = menu_list.find(key);
2203 while (i != menu_list.end() && i.key() == key) {
2204 switch (key) {
2205 case STANDARD:
2206 i.value()->setEnabled(true);
2207 break;
2208
2209 case EXPLORE:
2211 i.value()->setEnabled(true);
2212 }
2213 break;
2214
2215 case BOARD:
2216 if (units_can_load(punits)) {
2217 i.value()->setEnabled(true);
2218 }
2219 break;
2220
2221 case DEBOARD:
2222 if (units_can_unload(punits)) {
2223 i.value()->setEnabled(true);
2224 }
2225 break;
2226
2227 case TRANSPORTER:
2229 i.value()->setEnabled(true);
2230 }
2231 break;
2232
2233 case CONVERT:
2234 if (units_can_convert(&(wld.map), punits)) {
2235 i.value()->setEnabled(true);
2236 }
2237 break;
2238
2239 case MINE:
2241 i.value()->setEnabled(true);
2242 }
2243
2244 if (units_all_same_tile) {
2246 struct extra_type *pextra = NULL;
2247
2248 /* FIXME: this overloading doesn't work well with multiple focus
2249 * units. */
2253 if (pextra != NULL) {
2254 break;
2255 }
2257
2258 if (pextra != NULL) {
2259 i.value()->setText(
2260 // TRANS: Build mine of specific type
2261 QString(_("Build %1"))
2262 .arg(extra_name_translation(pextra))
2263 .replace("&", "&&"));
2264 } else {
2265 i.value()->setText(QString(_("Build Mine")));
2266 }
2267 } else {
2268 i.value()->setText(QString(_("Build Mine")));
2269 }
2270 }
2271 break;
2272
2273 case IRRIGATION:
2275 i.value()->setEnabled(true);
2276 }
2277 if (units_all_same_tile) {
2279 struct extra_type *pextra = NULL;
2280
2281 /* FIXME: this overloading doesn't work well with multiple focus
2282 * units. */
2286 if (pextra != NULL) {
2287 break;
2288 }
2290
2291 if (pextra != NULL) {
2292 i.value()->setText(
2293 // TRANS: Build irrigation of specific type
2294 QString(_("Build %1"))
2295 .arg(extra_name_translation(pextra))
2296 .replace("&", "&&"));
2297 } else {
2298 i.value()->setText(QString(_("Build Irrigation")));
2299 }
2300 } else {
2301 i.value()->setText(QString(_("Build Irrigation")));
2302 }
2303 }
2304 break;
2305
2306 case CULTIVATE:
2308 i.value()->setEnabled(true);
2309 }
2310 if (units_all_same_tile) {
2311 struct unit *punit = unit_list_get(punits, 0);
2312 struct tile *atile = unit_tile(punit);
2313 struct terrain *pterrain = tile_terrain(atile);
2314
2315 if (pterrain->cultivate_result != T_NONE) {
2316 i.value()->setText(
2317 // TRANS: Transform terrain to specific type
2318 QString(_("Cultivate to %1"))
2320 .replace("&", "&&"));
2321 } else {
2322 i.value()->setText(QString(_("Cultivate")));
2323 }
2324 } else {
2325 i.value()->setText(QString(_("Cultivate")));
2326 }
2327 break;
2328
2329 case PLANT:
2331 i.value()->setEnabled(true);
2332 }
2333 if (units_all_same_tile) {
2334 struct unit *punit = unit_list_get(punits, 0);
2335 struct tile *atile = unit_tile(punit);
2336 struct terrain *pterrain = tile_terrain(atile);
2337
2338 if (pterrain->plant_result != T_NONE) {
2339 i.value()->setText(
2340 // TRANS: Transform terrain to specific type
2341 QString(_("Plant to %1"))
2343 .replace("&", "&&"));
2344 } else {
2345 i.value()->setText(QString(_("Plant")));
2346 }
2347 } else {
2348 i.value()->setText(QString(_("Plant")));
2349 }
2350 break;
2351
2352 case TRANSFORM:
2354 i.value()->setEnabled(true);
2355 } else {
2356 break;
2357 }
2358 if (units_all_same_tile) {
2359 struct unit *punit = unit_list_get(punits, 0);
2360 struct tile *atile = unit_tile(punit);
2361 struct terrain *pterrain = tile_terrain(atile);
2362
2363 if (pterrain->transform_result != T_NONE
2364 && pterrain->transform_result != pterrain) {
2365 i.value()->setText(
2366 // TRANS: Transform terrain to specific type
2367 QString(_("Transform to %1"))
2369 .replace("&", "&&"));
2370 } else {
2371 i.value()->setText(_("Transform Terrain"));
2372 }
2373 }
2374 break;
2375
2376 case BUILD:
2379 i.value()->setEnabled(true);
2380 }
2381 if (city_on_tile
2383 i.value()->setText(
2385 .replace("&", "&&"));
2386 } else {
2387 i.value()->setText(
2389 .replace("&", "&&"));
2390 }
2391 break;
2392
2393 case ROAD:
2394 {
2395 struct extra_type *pextra = nullptr;
2396
2398 i.value()->setEnabled(true);
2399 }
2403 if (pextra != nullptr) {
2404 break;
2405 }
2407
2408 if (pextra != nullptr) {
2409 i.value()->setText(
2410 // TRANS: Build road of specific type
2411 QString(_("Build %1"))
2412 .arg(extra_name_translation(pextra))
2413 .replace("&", "&&"));
2414 }
2415 }
2416 break;
2417
2418 case FORTIFY:
2420 i.value()->setEnabled(true);
2421 }
2422 break;
2423
2424 case FORTRESS:
2426 i.value()->setEnabled(true);
2427 }
2428 break;
2429
2430 case AIRBASE:
2432 i.value()->setEnabled(true);
2433 }
2434 break;
2435
2436 case CLEAN:
2438 i.value()->setEnabled(true);
2439 }
2440 break;
2441
2442 case SENTRY:
2444 i.value()->setEnabled(true);
2445 }
2446 break;
2447
2448 case PARADROP:
2450 i.value()->setEnabled(true);
2452 .replace("&", "&&"));
2453 }
2454 break;
2455
2456 case PILLAGE:
2458 i.value()->setEnabled(true);
2459 }
2460 break;
2461
2462 case HOMECITY:
2464 i.value()->setEnabled(true);
2465 }
2466 break;
2467
2468 case WAKEUP:
2470 i.value()->setEnabled(true);
2471 }
2472 break;
2473
2474 case AUTOSETTLER:
2476 i.value()->setEnabled(true);
2477 }
2479 i.value()->setText(_("Auto Settler"));
2480 } else {
2481 i.value()->setText(_("Auto Worker"));
2482 }
2483 break;
2484 case CONNECT_ROAD:
2486 if (proad != NULL) {
2487 tgt = road_extra_get(proad);
2488 } else {
2489 break;
2490 }
2492 i.value()->setEnabled(true);
2493 }
2494 break;
2495
2496 case DISBAND:
2498 i.value()->setEnabled(true);
2499 }
2500 break;
2501
2502 case CONNECT_RAIL:
2504 if (proad != NULL) {
2505 tgt = road_extra_get(proad);
2506 } else {
2507 break;
2508 }
2510 i.value()->setEnabled(true);
2511 }
2512 break;
2513
2514 case CONNECT_MAGLEV:
2516 if (proad != NULL) {
2517 tgt = road_extra_get(proad);
2518 } else {
2519 break;
2520 }
2522 i.value()->setEnabled(true);
2523 }
2524 break;
2525
2526 case CONNECT_IRRIGATION:
2527 {
2529
2530 if (extra_type_list_size(extras) > 0) {
2531 struct extra_type *pextra;
2532
2535 i.value()->setEnabled(true);
2536 }
2537 }
2538 }
2539 break;
2540
2541 case GOTO_CITY:
2542 if (any_cities) {
2543 i.value()->setEnabled(true);
2544 }
2545 break;
2546
2547 case AIRLIFT:
2548 if (any_cities) {
2549 i.value()->setEnabled(true);
2550 }
2551 break;
2552
2553 case BUILD_WONDER:
2554 i.value()->setText(
2556 .replace("&", "&&"));
2558 i.value()->setEnabled(true);
2559 }
2560 break;
2561
2562 case AUTOTRADEROUTE:
2564 i.value()->setEnabled(true);
2565 }
2566 break;
2567
2568 case ORDER_TRADE_ROUTE:
2569 i.value()->setText(
2571 .replace("&", "&&"));
2573 i.value()->setEnabled(true);
2574 }
2575 break;
2576
2577 case ORDER_DIPLOMAT_DLG:
2579 i.value()->setEnabled(true);
2580 }
2581 break;
2582
2583 case UPGRADE:
2584 if (units_can_upgrade(&(wld.map), punits)) {
2585 i.value()->setEnabled(true);
2586 }
2587 break;
2588 default:
2589 break;
2590 }
2591
2592 i++;
2593 }
2594 }
2595}
2596
2597/**********************************************************************/
2604
2605/**********************************************************************/
2614
2615/**********************************************************************/
2622
2623/**********************************************************************/
2627{
2628 ::gui()->game_tab_widget->setCurrentIndex(0);
2629}
2630
2631/**********************************************************************/
2638
2639/**********************************************************************/
2643{
2644 popup_players_dialog(false);
2645}
2646
2647/**********************************************************************/
2654
2655/**********************************************************************/
2659{
2661 /* FIXME: this can provide different actions for different units...
2662 * not good! */
2663 /* Enable the button for adding to a city in all cases, so we
2664 get an eventual error message from the server if we try. */
2669 }
2671}
2672
2673/**********************************************************************/
2677{
2679 struct extra_type *pextra;
2680
2683
2684 if (pextra != NULL) {
2686 }
2688}
2689
2690/**********************************************************************/
2705
2706/**********************************************************************/
2710{
2712
2713 if (prail != NULL) {
2714 struct extra_type *tgt;
2715
2716 tgt = road_extra_get(prail);
2718 }
2719}
2720
2721/**********************************************************************/
2725{
2727
2728 if (pmaglev != NULL) {
2729 struct extra_type *tgt;
2730
2731 tgt = road_extra_get(pmaglev);
2733 }
2734}
2735
2736/**********************************************************************/
2743
2744/**********************************************************************/
2751
2752/**********************************************************************/
2756{
2758
2759 if (proad != NULL) {
2760 struct extra_type *tgt;
2761
2762 tgt = road_extra_get(proad);
2764 }
2765}
2766
2767/**********************************************************************/
2774
2775/**********************************************************************/
2786
2787/**********************************************************************/
2791{
2793}
2794
2795/**********************************************************************/
2802
2803/**********************************************************************/
2810
2811/**********************************************************************/
2815{
2817 /* FIXME: this can provide different actions for different units...
2818 * not good! */
2820 EC_ROAD,
2822 punit);
2823 bool building_road = false;
2824
2825 if (tgt != NULL
2828 building_road = true;
2829 }
2830
2833 }
2835}
2836
2837/**********************************************************************/
2844
2845/**********************************************************************/
2852
2853/**********************************************************************/
2857{
2858 key_unit_mine();
2859}
2860
2861/**********************************************************************/
2865{
2867}
2868
2869/**********************************************************************/
2876
2877/**********************************************************************/
2884
2885/**********************************************************************/
2889{
2891}
2892
2893/**********************************************************************/
2900
2901/**********************************************************************/
2905{
2906 delayed_order = false;
2907 units_list.clear();
2908}
2909
2910/**********************************************************************/
2914{
2915 gui()->rallies.hover_tile = false;
2916 gui()->rallies.hover_city = true;
2917}
2918
2919/**********************************************************************/
2923{
2924 gui()->trade_gen.hover_city = true;
2925}
2926
2927/**********************************************************************/
2931{
2932 gui()->trade_gen.add_all_cities();
2933}
2934
2935/**********************************************************************/
2939{
2940 gui()->trade_gen.calculate();
2941}
2942
2943/**********************************************************************/
2947{
2948 gui()->trade_gen.clear_trade_planing();
2949}
2950
2951/**********************************************************************/
2955{
2956 qtiles gilles;
2957 struct unit *punit;
2958 struct city *homecity;
2959 struct tile *home_tile;
2960 struct tile *dest_tile;
2961 bool sent = false;
2962
2964 homecity = game_city_by_number(punit->homecity);
2965 home_tile = homecity->tile;
2966 foreach(gilles, gui()->trade_gen.lines) {
2967 if ((gilles.t1 == home_tile || gilles.t2 == home_tile)
2968 && gilles.autocaravan == nullptr) {
2969 // Send caravan
2970 if (gilles.t1 == home_tile) {
2971 dest_tile = gilles.t2;
2972 } else {
2973 dest_tile = gilles.t1;
2974 }
2975 if (send_goto_tile(punit, dest_tile)) {
2976 int i;
2977 i = gui()->trade_gen.lines.indexOf(gilles);
2978 gilles = gui()->trade_gen.lines.takeAt(i);
2979 gilles.autocaravan = punit;
2980 gui()->trade_gen.lines.append(gilles);
2981 sent = true;
2982 break;
2983 }
2984 }
2985 }
2986
2987 if (!sent) {
2988 gui()->infotab->chtwdg->append(_("Didn't find any trade route"
2989 " to establish"));
2990 }
2991}
2992
2993/**********************************************************************/
2997{
2998 QVariant v;
2999 QAction *act;
3000
3002 v = act->data();
3003 airlift_type_id = v.toInt();
3004}
3005
3006/**********************************************************************/
3010{
3011 QAction *act;
3012
3014 qdef_act::action()->vs_unit_set(act->data().toInt());
3015}
3016
3017/**********************************************************************/
3021{
3022 QAction *act;
3023
3025 qdef_act::action()->vs_city_set(act->data().toInt());
3026}
3027
3028/**********************************************************************/
3032{
3033 quick_airlifting = true;
3034}
3035
3036/**********************************************************************/
3040{
3042 int i = 0;
3044
3045 delayed_order = true;
3046 dg = D_GOTO;
3047
3048 struct unit_list *punits = get_units_in_focus();
3049 if (unit_list_size(punits) == 0) {
3050 return;
3051 }
3052 if (hover_state != HOVER_GOTO) {
3058 }
3060 i++;
3065}
3066
3067/**********************************************************************/
3071{
3073 struct unit *punit;
3074 struct tile *last_tile;
3075 struct tile *new_tile;
3076 int i = 0;
3077
3078 foreach (fui, units_list.unit_list) {
3079 i++;
3080 punit = unit_list_find(client_player()->units, fui->id);
3081 if (punit == nullptr) {
3082 continue;
3083 }
3084 last_tile = punit->tile;
3086 if (new_tile != nullptr) {
3087 punit->tile = new_tile;
3088 }
3089 if (is_tiles_adjacent(punit->tile, fui->ptile)) {
3092 punit->tile,
3093 fui->ptile));
3094 } else {
3095 send_attack_tile(punit, fui->ptile);
3096 }
3097 punit->tile = last_tile;
3098 }
3099 units_list.clear();
3100}
3101
3102/**********************************************************************/
3111
3112/**********************************************************************/
3116{
3118}
3119
3120/**********************************************************************/
3129
3130/**********************************************************************/
3134{
3136}
3137
3138/**********************************************************************/
3145
3146/**********************************************************************/
3155
3156/**********************************************************************/
3163
3164/**********************************************************************/
3171
3172/**********************************************************************/
3179
3180/**********************************************************************/
3184{
3185 key_unit_goto();
3186}
3187
3188/**********************************************************************/
3195
3196/**********************************************************************/
3203
3204/**********************************************************************/
3208{
3209 if (gui()->interface_locked) {
3210 enable_interface(false);
3211 } else {
3212 enable_interface(true);
3213 }
3214 gui()->interface_locked = !gui()->interface_locked;
3215}
3216
3217/**********************************************************************/
3221{
3225 int i;
3226
3227 lc = gui()->findChildren<close_widget *>();
3228 lm = gui()->findChildren<move_widget *>();
3229 lr = gui()->findChildren<resize_widget *>();
3230
3231 for (i = 0; i < lc.size(); ++i) {
3232 lc.at(i)->setVisible(!enable);
3233 }
3234 for (i = 0; i < lm.size(); ++i) {
3235 lm.at(i)->setVisible(!enable);
3236 }
3237 for (i = 0; i < lr.size(); ++i) {
3238 lr.at(i)->setVisible(!enable);
3239 }
3240}
3241
3242/**********************************************************************/
3246{
3248
3249 gui()->apply_fullscreen();
3250}
3251
3252/**********************************************************************/
3256{
3257 if (minimap_status->isChecked()) {
3258 ::gui()->minimapview_wdg->show();
3259 } else {
3260 ::gui()->minimapview_wdg->hide();
3261 }
3262}
3263
3264/**********************************************************************/
3268{
3269 if (osd_status->isChecked()) {
3270 gui()->qt_settings.show_new_turn_text = true;
3271 } else {
3272 gui()->qt_settings.show_new_turn_text = false;
3273 }
3274}
3275
3276/**********************************************************************/
3280{
3281 if (btlog_status->isChecked()) {
3282 gui()->qt_settings.show_battle_log = true;
3283 } else {
3284 gui()->qt_settings.show_battle_log = false;
3285 }
3286}
3287
3288/**********************************************************************/
3295
3296/**********************************************************************/
3303
3304/**********************************************************************/
3311
3312/**********************************************************************/
3319
3320/**********************************************************************/
3324{
3325 gui()->map_scale = gui()->map_scale * 1.2f;
3326 tilespec_reread(tileset_basename(tileset), true, gui()->map_scale);
3327}
3328
3329/**********************************************************************/
3333{
3334 QFont *qf;
3335
3336 gui()->map_scale = 1.0f;
3338 qf->setPointSize(fc_font::instance()->city_fontsize);
3340 qf->setPointSize(fc_font::instance()->prod_fontsize);
3341 tilespec_reread(tileset_basename(tileset), true, gui()->map_scale);
3342}
3343
3344/**********************************************************************/
3348{
3349 QFont *qf;
3350
3351 if (scale_fonts_status->isChecked()) {
3352 gui()->map_font_scale = true;
3353 } else {
3355 qf->setPointSize(fc_font::instance()->city_fontsize);
3357 qf->setPointSize(fc_font::instance()->prod_fontsize);
3358 gui()->map_font_scale = false;
3359 }
3361}
3362
3363/**********************************************************************/
3367{
3368 gui()->map_scale = gui()->map_scale / 1.2f;
3369 tilespec_reread(tileset_basename(tileset), true, gui()->map_scale);
3370}
3371
3372/**********************************************************************/
3379
3380/**********************************************************************/
3387
3388/**********************************************************************/
3395
3396/**********************************************************************/
3403
3404/**********************************************************************/
3411
3412/**********************************************************************/
3419
3420/**********************************************************************/
3427
3428/**********************************************************************/
3435
3436/**********************************************************************/
3440{
3441 key_unit_done();
3442}
3443
3444/**********************************************************************/
3451
3452/**********************************************************************/
3459
3460/**********************************************************************/
3469
3470/**********************************************************************/
3479
3480/**********************************************************************/
3487
3488/**********************************************************************/
3492{
3493 key_unit_wait();
3494}
3495
3496/**********************************************************************/
3500{
3502
3503 uhs = new unit_hud_selector(gui()->central_wdg);
3504 uhs->show_me();
3505}
3506
3507/**********************************************************************/
3514
3515/**********************************************************************/
3522
3523/**********************************************************************/
3530
3531/**********************************************************************/
3538
3539/**********************************************************************/
3546
3547/**********************************************************************/
3554
3555/**********************************************************************/
3562
3563/**********************************************************************/
3570
3571/**********************************************************************/
3578
3579/**********************************************************************/
3586
3587/**********************************************************************/
3594
3595/**********************************************************************/
3602
3603/**********************************************************************/
3610
3611/**********************************************************************/
3618
3619/**********************************************************************/
3626
3627/**********************************************************************/
3634
3635/**********************************************************************/
3642
3643/**********************************************************************/
3647{
3648 QDialog *dialog = new QDialog(this);
3649 QLabel *label;
3650 QPushButton *but;
3652 const struct strvec *tlset_list;
3653 const struct option *poption;
3655 QString s;
3656
3657 sl << "default_tileset_overhead_name" << "default_tileset_iso_name"
3658 << "default_tileset_hex_name" << "default_tileset_isohex_name";
3659 layout = new QVBoxLayout;
3660 dialog->setWindowTitle(_("Available tilesets"));
3661 label = new QLabel;
3662 label->setText(_("Some tilesets might not be compatible with current"
3663 " map topology!"));
3664 layout->addWidget(label);
3665
3666 foreach (s, sl) {
3668
3669 on_bytes = s.toUtf8();
3672 strvec_iterate(tlset_list, value) {
3673 but = new QPushButton(value);
3674 connect(but, &QAbstractButton::clicked, this, &mr_menu::load_new_tileset);
3675 layout->addWidget(but);
3677 }
3678 dialog->setSizeGripEnabled(true);
3679 dialog->setLayout(layout);
3680 dialog->show();
3681}
3682
3683/**********************************************************************/
3687{
3688 QPushButton *but;
3690
3692 tn_bytes = but->text().toUtf8();
3693 tilespec_reread(tn_bytes.data(), true, 1.0f);
3694 gui()->map_scale = 1.0f;
3695 but->parentWidget()->close();
3696}
3697
3698/**********************************************************************/
3702{
3703 gui()->trade_gen.calculate();
3704}
3705
3706/**********************************************************************/
3713
3714/**********************************************************************/
3721
3722/**********************************************************************/
3725void mr_menu::slot_help(const QString &topic)
3726{
3727 popup_help_dialog_typed(Q_(topic.toStdString().c_str()), HELP_ANY);
3728}
3729
3730/****************************************************************
3731 Actions "BUILD_PATH_*"
3732*****************************************************************/
3745
3746/****************************************************************
3747 Actions "BUILD_BASE_*"
3748*****************************************************************/
3750{
3753 if (pextra->buildable && pextra->id == id
3755 pextra)) {
3757 }
3760}
3761
3762
3763
3764/**********************************************************************/
3768{
3769 gui()->popup_client_options();
3770}
3771
3772/**********************************************************************/
3779
3780/**********************************************************************/
3784{
3785 gui()->pr_options->popup_server_options();
3786}
3787
3788/**********************************************************************/
3795
3796/**********************************************************************/
3803
3804/**********************************************************************/
3811
3812/**********************************************************************/
3816{
3818}
3819
3820/**********************************************************************/
3824{
3827 QString path, storage_path;
3828 hud_message_box *saved = new hud_message_box(gui()->central_wdg);
3829 bool map_saved;
3831
3834 current_width = gui()->mapview_wdg->width();
3835 current_height = gui()->mapview_wdg->height();
3836 if (tileset_hex_width(tileset) > 0) {
3837 full_size_y = full_size_y * 11 / 20;
3838 } else if (tileset_is_isometric(tileset)) {
3840 }
3842 img_name = QString("Freeciv-Turn%1").arg(game.info.turn);
3843 if (client_has_player()) {
3844 img_name = img_name + "-"
3846 }
3848 path = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
3849 if (!storage_path.isEmpty() && QDir(storage_path).isReadable()) {
3851 } else if (!path.isEmpty()) {
3852 img_name = path + DIR_SEPARATOR + img_name;
3853 } else {
3854 img_name = QStandardPaths::writableLocation(QStandardPaths::HomeLocation)
3856 }
3857 map_saved = mapview.store->map_pixmap.save(img_name, "png");
3859 saved->setStandardButtons(QMessageBox::Ok);
3860 saved->setDefaultButton(QMessageBox::Cancel);
3861 saved->setAttribute(Qt::WA_DeleteOnClose);
3862 if (map_saved) {
3863 saved->set_text_title("Image saved as:\n" + img_name, _("Success"));
3864 } else {
3865 saved->set_text_title(_("Failed to save image of the map"), _("Error"));
3866 }
3867 saved->show();
3868}
3869
3870/**********************************************************************/
3874{
3876}
3877
3878/**********************************************************************/
3882{
3883 QString str;
3884 QString current_file;
3885 QString location;
3886
3888 location = dirname;
3889 // choose last location
3891
3892 str = QString(_("Save Games"))
3893 + QString(" (*.sav *.sav.bz2 *.sav.gz *.sav.xz)");
3894 current_file = QFileDialog::getSaveFileName(gui()->central_wdg,
3895 _("Save Game As..."),
3896 location, str);
3897 if (!current_file.isEmpty()) {
3899
3900 cf_bytes = current_file.toUtf8();
3901 send_save_game(cf_bytes.data());
3902 }
3903}
3904
3905/**********************************************************************/
3909{
3911
3912 if (is_server_running()) {
3913 ask = new hud_message_box(gui()->central_wdg);
3914 ask->set_text_title(_("Leaving a local game will end it!"), "Leave game");
3915 ask->setStandardButtons(QMessageBox::Cancel | QMessageBox::Ok);
3916 ask->setDefaultButton(QMessageBox::Cancel);
3917 ask->setAttribute(Qt::WA_DeleteOnClose);
3918
3919 connect(ask, &hud_message_box::accepted, [=]() {
3920 if (client.conn.used) {
3921 gui()->infotab->msgwdg->clr();
3922 disconnect_from_server(TRUE);
3923 }
3924 });
3925 ask->show();
3926 } else {
3928 }
3929}
3930
3931/**********************************************************************/
3942
3943/**********************************************************************/
3954
3955/**********************************************************************/
3959{
3960 hud_message_box* ask = new hud_message_box(gui()->central_wdg);
3961
3962 ask->setIcon(QMessageBox::Warning);
3963 ask->setStandardButtons(QMessageBox::Cancel | QMessageBox::Ok);
3964 ask->setDefaultButton(QMessageBox::Cancel);
3965 ask->setAttribute(Qt::WA_DeleteOnClose);
3966 return (ask->set_text_title(_("Selection will cancel current assignments!"),
3967 _("Confirm Disruptive Selection"), true)
3968 == QMessageBox::Ok);
3969}
3970
3971/**********************************************************************/
3975{
3976 struct tile *ptile;
3978 if (get_city_bonus(pcity, EFT_AIRLIFT) > 0) {
3979 ptile = city_tile(pcity);
3980 unit_list_iterate(ptile->units, punit) {
3981 if (punit->utype == utype_by_number(ut)) {
3983 break;
3984 }
3986 }
3988}
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
bool audio_is_dummy_plugin(void)
Definition audio.c:715
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:896
virtual ~go_act_menu()
Definition menu.cpp:708
void start_go_act(int act_id, int sub_tgt_id)
Definition menu.cpp:873
void reset()
Definition menu.cpp:717
static QSet< go_act_menu * > instances
Definition menu.h:238
void update()
Definition menu.cpp:833
go_act_menu(QWidget *parent=nullptr)
Definition menu.cpp:698
static void reset_all()
Definition menu.cpp:886
void create()
Definition menu.cpp:729
QMap< QAction *, int > items
Definition menu.h:240
static QSet< gov_menu * > instances
Definition menu.h:213
virtual ~gov_menu()
Definition menu.cpp:579
static void create_all()
Definition menu.cpp:678
void revolution()
Definition menu.cpp:657
QVector< QAction * > actions
Definition menu.h:215
static void update_all()
Definition menu.cpp:688
void change_gov(int target_gov)
Definition menu.cpp:665
gov_menu(QWidget *parent=0)
Definition menu.cpp:568
void create()
Definition menu.cpp:588
void update()
Definition menu.cpp:629
bool shortcut_2_menustring_inner(const QMenu *m, QKeySequence seq, QString *ret)
Definition menu.cpp:1914
void slot_unit_sentry()
Definition menu.cpp:2880
QActionGroup * action_vs_city
Definition menu.h:268
void slot_bg3select()
Definition menu.cpp:3598
void slot_traveler()
Definition menu.cpp:3542
bool execute_shortcut_inner(const QMenu *m, QKeySequence seq)
Definition menu.cpp:1832
void slot_delayed_goto()
Definition menu.cpp:3039
void zoom_in()
Definition menu.cpp:3323
void slot_autocaravan()
Definition menu.cpp:2954
QMenu * multiplayer_menu
Definition menu.h:265
void slot_build_irrigation()
Definition menu.cpp:2840
void volume_up()
Definition menu.cpp:3934
void slot_execute_orders()
Definition menu.cpp:3070
void update_bases_menu()
Definition menu.cpp:2039
QString shortcut_exist(fc_shortcut *fcs)
Definition menu.cpp:1891
void tileset_custom_load()
Definition menu.cpp:3646
void update_roads_menu()
Definition menu.cpp:1992
void slot_calculate()
Definition menu.cpp:2938
void slot_conn_road()
Definition menu.cpp:2755
void slot_conn_irrigation()
Definition menu.cpp:2693
QMenu * bases_menu
Definition menu.h:264
QActionGroup * airlift_type
Definition menu.h:267
void save_options_exit()
Definition menu.cpp:3807
void slot_quickairlift_set()
Definition menu.cpp:2996
void slot_battlelog()
Definition menu.cpp:3279
QMultiHash< munit, QAction * > menu_list
Definition menu.h:272
void slot_trade_add_all()
Definition menu.cpp:2930
void update_airlift_menu()
Definition menu.cpp:1956
void slot_show_cities()
Definition menu.cpp:2650
void slot_transform()
Definition menu.cpp:2770
void slot_top_cities()
Definition menu.cpp:3534
void slot_action_vs_unit()
Definition menu.cpp:3009
void slot_achievements()
Definition menu.cpp:3518
void slot_show_research_tab()
Definition menu.cpp:2600
void shortcut_options()
Definition menu.cpp:3775
void slot_city_output()
Definition menu.cpp:3391
void slot_show_eco_report()
Definition menu.cpp:2618
QMenu * airlift_menu
Definition menu.h:263
QAction * osd_status
Definition menu.h:288
void slot_bg1select()
Definition menu.cpp:3550
void slot_unload_all()
Definition menu.cpp:3159
void slot_airlift()
Definition menu.cpp:3133
void slot_select_same_continent()
Definition menu.cpp:3463
void slot_city_production()
Definition menu.cpp:3399
void slot_set_home()
Definition menu.cpp:3141
QAction * lock_status
Definition menu.h:287
void slot_native_tiles()
Definition menu.cpp:3299
void slot_unit_explore()
Definition menu.cpp:3191
void slot_bg4assign()
Definition menu.cpp:3630
void slot_bg1append()
Definition menu.cpp:3566
void slot_upgrade()
Definition menu.cpp:3175
void execute_shortcut(int sid)
Definition menu.cpp:1847
void slot_popup_mult_rates()
Definition menu.cpp:3717
void slot_select_same_everywhere()
Definition menu.cpp:3473
void volume_down()
Definition menu.cpp:3946
void slot_map_grid()
Definition menu.cpp:3431
void slot_unit_filter()
Definition menu.cpp:3499
void slot_bg2select()
Definition menu.cpp:3574
void slot_done_moving()
Definition menu.cpp:3439
void calc_trade_routes()
Definition menu.cpp:3701
void slot_city_buycost()
Definition menu.cpp:3307
void slot_action()
Definition menu.cpp:2798
void slot_bg4append()
Definition menu.cpp:3638
QMenu * roads_menu
Definition menu.h:266
QAction * minimap_status
Definition menu.h:285
bool shortcut_exist_inner(const QMenu *m, QKeySequence seq, fc_shortcut *fcs, QString *ret)
Definition menu.cpp:1874
void slot_select_all_tile()
Definition menu.cpp:3447
void save_game()
Definition menu.cpp:3873
struct tile * find_last_unit_pos(struct unit *punit, int pos)
Definition menu.cpp:906
void save_image()
Definition menu.cpp:3823
void slot_pillage()
Definition menu.cpp:2790
void slot_clean()
Definition menu.cpp:2676
void zoom_reset()
Definition menu.cpp:3332
void slot_board()
Definition menu.cpp:3105
void slot_center_view()
Definition menu.cpp:3199
void slot_build_mine()
Definition menu.cpp:2856
void server_options()
Definition menu.cpp:3783
void load_new_tileset()
Definition menu.cpp:3686
void set_tile_for_order(struct tile *ptile)
Definition menu.cpp:1820
void slot_fullscreen()
Definition menu.cpp:3245
void slot_bg4select()
Definition menu.cpp:3622
void slot_show_nations()
Definition menu.cpp:2642
void slot_build_road()
Definition menu.cpp:2814
void slot_unsentry()
Definition menu.cpp:3167
void slot_show_new_turn_text()
Definition menu.cpp:3267
void local_options()
Definition menu.cpp:3767
bool delayed_order
Definition menu.h:292
void slot_borders()
Definition menu.cpp:3291
void slot_clear_trade()
Definition menu.cpp:2946
void zoom_scale_fonts()
Definition menu.cpp:3347
void slot_conn_rail()
Definition menu.cpp:2709
void slot_select_same_tile()
Definition menu.cpp:3483
void slot_convert()
Definition menu.cpp:2888
QMenu * action_unit_menu
Definition menu.h:270
QActionGroup * action_vs_unit
Definition menu.h:269
void slot_endgame()
Definition menu.cpp:3526
void slot_bg2assign()
Definition menu.cpp:3582
void slot_select_one()
Definition menu.cpp:3455
void menus_sensitive()
Definition menu.cpp:2086
void messages_options()
Definition menu.cpp:3791
void slot_unit_goto()
Definition menu.cpp:3183
void slot_cultivate()
Definition menu.cpp:2848
void slot_stack_size()
Definition menu.cpp:3415
void slot_conn_maglev()
Definition menu.cpp:2724
void slot_patrol()
Definition menu.cpp:3115
void slot_unit_fortress()
Definition menu.cpp:2739
void slot_wait()
Definition menu.cpp:3491
void slot_demographics()
Definition menu.cpp:3510
void slot_build_city()
Definition menu.cpp:2658
void slot_city_growth()
Definition menu.cpp:3315
void slot_city_trade_routes()
Definition menu.cpp:3407
void slot_rally()
Definition menu.cpp:2913
void slot_plant()
Definition menu.cpp:2864
void slot_paradrop()
Definition menu.cpp:2778
void slot_build_path(int id)
Definition menu.cpp:3733
void slot_bg1assign()
Definition menu.cpp:3558
void slot_return_to_city()
Definition menu.cpp:3123
Unit_type_id airlift_type_id
Definition menu.h:294
void slot_show_map()
Definition menu.cpp:2626
void slot_bg3assign()
Definition menu.cpp:3606
QAction * scale_fonts_status
Definition menu.h:286
void slot_minimap_view()
Definition menu.cpp:3255
void slot_trade_city()
Definition menu.cpp:2922
void quit_game()
Definition menu.cpp:3815
void slot_help(const QString &topic)
Definition menu.cpp:3725
void save_game_as()
Definition menu.cpp:3881
void slot_bg2append()
Definition menu.cpp:3590
bool quick_airlifting
Definition menu.h:293
void slot_spaceship()
Definition menu.cpp:2608
void slot_city_names()
Definition menu.cpp:3375
QMenu * action_city_menu
Definition menu.h:271
void save_options_now()
Definition menu.cpp:3799
QAction * btlog_status
Definition menu.h:289
void slot_unit_fortify()
Definition menu.cpp:2872
void slot_show_units_report()
Definition menu.cpp:2634
void slot_quickairlift()
Definition menu.cpp:3031
QString shortcut_2_menustring(int sid)
Definition menu.cpp:1932
void slot_lock()
Definition menu.cpp:3207
void back_to_menu()
Definition menu.cpp:3908
void slot_deboard()
Definition menu.cpp:3149
void slot_popup_tax_rates()
Definition menu.cpp:3709
void slot_auto_settler()
Definition menu.cpp:2806
void slot_build_base(int id)
Definition menu.cpp:3749
qfc_units_list units_list
Definition menu.h:273
void setup_menus()
Definition menu.cpp:957
mr_menu()
Definition menu.cpp:948
void slot_bg3append()
Definition menu.cpp:3614
void slot_action_vs_city()
Definition menu.cpp:3020
void zoom_out()
Definition menu.cpp:3366
void slot_disband()
Definition menu.cpp:2896
void slot_unit_airbase()
Definition menu.cpp:2747
void slot_fullbar()
Definition menu.cpp:3423
void slot_city_outlines()
Definition menu.cpp:3383
bool confirm_disruptive_selection()
Definition menu.cpp:3958
void slot_orders_clear()
Definition menu.cpp:2904
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:132
void add(qfc_delayed_unit_item *fui)
Definition menu.cpp:494
int nr_units
Definition menu.h:133
void clear()
Definition menu.cpp:502
bool done
Definition menu.h:144
unsigned trade_num
Definition menu.h:147
int poss_trade_num
Definition menu.h:146
QList< struct city * > pos_cities
Definition menu.h:150
QList< struct city * > new_tr_cities
Definition menu.h:149
int over_max
Definition menu.h:145
trade_city(struct city *pcity)
Definition menu.cpp:69
QList< struct city * > curr_tr_cities
Definition menu.h:148
struct city * city
Definition menu.h:151
void calculate_inner(trade_city *tc)
Definition menu.cpp:215
bool discard_one(trade_city *tc)
Definition menu.cpp:377
void add_city(struct city *pcity)
Definition menu.cpp:126
void find_certain_routes()
Definition menu.cpp:459
QList< trade_city * > cities
Definition menu.h:183
void find_certain_routes_inner(trade_city *tc)
Definition menu.cpp:424
trade_city * find_most_free()
Definition menu.cpp:326
void discard_trade(trade_city *tc1, trade_city *tc2)
Definition menu.cpp:363
void add_tile(struct tile *ptile)
Definition menu.cpp:138
void remove_virtual_city(struct tile *ptile)
Definition menu.cpp:189
bool hover_city
Definition menu.h:180
void add_all_cities()
Definition menu.cpp:88
void clear_trade_planing()
Definition menu.cpp:106
void discard()
Definition menu.cpp:344
void remove_city(struct city *pcity)
Definition menu.cpp:171
QList< qtiles > lines
Definition menu.h:181
bool discard_any(trade_city *tc, int freeroutes)
Definition menu.cpp:403
void check_if_done(trade_city *tc1, trade_city *tc2)
Definition menu.cpp:474
QList< struct city * > virtual_cities
Definition menu.h:182
int find_over_max(struct city *pcity)
Definition menu.cpp:310
void calculate()
Definition menu.cpp:233
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:3768
void request_unit_airlift(struct unit *punit, struct city *pcity)
Definition control.c:1555
void key_city_output_toggle(void)
Definition control.c:3865
void request_unit_return(struct unit *punit)
Definition control.c:1564
void request_unit_caravan_action(struct unit *punit, action_id action)
Definition control.c:2235
void key_unit_auto_explore(void)
Definition control.c:3589
void key_unit_auto_settle(void)
Definition control.c:3602
void key_unit_connect(enum unit_activity activity, struct extra_type *tgt)
Definition control.c:3387
void key_city_full_bar_toggle(void)
Definition control.c:3897
void key_map_native_toggle(void)
Definition control.c:3889
void request_unit_goto(enum unit_orders last_order, action_id act_id, int sub_tgt_id)
Definition control.c:1142
void key_unit_paradrop(void)
Definition control.c:3491
struct unit_list * get_units_in_focus(void)
Definition control.c:177
void request_center_focus_unit(void)
Definition control.c:2762
void key_city_productions_toggle(void)
Definition control.c:3931
void key_unit_plant(void)
Definition control.c:3708
void key_unit_fortress(void)
Definition control.c:3636
void key_unit_mine(void)
Definition control.c:3700
void key_unit_pillage(void)
Definition control.c:3720
void request_unit_unload(struct unit *pcargo)
Definition control.c:2206
void request_new_unit_activity_targeted(struct unit *punit, enum unit_activity act, struct extra_type *tgt)
Definition control.c:1950
void key_unit_irrigate(void)
Definition control.c:3680
void request_unit_build_city(struct unit *punit)
Definition control.c:1829
void key_unit_unload_all(void)
Definition control.c:3529
void key_city_outlines_toggle(void)
Definition control.c:3857
void key_unit_homecity(void)
Definition control.c:3653
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:3499
void key_unit_wakeup_others(void)
Definition control.c:3562
enum cursor_hover_state hover_state
Definition control.c:89
void key_unit_stack_size_toggle(void)
Definition control.c:3948
void key_unit_wait(void)
Definition control.c:3554
void key_unit_select_battlegroup(int battlegroup, bool append)
Definition control.c:3831
void key_map_grid_toggle(void)
Definition control.c:3873
struct unit * head_of_units_in_focus(void)
Definition control.c:410
void key_city_growth_toggle(void)
Definition control.c:3914
void key_unit_action_select_tgt(void)
Definition control.c:3418
void key_city_buycost_toggle(void)
Definition control.c:3923
int get_num_units_in_focus(void)
Definition control.c:185
void key_unit_transform(void)
Definition control.c:3780
void request_move_unit_direction(struct unit *punit, int dir)
Definition control.c:1891
void key_unit_done(void)
Definition control.c:3475
void key_city_trade_routes_toggle(void)
Definition control.c:3940
void key_city_names_toggle(void)
Definition control.c:3905
void request_unit_select(struct unit_list *punits, enum unit_select_type_mode seltype, enum unit_select_location_mode selloc)
Definition control.c:1633
void key_unit_airbase(void)
Definition control.c:3572
void key_unit_goto(void)
Definition control.c:3483
void control_mouse_cursor(struct tile *ptile)
Definition control.c:1227
void key_unit_convert(void)
Definition control.c:3614
void key_unit_fortify(void)
Definition control.c:3624
void key_unit_assign_battlegroup(int battlegroup, bool append)
Definition control.c:3792
void key_unit_cultivate(void)
Definition control.c:3688
void key_map_borders_toggle(void)
Definition control.c:3881
#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:2371
#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:83
@ D_GOTO
Definition menu.h:84
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
@ AUDIO
Definition menu.h:80
@ 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:1356
bool is_tiles_adjacent(const struct tile *tile0, const struct tile *tile1)
Definition map.c:940
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:3220
void multiairlift(struct city *acity, Unit_type_id ut)
Definition menu.cpp:3974
void real_menus_init(void)
Definition menu.cpp:511
static const char * get_tile_change_menu_text(struct tile *ptile, enum unit_activity activity)
Definition menu.cpp:552
void real_menus_update(void)
Definition menu.cpp:529
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:2019
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:161
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:6804
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