Freeciv-3.3
Loading...
Searching...
No Matches
menu.cpp
Go to the documentation of this file.
1/***********************************************************************
2 Freeciv - Copyright (C) 1996 - A Kjeldberg, L Gregersen, P Unold
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation; either version 2, or (at your option)
6 any later version.
7
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
12***********************************************************************/
13
14#ifdef HAVE_CONFIG_H
15#include <fc_config.h>
16#endif
17
18// Qt
19#include <QActionGroup>
20#include <QApplication>
21#include <QFileDialog>
22#include <QMainWindow>
23#include <QMessageBox>
24#include <QScrollArea>
25#include <QStandardPaths>
26#include <QVBoxLayout>
27
28// utility
29#include "string_vector.h"
30
31// common
32#include "game.h"
33#include "government.h"
34#include "goto.h"
35#include "name_translation.h"
36#include "road.h"
37#include "unit.h"
38
39// client
40#include "connectdlg_common.h"
41#include "control.h"
42#include "helpdata.h"
43
44// gui-qt
45#include "fc_client.h"
46#include "chatline.h"
47#include "cityrep.h"
48#include "dialogs.h"
49#include "gotodlg.h"
50#include "gui_main.h"
51#include "hudwidget.h"
52#include "mapctrl.h"
53#include "messagedlg.h"
54#include "plrdlg.h"
55#include "ratesdlg.h"
56#include "repodlgs.h"
57#include "shortcuts.h"
58#include "spaceshipdlg.h"
59#include "sprite.h"
60
61#include "menu.h"
62
63static void enable_interface(bool enable);
64
65/**********************************************************************/
69{
70 city = pcity;
71 tile = nullptr;
72 trade_num = 0;
74}
75
76/**********************************************************************/
83
84/**********************************************************************/
88{
89 int i, s;
90 struct city *pcity;
91 struct player *pplayer = client_player();
92
94 s = city_list_size(pplayer->cities);
95 if (s == 0) {
96 return;
97 }
98 for (i = 0; i < s; i++) {
99 pcity = city_list_get(pplayer->cities, i);
101 }
102}
103
104/**********************************************************************/
108{
109 struct city *pcity;
110 trade_city *tc;
111
112 foreach(pcity, virtual_cities) {
114 }
115 virtual_cities.clear();
116 foreach(tc, cities) {
117 delete tc;
118 }
119 cities.clear();
120 lines.clear();
121 gui()->mapview_wdg->repaint();
122}
123
124/**********************************************************************/
128{
129 trade_city *tc = new trade_city(pcity);
130
131 cities.append(tc);
132 gui()->infotab->chtwdg->append(QString(_("Adding city %1 to trade planning"))
133 .arg(tc->city->name));
134}
135
136/**********************************************************************/
140{
141 struct city *pcity;
142 trade_city *tc;
143
144 pcity = tile_city(ptile);
145
146 foreach (tc, cities) {
147 if (pcity != nullptr) {
148 if (tc->city == pcity) {
150 return;
151 }
152 }
153 if (tc->city->tile == ptile) {
154 remove_virtual_city(ptile);
155 return;
156 }
157 }
158
159 if (pcity != nullptr) {
161 return;
162 }
163
164 pcity = create_city_virtual(client_player(), ptile, "Virtual");
166 virtual_cities.append(pcity);
167}
168
169/**********************************************************************/
173{
174 trade_city *tc;
175
176 foreach (tc, cities) {
177 if (tc->city->tile == pcity->tile) {
178 cities.removeAll(tc);
179 gui()->infotab->chtwdg->append(
180 QString(_("Removing city %1 from trade planning"))
181 .arg(tc->city->name));
182 return;
183 }
184 }
185}
186
187/**********************************************************************/
191{
192 struct city *c;
193 trade_city *tc;
194
195 foreach (c, virtual_cities) {
196 if (c->tile == ptile) {
197 virtual_cities.removeAll(c);
198 gui()->infotab->chtwdg->append(
199 QString(_("Removing city %1 from trade planning")).arg(c->name));
200 }
201 }
202
203 foreach (tc, cities) {
204 if (tc->city->tile == ptile) {
205 cities.removeAll(tc);
206 return;
207 }
208 }
209}
210
211/**********************************************************************/
217{
219
220 foreach (ttc, cities) {
221 if (!have_cities_trade_route(tc->city, ttc->city)
223 tc->poss_trade_num++;
224 tc->pos_cities.append(ttc->city);
225 }
226 tc->over_max = tc->trade_num + tc->poss_trade_num
227 - max_trade_routes(tc->city);
228 }
229}
230
231/**********************************************************************/
235{
236 trade_city *tc;
237 int i;
238 bool tdone;
239 int count = cities.size();
240 int *cities_ids = (int *)fc_malloc(sizeof(int) * count);
241 trade_city **cities_order = (trade_city **)fc_malloc(sizeof(trade_city *) * count);
242
243 for (i = 0; i < 100; i++) {
244 int n;
245
246 tdone = true;
247
248 for (n = 0; n < count; n++) {
249 cities_ids[n] = n;
251 }
253
254 cities.clear();
255 for (n = 0; n < count; n++) {
257 }
258
259 lines.clear();
260 foreach (tc, cities) {
261 tc->pos_cities.clear();
262 tc->new_tr_cities.clear();
263 tc->curr_tr_cities.clear();
264 }
265 foreach (tc, cities) {
267 tc->poss_trade_num = 0;
268 tc->pos_cities.clear();
269 tc->new_tr_cities.clear();
270 tc->curr_tr_cities.clear();
271 tc->done = false;
272 calculate_inner(tc);
273 }
274
276 discard();
278
279 foreach (tc, cities) {
280 if (!tc->done) {
281 tdone = false;
282 }
283 }
284 if (tdone) {
285 break;
286 }
287 }
288 foreach (tc, cities) {
289 if (!tc->done) {
290 char text[1024];
291 fc_snprintf(text, sizeof(text),
292 PL_("City %s - 1 free trade route.",
293 "City %s - %d free trade routes.",
294 max_trade_routes(tc->city) - tc->trade_num),
295 city_link(tc->city),
296 max_trade_routes(tc->city) - tc->trade_num);
298 }
299 }
300
303
304 gui()->mapview_wdg->repaint();
305}
306
307/**********************************************************************/
312{
313 trade_city *tc;
314 int max = 0;
315
316 foreach (tc, cities) {
317 if (pcity != tc->city) {
318 max = qMax(max, tc->over_max);
319 }
320 }
321 return max;
322}
323
324/**********************************************************************/
328{
329 trade_city *tc;
330 trade_city *rc = nullptr;
331 int max = 0;
332
333 foreach (tc, cities) {
334 if (max < tc->over_max) {
335 max = tc->over_max;
336 rc = tc;
337 }
338 }
339 return rc;
340}
341
342/**********************************************************************/
346{
347 trade_city *tc;
348 int j = 5;
349
350 for (int i = j; i > -j; i--) {
351 while ((tc = find_most_free())) {
352 if (!discard_one(tc)) {
353 if (!discard_any(tc, i)) {
354 break;
355 }
356 }
357 }
358 }
359}
360
361/**********************************************************************/
365{
366 tc->pos_cities.removeOne(ttc->city);
367 ttc->pos_cities.removeOne(tc->city);
368 tc->poss_trade_num--;
369 ttc->poss_trade_num--;
370 tc->over_max--;
371 ttc->over_max--;
372 check_if_done(tc, ttc);
373}
374
375/**********************************************************************/
379{
380 int best = 0;
381 int current_candidate = 0;
382 int best_id;
384
385 for (int i = cities.size() - 1 ; i >= 0; i--) {
386 ttc = cities.at(i);
388 if (current_candidate > best) {
389 best_id = i;
390 }
391 }
392 if (best == 0) {
393 return false;
394 }
395
396 ttc = cities.at(best_id);
397 discard_trade(tc, ttc);
398 return true;
399}
400
401/**********************************************************************/
405{
407
408 for (int i = cities.size() - 1 ; i >= 0; i--) {
409 ttc = cities.at(i);
410 if (tc->pos_cities.contains(ttc->city)
411 && ttc->pos_cities.contains(tc->city)
412 && ttc->over_max > freeroutes) {
413 discard_trade(tc, ttc);
414 return true;
415 }
416 }
417 return false;
418}
419
420/**********************************************************************/
426{
428
429 foreach (ttc, cities) {
430 if (ttc->done || ttc->over_max > 0
431 || tc == ttc || tc->done || tc->over_max > 0) {
432 continue;
433 }
434 if (tc->pos_cities.contains(ttc->city)
435 && ttc->pos_cities.contains(tc->city)) {
436 struct qtiles gilles;
437
438 tc->pos_cities.removeOne(ttc->city);
439 ttc->pos_cities.removeOne(tc->city);
440 tc->poss_trade_num--;
441 ttc->poss_trade_num--;
442 tc->new_tr_cities.append(ttc->city);
443 ttc->new_tr_cities.append(ttc->city);
444 tc->trade_num++;
445 ttc->trade_num++;
446 tc->over_max--;
447 ttc->over_max--;
448 check_if_done(tc, ttc);
449 gilles.t1 = tc->city->tile;
450 gilles.t2 = ttc->city->tile;
451 gilles.autocaravan = nullptr;
452 lines.append(gilles);
453 }
454 }
455}
456
457/**********************************************************************/
461{
462 trade_city *tc;
463
464 foreach (tc, cities) {
465 if (tc->done || tc->over_max > 0) {
466 continue;
467 }
469 }
470}
471
472/**********************************************************************/
476{
477 if (tc1->trade_num == max_trade_routes(tc1->city)) {
478 tc1->done = true;
479 }
480 if (tc2->trade_num == max_trade_routes(tc2->city)) {
481 tc2->done = true;
482 }
483}
484
485/**********************************************************************/
491
492/**********************************************************************/
499
500/**********************************************************************/
504{
505 unit_list.clear();
506}
507
508/**********************************************************************/
513{
515 return;
516 }
517 gui()->menu_bar->clear();
518 gui()->menu_bar->setup_menus();
519
521
522 // A new ruleset may have been loaded.
524}
525
526/**********************************************************************/
531{
532 if (C_S_RUNNING <= client_state()) {
533 gui()->menuBar()->setVisible(true);
534 if (!is_waiting_turn_change()) {
535 gui()->menu_bar->menus_sensitive();
536 gui()->menu_bar->update_airlift_menu();
537 gui()->menu_bar->update_roads_menu();
538 gui()->menu_bar->update_bases_menu();
541 gui()->unitinfo_wdg->update_actions(nullptr);
542 }
543 } else {
544 gui()->menuBar()->setVisible(false);
545 }
546}
547
548/**********************************************************************/
553static const char *get_tile_change_menu_text(struct tile *ptile,
554 enum unit_activity activity)
555{
556 struct tile *newtile = tile_virtual_new(ptile);
557 const char *text;
558
559 tile_apply_activity(newtile, activity, nullptr);
560 text = tile_get_info_text(newtile, FALSE, 0);
562
563 return text;
564}
565
566/**********************************************************************/
570 QMenu(_("Government"), parent)
571{
572 // Register ourselves to get updates for free.
573 instances << this;
574 setAttribute(Qt::WA_TranslucentBackground);
575}
576
577/**********************************************************************/
581{
583 instances.remove(this);
584}
585
586/**********************************************************************/
591 struct government *gov, *revol_gov;
592 int gov_count, i;
593
594 // Clear any content
595 foreach(action, QWidget::actions()) {
597 action->deleteLater();
598 }
599 actions.clear();
600
602 actions.reserve(gov_count + 1);
603 action = addAction(_("Revolution..."));
604 action->setShortcut(QKeySequence(tr("ctrl+shift+g")));
605 connect(action, &QAction::triggered, this, &gov_menu::revolution);
606 actions.append(action);
607
608 addSeparator();
609
610 // Add an action for each government. There is no icon yet.
612 for (i = 0; i < gov_count; ++i) {
613 gov = government_by_number(i);
614 if (gov != revol_gov) { // Skip revolution government
615 // Defeat keyboard shortcut mnemonics
617 .replace("&", "&&"));
618 // We need to keep track of the gov <-> action mapping to be able to
619 // set enabled/disabled depending on available govs.
620 actions.append(action);
621 QObject::connect(action, &QAction::triggered, [this,i]() {
622 change_gov(i);
623 });
624 }
625 }
626}
627
628/**********************************************************************/
632{
633 struct government *gov, *revol_gov;
634 struct sprite *sprite;
635 int gov_count, i, j;
636
639 for (i = 0, j = 0; i < gov_count; i++) {
640 gov = government_by_number(i);
641 if (gov != revol_gov) { // Skip revolution government
643 if (sprite != nullptr) {
644 actions[j + 1]->setIcon(QIcon(*(sprite->pm)));
645 }
646 actions[j + 1]->setEnabled(
648 j++;
649 } else {
650 actions[0]->setEnabled(!client_is_observer()
652 }
653 }
654}
655
656/**********************************************************************/
663
664/**********************************************************************/
671
672/**************************************************************************
673 Keeps track of all gov_menu instances.
674**************************************************************************/
676
677/**********************************************************************/
681{
682 foreach (gov_menu *m, instances) {
683 m->create();
684 }
685}
686
687/**********************************************************************/
691{
692 foreach (gov_menu *m, instances) {
693 m->update();
694 }
695}
696
697/**********************************************************************/
701 : QMenu(_("Go to and..."), parent)
702{
703 // Will need auto updates etc.
704 instances << this;
705}
706
707/**********************************************************************/
711{
712 // Updates are no longer needed.
713 instances.remove(this);
714}
715
716/**********************************************************************/
720{
721 // Clear menu item to action ID mapping.
722 items.clear();
723
724 // Remove the menu items
725 clear();
726}
727
728/**********************************************************************/
732{
733 QAction *item;
734 int tgt_kind_group;
735
736 // Group goto and perform action menu items by target kind.
739 struct action *paction = action_by_number(act_id);
741 .replace("&", "&&"));
742
743 if (action_id_get_actor_kind(act_id) != AAK_UNIT) {
744 // This action isn't performed by an unit.
745 continue;
746 }
747
749 // Wrong group.
750 continue;
751 }
752
753 if (action_id_has_complex_target(act_id)) {
755 items.insert(sub_target_menu->menuAction(), act_id);
756
757#define CREATE_SUB_ITEM(_menu_, _act_id_, _sub_tgt_id_, _sub_tgt_name_) \
758 { \
759 QAction *_sub_item_ = _menu_->addAction(_sub_tgt_name_); \
760 int _sub_target_id_ = _sub_tgt_id_; \
761 QObject::connect(_sub_item_, &QAction::triggered, \
762 [this, _act_id_, _sub_target_id_]() { \
763 start_go_act(_act_id_, _sub_target_id_); \
764 }); \
765 }
766
768 case ASTK_BUILDING:
774 break;
775 case ASTK_TECH:
781 break;
782 case ASTK_EXTRA:
784 extra_type_iterate(pextra) {
785 if (!actres_creates_extra(paction->result, pextra)
786 && !actres_removes_extra(paction->result, pextra)) {
787 // Not relevant
788 continue;
789 }
790
792 extra_number(pextra),
793 extra_name_translation(pextra));
795 break;
796 case ASTK_NONE:
797 // Should not be here.
799 break;
800 case ASTK_COUNT:
801 // Should not exits
803 break;
804 }
805 continue;
806 }
807
808#define ADD_OLD_SHORTCUT(wanted_action_id, sc_id) \
809 if (act_id == wanted_action_id) { \
810 item->setShortcut(QKeySequence(shortcut_to_string( \
811 fc_shortcuts::sc()->get_shortcut(sc_id)))); \
812 }
813
814 /* Create and add the menu item. It will be hidden or shown based on
815 * unit type. */
817 items.insert(item, act_id);
818
819 /* Add the keyboard shortcuts for "Go to and..." menu items that
820 * existed independently before the "Go to and..." menu arrived. */
824
825 QObject::connect(item, &QAction::triggered, [this,act_id]() {
826 start_go_act(act_id, NO_TARGET);
827 });
829 }
830}
831
832/**********************************************************************/
836{
837 bool can_do_something = false;
838
839 if (!actions_are_ready()) {
840 // Nothing to do.
841 return;
842 }
843
844 if (items.isEmpty()) {
845 // The goto and act menu needs menu items.
846 create();
847 }
848
849 /* Enable a menu item if it is theoretically possible that one of the
850 * selected units can perform it. Checking if the action can be performed
851 * at the current tile is pointless since it should be performed at the
852 * target tile. */
853 foreach(QAction *item, items.keys()) {
855 items.value(item), TRUE)) {
856 item->setVisible(true);
857 can_do_something = true;
858 } else {
859 item->setVisible(false);
860 }
861 }
862
863 if (can_do_something) {
864 // At least one menu item is enabled for one of the selected units.
865 setEnabled(true);
866 } else {
867 // No menu item is enabled any of the selected units.
868 setEnabled(false);
869 }
870}
871
872/**********************************************************************/
875void go_act_menu::start_go_act(int act_id, int sub_tgt_id)
876{
877 request_unit_goto(ORDER_PERFORM_ACTION, act_id, sub_tgt_id);
878}
879
880/**************************************************************************
881 Store all goto and act menu items so they can be updated etc
882**************************************************************************/
884
885/**********************************************************************/
889{
890 foreach (go_act_menu *m, instances) {
891 m->reset();
892 }
893}
894
895/**********************************************************************/
899{
900 foreach (go_act_menu *m, instances) {
901 m->update();
902 }
903}
904
905/**********************************************************************/
909{
911 struct tile *ptile = nullptr;
912 struct unit *zunit;
913 struct unit *qunit;
914
915 int i = 0;
916 qunit = punit;
917 foreach (fui, units_list.unit_list) {
918 zunit = unit_list_find(client_player()->units, fui->id);
919 i++;
920 if (i >= pos) {
921 punit = qunit;
922 return ptile;
923 }
924 if (zunit == nullptr) {
925 continue;
926 }
927
928 if (punit == zunit) { // Unit found
929 /* Unit was ordered to attack city so it might stay in
930 front of that city */
932 ptile = tile_before_end_path(punit, fui->ptile);
933 if (ptile == nullptr) {
934 ptile = fui->ptile;
935 }
936 } else {
937 ptile = fui->ptile;
938 }
939 // Unit found in transport
940 } else if (unit_contained_in(punit, zunit)) {
941 ptile = fui->ptile;
942 }
943 }
944 return nullptr;
945}
946
947/**********************************************************************/
950mr_menu::mr_menu() : QMenuBar()
951{
952}
953
954/**********************************************************************/
960{
961 QAction *act;
962 QMenu *sub_menu;
963 QMenu *main_menu;
965 int i;
966
967 delayed_order = false;
968 airlift_type_id = 0;
969 quick_airlifting = false;
970
971 // Game Menu
972 main_menu = this->addMenu(_("Game"));
973
974#ifdef __APPLE__
975 // On Mac, Qt would try to move menu entry named just "Options" to
976 // application menu, but as this is submenu and not an action
977 // 1) It would fail to appear in the destination
978 // 2) It's impossible to override the behavior with QAction::menuRule()
979 // We add an invisible character for the string comparison to fail.
980 sub_menu = main_menu->addMenu(QString("\u200B") + _("Options"));
981#else // __APPLE__
982 sub_menu = main_menu->addMenu(_("Options"));
983#endif // __APPLE__
984
985 act = sub_menu->addAction(_("Set local options"));
986 connect(act, &QAction::triggered, this, &mr_menu::local_options);
987 act = sub_menu->addAction(_("Server Options"));
988 connect(act, &QAction::triggered, this, &mr_menu::server_options);
989 act = sub_menu->addAction(_("Messages"));
990 connect(act, &QAction::triggered, this, &mr_menu::messages_options);
991 act = sub_menu->addAction(_("Shortcuts"));
992 connect(act, &QAction::triggered, this, &mr_menu::shortcut_options);
993 act = sub_menu->addAction(_("Load another tileset"));
994 connect(act, &QAction::triggered, this, &mr_menu::tileset_custom_load);
995 act = sub_menu->addAction(_("Save Options Now"));
996 act->setIcon(style()->standardIcon(QStyle::SP_DialogSaveButton));
997 connect(act, &QAction::triggered, this, &mr_menu::save_options_now);
998 act = sub_menu->addAction(_("Save Options on Exit"));
999 act->setCheckable(true);
1000 act->setChecked(gui_options.save_options_on_exit);
1001 main_menu->addSeparator();
1002 act = main_menu->addAction(_("Save Game"));
1003 act->setShortcut(QKeySequence(tr("Ctrl+s")));
1004 act->setIcon(style()->standardIcon(QStyle::SP_DialogSaveButton));
1005 menu_list.insert(SAVE, act);
1006 connect(act, &QAction::triggered, this, &mr_menu::save_game);
1007 act = main_menu->addAction(_("Save Game As..."));
1008 menu_list.insert(SAVE, act);
1009 act->setIcon(style()->standardIcon(QStyle::SP_DialogSaveButton));
1010 connect(act, &QAction::triggered, this, &mr_menu::save_game_as);
1011 act = main_menu->addAction(_("Save Map to Image"));
1012 connect(act, &QAction::triggered, this, &mr_menu::save_image);
1013 main_menu->addSeparator();
1014 act = main_menu->addAction(_("Volume Up"));
1015 act->setShortcut(QKeySequence(tr(">")));
1016 connect(act, &QAction::triggered, this, &mr_menu::volume_up);
1017 act = main_menu->addAction(_("Volume Down"));
1018 act->setShortcut(QKeySequence(tr("<")));
1019 connect(act, &QAction::triggered, this, &mr_menu::volume_down);
1020 main_menu->addSeparator();
1021 act = main_menu->addAction(_("Leave game"));
1022 act->setIcon(style()->standardIcon(QStyle::SP_DialogDiscardButton));
1023 connect(act, &QAction::triggered, this, &mr_menu::back_to_menu);
1024 act = main_menu->addAction(_("Quit"));
1025 act->setIcon(style()->standardIcon(QStyle::SP_TitleBarCloseButton));
1026 connect(act, &QAction::triggered, this, &mr_menu::quit_game);
1027
1028 // View Menu
1029 main_menu = this->addMenu(Q_("?verb:View"));
1030 act = main_menu->addAction(_("Center View"));
1031 act->setShortcut(QKeySequence(shortcut_to_string(
1032 fc_shortcuts::sc()->get_shortcut(SC_CENTER_VIEW))));
1033 connect(act, &QAction::triggered, this, &mr_menu::slot_center_view);
1034 main_menu->addSeparator();
1035 act = main_menu->addAction(_("Fullscreen"));
1036 act->setShortcut(QKeySequence(shortcut_to_string(
1037 fc_shortcuts::sc()->get_shortcut(SC_FULLSCREEN))));
1038 act->setCheckable(true);
1039 act->setChecked(gui_options.gui_qt_fullscreen);
1040 connect(act, &QAction::triggered, this, &mr_menu::slot_fullscreen);
1041 main_menu->addSeparator();
1042 minimap_status = main_menu->addAction(_("Minimap"));
1043 minimap_status->setCheckable(true);
1045 fc_shortcuts::sc()->get_shortcut(SC_MINIMAP))));
1046 minimap_status->setChecked(true);
1047 connect(minimap_status, &QAction::triggered, this,
1049 osd_status = main_menu->addAction(_("Show new turn information"));
1050 osd_status->setCheckable(true);
1051 osd_status->setChecked(gui()->qt_settings.show_new_turn_text);
1052 connect(osd_status, &QAction::triggered, this,
1054 btlog_status = main_menu->addAction(_("Show combat detailed information"));
1055 btlog_status->setCheckable(true);
1056 btlog_status->setChecked(gui()->qt_settings.show_battle_log);
1057 connect(btlog_status, &QAction::triggered, this, &mr_menu::slot_battlelog);
1058 lock_status = main_menu->addAction(_("Lock interface"));
1059 lock_status->setCheckable(true);
1061 fc_shortcuts::sc()->get_shortcut(SC_IFACE_LOCK))));
1062 lock_status->setChecked(false);
1063 connect(lock_status, &QAction::triggered, this, &mr_menu::slot_lock);
1064 connect(minimap_status, &QAction::triggered, this, &mr_menu::slot_lock);
1065 main_menu->addSeparator();
1066 act = main_menu->addAction(_("Zoom in"));
1067 act->setShortcut(QKeySequence(shortcut_to_string(
1068 fc_shortcuts::sc()->get_shortcut(SC_ZOOM_IN))));
1069 connect(act, &QAction::triggered, this, &mr_menu::zoom_in);
1070 act = main_menu->addAction(_("Zoom default"));
1071 act->setShortcut(QKeySequence(shortcut_to_string(
1072 fc_shortcuts::sc()->get_shortcut(SC_ZOOM_RESET))));
1073 connect(act, &QAction::triggered, this, &mr_menu::zoom_reset);
1074 act = main_menu->addAction(_("Zoom out"));
1075 act->setShortcut(QKeySequence(shortcut_to_string(
1076 fc_shortcuts::sc()->get_shortcut(SC_ZOOM_OUT))));
1077 connect(act, &QAction::triggered, this, &mr_menu::zoom_out);
1078 scale_fonts_status = main_menu->addAction(_("Scale fonts"));
1079 connect(scale_fonts_status, &QAction::triggered, this,
1081 scale_fonts_status->setCheckable(true);
1082 scale_fonts_status->setChecked(true);
1083 main_menu->addSeparator();
1084 act = main_menu->addAction(_("City Outlines"));
1085 act->setShortcut(QKeySequence(tr("ctrl+y")));
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("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 Worker"));
1319 act->setShortcut(QKeySequence(shortcut_to_string(
1320 fc_shortcuts::sc()->get_shortcut(SC_AUTOMATE))));
1321 menu_list.insert(AUTOWORKER, act);
1322 connect(act, &QAction::triggered, this, &mr_menu::slot_auto_worker);
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+ctrl+r")));
1415 connect(act, &QAction::triggered, this, &mr_menu::slot_rally);
1416 act = multiplayer_menu->addAction(_("Quick Airlift"));
1417 act->setShortcut(QKeySequence(tr("shift+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 Unit"));
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 act->setShortcut(QKeySequence(tr("ctrl+t")));
1537 menu_list.insert(NOT_4_OBS, act);
1538 connect(act, &QAction::triggered, this, &mr_menu::slot_popup_tax_rates);
1539 main_menu->addSeparator();
1540
1541 act = main_menu->addAction(_("Policies..."));
1542 menu_list.insert(MULTIPLIERS, act);
1543 connect(act, &QAction::triggered, this, &mr_menu::slot_popup_mult_rates);
1544 main_menu->addSeparator();
1545
1546 main_menu->addMenu(new class gov_menu(this));
1547 main_menu->addSeparator();
1548
1549 act = main_menu->addAction(Q_("?noun:View"));
1550 act->setShortcut(QKeySequence(tr("F1")));
1551 connect(act, &QAction::triggered, this, &mr_menu::slot_show_map);
1552
1553 act = main_menu->addAction(_("Units"));
1554 act->setShortcut(QKeySequence(tr("F2")));
1555 connect(act, &QAction::triggered, this, &mr_menu::slot_show_units_report);
1556
1557 act = main_menu->addAction(_("Nations"));
1558 act->setShortcut(QKeySequence(tr("F3")));
1559 connect(act, &QAction::triggered, this, &mr_menu::slot_show_nations);
1560
1561 act = main_menu->addAction(_("Cities"));
1562 act->setShortcut(QKeySequence(tr("F4")));
1563 connect(act, &QAction::triggered, this, &mr_menu::slot_show_cities);
1564
1565 act = main_menu->addAction(_("Economy"));
1566 act->setShortcut(QKeySequence(tr("F5")));
1567 connect(act, &QAction::triggered, this, &mr_menu::slot_show_eco_report);
1568
1569 act = main_menu->addAction(_("Research"));
1570 act->setShortcut(QKeySequence(tr("F6")));
1571 connect(act, &QAction::triggered, this, &mr_menu::slot_show_research_tab);
1572
1573 act = main_menu->addAction(_("Wonders of the World"));
1574 act->setShortcut(QKeySequence(tr("F7")));
1575 connect(act, &QAction::triggered, this, &mr_menu::slot_traveler);
1576
1577 act = main_menu->addAction(_("Top Cities"));
1578 act->setShortcut(QKeySequence(tr("F8")));
1579 menu_list.insert(TOP_CITIES, act);
1580 connect(act, &QAction::triggered, this, &mr_menu::slot_top_cities);
1581
1582 act = main_menu->addAction(_("Demographics"));
1583 act->setShortcut(QKeySequence(tr("F11")));
1584 connect(act, &QAction::triggered, this, &mr_menu::slot_demographics);
1585
1586 act = main_menu->addAction(_("Spaceship"));
1587 act->setShortcut(QKeySequence(tr("F12")));
1588 connect(act, &QAction::triggered, this, &mr_menu::slot_spaceship);
1589
1590 act = main_menu->addAction(_("Achievements"));
1591 connect(act, &QAction::triggered, this, &mr_menu::slot_achievements);
1592
1593 act = main_menu->addAction(_("Endgame report"));
1594 menu_list.insert(ENDGAME, act);
1595 connect(act, &QAction::triggered, this, &mr_menu::slot_endgame);
1596
1597 // Battle Groups Menu
1598 main_menu = this->addMenu(_("Battle Groups"));
1599
1600 act = main_menu->addAction(_("Select Battle Group 1"));
1601 act->setShortcut(QKeySequence(tr("Shift+F1")));
1602 connect(act, &QAction::triggered, this, &mr_menu::slot_bg1select);
1603
1604 act = main_menu->addAction(_("Assign Battle Group 1"));
1605 act->setShortcut(QKeySequence(tr("Ctrl+F1")));
1606 connect(act, &QAction::triggered, this, &mr_menu::slot_bg1assign);
1607
1608 act = main_menu->addAction(_("Append to Battle Group 1"));
1609 act->setShortcut(QKeySequence(tr("Ctrl+Shift+F1")));
1610 connect(act, &QAction::triggered, this, &mr_menu::slot_bg1append);
1611
1612 act = main_menu->addAction(_("Select Battle Group 2"));
1613 act->setShortcut(QKeySequence(tr("Shift+F2")));
1614 connect(act, &QAction::triggered, this, &mr_menu::slot_bg2select);
1615
1616 act = main_menu->addAction(_("Assign Battle Group 2"));
1617 act->setShortcut(QKeySequence(tr("Ctrl+F2")));
1618 connect(act, &QAction::triggered, this, &mr_menu::slot_bg2assign);
1619
1620 act = main_menu->addAction(_("Append to Battle Group 2"));
1621 act->setShortcut(QKeySequence(tr("Ctrl+Shift+F2")));
1622 connect(act, &QAction::triggered, this, &mr_menu::slot_bg2append);
1623
1624 act = main_menu->addAction(_("Select Battle Group 3"));
1625 act->setShortcut(QKeySequence(tr("Shift+F3")));
1626 connect(act, &QAction::triggered, this, &mr_menu::slot_bg3select);
1627
1628 act = main_menu->addAction(_("Assign Battle Group 3"));
1629 act->setShortcut(QKeySequence(tr("Ctrl+F3")));
1630 connect(act, &QAction::triggered, this, &mr_menu::slot_bg3assign);
1631
1632 act = main_menu->addAction(_("Append to Battle Group 3"));
1633 act->setShortcut(QKeySequence(tr("Ctrl+Shift+F3")));
1634 connect(act, &QAction::triggered, this, &mr_menu::slot_bg3append);
1635
1636 act = main_menu->addAction(_("Select Battle Group 4"));
1637 act->setShortcut(QKeySequence(tr("Shift+F4")));
1638 connect(act, &QAction::triggered, this, &mr_menu::slot_bg4select);
1639
1640 act = main_menu->addAction(_("Assign Battle Group 4"));
1641 act->setShortcut(QKeySequence(tr("Ctrl+F4")));
1642 connect(act, &QAction::triggered, this, &mr_menu::slot_bg4assign);
1643
1644 act = main_menu->addAction(_("Append to Battle Group 4"));
1645 act->setShortcut(QKeySequence(tr("Ctrl+Shift+F4")));
1646 connect(act, &QAction::triggered, this, &mr_menu::slot_bg4append);
1647
1648 // Help Menu
1649 main_menu = this->addMenu(_("Help"));
1650
1651 act = main_menu->addAction(Q_(HELP_OVERVIEW_ITEM));
1652 QObject::connect(act, &QAction::triggered, [this]() {
1654 });
1655
1656 act = main_menu->addAction(Q_(HELP_PLAYING_ITEM));
1657 QObject::connect(act, &QAction::triggered, [this]() {
1659 });
1660
1661 act = main_menu->addAction(Q_(HELP_TERRAIN_ITEM));
1662 QObject::connect(act, &QAction::triggered, [this]() {
1664 });
1665
1666 act = main_menu->addAction(Q_(HELP_ECONOMY_ITEM));
1667 QObject::connect(act, &QAction::triggered, [this]() {
1669 });
1670
1671 act = main_menu->addAction(Q_(HELP_CITIES_ITEM));
1672 QObject::connect(act, &QAction::triggered, [this]() {
1674 });
1675
1676 act = main_menu->addAction(Q_(HELP_IMPROVEMENTS_ITEM));
1677 QObject::connect(act, &QAction::triggered, [this]() {
1679 });
1680
1681 act = main_menu->addAction(Q_(HELP_WONDERS_ITEM));
1682 QObject::connect(act, &QAction::triggered, [this]() {
1684 });
1685
1686 act = main_menu->addAction(Q_(HELP_UNITS_ITEM));
1687 QObject::connect(act, &QAction::triggered, [this]() {
1689 });
1690
1691 act = main_menu->addAction(Q_(HELP_COMBAT_ITEM));
1692 QObject::connect(act, &QAction::triggered, [this]() {
1694 });
1695
1696 act = main_menu->addAction(Q_(HELP_ZOC_ITEM));
1697 QObject::connect(act, &QAction::triggered, [this]() {
1699 });
1700
1701 act = main_menu->addAction(Q_(HELP_GOVERNMENT_ITEM));
1702 QObject::connect(act, &QAction::triggered, [this]() {
1704 });
1705
1706 act = main_menu->addAction(Q_(HELP_MULTIPLIER_ITEM));
1707 QObject::connect(act, &QAction::triggered, [this]() {
1709 });
1710
1711 act = main_menu->addAction(Q_(HELP_DIPLOMACY_ITEM));
1712 QObject::connect(act, &QAction::triggered, [this]() {
1714 });
1715
1716 act = main_menu->addAction(Q_(HELP_TECHS_ITEM));
1717 QObject::connect(act, &QAction::triggered, [this]() {
1719 });
1720
1721 act = main_menu->addAction(Q_(HELP_SPACE_RACE_ITEM));
1722 QObject::connect(act, &QAction::triggered, [this]() {
1724 });
1725
1726 act = main_menu->addAction(Q_(HELP_RULESET_ITEM));
1727#ifdef __APPLE__
1728 // only needed on Mac, prevents qt from moving the menu item
1729 act->setMenuRole(QAction::NoRole);
1730#endif // __APPLE__
1731 QObject::connect(act, &QAction::triggered, [this]() {
1733 });
1734
1735 act = main_menu->addAction(Q_(HELP_TILESET_ITEM));
1736#ifdef __APPLE__
1737 // only needed on Mac, prevents qt from moving the menu item
1738 act->setMenuRole(QAction::NoRole);
1739#endif // __APPLE__
1740 QObject::connect(act, &QAction::triggered, [this]() {
1742 });
1743
1744 act = main_menu->addAction(Q_(HELP_MUSICSET_ITEM));
1745#ifdef __APPLE__
1746 // only needed on Mac, prevents qt from moving the menu item
1747 act->setMenuRole(QAction::NoRole);
1748#endif // __APPLE__
1749 QObject::connect(act, &QAction::triggered, [this]() {
1751 });
1752
1753 act = main_menu->addAction(Q_(HELP_NATIONS_ITEM));
1754#ifdef __APPLE__
1755 // only needed on Mac, prevents qt from moving the menu item
1756 act->setMenuRole(QAction::NoRole);
1757#endif // __APPLE__
1758 QObject::connect(act, &QAction::triggered, [this]() {
1760 });
1761
1762 main_menu->addSeparator();
1763
1764 act = main_menu->addAction(Q_(HELP_CONNECTING_ITEM));
1765 QObject::connect(act, &QAction::triggered, [this]() {
1767 });
1768
1769 act = main_menu->addAction(Q_(HELP_CONTROLS_ITEM));
1770 QObject::connect(act, &QAction::triggered, [this]() {
1772 });
1773
1774 act = main_menu->addAction(Q_(HELP_CMA_ITEM));
1775 QObject::connect(act, &QAction::triggered, [this]() {
1777 });
1778
1779 act = main_menu->addAction(Q_(HELP_CHATLINE_ITEM));
1780 QObject::connect(act, &QAction::triggered, [this]() {
1782 });
1783
1784 act = main_menu->addAction(Q_(HELP_WORKLIST_EDITOR_ITEM));
1785 QObject::connect(act, &QAction::triggered, [this]() {
1787 });
1788
1789 main_menu->addSeparator();
1790
1791 act = main_menu->addAction(Q_(HELP_LANGUAGES_ITEM));
1792 QObject::connect(act, &QAction::triggered, [this]() {
1794 });
1795
1796 act = main_menu->addAction(Q_(HELP_COPYING_ITEM));
1797 QObject::connect(act, &QAction::triggered, [this]() {
1799 });
1800
1801 act = main_menu->addAction(Q_(HELP_ABOUT_ITEM));
1802#ifdef __APPLE__
1803 // only needed on Mac, prevents qt from moving the menu item
1804 act->setMenuRole(QAction::NoRole);
1805#endif // __APPLE__
1806 QObject::connect(act, &QAction::triggered, [this]() {
1808 });
1809
1810 menus = this->findChildren<QMenu*>();
1811 for (i = 0; i < menus.count(); i++) {
1812 menus[i]->setAttribute(Qt::WA_TranslucentBackground);
1813 }
1814
1815 this->setVisible(false);
1816}
1817
1818/**********************************************************************/
1822{
1823 for (int i = 0; i < units_list.nr_units; i++) {
1824 units_list.unit_list.at(units_list.unit_list.count() - i -1)->ptile = ptile;
1825 }
1826}
1827
1828/**********************************************************************/
1834{
1835 foreach (QAction *a, m->actions()) {
1836 if (a->shortcut() == seq && a->isEnabled()) {
1837 a->activate(QAction::Trigger);
1838 return TRUE;
1839 }
1840 }
1841
1842 return FALSE;
1843}
1844
1845/**********************************************************************/
1849{
1853
1854 if (sid == SC_GOTO) {
1855 gui()->mapview_wdg->menu_click = true;
1857 return;
1858 }
1859 fcs = fc_shortcuts::sc()->get_shortcut(static_cast<shortcut_id>(sid));
1861
1863 foreach (const QMenu *m, menus) {
1865 return;
1866 }
1867 }
1868}
1869
1870/**********************************************************************/
1877{
1878 foreach (QAction *a, m->actions()) {
1879 if (a->shortcut() == seq && fcs->mouse == Qt::AllButtons) {
1880 *ret = a->text();
1881
1882 return TRUE;
1883 }
1884 }
1885
1886 return FALSE;
1887}
1888
1889/**********************************************************************/
1893{
1896
1899 foreach (const QMenu *m, menus) {
1900 QString ret;
1901
1902 if (shortcut_exist_inner(m, seq, fcs, &ret)) {
1903 return ret;
1904 }
1905 }
1906
1907 return QString();
1908}
1909
1910/**********************************************************************/
1916 QString *ret)
1917{
1918 foreach (QAction *a, m->actions()) {
1919 if (a->shortcut() == seq) {
1920 *ret = a->text() + " ("
1921 + a->shortcut().toString(QKeySequence::NativeText) + ")";
1922
1923 return TRUE;
1924 }
1925 }
1926
1927 return FALSE;
1928}
1929
1930/**********************************************************************/
1934{
1938
1939 fcs = fc_shortcuts::sc()->get_shortcut(static_cast<shortcut_id>(sid));
1941
1943 foreach (const QMenu *m, menus) {
1944 QString ret;
1945
1947 return ret;
1948 }
1949 }
1950
1951 return QString();
1952}
1953
1954/**********************************************************************/
1958{
1960 QAction *act;
1961 struct player *pplayer;
1962
1963 airlift_menu->clear();
1964 if (client_is_observer()) {
1965 return;
1966 }
1967
1968 pplayer = client_player();
1969 unit_type_iterate(utype) {
1970 utype_id = utype_index(utype);
1971
1972 if (!can_player_build_unit_now(pplayer, utype)
1973 || !utype_can_do_action(utype, ACTION_AIRLIFT)) {
1974 continue;
1975 }
1976 if (!can_player_build_unit_now(pplayer, utype)
1978 continue;
1979 }
1980 // Defeat keyboard shortcut mnemonics
1981 act = airlift_menu->addAction(QString(utype_name_translation(utype))
1982 .replace("&", "&&"));
1983 act->setCheckable(true);
1984 act->setData(utype_id);
1985 if (airlift_type_id == utype_id) {
1986 act->setChecked(true);
1987 }
1988 connect(act, &QAction::triggered, this, &mr_menu::slot_quickairlift_set);
1989 airlift_type->addAction(act);
1991}
1992
1993/****************************************************************************
1994 Updates "build path" menu
1995****************************************************************************/
1997{
1998 QAction *act;
1999 struct unit_list *punits = nullptr;
2000 bool enabled = false;
2001
2002 foreach(act, roads_menu->actions()) {
2003 removeAction(act);
2004 act->deleteLater();
2005 }
2006 roads_menu->clear();
2007 roads_menu->setDisabled(true);
2008 if (client_is_observer()) {
2009 return;
2010 }
2011
2014 if (pextra->buildable) {
2015 int road_id;
2016
2017 // Defeat keyboard shortcut mnemonics
2018 act = roads_menu->addAction(QString(extra_name_translation(pextra))
2019 .replace("&", "&&"));
2020 road_id = pextra->id;
2021 act->setData(road_id);
2022 QObject::connect(act, &QAction::triggered, [this,road_id]() {
2024 });
2026 ACTIVITY_GEN_ROAD, pextra)) {
2027 act->setEnabled(true);
2028 enabled = true;
2029 } else {
2030 act->setDisabled(true);
2031 }
2032 }
2034
2035 if (enabled) {
2036 roads_menu->setEnabled(true);
2037 }
2038}
2039
2040/****************************************************************************
2041 Updates "build bases" menu
2042****************************************************************************/
2044{
2045 QAction *act;
2046 struct unit_list *punits = nullptr;
2047 bool enabled = false;
2048
2049 foreach(act, bases_menu->actions()) {
2050 removeAction(act);
2051 act->deleteLater();
2052 }
2053 bases_menu->clear();
2054 bases_menu->setDisabled(true);
2055
2056 if (client_is_observer()) {
2057 return;
2058 }
2059
2062 if (pextra->buildable) {
2063 int base_id;
2064
2065 // Defeat keyboard shortcut mnemonics
2066 act = bases_menu->addAction(QString(extra_name_translation(pextra))
2067 .replace("&", "&&"));
2068 base_id = pextra->id;
2069 act->setData(base_id);
2070 QObject::connect(act, &QAction::triggered, [this,base_id]() {
2072 });
2074 act->setEnabled(true);
2075 enabled = true;
2076 } else {
2077 act->setDisabled(true);
2078 }
2079 }
2081
2082 if (enabled) {
2083 bases_menu->setEnabled(true);
2084 }
2085}
2086
2087/**********************************************************************/
2091{
2092 QList <QAction * >values;
2094 QMultiHash <munit, QAction *>::iterator i;
2095 struct unit_list *punits = nullptr;
2096 struct road_type *proad;
2097 struct extra_type *tgt;
2098 bool any_cities = false;
2099 bool city_on_tile = false;
2100 bool units_all_same_tile = true;
2101 const struct tile *ptile = nullptr;
2102 const struct unit_type *ptype = nullptr;
2103
2104 players_iterate(pplayer) {
2105 if (city_list_size(pplayer->cities)) {
2106 any_cities = true;
2107 break;
2108 }
2110
2111 // Disable first all sensitive menus
2112 foreach(QAction *a, menu_list) {
2113 a->setEnabled(false);
2114 }
2115
2116 if (client_is_observer()) {
2117 multiplayer_menu->setDisabled(true);
2118 } else {
2119 multiplayer_menu->setDisabled(false);
2120 }
2121
2122 // Non unit menus
2123 keys = menu_list.keys();
2124 foreach (munit key, keys) {
2125 i = menu_list.find(key);
2126 while (i != menu_list.end() && i.key() == key) {
2127 switch (key) {
2128 case SAVE:
2130 i.value()->setEnabled(true);
2131 }
2132 break;
2133 case NOT_4_OBS:
2134 if (!client_is_observer()) {
2135 i.value()->setEnabled(true);
2136 }
2137 break;
2138 case MULTIPLIERS:
2139 if (!client_is_observer() && multiplier_count() > 0) {
2140 i.value()->setEnabled(true);
2141 i.value()->setVisible(true);
2142 } else {
2143 i.value()->setVisible(false);
2144 }
2145 break;
2146 case ENDGAME:
2147 if (gui()->is_repo_dlg_open("END")) {
2148 i.value()->setEnabled(true);
2149 i.value()->setVisible(true);
2150 } else {
2151 i.value()->setVisible(false);
2152 }
2153 break;
2154 case TOP_CITIES:
2155 i.value()->setEnabled(game.info.top_cities_count > 0);
2156 if (game.info.top_cities_count > 0) {
2157 i.value()->setText(QString(PL_("Top %1 City", "Top %1 Cities",
2159 .arg(game.info.top_cities_count));
2160 } else {
2161 i.value()->setText(QString(_("Top Cities")));
2162 }
2163 break;
2164 default:
2165 break;
2166 }
2167 i++;
2168 }
2169 }
2170
2172 return;
2173 }
2174
2177 if (tile_city(unit_tile(punit))) {
2178 city_on_tile = true;
2179 break;
2180 }
2182
2184 const struct unit_type *ntype;
2185
2186 fc_assert((ptile == nullptr) == (ptype == nullptr));
2187
2189
2190 // 'ntype == ptype' is correct check even when ptype is still nullptr
2191 if (ptile != nullptr && ntype == ptype && unit_tile(punit) != ptile) {
2192 units_all_same_tile = false;
2193 }
2194
2195 if (ptype == nullptr || ntype == ptype) {
2196 ptile = unit_tile(punit);
2197 ptype = ntype;
2198 }
2200
2201 keys = menu_list.keys();
2202 foreach(munit key, keys) {
2203 i = menu_list.find(key);
2204 while (i != menu_list.end() && i.key() == key) {
2205 switch (key) {
2206 case STANDARD:
2207 i.value()->setEnabled(true);
2208 break;
2209
2210 case EXPLORE:
2212 i.value()->setEnabled(true);
2213 }
2214 break;
2215
2216 case BOARD:
2217 if (units_can_load(punits)) {
2218 i.value()->setEnabled(true);
2219 }
2220 break;
2221
2222 case DEBOARD:
2223 if (units_can_unload(&(wld.map), punits)) {
2224 i.value()->setEnabled(true);
2225 }
2226 break;
2227
2228 case TRANSPORTER:
2230 i.value()->setEnabled(true);
2231 }
2232 break;
2233
2234 case CONVERT:
2235 if (units_can_convert(&(wld.map), punits)) {
2236 i.value()->setEnabled(true);
2237 }
2238 break;
2239
2240 case MINE:
2242 i.value()->setEnabled(true);
2243 }
2244
2245 if (units_all_same_tile) {
2247 struct extra_type *pextra = nullptr;
2248
2249 /* FIXME: this overloading doesn't work well with multiple focus
2250 * units. */
2254 if (pextra != nullptr) {
2255 break;
2256 }
2258
2259 if (pextra != nullptr) {
2260 i.value()->setText(
2261 // TRANS: Build mine of specific type
2262 QString(_("Build %1"))
2263 .arg(extra_name_translation(pextra))
2264 .replace("&", "&&"));
2265 } else {
2266 i.value()->setText(QString(_("Build Mine")));
2267 }
2268 } else {
2269 i.value()->setText(QString(_("Build Mine")));
2270 }
2271 }
2272 break;
2273
2274 case IRRIGATION:
2276 i.value()->setEnabled(true);
2277 }
2278 if (units_all_same_tile) {
2280 struct extra_type *pextra = nullptr;
2281
2282 /* FIXME: this overloading doesn't work well with multiple focus
2283 * units. */
2287 if (pextra != nullptr) {
2288 break;
2289 }
2291
2292 if (pextra != nullptr) {
2293 i.value()->setText(
2294 // TRANS: Build irrigation of specific type
2295 QString(_("Build %1"))
2296 .arg(extra_name_translation(pextra))
2297 .replace("&", "&&"));
2298 } else {
2299 i.value()->setText(QString(_("Build Irrigation")));
2300 }
2301 } else {
2302 i.value()->setText(QString(_("Build Irrigation")));
2303 }
2304 }
2305 break;
2306
2307 case CULTIVATE:
2309 i.value()->setEnabled(true);
2310 }
2311 if (units_all_same_tile) {
2312 struct unit *punit = unit_list_get(punits, 0);
2313 struct tile *atile = unit_tile(punit);
2314 struct terrain *pterrain = tile_terrain(atile);
2315
2316 if (pterrain->cultivate_result != T_NONE) {
2317 i.value()->setText(
2318 // TRANS: Transform terrain to specific type
2319 QString(_("Cultivate to %1"))
2321 .replace("&", "&&"));
2322 } else {
2323 i.value()->setText(QString(_("Cultivate")));
2324 }
2325 } else {
2326 i.value()->setText(QString(_("Cultivate")));
2327 }
2328 break;
2329
2330 case PLANT:
2332 i.value()->setEnabled(true);
2333 }
2334 if (units_all_same_tile) {
2335 struct unit *punit = unit_list_get(punits, 0);
2336 struct tile *atile = unit_tile(punit);
2337 struct terrain *pterrain = tile_terrain(atile);
2338
2339 if (pterrain->plant_result != T_NONE) {
2340 i.value()->setText(
2341 // TRANS: Transform terrain to specific type
2342 QString(_("Plant to %1"))
2344 .replace("&", "&&"));
2345 } else {
2346 i.value()->setText(QString(_("Plant")));
2347 }
2348 } else {
2349 i.value()->setText(QString(_("Plant")));
2350 }
2351 break;
2352
2353 case TRANSFORM:
2355 i.value()->setEnabled(true);
2356 } else {
2357 break;
2358 }
2359 if (units_all_same_tile) {
2360 struct unit *punit = unit_list_get(punits, 0);
2361 struct tile *atile = unit_tile(punit);
2362 struct terrain *pterrain = tile_terrain(atile);
2363
2364 if (pterrain->transform_result != T_NONE
2365 && pterrain->transform_result != pterrain) {
2366 i.value()->setText(
2367 // TRANS: Transform terrain to specific type
2368 QString(_("Transform to %1"))
2370 .replace("&", "&&"));
2371 } else {
2372 i.value()->setText(_("Transform Terrain"));
2373 }
2374 }
2375 break;
2376
2377 case BUILD:
2380 i.value()->setEnabled(true);
2381 }
2382 if (city_on_tile
2384 i.value()->setText(
2386 .replace("&", "&&"));
2387 } else {
2388 i.value()->setText(
2390 .replace("&", "&&"));
2391 }
2392 break;
2393
2394 case ROAD:
2395 {
2396 struct extra_type *pextra = nullptr;
2397
2399 i.value()->setEnabled(true);
2400 }
2404 if (pextra != nullptr) {
2405 break;
2406 }
2408
2409 if (pextra != nullptr) {
2410 i.value()->setText(
2411 // TRANS: Build road of specific type
2412 QString(_("Build %1"))
2413 .arg(extra_name_translation(pextra))
2414 .replace("&", "&&"));
2415 }
2416 }
2417 break;
2418
2419 case FORTIFY:
2421 i.value()->setEnabled(true);
2422 }
2423 break;
2424
2425 case FORTRESS:
2427 i.value()->setEnabled(true);
2428 }
2429 break;
2430
2431 case AIRBASE:
2433 i.value()->setEnabled(true);
2434 }
2435 break;
2436
2437 case CLEAN:
2439 i.value()->setEnabled(true);
2440 }
2441 break;
2442
2443 case SENTRY:
2445 i.value()->setEnabled(true);
2446 }
2447 break;
2448
2449 case PARADROP:
2451 i.value()->setEnabled(true);
2453 .replace("&", "&&"));
2454 }
2455 break;
2456
2457 case PILLAGE:
2459 i.value()->setEnabled(true);
2460 }
2461 break;
2462
2463 case HOMECITY:
2465 i.value()->setEnabled(true);
2466 }
2467 break;
2468
2469 case WAKEUP:
2471 i.value()->setEnabled(true);
2472 }
2473 break;
2474
2475 case AUTOWORKER:
2477 i.value()->setEnabled(true);
2478 }
2480 i.value()->setText(_("Auto Settler"));
2481 } else {
2482 i.value()->setText(_("Auto Worker"));
2483 }
2484 break;
2485 case CONNECT_ROAD:
2487 if (proad != nullptr) {
2488 tgt = road_extra_get(proad);
2489 } else {
2490 break;
2491 }
2493 i.value()->setEnabled(true);
2494 }
2495 break;
2496
2497 case DISBAND:
2499 i.value()->setEnabled(true);
2500 }
2501 break;
2502
2503 case CONNECT_RAIL:
2505 if (proad != nullptr) {
2506 tgt = road_extra_get(proad);
2507 } else {
2508 break;
2509 }
2511 i.value()->setEnabled(true);
2512 }
2513 break;
2514
2515 case CONNECT_MAGLEV:
2517 if (proad != nullptr) {
2518 tgt = road_extra_get(proad);
2519 } else {
2520 break;
2521 }
2523 i.value()->setEnabled(true);
2524 }
2525 break;
2526
2527 case CONNECT_IRRIGATION:
2528 {
2530
2531 if (extra_type_list_size(extras) > 0) {
2532 struct extra_type *pextra;
2533
2536 i.value()->setEnabled(true);
2537 }
2538 }
2539 }
2540 break;
2541
2542 case GOTO_CITY:
2543 if (any_cities) {
2544 i.value()->setEnabled(true);
2545 }
2546 break;
2547
2548 case AIRLIFT:
2549 if (any_cities) {
2550 i.value()->setEnabled(true);
2551 }
2552 break;
2553
2554 case BUILD_WONDER:
2555 i.value()->setText(
2557 .replace("&", "&&"));
2559 i.value()->setEnabled(true);
2560 }
2561 break;
2562
2563 case AUTOTRADEROUTE:
2565 i.value()->setEnabled(true);
2566 }
2567 break;
2568
2569 case ORDER_TRADE_ROUTE:
2570 i.value()->setText(
2572 .replace("&", "&&"));
2574 i.value()->setEnabled(true);
2575 }
2576 break;
2577
2578 case ORDER_DIPLOMAT_DLG:
2580 i.value()->setEnabled(true);
2581 }
2582 break;
2583
2584 case UPGRADE:
2585 if (units_can_upgrade(&(wld.map), punits)) {
2586 i.value()->setEnabled(true);
2587 }
2588 break;
2589 default:
2590 break;
2591 }
2592
2593 i++;
2594 }
2595 }
2596}
2597
2598/**********************************************************************/
2605
2606/**********************************************************************/
2610{
2611 struct player *pplayer = client_player();
2612
2613 if (pplayer != nullptr) {
2614 popup_spaceship_dialog(pplayer);
2615 }
2616}
2617
2618/**********************************************************************/
2625
2626/**********************************************************************/
2630{
2631 ::gui()->game_tab_widget->setCurrentIndex(0);
2632}
2633
2634/**********************************************************************/
2641
2642/**********************************************************************/
2646{
2647 popup_players_dialog(false);
2648}
2649
2650/**********************************************************************/
2657
2658/**********************************************************************/
2662{
2664 /* FIXME: this can provide different actions for different units...
2665 * not good! */
2666 /* Enable the button for adding to a city in all cases, so we
2667 get an eventual error message from the server if we try. */
2672 }
2674}
2675
2676/**********************************************************************/
2680{
2682 struct extra_type *pextra;
2683
2686
2687 if (pextra != nullptr) {
2689 }
2691}
2692
2693/**********************************************************************/
2708
2709/**********************************************************************/
2713{
2715
2716 if (prail != nullptr) {
2717 struct extra_type *tgt;
2718
2719 tgt = road_extra_get(prail);
2721 }
2722}
2723
2724/**********************************************************************/
2728{
2730
2731 if (pmaglev != nullptr) {
2732 struct extra_type *tgt;
2733
2734 tgt = road_extra_get(pmaglev);
2736 }
2737}
2738
2739/**********************************************************************/
2746
2747/**********************************************************************/
2754
2755/**********************************************************************/
2759{
2761
2762 if (proad != nullptr) {
2763 struct extra_type *tgt;
2764
2765 tgt = road_extra_get(proad);
2767 }
2768}
2769
2770/**********************************************************************/
2777
2778/**********************************************************************/
2789
2790/**********************************************************************/
2794{
2796}
2797
2798/**********************************************************************/
2805
2806/**********************************************************************/
2813
2814/**********************************************************************/
2818{
2820 /* FIXME: this can provide different actions for different units...
2821 * not good! */
2823 EC_ROAD,
2825 punit);
2826 bool building_road = false;
2827
2828 if (tgt != nullptr
2831 building_road = true;
2832 }
2833
2836 }
2838}
2839
2840/**********************************************************************/
2847
2848/**********************************************************************/
2855
2856/**********************************************************************/
2860{
2861 key_unit_mine();
2862}
2863
2864/**********************************************************************/
2868{
2870}
2871
2872/**********************************************************************/
2879
2880/**********************************************************************/
2887
2888/**********************************************************************/
2892{
2894}
2895
2896/**********************************************************************/
2903
2904/**********************************************************************/
2908{
2909 delayed_order = false;
2910 units_list.clear();
2911}
2912
2913/**********************************************************************/
2917{
2918 gui()->rallies.hover_tile = false;
2919 gui()->rallies.hover_city = true;
2920}
2921
2922/**********************************************************************/
2926{
2927 gui()->trade_gen.hover_city = true;
2928}
2929
2930/**********************************************************************/
2934{
2935 gui()->trade_gen.add_all_cities();
2936}
2937
2938/**********************************************************************/
2942{
2943 gui()->trade_gen.calculate();
2944}
2945
2946/**********************************************************************/
2950{
2951 gui()->trade_gen.clear_trade_planing();
2952}
2953
2954/**********************************************************************/
2958{
2959 qtiles gilles;
2960 struct unit *punit;
2961 struct city *homecity;
2962 struct tile *home_tile;
2963 struct tile *dest_tile;
2964 bool sent = false;
2965
2967 homecity = game_city_by_number(punit->homecity);
2968 home_tile = homecity->tile;
2969 foreach(gilles, gui()->trade_gen.lines) {
2970 if ((gilles.t1 == home_tile || gilles.t2 == home_tile)
2971 && gilles.autocaravan == nullptr) {
2972 // Send caravan
2973 if (gilles.t1 == home_tile) {
2974 dest_tile = gilles.t2;
2975 } else {
2976 dest_tile = gilles.t1;
2977 }
2978 if (send_goto_tile(punit, dest_tile)) {
2979 int i;
2980 i = gui()->trade_gen.lines.indexOf(gilles);
2981 gilles = gui()->trade_gen.lines.takeAt(i);
2982 gilles.autocaravan = punit;
2983 gui()->trade_gen.lines.append(gilles);
2984 sent = true;
2985 break;
2986 }
2987 }
2988 }
2989
2990 if (!sent) {
2991 gui()->infotab->chtwdg->append(_("Didn't find any trade route"
2992 " to establish"));
2993 }
2994}
2995
2996/**********************************************************************/
3000{
3001 QVariant v;
3002 QAction *act;
3003
3005 v = act->data();
3006 airlift_type_id = v.toInt();
3007}
3008
3009/**********************************************************************/
3013{
3014 QAction *act;
3015
3017 qdef_act::action()->vs_unit_set(act->data().toInt());
3018}
3019
3020/**********************************************************************/
3024{
3025 QAction *act;
3026
3028 qdef_act::action()->vs_city_set(act->data().toInt());
3029}
3030
3031/**********************************************************************/
3035{
3036 quick_airlifting = true;
3037}
3038
3039/**********************************************************************/
3043{
3045 int i = 0;
3047
3048 delayed_order = true;
3049 dg = D_GOTO;
3050
3051 struct unit_list *punits = get_units_in_focus();
3052 if (unit_list_size(punits) == 0) {
3053 return;
3054 }
3055 if (hover_state != HOVER_GOTO) {
3060 control_mouse_cursor(nullptr);
3061 }
3063 i++;
3068}
3069
3070/**********************************************************************/
3074{
3076 struct unit *punit;
3077 struct tile *last_tile;
3078 struct tile *new_tile;
3079 int i = 0;
3080
3081 foreach (fui, units_list.unit_list) {
3082 i++;
3083 punit = unit_list_find(client_player()->units, fui->id);
3084 if (punit == nullptr) {
3085 continue;
3086 }
3087 last_tile = punit->tile;
3089 if (new_tile != nullptr) {
3090 punit->tile = new_tile;
3091 }
3092 if (is_tiles_adjacent(punit->tile, fui->ptile)) {
3095 punit->tile,
3096 fui->ptile));
3097 } else {
3098 send_attack_tile(punit, fui->ptile);
3099 }
3100 punit->tile = last_tile;
3101 }
3102 units_list.clear();
3103}
3104
3105/**********************************************************************/
3114
3115/**********************************************************************/
3119{
3121}
3122
3123/**********************************************************************/
3132
3133/**********************************************************************/
3137{
3139}
3140
3141/**********************************************************************/
3148
3149/**********************************************************************/
3158
3159/**********************************************************************/
3166
3167/**********************************************************************/
3174
3175/**********************************************************************/
3182
3183/**********************************************************************/
3187{
3188 key_unit_goto();
3189}
3190
3191/**********************************************************************/
3198
3199/**********************************************************************/
3206
3207/**********************************************************************/
3211{
3212 if (gui()->interface_locked) {
3213 enable_interface(false);
3214 } else {
3215 enable_interface(true);
3216 }
3217 gui()->interface_locked = !gui()->interface_locked;
3218}
3219
3220/**********************************************************************/
3224{
3228 int i;
3229
3230 lc = gui()->findChildren<close_widget *>();
3231 lm = gui()->findChildren<move_widget *>();
3232 lr = gui()->findChildren<resize_widget *>();
3233
3234 for (i = 0; i < lc.size(); ++i) {
3235 lc.at(i)->setVisible(!enable);
3236 }
3237 for (i = 0; i < lm.size(); ++i) {
3238 lm.at(i)->setVisible(!enable);
3239 }
3240 for (i = 0; i < lr.size(); ++i) {
3241 lr.at(i)->setVisible(!enable);
3242 }
3243}
3244
3245/**********************************************************************/
3249{
3251
3252 gui()->apply_fullscreen();
3253}
3254
3255/**********************************************************************/
3259{
3260 if (minimap_status->isChecked()) {
3261 ::gui()->minimapview_wdg->show();
3262 } else {
3263 ::gui()->minimapview_wdg->hide();
3264 }
3265}
3266
3267/**********************************************************************/
3271{
3272 if (osd_status->isChecked()) {
3273 gui()->qt_settings.show_new_turn_text = true;
3274 } else {
3275 gui()->qt_settings.show_new_turn_text = false;
3276 }
3277}
3278
3279/**********************************************************************/
3283{
3284 if (btlog_status->isChecked()) {
3285 gui()->qt_settings.show_battle_log = true;
3286 } else {
3287 gui()->qt_settings.show_battle_log = false;
3288 }
3289}
3290
3291/**********************************************************************/
3298
3299/**********************************************************************/
3306
3307/**********************************************************************/
3314
3315/**********************************************************************/
3322
3323/**********************************************************************/
3327{
3328 gui()->map_scale = gui()->map_scale * 1.2f;
3329 tilespec_reread(tileset_basename(tileset), true, gui()->map_scale);
3330}
3331
3332/**********************************************************************/
3336{
3337 QFont *qf;
3338
3339 gui()->map_scale = 1.0f;
3341 qf->setPointSize(fc_font::instance()->city_fontsize);
3343 qf->setPointSize(fc_font::instance()->prod_fontsize);
3344 tilespec_reread(tileset_basename(tileset), true, gui()->map_scale);
3345}
3346
3347/**********************************************************************/
3351{
3352 QFont *qf;
3353
3354 if (scale_fonts_status->isChecked()) {
3355 gui()->map_font_scale = true;
3356 } else {
3358 qf->setPointSize(fc_font::instance()->city_fontsize);
3360 qf->setPointSize(fc_font::instance()->prod_fontsize);
3361 gui()->map_font_scale = false;
3362 }
3364}
3365
3366/**********************************************************************/
3370{
3371 gui()->map_scale = gui()->map_scale / 1.2f;
3372 tilespec_reread(tileset_basename(tileset), true, gui()->map_scale);
3373}
3374
3375/**********************************************************************/
3382
3383/**********************************************************************/
3390
3391/**********************************************************************/
3398
3399/**********************************************************************/
3406
3407/**********************************************************************/
3414
3415/**********************************************************************/
3422
3423/**********************************************************************/
3430
3431/**********************************************************************/
3438
3439/**********************************************************************/
3443{
3444 key_unit_done();
3445}
3446
3447/**********************************************************************/
3454
3455/**********************************************************************/
3462
3463/**********************************************************************/
3472
3473/**********************************************************************/
3482
3483/**********************************************************************/
3490
3491/**********************************************************************/
3495{
3496 key_unit_wait();
3497}
3498
3499/**********************************************************************/
3503{
3505
3506 uhs = new unit_hud_selector(gui()->central_wdg);
3507 uhs->show_me();
3508}
3509
3510/**********************************************************************/
3517
3518/**********************************************************************/
3525
3526/**********************************************************************/
3533
3534/**********************************************************************/
3541
3542/**********************************************************************/
3549
3550/**********************************************************************/
3557
3558/**********************************************************************/
3565
3566/**********************************************************************/
3573
3574/**********************************************************************/
3581
3582/**********************************************************************/
3589
3590/**********************************************************************/
3597
3598/**********************************************************************/
3605
3606/**********************************************************************/
3613
3614/**********************************************************************/
3621
3622/**********************************************************************/
3629
3630/**********************************************************************/
3637
3638/**********************************************************************/
3645
3646/**********************************************************************/
3650{
3651 QDialog *dialog = new QDialog(this);
3652 QLabel *label;
3653 QPushButton *but;
3655 const struct strvec *tlset_list;
3656 const struct option *poption;
3658 QString s;
3659
3660 sl << "default_tileset_overhead_name" << "default_tileset_iso_name"
3661 << "default_tileset_hex_name" << "default_tileset_isohex_name";
3662 layout = new QVBoxLayout;
3663 dialog->setWindowTitle(_("Available tilesets"));
3664 label = new QLabel;
3665 label->setText(_("Some tilesets might not be compatible with current"
3666 " map topology!"));
3667 layout->addWidget(label);
3668
3669 foreach (s, sl) {
3671
3672 on_bytes = s.toUtf8();
3675 strvec_iterate(tlset_list, value) {
3676 but = new QPushButton(value);
3677 connect(but, &QAbstractButton::clicked, this, &mr_menu::load_new_tileset);
3678 layout->addWidget(but);
3680 }
3681 dialog->setSizeGripEnabled(true);
3682 dialog->setLayout(layout);
3683 dialog->show();
3684}
3685
3686/**********************************************************************/
3690{
3691 QPushButton *but;
3693
3695 tn_bytes = but->text().toUtf8();
3696 tilespec_reread(tn_bytes.data(), true, 1.0f);
3697 gui()->map_scale = 1.0f;
3698 but->parentWidget()->close();
3699}
3700
3701/**********************************************************************/
3705{
3706 gui()->trade_gen.calculate();
3707}
3708
3709/**********************************************************************/
3716
3717/**********************************************************************/
3724
3725/**********************************************************************/
3728void mr_menu::slot_help(const QString &topic)
3729{
3730 popup_help_dialog_typed(Q_(topic.toStdString().c_str()), HELP_ANY);
3731}
3732
3733/****************************************************************
3734 Actions "BUILD_PATH_*"
3735*****************************************************************/
3748
3749/****************************************************************
3750 Actions "BUILD_BASE_*"
3751*****************************************************************/
3753{
3756 if (pextra->buildable && pextra->id == id
3758 pextra)) {
3760 }
3763}
3764
3765
3766
3767/**********************************************************************/
3771{
3772 gui()->popup_client_options();
3773}
3774
3775/**********************************************************************/
3782
3783/**********************************************************************/
3787{
3788 gui()->pr_options->popup_server_options();
3789}
3790
3791/**********************************************************************/
3798
3799/**********************************************************************/
3803{
3804 options_save(nullptr);
3805}
3806
3807/**********************************************************************/
3811{
3813}
3814
3815/**********************************************************************/
3819{
3822 QString path, storage_path;
3823 hud_message_box *saved = new hud_message_box(gui()->central_wdg);
3824 bool map_saved;
3826
3829 current_width = gui()->mapview_wdg->width();
3830 current_height = gui()->mapview_wdg->height();
3831 if (tileset_hex_width(tileset) > 0) {
3832 full_size_y = full_size_y * 11 / 20;
3833 } else if (tileset_is_isometric(tileset)) {
3835 }
3837 img_name = QString("Freeciv-Turn%1").arg(game.info.turn);
3838 if (client_has_player()) {
3839 img_name = img_name + "-"
3841 }
3843 path = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
3844 if (!storage_path.isEmpty() && QDir(storage_path).isReadable()) {
3846 } else if (!path.isEmpty()) {
3847 img_name = path + DIR_SEPARATOR + img_name;
3848 } else {
3849 img_name = QStandardPaths::writableLocation(QStandardPaths::HomeLocation)
3851 }
3852 map_saved = mapview.store->map_pixmap.save(img_name, "png");
3854 saved->setStandardButtons(QMessageBox::Ok);
3855 saved->setDefaultButton(QMessageBox::Cancel);
3856 saved->setAttribute(Qt::WA_DeleteOnClose);
3857 if (map_saved) {
3858 saved->set_text_title("Image saved as:\n" + img_name, _("Success"));
3859 } else {
3860 saved->set_text_title(_("Failed to save image of the map"), _("Error"));
3861 }
3862 saved->show();
3863}
3864
3865/**********************************************************************/
3869{
3870 send_save_game(nullptr);
3871}
3872
3873/**********************************************************************/
3877{
3878 QString str;
3879 QString current_file;
3880 QString location;
3881
3883 location = dirname;
3884 // choose last location
3886
3887 str = QString(_("Save Games"))
3888 + QString(" (*.sav *.sav.bz2 *.sav.gz *.sav.xz)");
3889 current_file = QFileDialog::getSaveFileName(gui()->central_wdg,
3890 _("Save Game As..."),
3891 location, str);
3892 if (!current_file.isEmpty()) {
3894
3895 cf_bytes = current_file.toUtf8();
3896 send_save_game(cf_bytes.data());
3897 }
3898}
3899
3900/**********************************************************************/
3904{
3906
3907 if (is_server_running()) {
3908 ask = new hud_message_box(gui()->central_wdg);
3909 ask->set_text_title(_("Leaving a local game will end it!"), "Leave game");
3910 ask->setStandardButtons(QMessageBox::Cancel | QMessageBox::Ok);
3911 ask->setDefaultButton(QMessageBox::Cancel);
3912 ask->setAttribute(Qt::WA_DeleteOnClose);
3913
3914 connect(ask, &hud_message_box::accepted, [=]() {
3915 if (client.conn.used) {
3916 gui()->infotab->msgwdg->clr();
3917 disconnect_from_server(TRUE);
3918 }
3919 });
3920 ask->show();
3921 } else {
3923 }
3924}
3925
3926/**********************************************************************/
3937
3938/**********************************************************************/
3949
3950/**********************************************************************/
3954{
3955 hud_message_box* ask = new hud_message_box(gui()->central_wdg);
3956
3957 ask->setIcon(QMessageBox::Warning);
3958 ask->setStandardButtons(QMessageBox::Cancel | QMessageBox::Ok);
3959 ask->setDefaultButton(QMessageBox::Cancel);
3960 ask->setAttribute(Qt::WA_DeleteOnClose);
3961 return (ask->set_text_title(_("Selection will cancel current assignments!"),
3962 _("Confirm Disruptive Selection"), true)
3963 == QMessageBox::Ok);
3964}
3965
3966/**********************************************************************/
3970{
3971 struct tile *ptile;
3972
3974 if (get_city_bonus(pcity, EFT_AIRLIFT) > 0) {
3975 ptile = city_tile(pcity);
3976 unit_list_iterate(ptile->units, punit) {
3977 if (punit->utype == utype_by_number(ut)) {
3979 break;
3980 }
3982 }
3984}
const char * action_id_name_translation(action_id act_id)
Definition actions.c:1250
const char * action_name_translation(const struct action *paction)
Definition actions.c:1230
enum action_sub_target_kind action_get_sub_target_kind(const struct action *paction)
Definition actions.c:1119
bool actions_are_ready(void)
Definition actions.c:941
#define action_noninternal_iterate_end
Definition actions.h:240
static struct action * action_by_number(action_id act_id)
Definition actions.h:400
#define action_id_get_actor_kind(act_id)
Definition actions.h:413
#define ACTION_ANY
Definition actions.h:56
#define action_noninternal_iterate(_act_)
Definition actions.h:235
#define action_id_get_target_kind(act_id)
Definition actions.h:417
#define action_id_has_complex_target(act_id)
Definition actions.h:435
#define ACTION_NONE
Definition actions.h:59
bool actres_removes_extra(enum action_result result, const struct extra_type *pextra)
Definition actres.c:810
bool actres_creates_extra(enum action_result result, const struct extra_type *pextra)
Definition actres.c:789
#define str
Definition astring.c:76
#define n
Definition astring.c:77
void output_window_append(const struct ft_color color, const char *featured_text)
struct city * create_city_virtual(struct player *pplayer, struct tile *ptile, const char *name)
Definition city.c:3455
void destroy_city_virtual(struct city *pcity)
Definition city.c:3541
static bool is_non_allied_city_tile(const struct tile *ptile, const struct player *pplayer)
Definition city.h:767
#define city_list_iterate(citylist, pcity)
Definition city.h:505
#define city_tile(_pcity_)
Definition city.h:561
#define city_list_iterate_end
Definition city.h:507
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:898
virtual ~go_act_menu()
Definition menu.cpp:710
void start_go_act(int act_id, int sub_tgt_id)
Definition menu.cpp:875
void reset()
Definition menu.cpp:719
static QSet< go_act_menu * > instances
Definition menu.h:237
void update()
Definition menu.cpp:835
go_act_menu(QWidget *parent=nullptr)
Definition menu.cpp:700
static void reset_all()
Definition menu.cpp:888
void create()
Definition menu.cpp:731
QMap< QAction *, int > items
Definition menu.h:239
static QSet< gov_menu * > instances
Definition menu.h:212
virtual ~gov_menu()
Definition menu.cpp:580
static void create_all()
Definition menu.cpp:680
void revolution()
Definition menu.cpp:659
QVector< QAction * > actions
Definition menu.h:214
static void update_all()
Definition menu.cpp:690
void change_gov(int target_gov)
Definition menu.cpp:667
gov_menu(QWidget *parent=0)
Definition menu.cpp:569
void create()
Definition menu.cpp:589
void update()
Definition menu.cpp:631
bool shortcut_2_menustring_inner(const QMenu *m, QKeySequence seq, QString *ret)
Definition menu.cpp:1915
void slot_unit_sentry()
Definition menu.cpp:2883
QActionGroup * action_vs_city
Definition menu.h:267
void slot_bg3select()
Definition menu.cpp:3601
void slot_auto_worker()
Definition menu.cpp:2809
void slot_traveler()
Definition menu.cpp:3545
bool execute_shortcut_inner(const QMenu *m, QKeySequence seq)
Definition menu.cpp:1833
void slot_delayed_goto()
Definition menu.cpp:3042
void zoom_in()
Definition menu.cpp:3326
void slot_autocaravan()
Definition menu.cpp:2957
QMenu * multiplayer_menu
Definition menu.h:264
void slot_build_irrigation()
Definition menu.cpp:2843
void volume_up()
Definition menu.cpp:3929
void slot_execute_orders()
Definition menu.cpp:3073
void update_bases_menu()
Definition menu.cpp:2043
QString shortcut_exist(fc_shortcut *fcs)
Definition menu.cpp:1892
void tileset_custom_load()
Definition menu.cpp:3649
void update_roads_menu()
Definition menu.cpp:1996
void slot_calculate()
Definition menu.cpp:2941
void slot_conn_road()
Definition menu.cpp:2758
void slot_conn_irrigation()
Definition menu.cpp:2696
QMenu * bases_menu
Definition menu.h:263
QActionGroup * airlift_type
Definition menu.h:266
void slot_quickairlift_set()
Definition menu.cpp:2999
void slot_battlelog()
Definition menu.cpp:3282
QMultiHash< munit, QAction * > menu_list
Definition menu.h:271
void slot_trade_add_all()
Definition menu.cpp:2933
void update_airlift_menu()
Definition menu.cpp:1957
void slot_show_cities()
Definition menu.cpp:2653
void slot_transform()
Definition menu.cpp:2773
void slot_top_cities()
Definition menu.cpp:3537
void slot_action_vs_unit()
Definition menu.cpp:3012
void slot_achievements()
Definition menu.cpp:3521
void slot_show_research_tab()
Definition menu.cpp:2601
void shortcut_options()
Definition menu.cpp:3778
void slot_city_output()
Definition menu.cpp:3394
void slot_show_eco_report()
Definition menu.cpp:2621
QMenu * airlift_menu
Definition menu.h:262
QAction * osd_status
Definition menu.h:287
void slot_bg1select()
Definition menu.cpp:3553
void slot_unload_all()
Definition menu.cpp:3162
void slot_airlift()
Definition menu.cpp:3136
void slot_select_same_continent()
Definition menu.cpp:3466
void slot_city_production()
Definition menu.cpp:3402
void slot_set_home()
Definition menu.cpp:3144
QAction * lock_status
Definition menu.h:286
void slot_native_tiles()
Definition menu.cpp:3302
void slot_unit_explore()
Definition menu.cpp:3194
void slot_bg4assign()
Definition menu.cpp:3633
void slot_bg1append()
Definition menu.cpp:3569
void slot_upgrade()
Definition menu.cpp:3178
void execute_shortcut(int sid)
Definition menu.cpp:1848
void slot_popup_mult_rates()
Definition menu.cpp:3720
void slot_select_same_everywhere()
Definition menu.cpp:3476
void volume_down()
Definition menu.cpp:3941
void slot_map_grid()
Definition menu.cpp:3434
void slot_unit_filter()
Definition menu.cpp:3502
void slot_bg2select()
Definition menu.cpp:3577
void slot_done_moving()
Definition menu.cpp:3442
void calc_trade_routes()
Definition menu.cpp:3704
void slot_city_buycost()
Definition menu.cpp:3310
void slot_action()
Definition menu.cpp:2801
void slot_bg4append()
Definition menu.cpp:3641
QMenu * roads_menu
Definition menu.h:265
QAction * minimap_status
Definition menu.h:284
bool shortcut_exist_inner(const QMenu *m, QKeySequence seq, fc_shortcut *fcs, QString *ret)
Definition menu.cpp:1875
void slot_select_all_tile()
Definition menu.cpp:3450
void save_game()
Definition menu.cpp:3868
struct tile * find_last_unit_pos(struct unit *punit, int pos)
Definition menu.cpp:908
void save_image()
Definition menu.cpp:3818
void slot_pillage()
Definition menu.cpp:2793
void slot_clean()
Definition menu.cpp:2679
void zoom_reset()
Definition menu.cpp:3335
void slot_board()
Definition menu.cpp:3108
void slot_center_view()
Definition menu.cpp:3202
void slot_build_mine()
Definition menu.cpp:2859
void server_options()
Definition menu.cpp:3786
void load_new_tileset()
Definition menu.cpp:3689
void set_tile_for_order(struct tile *ptile)
Definition menu.cpp:1821
void slot_fullscreen()
Definition menu.cpp:3248
void slot_bg4select()
Definition menu.cpp:3625
void slot_show_nations()
Definition menu.cpp:2645
void slot_build_road()
Definition menu.cpp:2817
void slot_unsentry()
Definition menu.cpp:3170
void slot_show_new_turn_text()
Definition menu.cpp:3270
void local_options()
Definition menu.cpp:3770
bool delayed_order
Definition menu.h:291
void slot_borders()
Definition menu.cpp:3294
void slot_clear_trade()
Definition menu.cpp:2949
void zoom_scale_fonts()
Definition menu.cpp:3350
void slot_conn_rail()
Definition menu.cpp:2712
void slot_select_same_tile()
Definition menu.cpp:3486
void slot_convert()
Definition menu.cpp:2891
QMenu * action_unit_menu
Definition menu.h:269
QActionGroup * action_vs_unit
Definition menu.h:268
void slot_endgame()
Definition menu.cpp:3529
void slot_bg2assign()
Definition menu.cpp:3585
void slot_select_one()
Definition menu.cpp:3458
void menus_sensitive()
Definition menu.cpp:2090
void messages_options()
Definition menu.cpp:3794
void slot_unit_goto()
Definition menu.cpp:3186
void slot_cultivate()
Definition menu.cpp:2851
void slot_stack_size()
Definition menu.cpp:3418
void slot_conn_maglev()
Definition menu.cpp:2727
void slot_patrol()
Definition menu.cpp:3118
void slot_unit_fortress()
Definition menu.cpp:2742
void slot_wait()
Definition menu.cpp:3494
void slot_demographics()
Definition menu.cpp:3513
void slot_build_city()
Definition menu.cpp:2661
void slot_city_growth()
Definition menu.cpp:3318
void slot_city_trade_routes()
Definition menu.cpp:3410
void slot_rally()
Definition menu.cpp:2916
void slot_plant()
Definition menu.cpp:2867
void slot_paradrop()
Definition menu.cpp:2781
void slot_build_path(int id)
Definition menu.cpp:3736
void slot_bg1assign()
Definition menu.cpp:3561
void slot_return_to_city()
Definition menu.cpp:3126
Unit_type_id airlift_type_id
Definition menu.h:293
void slot_show_map()
Definition menu.cpp:2629
void slot_bg3assign()
Definition menu.cpp:3609
QAction * scale_fonts_status
Definition menu.h:285
void slot_minimap_view()
Definition menu.cpp:3258
void slot_trade_city()
Definition menu.cpp:2925
void quit_game()
Definition menu.cpp:3810
void slot_help(const QString &topic)
Definition menu.cpp:3728
void save_game_as()
Definition menu.cpp:3876
void slot_bg2append()
Definition menu.cpp:3593
bool quick_airlifting
Definition menu.h:292
void slot_spaceship()
Definition menu.cpp:2609
void slot_city_names()
Definition menu.cpp:3378
QMenu * action_city_menu
Definition menu.h:270
void save_options_now()
Definition menu.cpp:3802
QAction * btlog_status
Definition menu.h:288
void slot_unit_fortify()
Definition menu.cpp:2875
void slot_show_units_report()
Definition menu.cpp:2637
void slot_quickairlift()
Definition menu.cpp:3034
QString shortcut_2_menustring(int sid)
Definition menu.cpp:1933
void slot_lock()
Definition menu.cpp:3210
void back_to_menu()
Definition menu.cpp:3903
void slot_deboard()
Definition menu.cpp:3152
void slot_popup_tax_rates()
Definition menu.cpp:3712
void slot_build_base(int id)
Definition menu.cpp:3752
qfc_units_list units_list
Definition menu.h:272
void setup_menus()
Definition menu.cpp:959
mr_menu()
Definition menu.cpp:950
void slot_bg3append()
Definition menu.cpp:3617
void slot_action_vs_city()
Definition menu.cpp:3023
void zoom_out()
Definition menu.cpp:3369
void slot_disband()
Definition menu.cpp:2899
void slot_unit_airbase()
Definition menu.cpp:2750
void slot_fullbar()
Definition menu.cpp:3426
void slot_city_outlines()
Definition menu.cpp:3386
bool confirm_disruptive_selection()
Definition menu.cpp:3953
void slot_orders_clear()
Definition menu.cpp:2907
static qdef_act * action()
Definition dialogs.cpp:1040
void vs_city_set(int i)
Definition dialogs.cpp:1062
void vs_unit_set(int i)
Definition dialogs.cpp:1070
QList< qfc_delayed_unit_item * > unit_list
Definition menu.h:131
void add(qfc_delayed_unit_item *fui)
Definition menu.cpp:495
int nr_units
Definition menu.h:132
void clear()
Definition menu.cpp:503
bool done
Definition menu.h:143
unsigned trade_num
Definition menu.h:146
int poss_trade_num
Definition menu.h:145
QList< struct city * > pos_cities
Definition menu.h:149
QList< struct city * > new_tr_cities
Definition menu.h:148
int over_max
Definition menu.h:144
trade_city(struct city *pcity)
Definition menu.cpp:68
QList< struct city * > curr_tr_cities
Definition menu.h:147
struct city * city
Definition menu.h:150
void calculate_inner(trade_city *tc)
Definition menu.cpp:216
bool discard_one(trade_city *tc)
Definition menu.cpp:378
void add_city(struct city *pcity)
Definition menu.cpp:127
void find_certain_routes()
Definition menu.cpp:460
QList< trade_city * > cities
Definition menu.h:182
void find_certain_routes_inner(trade_city *tc)
Definition menu.cpp:425
trade_city * find_most_free()
Definition menu.cpp:327
void discard_trade(trade_city *tc1, trade_city *tc2)
Definition menu.cpp:364
void add_tile(struct tile *ptile)
Definition menu.cpp:139
void remove_virtual_city(struct tile *ptile)
Definition menu.cpp:190
bool hover_city
Definition menu.h:179
void add_all_cities()
Definition menu.cpp:87
void clear_trade_planing()
Definition menu.cpp:107
void discard()
Definition menu.cpp:345
void remove_city(struct city *pcity)
Definition menu.cpp:172
QList< qtiles > lines
Definition menu.h:180
bool discard_any(trade_city *tc, int freeroutes)
Definition menu.cpp:404
void check_if_done(trade_city *tc1, trade_city *tc2)
Definition menu.cpp:475
QList< struct city * > virtual_cities
Definition menu.h:181
int find_over_max(struct city *pcity)
Definition menu.cpp:311
void calculate()
Definition menu.cpp:234
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:1242
void disconnect_from_server(bool leaving_sound)
Definition clinet.c:306
char * incite_cost
Definition comments.c:76
@ REPORT_DEMOGRAPHIC
Definition conn_types.h:53
@ REPORT_WONDERS_OF_THE_WORLD_LONG
Definition conn_types.h:51
@ REPORT_ACHIEVEMENTS
Definition conn_types.h:54
@ REPORT_TOP_CITIES
Definition conn_types.h:52
void send_save_game(const char *filename)
bool is_server_running(void)
bool can_client_access_hack(void)
void key_unit_sentry(void)
Definition control.c:3756
void request_unit_airlift(struct unit *punit, struct city *pcity)
Definition control.c:1543
void key_city_output_toggle(void)
Definition control.c:3853
void request_unit_return(struct unit *punit)
Definition control.c:1552
void request_unit_caravan_action(struct unit *punit, action_id action)
Definition control.c:2223
void key_unit_auto_explore(void)
Definition control.c:3577
void key_unit_connect(enum unit_activity activity, struct extra_type *tgt)
Definition control.c:3375
void key_city_full_bar_toggle(void)
Definition control.c:3885
void key_map_native_toggle(void)
Definition control.c:3877
void request_unit_goto(enum unit_orders last_order, action_id act_id, int sub_tgt_id)
Definition control.c:1130
void key_unit_paradrop(void)
Definition control.c:3479
struct unit_list * get_units_in_focus(void)
Definition control.c:177
void request_center_focus_unit(void)
Definition control.c:2750
void key_city_productions_toggle(void)
Definition control.c:3919
void key_unit_plant(void)
Definition control.c:3696
void key_unit_fortress(void)
Definition control.c:3624
void key_unit_mine(void)
Definition control.c:3688
void key_unit_pillage(void)
Definition control.c:3708
void request_unit_unload(struct unit *pcargo)
Definition control.c:2194
void request_new_unit_activity_targeted(struct unit *punit, enum unit_activity act, struct extra_type *tgt)
Definition control.c:1938
void key_unit_irrigate(void)
Definition control.c:3668
void request_unit_build_city(struct unit *punit)
Definition control.c:1817
void key_unit_unload_all(void)
Definition control.c:3517
void key_city_outlines_toggle(void)
Definition control.c:3845
void key_unit_homecity(void)
Definition control.c:3641
void set_hover_state(struct unit_list *punits, enum cursor_hover_state state, enum unit_activity activity, struct extra_type *tgt, int last_tgt, int last_sub_tgt, action_id action, enum unit_orders order)
Definition control.c:290
void key_unit_patrol(void)
Definition control.c:3487
void key_unit_wakeup_others(void)
Definition control.c:3550
enum cursor_hover_state hover_state
Definition control.c:89
void key_unit_stack_size_toggle(void)
Definition control.c:3936
void key_unit_wait(void)
Definition control.c:3542
void key_unit_select_battlegroup(int battlegroup, bool append)
Definition control.c:3819
void key_map_grid_toggle(void)
Definition control.c:3861
struct unit * head_of_units_in_focus(void)
Definition control.c:410
void key_city_growth_toggle(void)
Definition control.c:3902
void key_unit_action_select_tgt(void)
Definition control.c:3406
void key_city_buycost_toggle(void)
Definition control.c:3911
int get_num_units_in_focus(void)
Definition control.c:185
void key_unit_transform(void)
Definition control.c:3768
void request_move_unit_direction(struct unit *punit, int dir)
Definition control.c:1879
void key_unit_done(void)
Definition control.c:3463
void key_city_trade_routes_toggle(void)
Definition control.c:3928
void key_city_names_toggle(void)
Definition control.c:3893
void request_unit_select(struct unit_list *punits, enum unit_select_type_mode seltype, enum unit_select_location_mode selloc)
Definition control.c:1621
void key_unit_auto_work(void)
Definition control.c:3590
void key_unit_airbase(void)
Definition control.c:3560
void key_unit_goto(void)
Definition control.c:3471
void control_mouse_cursor(struct tile *ptile)
Definition control.c:1215
void key_unit_convert(void)
Definition control.c:3602
void key_unit_fortify(void)
Definition control.c:3612
void key_unit_assign_battlegroup(int battlegroup, bool append)
Definition control.c:3780
void key_unit_cultivate(void)
Definition control.c:3676
void key_map_borders_toggle(void)
Definition control.c:3869
#define can_unit_do_activity_targeted_client(_punit_, _act_, _tgt_)
Definition control.h:43
#define can_units_do_activity_targeted_client(_punits_, _act_, _tgt_)
Definition control.h:47
@ HOVER_GOTO
Definition control.h:27
#define can_units_do_activity_client(_punits_, _act_)
Definition control.h:45
bool qtg_request_transport(struct unit *pcargo, struct tile *ptile)
Definition dialogs.cpp:4947
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
struct unit struct city struct unit struct tile struct extra_type const struct act_prob *act_probs int actor_unit_id struct unit struct unit int const struct action *paction struct unit struct city * pcity
Definition dialogs_g.h:78
int get_city_bonus(const struct city *pcity, enum effect_type effect_type)
Definition effects.c:842
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:779
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:804
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:214
int Unit_type_id
Definition fc_types.h:242
#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:61
struct world wld
Definition game.c:62
struct city * game_city_by_number(int id)
Definition game.c:106
struct tile * tile_before_end_path(struct unit *punit, struct tile *ptile)
Definition goto.c:2036
bool send_attack_tile(struct unit *punit, struct tile *ptile)
Definition goto.c:1639
bool send_goto_tile(struct unit *punit, struct tile *ptile)
Definition goto.c:1569
void enter_goto_state(struct unit_list *punits)
Definition goto.c:1011
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:2349
void popup_help_dialog_typed(const char *item, enum help_page_type htype)
Definition helpdlg.c:196
void create_line_at_mouse_pos(void)
Definition mapctrl.c:355
void update_city_descriptions(void)
Definition mapview.c:488
static const char * get_tile_change_menu_text(struct tile *ptile, enum unit_activity activity)
Definition menu.c:2370
#define CREATE_SUB_ITEM(_sub_target_, _sub_target_key_, _sub_target_name_)
void popup_messageopt_dialog(void)
Definition messagedlg.c:51
void popup_players_dialog(bool raise)
Definition plrdlg.c:91
void economy_report_dialog_popup(bool raise)
Definition repodlgs.c:1243
void popup_spaceship_dialog(struct player *pplayer)
delay_order
Definition menu.h:82
@ D_GOTO
Definition menu.h:83
munit
Definition menu.h:39
@ AIRLIFT
Definition menu.h:69
@ CONNECT_RAIL
Definition menu.h:65
@ TRANSFORM
Definition menu.h:51
@ FORTIFY
Definition menu.h:56
@ GOTO_CITY
Definition menu.h:68
@ TRANSPORTER
Definition menu.h:44
@ BUILD
Definition menu.h:54
@ IRRIGATION
Definition menu.h:49
@ CONNECT_IRRIGATION
Definition menu.h:67
@ CONNECT_ROAD
Definition menu.h:64
@ HOMECITY
Definition menu.h:61
@ CONVERT
Definition menu.h:46
@ PILLAGE
Definition menu.h:53
@ TOP_CITIES
Definition menu.h:79
@ BUILD_WONDER
Definition menu.h:70
@ DISBAND
Definition menu.h:45
@ DEBOARD
Definition menu.h:43
@ CLEAN
Definition menu.h:59
@ NOT_4_OBS
Definition menu.h:75
@ UPGRADE
Definition menu.h:74
@ SAVE
Definition menu.h:78
@ MULTIPLIERS
Definition menu.h:76
@ PLANT
Definition menu.h:48
@ ORDER_TRADE_ROUTE
Definition menu.h:72
@ WAKEUP
Definition menu.h:62
@ MINE
Definition menu.h:47
@ SENTRY
Definition menu.h:60
@ ORDER_DIPLOMAT_DLG
Definition menu.h:73
@ EXPLORE
Definition menu.h:41
@ STANDARD
Definition menu.h:40
@ AUTOWORKER
Definition menu.h:63
@ ROAD
Definition menu.h:55
@ CONNECT_MAGLEV
Definition menu.h:66
@ CULTIVATE
Definition menu.h:50
@ PARADROP
Definition menu.h:52
@ BOARD
Definition menu.h:42
@ FORTRESS
Definition menu.h:57
@ ENDGAME
Definition menu.h:77
@ AUTOTRADEROUTE
Definition menu.h:71
@ AIRBASE
Definition menu.h:58
#define enable(id)
Definition widget.h:223
void popup_revolution_dialog(void)
Definition dialogs.c:112
#define HELP_MUSICSET_ITEM
#define HELP_CITIES_ITEM
#define HELP_TERRAIN_ITEM
#define HELP_LANGUAGES_ITEM
#define HELP_CONNECTING_ITEM
#define HELP_TILESET_ITEM
#define HELP_CHATLINE_ITEM
#define HELP_RULESET_ITEM
#define HELP_GOVERNMENT_ITEM
#define HELP_ABOUT_ITEM
#define HELP_MULTIPLIER_ITEM
#define HELP_PLAYING_ITEM
#define HELP_IMPROVEMENTS_ITEM
#define HELP_UNITS_ITEM
#define HELP_ZOC_ITEM
#define HELP_WORKLIST_EDITOR_ITEM
#define HELP_WONDERS_ITEM
#define HELP_COMBAT_ITEM
#define HELP_SPACE_RACE_ITEM
#define HELP_COPYING_ITEM
#define HELP_OVERVIEW_ITEM
#define HELP_NATIONS_ITEM
#define HELP_TECHS_ITEM
#define HELP_DIPLOMACY_ITEM
#define HELP_ECONOMY_ITEM
@ HELP_ANY
Definition helpdlg_g.h:20
#define HELP_CMA_ITEM
#define HELP_CONTROLS_ITEM
bool has_player_unit_type(Unit_type_id utype)
Definition hudwidget.cpp:60
Impr_type_id improvement_number(const struct impr_type *pimprove)
const char * improvement_name_translation(const struct impr_type *pimprove)
#define improvement_iterate_end
#define improvement_iterate(_p)
#define fc_assert(condition)
Definition log.h:177
int get_direction_for_step(const struct civ_map *nmap, const struct tile *start_tile, const struct tile *end_tile)
Definition map.c:1488
bool is_tiles_adjacent(const struct tile *tile0, const struct tile *tile1)
Definition map.c:1067
struct terrain_misc terrain_control
Definition map.c:68
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:3223
void multiairlift(struct city *acity, Unit_type_id ut)
Definition menu.cpp:3969
void real_menus_init(void)
Definition menu.cpp:512
static const char * get_tile_change_menu_text(struct tile *ptile, enum unit_activity activity)
Definition menu.cpp:553
void real_menus_update(void)
Definition menu.cpp:530
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:759
const struct option_set * client_optset
Definition options.c:1291
void options_save(option_save_log_callback log_cb)
Definition options.c:6177
struct client_options gui_options
Definition options.c:71
struct option * optset_option_by_name(const struct option_set *poptset, const char *name)
Definition options.c:442
struct city_list * cities
Definition packhand.c:119
void popup_shortcuts_dialog()
void toggle_units_report(bool)
#define players_iterate_end
Definition player.h:542
#define players_iterate(_pplayer)
Definition player.h:537
void qtg_science_report_dialog_popup(bool raise)
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:934
void array_shuffle(int *array, int n)
Definition shared.c:2011
char * freeciv_storage_dir(void)
Definition shared.c:671
#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:317
char * name
Definition city.h:318
struct tile * tile
Definition city.h:319
struct civ_game::@32::@35 client
struct packet_game_info info
Definition game.h:89
bool ruleset_ready
Definition game.h:119
struct government * government_during_revolution
Definition game.h:94
struct connection conn
Definition client_main.h:96
bool gui_qt_fullscreen
Definition options.h:413
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
Definition climisc.h:82
struct city_list * cities
Definition player.h:281
Definition menu.h:160
QPixmap * pm
Definition sprite.h:25
struct terrain * cultivate_result
Definition terrain.h:108
struct terrain * plant_result
Definition terrain.h:111
struct terrain * transform_result
Definition terrain.h:122
Definition tile.h:50
struct unit_list * units
Definition tile.h:58
Definition unit.h:140
int id
Definition unit.h:147
struct tile * tile
Definition unit.h:142
int homecity
Definition unit.h:148
const struct unit_type * utype
Definition unit.h:141
struct canvas * store
struct civ_map map
int fc_snprintf(char *str, size_t n, const char *format,...)
Definition support.c:960
#define TRUE
Definition support.h:46
#define FALSE
Definition support.h:47
const char * advance_name_translation(const struct advance *padvance)
Definition tech.c:300
Tech_type_id advance_number(const struct advance *padvance)
Definition tech.c:98
#define advance_iterate(_p)
Definition tech.h:271
#define advance_iterate_end
Definition tech.h:272
#define T_NONE
Definition terrain.h:61
void tile_virtual_destroy(struct tile *vtile)
Definition tile.c:1035
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:115
struct sprite * get_government_sprite(const struct tileset *t, const struct government *gov)
Definition tilespec.c:7030
int tileset_hex_width(const struct tileset *t)
Definition tilespec.c:747
const struct strvec * get_tileset_list(const struct option *poption)
Definition tilespec.c:1150
bool tileset_is_isometric(const struct tileset *t)
Definition tilespec.c:738
const char * tileset_basename(const struct tileset *t)
Definition tilespec.c:730
int tileset_tile_height(const struct tileset *t)
Definition tilespec.c:791
int tileset_tile_width(const struct tileset *t)
Definition tilespec.c:779
bool tilespec_reread(const char *new_tileset_name, bool game_fully_initialized, float scale)
Definition tilespec.c:1401
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, int priority)
bool have_cities_trade_route(const struct city *pc1, const struct city *pc2)
#define GOODS_HIGH_PRIORITY
bool unit_can_est_trade_route_here(const struct unit *punit)
Definition unit.c:302
bool unit_can_add_or_build_city(const struct civ_map *nmap, const struct unit *punit)
Definition unit.c:490
bool can_unit_change_homecity(const struct civ_map *nmap, const struct unit *punit)
Definition unit.c:523
bool unit_contained_in(const struct unit *pcargo, const struct unit *ptrans)
Definition unit.c:2623
bool can_unit_do_autoworker(const struct unit *punit)
Definition unit.c:648
bool can_unit_paradrop(const struct civ_map *nmap, const struct unit *punit)
Definition unit.c:864
bool unit_can_help_build_wonder_here(const struct civ_map *nmap, const struct unit *punit)
Definition unit.c:276
#define unit_tile(_pu)
Definition unit.h:407
@ ORDER_LAST
Definition unit.h:50
@ ORDER_PERFORM_ACTION
Definition unit.h:48
#define unit_owner(_pu)
Definition unit.h:406
bool units_can_convert(const struct civ_map *nmap, const struct unit_list *punits)
Definition unitlist.c:352
bool units_are_occupied(const struct unit_list *punits)
Definition unitlist.c:275
bool units_can_unload(const struct civ_map *nmap, const struct unit_list *punits)
Definition unitlist.c:303
bool can_units_do_base_gui(const struct unit_list *punits, enum base_gui_type base_gui)
Definition unitlist.c:182
bool units_contain_cityfounder(const struct unit_list *punits)
Definition unitlist.c:219
bool can_units_do_any_road(const struct civ_map *nmap, const struct unit_list *punits)
Definition unitlist.c:163
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:337
bool units_have_activity_on_tile(const struct unit_list *punits, enum unit_activity activity)
Definition unitlist.c:321
bool units_have_type_flag(const struct unit_list *punits, enum unit_type_flag_id flag, bool has_flag)
Definition unitlist.c:204
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:241
bool units_can_load(const struct unit_list *punits)
Definition unitlist.c:289
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:2082
const char * utype_name_translation(const struct unit_type *punittype)
Definition unittype.c:1564
bool utype_can_do_action(const struct unit_type *putype, const action_id act_id)
Definition unittype.c:375
#define unit_type_iterate(_p)
Definition unittype.h:860
#define unit_type_iterate_end
Definition unittype.h:867
#define MAP_NATIVE_WIDTH
#define MAP_NATIVE_HEIGHT