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 "audio.h"
41#include "connectdlg_common.h"
42#include "control.h"
43#include "helpdata.h"
44
45// gui-qt
46#include "fc_client.h"
47#include "chatline.h"
48#include "cityrep.h"
49#include "dialogs.h"
50#include "gotodlg.h"
51#include "gui_main.h"
52#include "hudwidget.h"
53#include "mapctrl.h"
54#include "messagedlg.h"
55#include "plrdlg.h"
56#include "ratesdlg.h"
57#include "repodlgs.h"
58#include "shortcuts.h"
59#include "spaceshipdlg.h"
60#include "sprite.h"
61
62#include "menu.h"
63
64static void enable_interface(bool enable);
65
66/**********************************************************************/
70{
71 city = pcity;
72 tile = nullptr;
73 trade_num = 0;
75}
76
77/**********************************************************************/
84
85/**********************************************************************/
89{
90 int i, s;
91 struct city *pcity;
92 struct player *pplayer = client_player();
93
95 s = city_list_size(pplayer->cities);
96 if (s == 0) {
97 return;
98 }
99 for (i = 0; i < s; i++) {
100 pcity = city_list_get(pplayer->cities, i);
102 }
103}
104
105/**********************************************************************/
109{
110 struct city *pcity;
111 trade_city *tc;
112
113 foreach(pcity, virtual_cities) {
115 }
116 virtual_cities.clear();
117 foreach(tc, cities) {
118 delete tc;
119 }
120 cities.clear();
121 lines.clear();
122 gui()->mapview_wdg->repaint();
123}
124
125/**********************************************************************/
129{
130 trade_city *tc = new trade_city(pcity);
131
132 cities.append(tc);
133 gui()->infotab->chtwdg->append(QString(_("Adding city %1 to trade planning"))
134 .arg(tc->city->name));
135}
136
137/**********************************************************************/
141{
142 struct city *pcity;
143 trade_city *tc;
144
145 pcity = tile_city(ptile);
146
147 foreach (tc, cities) {
148 if (pcity != nullptr) {
149 if (tc->city == pcity) {
151 return;
152 }
153 }
154 if (tc->city->tile == ptile) {
155 remove_virtual_city(ptile);
156 return;
157 }
158 }
159
160 if (pcity != nullptr) {
162 return;
163 }
164
165 pcity = create_city_virtual(client_player(), ptile, "Virtual");
167 virtual_cities.append(pcity);
168}
169
170/**********************************************************************/
174{
175 trade_city *tc;
176
177 foreach (tc, cities) {
178 if (tc->city->tile == pcity->tile) {
179 cities.removeAll(tc);
180 gui()->infotab->chtwdg->append(
181 QString(_("Removing city %1 from trade planning"))
182 .arg(tc->city->name));
183 return;
184 }
185 }
186}
187
188/**********************************************************************/
192{
193 struct city *c;
194 trade_city *tc;
195
196 foreach (c, virtual_cities) {
197 if (c->tile == ptile) {
198 virtual_cities.removeAll(c);
199 gui()->infotab->chtwdg->append(
200 QString(_("Removing city %1 from trade planning")).arg(c->name));
201 }
202 }
203
204 foreach (tc, cities) {
205 if (tc->city->tile == ptile) {
206 cities.removeAll(tc);
207 return;
208 }
209 }
210}
211
212/**********************************************************************/
218{
220
221 foreach (ttc, cities) {
222 if (!have_cities_trade_route(tc->city, ttc->city)
224 tc->poss_trade_num++;
225 tc->pos_cities.append(ttc->city);
226 }
227 tc->over_max = tc->trade_num + tc->poss_trade_num
228 - max_trade_routes(tc->city);
229 }
230}
231
232/**********************************************************************/
236{
237 trade_city *tc;
238 int i;
239 bool tdone;
240 int count = cities.size();
241 int *cities_ids = (int *)fc_malloc(sizeof(int) * count);
242 trade_city **cities_order = (trade_city **)fc_malloc(sizeof(trade_city *) * count);
243
244 for (i = 0; i < 100; i++) {
245 int n;
246
247 tdone = true;
248
249 for (n = 0; n < count; n++) {
250 cities_ids[n] = n;
252 }
254
255 cities.clear();
256 for (n = 0; n < count; n++) {
258 }
259
260 lines.clear();
261 foreach (tc, cities) {
262 tc->pos_cities.clear();
263 tc->new_tr_cities.clear();
264 tc->curr_tr_cities.clear();
265 }
266 foreach (tc, cities) {
268 tc->poss_trade_num = 0;
269 tc->pos_cities.clear();
270 tc->new_tr_cities.clear();
271 tc->curr_tr_cities.clear();
272 tc->done = false;
273 calculate_inner(tc);
274 }
275
277 discard();
279
280 foreach (tc, cities) {
281 if (!tc->done) {
282 tdone = false;
283 }
284 }
285 if (tdone) {
286 break;
287 }
288 }
289 foreach (tc, cities) {
290 if (!tc->done) {
291 char text[1024];
292 fc_snprintf(text, sizeof(text),
293 PL_("City %s - 1 free trade route.",
294 "City %s - %d free trade routes.",
295 max_trade_routes(tc->city) - tc->trade_num),
296 city_link(tc->city),
297 max_trade_routes(tc->city) - tc->trade_num);
299 }
300 }
301
304
305 gui()->mapview_wdg->repaint();
306}
307
308/**********************************************************************/
313{
314 trade_city *tc;
315 int max = 0;
316
317 foreach (tc, cities) {
318 if (pcity != tc->city) {
319 max = qMax(max, tc->over_max);
320 }
321 }
322 return max;
323}
324
325/**********************************************************************/
329{
330 trade_city *tc;
331 trade_city *rc = nullptr;
332 int max = 0;
333
334 foreach (tc, cities) {
335 if (max < tc->over_max) {
336 max = tc->over_max;
337 rc = tc;
338 }
339 }
340 return rc;
341}
342
343/**********************************************************************/
347{
348 trade_city *tc;
349 int j = 5;
350
351 for (int i = j; i > -j; i--) {
352 while ((tc = find_most_free())) {
353 if (!discard_one(tc)) {
354 if (!discard_any(tc, i)) {
355 break;
356 }
357 }
358 }
359 }
360}
361
362/**********************************************************************/
366{
367 tc->pos_cities.removeOne(ttc->city);
368 ttc->pos_cities.removeOne(tc->city);
369 tc->poss_trade_num--;
370 ttc->poss_trade_num--;
371 tc->over_max--;
372 ttc->over_max--;
373 check_if_done(tc, ttc);
374}
375
376/**********************************************************************/
380{
381 int best = 0;
382 int current_candidate = 0;
383 int best_id;
385
386 for (int i = cities.size() - 1 ; i >= 0; i--) {
387 ttc = cities.at(i);
389 if (current_candidate > best) {
390 best_id = i;
391 }
392 }
393 if (best == 0) {
394 return false;
395 }
396
397 ttc = cities.at(best_id);
398 discard_trade(tc, ttc);
399 return true;
400}
401
402/**********************************************************************/
406{
408
409 for (int i = cities.size() - 1 ; i >= 0; i--) {
410 ttc = cities.at(i);
411 if (tc->pos_cities.contains(ttc->city)
412 && ttc->pos_cities.contains(tc->city)
413 && ttc->over_max > freeroutes) {
414 discard_trade(tc, ttc);
415 return true;
416 }
417 }
418 return false;
419}
420
421/**********************************************************************/
427{
429
430 foreach (ttc, cities) {
431 if (ttc->done || ttc->over_max > 0
432 || tc == ttc || tc->done || tc->over_max > 0) {
433 continue;
434 }
435 if (tc->pos_cities.contains(ttc->city)
436 && ttc->pos_cities.contains(tc->city)) {
437 struct qtiles gilles;
438
439 tc->pos_cities.removeOne(ttc->city);
440 ttc->pos_cities.removeOne(tc->city);
441 tc->poss_trade_num--;
442 ttc->poss_trade_num--;
443 tc->new_tr_cities.append(ttc->city);
444 ttc->new_tr_cities.append(ttc->city);
445 tc->trade_num++;
446 ttc->trade_num++;
447 tc->over_max--;
448 ttc->over_max--;
449 check_if_done(tc, ttc);
450 gilles.t1 = tc->city->tile;
451 gilles.t2 = ttc->city->tile;
452 gilles.autocaravan = nullptr;
453 lines.append(gilles);
454 }
455 }
456}
457
458/**********************************************************************/
462{
463 trade_city *tc;
464
465 foreach (tc, cities) {
466 if (tc->done || tc->over_max > 0) {
467 continue;
468 }
470 }
471}
472
473/**********************************************************************/
477{
478 if (tc1->trade_num == max_trade_routes(tc1->city)) {
479 tc1->done = true;
480 }
481 if (tc2->trade_num == max_trade_routes(tc2->city)) {
482 tc2->done = true;
483 }
484}
485
486/**********************************************************************/
492
493/**********************************************************************/
500
501/**********************************************************************/
505{
506 unit_list.clear();
507}
508
509/**********************************************************************/
514{
516 return;
517 }
518 gui()->menu_bar->clear();
519 gui()->menu_bar->setup_menus();
520
522
523 // A new ruleset may have been loaded.
525}
526
527/**********************************************************************/
532{
533 if (C_S_RUNNING <= client_state()) {
534 gui()->menuBar()->setVisible(true);
535 if (!is_waiting_turn_change()) {
536 gui()->menu_bar->menus_sensitive();
537 gui()->menu_bar->update_airlift_menu();
538 gui()->menu_bar->update_roads_menu();
539 gui()->menu_bar->update_bases_menu();
542 gui()->unitinfo_wdg->update_actions(nullptr);
543 }
544 } else {
545 gui()->menuBar()->setVisible(false);
546 }
547}
548
549/**********************************************************************/
554static const char *get_tile_change_menu_text(struct tile *ptile,
555 enum unit_activity activity)
556{
557 struct tile *newtile = tile_virtual_new(ptile);
558 const char *text;
559
560 tile_apply_activity(newtile, activity, nullptr);
561 text = tile_get_info_text(newtile, FALSE, 0);
563
564 return text;
565}
566
567/**********************************************************************/
571 QMenu(_("Government"), parent)
572{
573 // Register ourselves to get updates for free.
574 instances << this;
575 setAttribute(Qt::WA_TranslucentBackground);
576}
577
578/**********************************************************************/
582{
584 instances.remove(this);
585}
586
587/**********************************************************************/
592 struct government *gov, *revol_gov;
593 int gov_count, i;
594
595 // Clear any content
596 foreach(action, QWidget::actions()) {
598 action->deleteLater();
599 }
600 actions.clear();
601
603 actions.reserve(gov_count + 1);
604 action = addAction(_("Revolution..."));
605 action->setShortcut(QKeySequence(tr("ctrl+shift+g")));
606 connect(action, &QAction::triggered, this, &gov_menu::revolution);
607 actions.append(action);
608
609 addSeparator();
610
611 // Add an action for each government. There is no icon yet.
613 for (i = 0; i < gov_count; ++i) {
614 gov = government_by_number(i);
615 if (gov != revol_gov) { // Skip revolution government
616 // Defeat keyboard shortcut mnemonics
618 .replace("&", "&&"));
619 // We need to keep track of the gov <-> action mapping to be able to
620 // set enabled/disabled depending on available govs.
621 actions.append(action);
622 QObject::connect(action, &QAction::triggered, [this,i]() {
623 change_gov(i);
624 });
625 }
626 }
627}
628
629/**********************************************************************/
633{
634 struct government *gov, *revol_gov;
635 struct sprite *sprite;
636 int gov_count, i, j;
637
640 for (i = 0, j = 0; i < gov_count; i++) {
641 gov = government_by_number(i);
642 if (gov != revol_gov) { // Skip revolution government
644 if (sprite != nullptr) {
645 actions[j + 1]->setIcon(QIcon(*(sprite->pm)));
646 }
647 actions[j + 1]->setEnabled(
649 j++;
650 } else {
651 actions[0]->setEnabled(!client_is_observer()
653 }
654 }
655}
656
657/**********************************************************************/
664
665/**********************************************************************/
672
673/**************************************************************************
674 Keeps track of all gov_menu instances.
675**************************************************************************/
677
678/**********************************************************************/
682{
683 foreach (gov_menu *m, instances) {
684 m->create();
685 }
686}
687
688/**********************************************************************/
692{
693 foreach (gov_menu *m, instances) {
694 m->update();
695 }
696}
697
698/**********************************************************************/
702 : QMenu(_("Go to and..."), parent)
703{
704 // Will need auto updates etc.
705 instances << this;
706}
707
708/**********************************************************************/
712{
713 // Updates are no longer needed.
714 instances.remove(this);
715}
716
717/**********************************************************************/
721{
722 // Clear menu item to action ID mapping.
723 items.clear();
724
725 // Remove the menu items
726 clear();
727}
728
729/**********************************************************************/
733{
734 QAction *item;
735 int tgt_kind_group;
736
737 // Group goto and perform action menu items by target kind.
740 struct action *paction = action_by_number(act_id);
742 .replace("&", "&&"));
743
744 if (action_id_get_actor_kind(act_id) != AAK_UNIT) {
745 // This action isn't performed by an unit.
746 continue;
747 }
748
750 // Wrong group.
751 continue;
752 }
753
754 if (action_id_has_complex_target(act_id)) {
756 items.insert(sub_target_menu->menuAction(), act_id);
757
758#define CREATE_SUB_ITEM(_menu_, _act_id_, _sub_tgt_id_, _sub_tgt_name_) \
759 { \
760 QAction *_sub_item_ = _menu_->addAction(_sub_tgt_name_); \
761 int _sub_target_id_ = _sub_tgt_id_; \
762 QObject::connect(_sub_item_, &QAction::triggered, \
763 [this, _act_id_, _sub_target_id_]() { \
764 start_go_act(_act_id_, _sub_target_id_); \
765 }); \
766 }
767
769 case ASTK_BUILDING:
775 break;
776 case ASTK_TECH:
782 break;
783 case ASTK_EXTRA:
785 extra_type_iterate(pextra) {
786 if (!actres_creates_extra(paction->result, pextra)
787 && !actres_removes_extra(paction->result, pextra)) {
788 // Not relevant
789 continue;
790 }
791
793 extra_number(pextra),
794 extra_name_translation(pextra));
796 break;
797 case ASTK_NONE:
798 // Should not be here.
800 break;
801 case ASTK_COUNT:
802 // Should not exits
804 break;
805 }
806 continue;
807 }
808
809#define ADD_OLD_SHORTCUT(wanted_action_id, sc_id) \
810 if (act_id == wanted_action_id) { \
811 item->setShortcut(QKeySequence(shortcut_to_string( \
812 fc_shortcuts::sc()->get_shortcut(sc_id)))); \
813 }
814
815 /* Create and add the menu item. It will be hidden or shown based on
816 * unit type. */
818 items.insert(item, act_id);
819
820 /* Add the keyboard shortcuts for "Go to and..." menu items that
821 * existed independently before the "Go to and..." menu arrived. */
825
826 QObject::connect(item, &QAction::triggered, [this,act_id]() {
827 start_go_act(act_id, NO_TARGET);
828 });
830 }
831}
832
833/**********************************************************************/
837{
838 bool can_do_something = false;
839
840 if (!actions_are_ready()) {
841 // Nothing to do.
842 return;
843 }
844
845 if (items.isEmpty()) {
846 // The goto and act menu needs menu items.
847 create();
848 }
849
850 /* Enable a menu item if it is theoretically possible that one of the
851 * selected units can perform it. Checking if the action can be performed
852 * at the current tile is pointless since it should be performed at the
853 * target tile. */
854 foreach(QAction *item, items.keys()) {
856 items.value(item), TRUE)) {
857 item->setVisible(true);
858 can_do_something = true;
859 } else {
860 item->setVisible(false);
861 }
862 }
863
864 if (can_do_something) {
865 // At least one menu item is enabled for one of the selected units.
866 setEnabled(true);
867 } else {
868 // No menu item is enabled any of the selected units.
869 setEnabled(false);
870 }
871}
872
873/**********************************************************************/
876void go_act_menu::start_go_act(int act_id, int sub_tgt_id)
877{
878 request_unit_goto(ORDER_PERFORM_ACTION, act_id, sub_tgt_id);
879}
880
881/**************************************************************************
882 Store all goto and act menu items so they can be updated etc
883**************************************************************************/
885
886/**********************************************************************/
890{
891 foreach (go_act_menu *m, instances) {
892 m->reset();
893 }
894}
895
896/**********************************************************************/
900{
901 foreach (go_act_menu *m, instances) {
902 m->update();
903 }
904}
905
906/**********************************************************************/
910{
912 struct tile *ptile = nullptr;
913 struct unit *zunit;
914 struct unit *qunit;
915
916 int i = 0;
917 qunit = punit;
918 foreach (fui, units_list.unit_list) {
919 zunit = unit_list_find(client_player()->units, fui->id);
920 i++;
921 if (i >= pos) {
922 punit = qunit;
923 return ptile;
924 }
925 if (zunit == nullptr) {
926 continue;
927 }
928
929 if (punit == zunit) { // Unit found
930 /* Unit was ordered to attack city so it might stay in
931 front of that city */
933 ptile = tile_before_end_path(punit, fui->ptile);
934 if (ptile == nullptr) {
935 ptile = fui->ptile;
936 }
937 } else {
938 ptile = fui->ptile;
939 }
940 // Unit found in transport
941 } else if (unit_contained_in(punit, zunit)) {
942 ptile = fui->ptile;
943 }
944 }
945 return nullptr;
946}
947
948/**********************************************************************/
951mr_menu::mr_menu() : QMenuBar()
952{
953}
954
955/**********************************************************************/
961{
962 QAction *act;
963 QMenu *sub_menu;
964 QMenu *main_menu;
966 int i;
967
968 delayed_order = false;
969 airlift_type_id = 0;
970 quick_airlifting = false;
971
972 // Game Menu
973 main_menu = this->addMenu(_("Game"));
974
975#ifdef __APPLE__
976 // On Mac, Qt would try to move menu entry named just "Options" to
977 // application menu, but as this is submenu and not an action
978 // 1) It would fail to appear in the destination
979 // 2) It's impossible to override the behavior with QAction::menuRule()
980 // We add an invisible character for the string comparison to fail.
981 sub_menu = main_menu->addMenu(QString("\u200B") + _("Options"));
982#else // __APPLE__
983 sub_menu = main_menu->addMenu(_("Options"));
984#endif // __APPLE__
985
986 act = sub_menu->addAction(_("Set local options"));
987 connect(act, &QAction::triggered, this, &mr_menu::local_options);
988 act = sub_menu->addAction(_("Server Options"));
989 connect(act, &QAction::triggered, this, &mr_menu::server_options);
990 act = sub_menu->addAction(_("Messages"));
991 connect(act, &QAction::triggered, this, &mr_menu::messages_options);
992 act = sub_menu->addAction(_("Shortcuts"));
993 connect(act, &QAction::triggered, this, &mr_menu::shortcut_options);
994 act = sub_menu->addAction(_("Load another tileset"));
995 connect(act, &QAction::triggered, this, &mr_menu::tileset_custom_load);
996 act = sub_menu->addAction(_("Save Options Now"));
997 act->setIcon(style()->standardIcon(QStyle::SP_DialogSaveButton));
998 connect(act, &QAction::triggered, this, &mr_menu::save_options_now);
999 act = sub_menu->addAction(_("Save Options on Exit"));
1000 act->setCheckable(true);
1001 act->setChecked(gui_options.save_options_on_exit);
1002 connect(act, &QAction::triggered, this, &mr_menu::save_options_exit);
1003 main_menu->addSeparator();
1004 act = main_menu->addAction(_("Save Game"));
1005 act->setShortcut(QKeySequence(tr("Ctrl+s")));
1006 act->setIcon(style()->standardIcon(QStyle::SP_DialogSaveButton));
1007 menu_list.insert(SAVE, act);
1008 connect(act, &QAction::triggered, this, &mr_menu::save_game);
1009 act = main_menu->addAction(_("Save Game As..."));
1010 menu_list.insert(SAVE, act);
1011 act->setIcon(style()->standardIcon(QStyle::SP_DialogSaveButton));
1012 connect(act, &QAction::triggered, this, &mr_menu::save_game_as);
1013 act = main_menu->addAction(_("Save Map to Image"));
1014 connect(act, &QAction::triggered, this, &mr_menu::save_image);
1015 main_menu->addSeparator();
1016 act = main_menu->addAction(_("Volume Up"));
1017 menu_list.insert(AUDIO, act);
1018 act->setShortcut(QKeySequence(tr(">")));
1019 connect(act, &QAction::triggered, this, &mr_menu::volume_up);
1020 act = main_menu->addAction(_("Volume Down"));
1021 menu_list.insert(AUDIO, act);
1022 act->setShortcut(QKeySequence(tr("<")));
1023 connect(act, &QAction::triggered, this, &mr_menu::volume_down);
1024 main_menu->addSeparator();
1025 act = main_menu->addAction(_("Leave game"));
1026 act->setIcon(style()->standardIcon(QStyle::SP_DialogDiscardButton));
1027 connect(act, &QAction::triggered, this, &mr_menu::back_to_menu);
1028 act = main_menu->addAction(_("Quit"));
1029 act->setIcon(style()->standardIcon(QStyle::SP_TitleBarCloseButton));
1030 connect(act, &QAction::triggered, this, &mr_menu::quit_game);
1031
1032 // View Menu
1033 main_menu = this->addMenu(Q_("?verb:View"));
1034 act = main_menu->addAction(_("Center View"));
1035 act->setShortcut(QKeySequence(shortcut_to_string(
1036 fc_shortcuts::sc()->get_shortcut(SC_CENTER_VIEW))));
1037 connect(act, &QAction::triggered, this, &mr_menu::slot_center_view);
1038 main_menu->addSeparator();
1039 act = main_menu->addAction(_("Fullscreen"));
1040 act->setShortcut(QKeySequence(shortcut_to_string(
1041 fc_shortcuts::sc()->get_shortcut(SC_FULLSCREEN))));
1042 act->setCheckable(true);
1043 act->setChecked(gui_options.gui_qt_fullscreen);
1044 connect(act, &QAction::triggered, this, &mr_menu::slot_fullscreen);
1045 main_menu->addSeparator();
1046 minimap_status = main_menu->addAction(_("Minimap"));
1047 minimap_status->setCheckable(true);
1049 fc_shortcuts::sc()->get_shortcut(SC_MINIMAP))));
1050 minimap_status->setChecked(true);
1051 connect(minimap_status, &QAction::triggered, this,
1053 osd_status = main_menu->addAction(_("Show new turn information"));
1054 osd_status->setCheckable(true);
1055 osd_status->setChecked(gui()->qt_settings.show_new_turn_text);
1056 connect(osd_status, &QAction::triggered, this,
1058 btlog_status = main_menu->addAction(_("Show combat detailed information"));
1059 btlog_status->setCheckable(true);
1060 btlog_status->setChecked(gui()->qt_settings.show_battle_log);
1061 connect(btlog_status, &QAction::triggered, this, &mr_menu::slot_battlelog);
1062 lock_status = main_menu->addAction(_("Lock interface"));
1063 lock_status->setCheckable(true);
1065 fc_shortcuts::sc()->get_shortcut(SC_IFACE_LOCK))));
1066 lock_status->setChecked(false);
1067 connect(lock_status, &QAction::triggered, this, &mr_menu::slot_lock);
1068 connect(minimap_status, &QAction::triggered, this, &mr_menu::slot_lock);
1069 main_menu->addSeparator();
1070 act = main_menu->addAction(_("Zoom in"));
1071 act->setShortcut(QKeySequence(shortcut_to_string(
1072 fc_shortcuts::sc()->get_shortcut(SC_ZOOM_IN))));
1073 connect(act, &QAction::triggered, this, &mr_menu::zoom_in);
1074 act = main_menu->addAction(_("Zoom default"));
1075 act->setShortcut(QKeySequence(shortcut_to_string(
1076 fc_shortcuts::sc()->get_shortcut(SC_ZOOM_RESET))));
1077 connect(act, &QAction::triggered, this, &mr_menu::zoom_reset);
1078 act = main_menu->addAction(_("Zoom out"));
1079 act->setShortcut(QKeySequence(shortcut_to_string(
1080 fc_shortcuts::sc()->get_shortcut(SC_ZOOM_OUT))));
1081 connect(act, &QAction::triggered, this, &mr_menu::zoom_out);
1082 scale_fonts_status = main_menu->addAction(_("Scale fonts"));
1083 connect(scale_fonts_status, &QAction::triggered, this,
1085 scale_fonts_status->setCheckable(true);
1086 scale_fonts_status->setChecked(true);
1087 main_menu->addSeparator();
1088 act = main_menu->addAction(_("City Outlines"));
1089 act->setShortcut(QKeySequence(tr("ctrl+y")));
1090 act->setCheckable(true);
1091 act->setChecked(gui_options.draw_city_outlines);
1092 connect(act, &QAction::triggered, this, &mr_menu::slot_city_outlines);
1093 act = main_menu->addAction(_("City Output"));
1094 act->setCheckable(true);
1095 act->setChecked(gui_options.draw_city_output);
1096 act->setShortcut(QKeySequence(shortcut_to_string(
1097 fc_shortcuts::sc()->get_shortcut(SC_CITY_OUTPUT))));
1098 connect(act, &QAction::triggered, this, &mr_menu::slot_city_output);
1099 act = main_menu->addAction(_("Map Grid"));
1100 act->setShortcut(QKeySequence(shortcut_to_string(
1101 fc_shortcuts::sc()->get_shortcut(SC_MAP_GRID))));
1102 act->setCheckable(true);
1103 act->setChecked(gui_options.draw_map_grid);
1104 connect(act, &QAction::triggered, this, &mr_menu::slot_map_grid);
1105 act = main_menu->addAction(_("National Borders"));
1106 act->setCheckable(true);
1107 act->setChecked(gui_options.draw_borders);
1108 act->setShortcut(QKeySequence(shortcut_to_string(
1109 fc_shortcuts::sc()->get_shortcut(SC_NAT_BORDERS))));
1110 connect(act, &QAction::triggered, this, &mr_menu::slot_borders);
1111 act = main_menu->addAction(_("Native Tiles"));
1112 act->setCheckable(true);
1113 act->setChecked(gui_options.draw_native);
1114 act->setShortcut(QKeySequence(tr("ctrl+shift+n")));
1115 connect(act, &QAction::triggered, this, &mr_menu::slot_native_tiles);
1116 act = main_menu->addAction(_("City Full Bar"));
1117 act->setCheckable(true);
1118 act->setShortcut(QKeySequence(shortcut_to_string(
1119 fc_shortcuts::sc()->get_shortcut(SC_SHOW_FULLBAR))));
1120 act->setChecked(gui_options.draw_full_citybar);
1121 connect(act, &QAction::triggered, this, &mr_menu::slot_fullbar);
1122 act = main_menu->addAction(_("City Names"));
1123 act->setCheckable(true);
1124 act->setChecked(gui_options.draw_city_names);
1125 act->setShortcut(QKeySequence(shortcut_to_string(
1126 fc_shortcuts::sc()->get_shortcut(SC_CITY_NAMES))));
1127 connect(act, &QAction::triggered, this, &mr_menu::slot_city_names);
1128 act = main_menu->addAction(_("City Growth"));
1129 act->setCheckable(true);
1130 act->setChecked(gui_options.draw_city_growth);
1131 act->setShortcut(QKeySequence(tr("ctrl+o")));
1132 connect(act, &QAction::triggered, this, &mr_menu::slot_city_growth);
1133 act = main_menu->addAction(_("City Production"));
1134 act->setCheckable(true);
1135 act->setChecked(gui_options.draw_city_productions);
1136 act->setShortcut(QKeySequence(shortcut_to_string(
1137 fc_shortcuts::sc()->get_shortcut(SC_CITY_PROD))));
1138 connect(act, &QAction::triggered, this, &mr_menu::slot_city_production);
1139 act = main_menu->addAction(_("City Buy Cost"));
1140 act->setCheckable(true);
1141 act->setChecked(gui_options.draw_city_buycost);
1142 connect(act, &QAction::triggered, this, &mr_menu::slot_city_buycost);
1143 act = main_menu->addAction(_("City Trade Routes"));
1144 act->setCheckable(true);
1145 act->setChecked(gui_options.draw_city_trade_routes);
1146 act->setShortcut(QKeySequence(shortcut_to_string(
1147 fc_shortcuts::sc()->get_shortcut(SC_TRADE_ROUTES))));
1148 connect(act, &QAction::triggered, this, &mr_menu::slot_city_trade_routes);
1149 act = main_menu->addAction(_("Unit Stack Size"));
1150 act->setCheckable(true);
1151 act->setChecked(gui_options.draw_unit_stack_size);
1152 act->setShortcut(QKeySequence(shortcut_to_string(
1153 fc_shortcuts::sc()->get_shortcut(SC_STACK_SIZE))));
1154 connect(act, &QAction::triggered, this, &mr_menu::slot_stack_size);
1155
1156 // Select Menu
1157 main_menu = this->addMenu(_("Select"));
1158 act = main_menu->addAction(_("Single Unit (Unselect Others)"));
1159 act->setShortcut(QKeySequence(tr("z")));
1160 menu_list.insert(STANDARD, act);
1161 connect(act, &QAction::triggered, this, &mr_menu::slot_select_one);
1162 act = main_menu->addAction(_("All On Tile"));
1163 act->setShortcut(QKeySequence(tr("v")));
1164 menu_list.insert(STANDARD, act);
1165 connect(act, &QAction::triggered, this, &mr_menu::slot_select_all_tile);
1166 main_menu->addSeparator();
1167 act = main_menu->addAction(_("Same Type on Tile"));
1168 act->setShortcut(QKeySequence(tr("shift+v")));
1169 menu_list.insert(STANDARD, act);
1170 connect(act, &QAction::triggered, this, &mr_menu::slot_select_same_tile);
1171 act = main_menu->addAction(_("Same Type on Continent"));
1172 act->setShortcut(QKeySequence(tr("shift+c")));
1173 menu_list.insert(STANDARD, act);
1174 connect(act, &QAction::triggered, this,
1176 act = main_menu->addAction(_("Same Type Everywhere"));
1177 act->setShortcut(QKeySequence(tr("shift+x")));
1178 menu_list.insert(STANDARD, act);
1179 connect(act, &QAction::triggered, this,
1181 main_menu->addSeparator();
1182 act = main_menu->addAction(_("Wait"));
1183 act->setShortcut(QKeySequence(shortcut_to_string(
1184 fc_shortcuts::sc()->get_shortcut(SC_WAIT))));
1185 menu_list.insert(STANDARD, act);
1186 connect(act, &QAction::triggered, this, &mr_menu::slot_wait);
1187 act = main_menu->addAction(_("Done"));
1188 act->setShortcut(QKeySequence(shortcut_to_string(
1189 fc_shortcuts::sc()->get_shortcut(SC_DONE_MOVING))));
1190 menu_list.insert(STANDARD, act);
1191 connect(act, &QAction::triggered, this, &mr_menu::slot_done_moving);
1192
1193 act = main_menu->addAction(_("Advanced unit selection"));
1194 act->setShortcut(QKeySequence(tr("ctrl+e")));
1195 menu_list.insert(NOT_4_OBS, act);
1196 connect(act, &QAction::triggered, this, &mr_menu::slot_unit_filter);
1197
1198 // Unit Menu
1199 main_menu = this->addMenu(_("Unit"));
1200 act = main_menu->addAction(_("Go to Tile"));
1201 act->setShortcut(QKeySequence(shortcut_to_string(
1202 fc_shortcuts::sc()->get_shortcut(SC_GOTO))));
1203 menu_list.insert(STANDARD, act);
1204 connect(act, &QAction::triggered, this, &mr_menu::slot_unit_goto);
1205
1206 // The goto and act sub menu is handled as a separate object.
1207 main_menu->addMenu(new go_act_menu(this));
1208
1209 act = main_menu->addAction(_("Go to Nearest City"));
1210 act->setShortcut(QKeySequence(tr("shift+g")));
1211 menu_list.insert(GOTO_CITY, act);
1212 connect(act, &QAction::triggered, this, &mr_menu::slot_return_to_city);
1213 act = main_menu->addAction(_("Go to/Airlift to City..."));
1214 act->setShortcut(QKeySequence(shortcut_to_string(
1215 fc_shortcuts::sc()->get_shortcut(SC_GOTOAIRLIFT))));
1216 menu_list.insert(AIRLIFT, act);
1217 connect(act, &QAction::triggered, this, &mr_menu::slot_airlift);
1218 main_menu->addSeparator();
1219 act = main_menu->addAction(_("Auto Explore"));
1220 menu_list.insert(EXPLORE, act);
1221 act->setShortcut(QKeySequence(shortcut_to_string(
1222 fc_shortcuts::sc()->get_shortcut(SC_AUTOEXPLORE))));
1223 connect(act, &QAction::triggered, this, &mr_menu::slot_unit_explore);
1224 act = main_menu->addAction(_("Patrol"));
1225 menu_list.insert(STANDARD, act);
1226 act->setEnabled(false);
1227 act->setShortcut(QKeySequence(shortcut_to_string(
1228 fc_shortcuts::sc()->get_shortcut(SC_PATROL))));
1229 connect(act, &QAction::triggered, this, &mr_menu::slot_patrol);
1230 main_menu->addSeparator();
1231 act = main_menu->addAction(_("Sentry"));
1232 act->setShortcut(QKeySequence(shortcut_to_string(
1233 fc_shortcuts::sc()->get_shortcut(SC_SENTRY))));
1234 menu_list.insert(SENTRY, act);
1235 connect(act, &QAction::triggered, this, &mr_menu::slot_unit_sentry);
1236 act = main_menu->addAction(_("Unsentry All On Tile"));
1237 act->setShortcut(QKeySequence(shortcut_to_string(
1238 fc_shortcuts::sc()->get_shortcut(SC_UNSENTRY_TILE))));
1239 menu_list.insert(WAKEUP, act);
1240 connect(act, &QAction::triggered, this, &mr_menu::slot_unsentry);
1241 main_menu->addSeparator();
1242 act = main_menu->addAction(_("Load"));
1243 act->setShortcut(QKeySequence(shortcut_to_string(
1244 fc_shortcuts::sc()->get_shortcut(SC_BOARD))));
1245 menu_list.insert(BOARD, act);
1246 connect(act, &QAction::triggered, this, &mr_menu::slot_board);
1247 act = main_menu->addAction(_("Unload"));
1248 act->setShortcut(QKeySequence(shortcut_to_string(
1249 fc_shortcuts::sc()->get_shortcut(SC_DEBOARD))));
1250 menu_list.insert(DEBOARD, act);
1251 connect(act, &QAction::triggered, this, &mr_menu::slot_deboard);
1252 act = main_menu->addAction(_("Unload All From Transporter"));
1253 act->setShortcut(QKeySequence(tr("shift+t")));
1254 menu_list.insert(TRANSPORTER, act);
1255 connect(act, &QAction::triggered, this, &mr_menu::slot_unload_all);
1256 main_menu->addSeparator();
1257
1258 // Defeat keyboard shortcut mnemonics
1260 .replace("&", "&&"));
1261 menu_list.insert(HOMECITY, act);
1262 act->setShortcut(QKeySequence(shortcut_to_string(
1263 fc_shortcuts::sc()->get_shortcut(SC_SETHOME))));
1264 connect(act, &QAction::triggered, this, &mr_menu::slot_set_home);
1265 act = main_menu->addAction(_("Upgrade"));
1266 act->setShortcut(QKeySequence(shortcut_to_string(
1267 fc_shortcuts::sc()->get_shortcut(SC_UPGRADE_UNIT))));
1268 menu_list.insert(UPGRADE, act);
1269 connect(act, &QAction::triggered, this, &mr_menu::slot_upgrade);
1270 act = main_menu->addAction(_("Convert"));
1271 act->setShortcut(QKeySequence(tr("shift+o")));
1272 menu_list.insert(CONVERT, act);
1273 connect(act, &QAction::triggered, this, &mr_menu::slot_convert);
1274 act = main_menu->addAction(_("Disband"));
1275 act->setShortcut(QKeySequence(tr("shift+d")));
1276 menu_list.insert(DISBAND, act);
1277 connect(act, &QAction::triggered, this, &mr_menu::slot_disband);
1278
1279 // Combat Menu
1280 main_menu = this->addMenu(_("Combat"));
1281 act = main_menu->addAction(_("Fortify Unit"));
1282 menu_list.insert(FORTIFY, act);
1283 act->setShortcut(QKeySequence(shortcut_to_string(
1284 fc_shortcuts::sc()->get_shortcut(SC_FORTIFY))));
1285 connect(act, &QAction::triggered, this, &mr_menu::slot_unit_fortify);
1286 act = main_menu->addAction(QString(Q_(terrain_control.gui_type_base0))
1287 .replace("&", "&&"));
1288 menu_list.insert(FORTRESS, act);
1289 act->setShortcut(QKeySequence(tr("shift+f")));
1290 connect(act, &QAction::triggered, this, &mr_menu::slot_unit_fortress);
1291 act = main_menu->addAction(QString(Q_(terrain_control.gui_type_base1))
1292 .replace("&", "&&"));
1293 menu_list.insert(AIRBASE, act);
1294 act->setShortcut(QKeySequence(tr("shift+e")));
1295 connect(act, &QAction::triggered, this, &mr_menu::slot_unit_airbase);
1296 bases_menu = main_menu->addMenu(_("Build Base"));
1297 main_menu->addSeparator();
1298 act = main_menu->addAction(_("Paradrop"));
1299 menu_list.insert(PARADROP, act);
1300 act->setShortcut(QKeySequence(shortcut_to_string(
1301 fc_shortcuts::sc()->get_shortcut(SC_PARADROP))));
1302 connect(act, &QAction::triggered, this, &mr_menu::slot_paradrop);
1303 act = main_menu->addAction(_("Pillage"));
1304 menu_list.insert(PILLAGE, act);
1305 act->setShortcut(QKeySequence(tr("shift+p")));
1306 connect(act, &QAction::triggered, this, &mr_menu::slot_pillage);
1307 // TRANS: Menu item to bring up the action selection dialog.
1308 act = main_menu->addAction(_("Do..."));
1309 menu_list.insert(ORDER_DIPLOMAT_DLG, act);
1310 act->setShortcut(QKeySequence(shortcut_to_string(
1311 fc_shortcuts::sc()->get_shortcut(SC_DO))));
1312 connect(act, &QAction::triggered, this, &mr_menu::slot_action);
1313
1314 // Work Menu
1315 main_menu = this->addMenu(_("Work"));
1317 .replace("&", "&&"));
1318 act->setShortcut(QKeySequence(shortcut_to_string(
1319 fc_shortcuts::sc()->get_shortcut(SC_BUILDCITY))));
1320 menu_list.insert(BUILD, act);
1321 connect(act, &QAction::triggered, this, &mr_menu::slot_build_city);
1322 act = main_menu->addAction(_("Auto Worker"));
1323 act->setShortcut(QKeySequence(shortcut_to_string(
1324 fc_shortcuts::sc()->get_shortcut(SC_AUTOMATE))));
1325 menu_list.insert(AUTOWORKER, act);
1326 connect(act, &QAction::triggered, this, &mr_menu::slot_auto_worker);
1327 main_menu->addSeparator();
1328 act = main_menu->addAction(_("Build Road"));
1329 menu_list.insert(ROAD, act);
1330 act->setShortcut(QKeySequence(shortcut_to_string(
1331 fc_shortcuts::sc()->get_shortcut(SC_BUILDROAD))));
1332 connect(act, &QAction::triggered, this, &mr_menu::slot_build_road);
1333 roads_menu = main_menu->addMenu(_("Build Path"));
1334 act = main_menu->addAction(_("Build Irrigation"));
1335 act->setShortcut(QKeySequence(shortcut_to_string(
1336 fc_shortcuts::sc()->get_shortcut(SC_BUILDIRRIGATION))));
1337 menu_list.insert(IRRIGATION, act);
1338 connect(act, &QAction::triggered, this, &mr_menu::slot_build_irrigation);
1339 act = main_menu->addAction(_("Cultivate"));
1340 act->setShortcut(QKeySequence(shortcut_to_string(
1341 fc_shortcuts::sc()->get_shortcut(SC_CULTIVATE))));
1342 menu_list.insert(CULTIVATE, act);
1343 connect(act, &QAction::triggered, this, &mr_menu::slot_cultivate);
1344 act = main_menu->addAction(_("Build Mine"));
1345 act->setShortcut(QKeySequence(shortcut_to_string(
1346 fc_shortcuts::sc()->get_shortcut(SC_BUILDMINE))));
1347 menu_list.insert(MINE, act);
1348 connect(act, &QAction::triggered, this, &mr_menu::slot_build_mine);
1349 act = main_menu->addAction(_("Plant"));
1350 act->setShortcut(QKeySequence(shortcut_to_string(
1351 fc_shortcuts::sc()->get_shortcut(SC_PLANT))));
1352 menu_list.insert(PLANT, act);
1353 connect(act, &QAction::triggered, this, &mr_menu::slot_plant);
1354 main_menu->addSeparator();
1355 act = main_menu->addAction(_("Connect With Road"));
1356 act->setShortcut(QKeySequence(tr("ctrl+r")));
1357 menu_list.insert(CONNECT_ROAD, act);
1358 connect(act, &QAction::triggered, this, &mr_menu::slot_conn_road);
1359 act = main_menu->addAction(_("Connect With Railroad"));
1360 menu_list.insert(CONNECT_RAIL, act);
1361 act->setShortcut(QKeySequence(tr("ctrl+l")));
1362 connect(act, &QAction::triggered, this, &mr_menu::slot_conn_rail);
1363 act = main_menu->addAction(_("Connect With Maglev"));
1364 menu_list.insert(CONNECT_MAGLEV, act);
1365 act->setShortcut(QKeySequence(tr("ctrl+m")));
1366 connect(act, &QAction::triggered, this, &mr_menu::slot_conn_maglev);
1367 act = main_menu->addAction(_("Connect With Irrigation"));
1368 menu_list.insert(CONNECT_IRRIGATION, act);
1369 act->setShortcut(QKeySequence(tr("ctrl+i")));
1370 connect(act, &QAction::triggered, this, &mr_menu::slot_conn_irrigation);
1371 main_menu->addSeparator();
1372 act = main_menu->addAction(_("Transform Terrain"));
1373 menu_list.insert(TRANSFORM, act);
1374 act->setShortcut(QKeySequence(shortcut_to_string(
1375 fc_shortcuts::sc()->get_shortcut(SC_TRANSFORM))));
1376 connect(act, &QAction::triggered, this, &mr_menu::slot_transform);
1377 act = main_menu->addAction(_("Clean"));
1378 menu_list.insert(CLEAN, act);
1379 act->setShortcut(QKeySequence(shortcut_to_string(
1380 fc_shortcuts::sc()->get_shortcut(SC_CLEAN))));
1381 connect(act, &QAction::triggered, this, &mr_menu::slot_clean);
1383 .replace("&", "&&"));
1384 act->setShortcut(QKeySequence(tr("b")));
1385 menu_list.insert(BUILD_WONDER, act);
1386 connect(act, &QAction::triggered, this, &mr_menu::slot_build_city);
1388 .replace("&", "&&"));
1389 act->setShortcut(QKeySequence(tr("r")));
1390 menu_list.insert(ORDER_TRADE_ROUTE, act);
1391 connect(act, &QAction::triggered, this, &mr_menu::slot_build_road);
1392
1393 // Multiplayer Menu
1394 multiplayer_menu = this->addMenu(_("Multiplayer"));
1395 act = multiplayer_menu->addAction(_("Delayed Goto"));
1396 act->setShortcut(QKeySequence(tr("z")));
1397 connect(act, &QAction::triggered, this, &mr_menu::slot_delayed_goto);
1398 act = multiplayer_menu->addAction(_("Delayed Orders Execute"));
1399 act->setShortcut(QKeySequence(tr("ctrl+z")));
1400 connect(act, &QAction::triggered, this, &mr_menu::slot_execute_orders);
1401 act = multiplayer_menu->addAction(_("Clear Orders"));
1402 act->setShortcut(QKeySequence(tr("ctrl+shift+c")));
1403 connect(act, &QAction::triggered, this, &mr_menu::slot_orders_clear);
1404 act = multiplayer_menu->addAction(_("Add all cities to trade planning"));
1405 connect(act, &QAction::triggered, this, &mr_menu::slot_trade_add_all);
1406 act = multiplayer_menu->addAction(_("Calculate trade planning"));
1407 connect(act, &QAction::triggered, this, &mr_menu::slot_calculate);
1408 act = multiplayer_menu->addAction(_("Add/Remove City"));
1409 act->setShortcut(QKeySequence(tr("ctrl+t")));
1410 connect(act, &QAction::triggered, this, &mr_menu::slot_trade_city);
1411 act = multiplayer_menu->addAction(_("Clear Trade Planning"));
1412 connect(act, &QAction::triggered, this, &mr_menu::slot_clear_trade);
1413 act = multiplayer_menu->addAction(_("Automatic caravan"));
1414 menu_list.insert(AUTOTRADEROUTE, act);
1415 connect(act, &QAction::triggered, this, &mr_menu::slot_autocaravan);
1416 act->setShortcut(QKeySequence(tr("ctrl+j")));
1417 act = multiplayer_menu->addAction(_("Set/Unset rally point"));
1418 act->setShortcut(QKeySequence(tr("shift+ctrl+r")));
1419 connect(act, &QAction::triggered, this, &mr_menu::slot_rally);
1420 act = multiplayer_menu->addAction(_("Quick Airlift"));
1421 act->setShortcut(QKeySequence(tr("shift+ctrl+y")));
1422 connect(act, &QAction::triggered, this, &mr_menu::slot_quickairlift);
1423 airlift_type = new QActionGroup(this);
1424 airlift_menu = multiplayer_menu->addMenu(_("Unit type for quickairlifting"));
1425
1426 // Default diplo
1427 action_vs_city = new QActionGroup(this);
1428 action_vs_unit = new QActionGroup(this);
1429 action_unit_menu = multiplayer_menu->addMenu(_("Default action vs unit"));
1430
1431 act = action_unit_menu->addAction(_("Ask"));
1432 act->setCheckable(true);
1433 act->setChecked(true);
1434 act->setData(-1);
1435 action_vs_unit->addAction(act);
1436 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_unit);
1437
1438 act = action_unit_menu->addAction(_("Bribe Unit"));
1439 act->setCheckable(true);
1440 act->setChecked(false);
1441 act->setData(ACTION_SPY_BRIBE_UNIT);
1442 action_vs_unit->addAction(act);
1443 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_unit);
1444
1445 act = action_unit_menu->addAction(_("Sabotage"));
1446 act->setCheckable(true);
1447 act->setChecked(false);
1448 act->setData(ACTION_SPY_SABOTAGE_UNIT);
1449 action_vs_unit->addAction(act);
1450 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_unit);
1451
1452 act = action_unit_menu->addAction(_("Sabotage Unit Escape"));
1453 act->setCheckable(true);
1454 act->setChecked(false);
1455 act->setData(ACTION_SPY_SABOTAGE_UNIT_ESC);
1456 action_vs_unit->addAction(act);
1457 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_unit);
1458
1459 action_city_menu = multiplayer_menu->addMenu(_("Default action vs city"));
1460 act = action_city_menu->addAction(_("Ask"));
1461 act->setCheckable(true);
1462 act->setChecked(true);
1463 act->setData(-1);
1464 action_vs_city->addAction(act);
1465 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1466
1467 act = action_city_menu->addAction(_("Investigate city"));
1468 act->setCheckable(true);
1469 act->setChecked(false);
1470 act->setData(ACTION_SPY_INVESTIGATE_CITY);
1471 action_vs_city->addAction(act);
1472 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1473
1474 act = action_city_menu->addAction(_("Investigate city (spends the unit)"));
1475 act->setCheckable(true);
1476 act->setChecked(false);
1477 act->setData(ACTION_INV_CITY_SPEND);
1478 action_vs_city->addAction(act);
1479 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1480
1481 act = action_city_menu->addAction(_("Establish embassy"));
1482 act->setCheckable(true);
1483 act->setChecked(false);
1484 act->setData(ACTION_ESTABLISH_EMBASSY);
1485 action_vs_city->addAction(act);
1486 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1487
1488 act = action_city_menu->addAction(_("Become Ambassador"));
1489 act->setCheckable(true);
1490 act->setChecked(false);
1491 act->setData(ACTION_ESTABLISH_EMBASSY_STAY);
1492 action_vs_city->addAction(act);
1493 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1494
1495 act = action_city_menu->addAction(_("Steal technology"));
1496 act->setCheckable(true);
1497 act->setChecked(false);
1498 act->setData(ACTION_SPY_STEAL_TECH);
1499 action_vs_city->addAction(act);
1500 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1501
1502 act = action_city_menu->addAction(_("Steal technology and escape"));
1503 act->setCheckable(true);
1504 act->setChecked(false);
1505 act->setData(ACTION_SPY_STEAL_TECH_ESC);
1506 action_vs_city->addAction(act);
1507 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1508
1509 act = action_city_menu->addAction(_("Incite a revolt"));
1510 act->setCheckable(true);
1511 act->setChecked(false);
1512 act->setData(ACTION_SPY_INCITE_CITY);
1513 action_vs_city->addAction(act);
1514 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1515
1516 act = action_city_menu->addAction(_("Incite a Revolt and Escape"));
1517 act->setCheckable(true);
1518 act->setChecked(false);
1519 act->setData(ACTION_SPY_INCITE_CITY_ESC);
1520 action_vs_city->addAction(act);
1521 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1522
1523 act = action_city_menu->addAction(_("Poison city"));
1524 act->setCheckable(true);
1525 act->setChecked(false);
1526 act->setData(ACTION_SPY_POISON);
1527 action_vs_city->addAction(act);
1528 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1529
1530 act = action_city_menu->addAction(_("Poison City Escape"));
1531 act->setCheckable(true);
1532 act->setChecked(false);
1533 act->setData(ACTION_SPY_POISON_ESC);
1534 action_vs_city->addAction(act);
1535 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1536
1537 // Civilization menu
1538 main_menu = this->addMenu(_("Civilization"));
1539 act = main_menu->addAction(_("Tax Rates..."));
1540 act->setShortcut(QKeySequence(tr("ctrl+t")));
1541 menu_list.insert(NOT_4_OBS, act);
1542 connect(act, &QAction::triggered, this, &mr_menu::slot_popup_tax_rates);
1543 main_menu->addSeparator();
1544
1545 act = main_menu->addAction(_("Policies..."));
1546 menu_list.insert(MULTIPLIERS, act);
1547 connect(act, &QAction::triggered, this, &mr_menu::slot_popup_mult_rates);
1548 main_menu->addSeparator();
1549
1550 main_menu->addMenu(new class gov_menu(this));
1551 main_menu->addSeparator();
1552
1553 act = main_menu->addAction(Q_("?noun:View"));
1554 act->setShortcut(QKeySequence(tr("F1")));
1555 connect(act, &QAction::triggered, this, &mr_menu::slot_show_map);
1556
1557 act = main_menu->addAction(_("Units"));
1558 act->setShortcut(QKeySequence(tr("F2")));
1559 connect(act, &QAction::triggered, this, &mr_menu::slot_show_units_report);
1560
1561 act = main_menu->addAction(_("Nations"));
1562 act->setShortcut(QKeySequence(tr("F3")));
1563 connect(act, &QAction::triggered, this, &mr_menu::slot_show_nations);
1564
1565 act = main_menu->addAction(_("Cities"));
1566 act->setShortcut(QKeySequence(tr("F4")));
1567 connect(act, &QAction::triggered, this, &mr_menu::slot_show_cities);
1568
1569 act = main_menu->addAction(_("Economy"));
1570 act->setShortcut(QKeySequence(tr("F5")));
1571 connect(act, &QAction::triggered, this, &mr_menu::slot_show_eco_report);
1572
1573 act = main_menu->addAction(_("Research"));
1574 act->setShortcut(QKeySequence(tr("F6")));
1575 connect(act, &QAction::triggered, this, &mr_menu::slot_show_research_tab);
1576
1577 act = main_menu->addAction(_("Wonders of the World"));
1578 act->setShortcut(QKeySequence(tr("F7")));
1579 connect(act, &QAction::triggered, this, &mr_menu::slot_traveler);
1580
1581 act = main_menu->addAction(_("Top Cities"));
1582 act->setShortcut(QKeySequence(tr("F8")));
1583 menu_list.insert(TOP_CITIES, act);
1584 connect(act, &QAction::triggered, this, &mr_menu::slot_top_cities);
1585
1586 act = main_menu->addAction(_("Demographics"));
1587 act->setShortcut(QKeySequence(tr("F11")));
1588 connect(act, &QAction::triggered, this, &mr_menu::slot_demographics);
1589
1590 act = main_menu->addAction(_("Spaceship"));
1591 act->setShortcut(QKeySequence(tr("F12")));
1592 connect(act, &QAction::triggered, this, &mr_menu::slot_spaceship);
1593
1594 act = main_menu->addAction(_("Achievements"));
1595 connect(act, &QAction::triggered, this, &mr_menu::slot_achievements);
1596
1597 act = main_menu->addAction(_("Endgame report"));
1598 menu_list.insert(ENDGAME, act);
1599 connect(act, &QAction::triggered, this, &mr_menu::slot_endgame);
1600
1601 // Battle Groups Menu
1602 main_menu = this->addMenu(_("Battle Groups"));
1603
1604 act = main_menu->addAction(_("Select Battle Group 1"));
1605 act->setShortcut(QKeySequence(tr("Shift+F1")));
1606 connect(act, &QAction::triggered, this, &mr_menu::slot_bg1select);
1607
1608 act = main_menu->addAction(_("Assign Battle Group 1"));
1609 act->setShortcut(QKeySequence(tr("Ctrl+F1")));
1610 connect(act, &QAction::triggered, this, &mr_menu::slot_bg1assign);
1611
1612 act = main_menu->addAction(_("Append to Battle Group 1"));
1613 act->setShortcut(QKeySequence(tr("Ctrl+Shift+F1")));
1614 connect(act, &QAction::triggered, this, &mr_menu::slot_bg1append);
1615
1616 act = main_menu->addAction(_("Select Battle Group 2"));
1617 act->setShortcut(QKeySequence(tr("Shift+F2")));
1618 connect(act, &QAction::triggered, this, &mr_menu::slot_bg2select);
1619
1620 act = main_menu->addAction(_("Assign Battle Group 2"));
1621 act->setShortcut(QKeySequence(tr("Ctrl+F2")));
1622 connect(act, &QAction::triggered, this, &mr_menu::slot_bg2assign);
1623
1624 act = main_menu->addAction(_("Append to Battle Group 2"));
1625 act->setShortcut(QKeySequence(tr("Ctrl+Shift+F2")));
1626 connect(act, &QAction::triggered, this, &mr_menu::slot_bg2append);
1627
1628 act = main_menu->addAction(_("Select Battle Group 3"));
1629 act->setShortcut(QKeySequence(tr("Shift+F3")));
1630 connect(act, &QAction::triggered, this, &mr_menu::slot_bg3select);
1631
1632 act = main_menu->addAction(_("Assign Battle Group 3"));
1633 act->setShortcut(QKeySequence(tr("Ctrl+F3")));
1634 connect(act, &QAction::triggered, this, &mr_menu::slot_bg3assign);
1635
1636 act = main_menu->addAction(_("Append to Battle Group 3"));
1637 act->setShortcut(QKeySequence(tr("Ctrl+Shift+F3")));
1638 connect(act, &QAction::triggered, this, &mr_menu::slot_bg3append);
1639
1640 act = main_menu->addAction(_("Select Battle Group 4"));
1641 act->setShortcut(QKeySequence(tr("Shift+F4")));
1642 connect(act, &QAction::triggered, this, &mr_menu::slot_bg4select);
1643
1644 act = main_menu->addAction(_("Assign Battle Group 4"));
1645 act->setShortcut(QKeySequence(tr("Ctrl+F4")));
1646 connect(act, &QAction::triggered, this, &mr_menu::slot_bg4assign);
1647
1648 act = main_menu->addAction(_("Append to Battle Group 4"));
1649 act->setShortcut(QKeySequence(tr("Ctrl+Shift+F4")));
1650 connect(act, &QAction::triggered, this, &mr_menu::slot_bg4append);
1651
1652 // Help Menu
1653 main_menu = this->addMenu(_("Help"));
1654
1655 act = main_menu->addAction(Q_(HELP_OVERVIEW_ITEM));
1656 QObject::connect(act, &QAction::triggered, [this]() {
1658 });
1659
1660 act = main_menu->addAction(Q_(HELP_PLAYING_ITEM));
1661 QObject::connect(act, &QAction::triggered, [this]() {
1663 });
1664
1665 act = main_menu->addAction(Q_(HELP_TERRAIN_ITEM));
1666 QObject::connect(act, &QAction::triggered, [this]() {
1668 });
1669
1670 act = main_menu->addAction(Q_(HELP_ECONOMY_ITEM));
1671 QObject::connect(act, &QAction::triggered, [this]() {
1673 });
1674
1675 act = main_menu->addAction(Q_(HELP_CITIES_ITEM));
1676 QObject::connect(act, &QAction::triggered, [this]() {
1678 });
1679
1680 act = main_menu->addAction(Q_(HELP_IMPROVEMENTS_ITEM));
1681 QObject::connect(act, &QAction::triggered, [this]() {
1683 });
1684
1685 act = main_menu->addAction(Q_(HELP_WONDERS_ITEM));
1686 QObject::connect(act, &QAction::triggered, [this]() {
1688 });
1689
1690 act = main_menu->addAction(Q_(HELP_UNITS_ITEM));
1691 QObject::connect(act, &QAction::triggered, [this]() {
1693 });
1694
1695 act = main_menu->addAction(Q_(HELP_COMBAT_ITEM));
1696 QObject::connect(act, &QAction::triggered, [this]() {
1698 });
1699
1700 act = main_menu->addAction(Q_(HELP_COUNTER_ITEM));
1701 QObject::connect(act, &QAction::triggered, [this]() {
1703 });
1704
1705 act = main_menu->addAction(Q_(HELP_ZOC_ITEM));
1706 QObject::connect(act, &QAction::triggered, [this]() {
1708 });
1709
1710 act = main_menu->addAction(Q_(HELP_GOVERNMENT_ITEM));
1711 QObject::connect(act, &QAction::triggered, [this]() {
1713 });
1714
1715 act = main_menu->addAction(Q_(HELP_MULTIPLIER_ITEM));
1716 QObject::connect(act, &QAction::triggered, [this]() {
1718 });
1719
1720 act = main_menu->addAction(Q_(HELP_DIPLOMACY_ITEM));
1721 QObject::connect(act, &QAction::triggered, [this]() {
1723 });
1724
1725 act = main_menu->addAction(Q_(HELP_TECHS_ITEM));
1726 QObject::connect(act, &QAction::triggered, [this]() {
1728 });
1729
1730 act = main_menu->addAction(Q_(HELP_SPACE_RACE_ITEM));
1731 QObject::connect(act, &QAction::triggered, [this]() {
1733 });
1734
1735 act = main_menu->addAction(Q_(HELP_RULESET_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_TILESET_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_MUSICSET_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 act = main_menu->addAction(Q_(HELP_NATIONS_ITEM));
1763#ifdef __APPLE__
1764 // only needed on Mac, prevents qt from moving the menu item
1765 act->setMenuRole(QAction::NoRole);
1766#endif // __APPLE__
1767 QObject::connect(act, &QAction::triggered, [this]() {
1769 });
1770
1771 main_menu->addSeparator();
1772
1773 act = main_menu->addAction(Q_(HELP_CONNECTING_ITEM));
1774 QObject::connect(act, &QAction::triggered, [this]() {
1776 });
1777
1778 act = main_menu->addAction(Q_(HELP_CONTROLS_ITEM));
1779 QObject::connect(act, &QAction::triggered, [this]() {
1781 });
1782
1783 act = main_menu->addAction(Q_(HELP_CMA_ITEM));
1784 QObject::connect(act, &QAction::triggered, [this]() {
1786 });
1787
1788 act = main_menu->addAction(Q_(HELP_CHATLINE_ITEM));
1789 QObject::connect(act, &QAction::triggered, [this]() {
1791 });
1792
1793 act = main_menu->addAction(Q_(HELP_WORKLIST_EDITOR_ITEM));
1794 QObject::connect(act, &QAction::triggered, [this]() {
1796 });
1797
1798 main_menu->addSeparator();
1799
1800 act = main_menu->addAction(Q_(HELP_LANGUAGES_ITEM));
1801 QObject::connect(act, &QAction::triggered, [this]() {
1803 });
1804
1805 act = main_menu->addAction(Q_(HELP_COPYING_ITEM));
1806 QObject::connect(act, &QAction::triggered, [this]() {
1808 });
1809
1810 act = main_menu->addAction(Q_(HELP_ABOUT_ITEM));
1811#ifdef __APPLE__
1812 // only needed on Mac, prevents qt from moving the menu item
1813 act->setMenuRole(QAction::NoRole);
1814#endif // __APPLE__
1815 QObject::connect(act, &QAction::triggered, [this]() {
1817 });
1818
1819 menus = this->findChildren<QMenu*>();
1820 for (i = 0; i < menus.count(); i++) {
1821 menus[i]->setAttribute(Qt::WA_TranslucentBackground);
1822 }
1823
1824 this->setVisible(false);
1825}
1826
1827/**********************************************************************/
1831{
1832 for (int i = 0; i < units_list.nr_units; i++) {
1833 units_list.unit_list.at(units_list.unit_list.count() - i -1)->ptile = ptile;
1834 }
1835}
1836
1837/**********************************************************************/
1843{
1844 foreach (QAction *a, m->actions()) {
1845 if (a->shortcut() == seq && a->isEnabled()) {
1846 a->activate(QAction::Trigger);
1847 return TRUE;
1848 }
1849 }
1850
1851 return FALSE;
1852}
1853
1854/**********************************************************************/
1858{
1862
1863 if (sid == SC_GOTO) {
1864 gui()->mapview_wdg->menu_click = true;
1866 return;
1867 }
1868 fcs = fc_shortcuts::sc()->get_shortcut(static_cast<shortcut_id>(sid));
1870
1872 foreach (const QMenu *m, menus) {
1874 return;
1875 }
1876 }
1877}
1878
1879/**********************************************************************/
1886{
1887 foreach (QAction *a, m->actions()) {
1888 if (a->shortcut() == seq && fcs->mouse == Qt::AllButtons) {
1889 *ret = a->text();
1890
1891 return TRUE;
1892 }
1893 }
1894
1895 return FALSE;
1896}
1897
1898/**********************************************************************/
1902{
1905
1908 foreach (const QMenu *m, menus) {
1909 QString ret;
1910
1911 if (shortcut_exist_inner(m, seq, fcs, &ret)) {
1912 return ret;
1913 }
1914 }
1915
1916 return QString();
1917}
1918
1919/**********************************************************************/
1925 QString *ret)
1926{
1927 foreach (QAction *a, m->actions()) {
1928 if (a->shortcut() == seq) {
1929 *ret = a->text() + " ("
1930 + a->shortcut().toString(QKeySequence::NativeText) + ")";
1931
1932 return TRUE;
1933 }
1934 }
1935
1936 return FALSE;
1937}
1938
1939/**********************************************************************/
1943{
1947
1948 fcs = fc_shortcuts::sc()->get_shortcut(static_cast<shortcut_id>(sid));
1950
1952 foreach (const QMenu *m, menus) {
1953 QString ret;
1954
1956 return ret;
1957 }
1958 }
1959
1960 return QString();
1961}
1962
1963/**********************************************************************/
1967{
1969 QAction *act;
1970 struct player *pplayer;
1971
1972 airlift_menu->clear();
1973 if (client_is_observer()) {
1974 return;
1975 }
1976
1977 pplayer = client_player();
1978 unit_type_iterate(utype) {
1979 utype_id = utype_index(utype);
1980
1981 if (!can_player_build_unit_now(pplayer, utype)
1982 || !utype_can_do_action(utype, ACTION_AIRLIFT)) {
1983 continue;
1984 }
1985 if (!can_player_build_unit_now(pplayer, utype)
1987 continue;
1988 }
1989 // Defeat keyboard shortcut mnemonics
1990 act = airlift_menu->addAction(QString(utype_name_translation(utype))
1991 .replace("&", "&&"));
1992 act->setCheckable(true);
1993 act->setData(utype_id);
1994 if (airlift_type_id == utype_id) {
1995 act->setChecked(true);
1996 }
1997 connect(act, &QAction::triggered, this, &mr_menu::slot_quickairlift_set);
1998 airlift_type->addAction(act);
2000}
2001
2002/****************************************************************************
2003 Updates "build path" menu
2004****************************************************************************/
2006{
2007 QAction *act;
2008 struct unit_list *punits = nullptr;
2009 bool enabled = false;
2010
2011 foreach(act, roads_menu->actions()) {
2012 removeAction(act);
2013 act->deleteLater();
2014 }
2015 roads_menu->clear();
2016 roads_menu->setDisabled(true);
2017 if (client_is_observer()) {
2018 return;
2019 }
2020
2023 if (pextra->buildable) {
2024 int road_id;
2025
2026 // Defeat keyboard shortcut mnemonics
2027 act = roads_menu->addAction(QString(extra_name_translation(pextra))
2028 .replace("&", "&&"));
2029 road_id = pextra->id;
2030 act->setData(road_id);
2031 QObject::connect(act, &QAction::triggered, [this,road_id]() {
2033 });
2035 ACTIVITY_GEN_ROAD, pextra)) {
2036 act->setEnabled(true);
2037 enabled = true;
2038 } else {
2039 act->setDisabled(true);
2040 }
2041 }
2043
2044 if (enabled) {
2045 roads_menu->setEnabled(true);
2046 }
2047}
2048
2049/****************************************************************************
2050 Updates "build bases" menu
2051****************************************************************************/
2053{
2054 QAction *act;
2055 struct unit_list *punits = nullptr;
2056 bool enabled = false;
2057
2058 foreach(act, bases_menu->actions()) {
2059 removeAction(act);
2060 act->deleteLater();
2061 }
2062 bases_menu->clear();
2063 bases_menu->setDisabled(true);
2064
2065 if (client_is_observer()) {
2066 return;
2067 }
2068
2071 if (pextra->buildable) {
2072 int base_id;
2073
2074 // Defeat keyboard shortcut mnemonics
2075 act = bases_menu->addAction(QString(extra_name_translation(pextra))
2076 .replace("&", "&&"));
2077 base_id = pextra->id;
2078 act->setData(base_id);
2079 QObject::connect(act, &QAction::triggered, [this,base_id]() {
2081 });
2083 act->setEnabled(true);
2084 enabled = true;
2085 } else {
2086 act->setDisabled(true);
2087 }
2088 }
2090
2091 if (enabled) {
2092 bases_menu->setEnabled(true);
2093 }
2094}
2095
2096/**********************************************************************/
2100{
2101 QList <QAction * >values;
2103 QMultiHash <munit, QAction *>::iterator i;
2104 struct unit_list *punits = nullptr;
2105 struct road_type *proad;
2106 struct extra_type *tgt;
2107 bool any_cities = false;
2108 bool city_on_tile = false;
2109 bool units_all_same_tile = true;
2110 const struct tile *ptile = nullptr;
2111 const struct unit_type *ptype = nullptr;
2112
2113 players_iterate(pplayer) {
2114 if (city_list_size(pplayer->cities)) {
2115 any_cities = true;
2116 break;
2117 }
2119
2120 // Disable first all sensitive menus
2121 foreach(QAction *a, menu_list) {
2122 a->setEnabled(false);
2123 }
2124
2125 if (client_is_observer()) {
2126 multiplayer_menu->setDisabled(true);
2127 } else {
2128 multiplayer_menu->setDisabled(false);
2129 }
2130
2131 // Non unit menus
2132 keys = menu_list.keys();
2133 foreach (munit key, keys) {
2134 i = menu_list.find(key);
2135 while (i != menu_list.end() && i.key() == key) {
2136 switch (key) {
2137 case SAVE:
2139 i.value()->setEnabled(true);
2140 }
2141 break;
2142 case NOT_4_OBS:
2143 if (!client_is_observer()) {
2144 i.value()->setEnabled(true);
2145 }
2146 break;
2147 case MULTIPLIERS:
2148 if (!client_is_observer() && multiplier_count() > 0) {
2149 i.value()->setEnabled(true);
2150 i.value()->setVisible(true);
2151 } else {
2152 i.value()->setVisible(false);
2153 }
2154 break;
2155 case ENDGAME:
2156 if (gui()->is_repo_dlg_open("END")) {
2157 i.value()->setEnabled(true);
2158 i.value()->setVisible(true);
2159 } else {
2160 i.value()->setVisible(false);
2161 }
2162 break;
2163 case TOP_CITIES:
2164 i.value()->setEnabled(game.info.top_cities_count > 0);
2165 if (game.info.top_cities_count > 0) {
2166 i.value()->setText(QString(PL_("Top %1 City", "Top %1 Cities",
2168 .arg(game.info.top_cities_count));
2169 } else {
2170 i.value()->setText(QString(_("Top Cities")));
2171 }
2172 break;
2173 case AUDIO:
2174 i.value()->setEnabled(!audio_is_dummy_plugin());
2175 break;
2176 default:
2177 break;
2178 }
2179 i++;
2180 }
2181 }
2182
2184 return;
2185 }
2186
2189 if (tile_city(unit_tile(punit))) {
2190 city_on_tile = true;
2191 break;
2192 }
2194
2196 const struct unit_type *ntype;
2197
2198 fc_assert((ptile == nullptr) == (ptype == nullptr));
2199
2201
2202 // 'ntype == ptype' is correct check even when ptype is still nullptr
2203 if (ptile != nullptr && ntype == ptype && unit_tile(punit) != ptile) {
2204 units_all_same_tile = false;
2205 }
2206
2207 if (ptype == nullptr || ntype == ptype) {
2208 ptile = unit_tile(punit);
2209 ptype = ntype;
2210 }
2212
2213 keys = menu_list.keys();
2214 foreach(munit key, keys) {
2215 i = menu_list.find(key);
2216 while (i != menu_list.end() && i.key() == key) {
2217 switch (key) {
2218 case STANDARD:
2219 i.value()->setEnabled(true);
2220 break;
2221
2222 case EXPLORE:
2224 i.value()->setEnabled(true);
2225 }
2226 break;
2227
2228 case BOARD:
2229 if (units_can_load(punits)) {
2230 i.value()->setEnabled(true);
2231 }
2232 break;
2233
2234 case DEBOARD:
2235 if (units_can_unload(&(wld.map), punits)) {
2236 i.value()->setEnabled(true);
2237 }
2238 break;
2239
2240 case TRANSPORTER:
2242 i.value()->setEnabled(true);
2243 }
2244 break;
2245
2246 case CONVERT:
2247 if (units_can_convert(&(wld.map), punits)) {
2248 i.value()->setEnabled(true);
2249 }
2250 break;
2251
2252 case MINE:
2254 i.value()->setEnabled(true);
2255 }
2256
2257 if (units_all_same_tile) {
2259 struct extra_type *pextra = nullptr;
2260
2261 /* FIXME: this overloading doesn't work well with multiple focus
2262 * units. */
2266 if (pextra != nullptr) {
2267 break;
2268 }
2270
2271 if (pextra != nullptr) {
2272 i.value()->setText(
2273 // TRANS: Build mine of specific type
2274 QString(_("Build %1"))
2275 .arg(extra_name_translation(pextra))
2276 .replace("&", "&&"));
2277 } else {
2278 i.value()->setText(QString(_("Build Mine")));
2279 }
2280 } else {
2281 i.value()->setText(QString(_("Build Mine")));
2282 }
2283 }
2284 break;
2285
2286 case IRRIGATION:
2288 i.value()->setEnabled(true);
2289 }
2290 if (units_all_same_tile) {
2292 struct extra_type *pextra = nullptr;
2293
2294 /* FIXME: this overloading doesn't work well with multiple focus
2295 * units. */
2299 if (pextra != nullptr) {
2300 break;
2301 }
2303
2304 if (pextra != nullptr) {
2305 i.value()->setText(
2306 // TRANS: Build irrigation of specific type
2307 QString(_("Build %1"))
2308 .arg(extra_name_translation(pextra))
2309 .replace("&", "&&"));
2310 } else {
2311 i.value()->setText(QString(_("Build Irrigation")));
2312 }
2313 } else {
2314 i.value()->setText(QString(_("Build Irrigation")));
2315 }
2316 }
2317 break;
2318
2319 case CULTIVATE:
2321 i.value()->setEnabled(true);
2322 }
2323 if (units_all_same_tile) {
2324 struct unit *punit = unit_list_get(punits, 0);
2325 struct tile *atile = unit_tile(punit);
2326 struct terrain *pterrain = tile_terrain(atile);
2327
2328 if (pterrain->cultivate_result != T_NONE) {
2329 i.value()->setText(
2330 // TRANS: Transform terrain to specific type
2331 QString(_("Cultivate to %1"))
2333 .replace("&", "&&"));
2334 } else {
2335 i.value()->setText(QString(_("Cultivate")));
2336 }
2337 } else {
2338 i.value()->setText(QString(_("Cultivate")));
2339 }
2340 break;
2341
2342 case PLANT:
2344 i.value()->setEnabled(true);
2345 }
2346 if (units_all_same_tile) {
2347 struct unit *punit = unit_list_get(punits, 0);
2348 struct tile *atile = unit_tile(punit);
2349 struct terrain *pterrain = tile_terrain(atile);
2350
2351 if (pterrain->plant_result != T_NONE) {
2352 i.value()->setText(
2353 // TRANS: Transform terrain to specific type
2354 QString(_("Plant to %1"))
2356 .replace("&", "&&"));
2357 } else {
2358 i.value()->setText(QString(_("Plant")));
2359 }
2360 } else {
2361 i.value()->setText(QString(_("Plant")));
2362 }
2363 break;
2364
2365 case TRANSFORM:
2367 i.value()->setEnabled(true);
2368 } else {
2369 break;
2370 }
2371 if (units_all_same_tile) {
2372 struct unit *punit = unit_list_get(punits, 0);
2373 struct tile *atile = unit_tile(punit);
2374 struct terrain *pterrain = tile_terrain(atile);
2375
2376 if (pterrain->transform_result != T_NONE
2377 && pterrain->transform_result != pterrain) {
2378 i.value()->setText(
2379 // TRANS: Transform terrain to specific type
2380 QString(_("Transform to %1"))
2382 .replace("&", "&&"));
2383 } else {
2384 i.value()->setText(_("Transform Terrain"));
2385 }
2386 }
2387 break;
2388
2389 case BUILD:
2392 i.value()->setEnabled(true);
2393 }
2394 if (city_on_tile
2396 i.value()->setText(
2398 .replace("&", "&&"));
2399 } else {
2400 i.value()->setText(
2402 .replace("&", "&&"));
2403 }
2404 break;
2405
2406 case ROAD:
2407 {
2408 struct extra_type *pextra = nullptr;
2409
2411 i.value()->setEnabled(true);
2412 }
2416 if (pextra != nullptr) {
2417 break;
2418 }
2420
2421 if (pextra != nullptr) {
2422 i.value()->setText(
2423 // TRANS: Build road of specific type
2424 QString(_("Build %1"))
2425 .arg(extra_name_translation(pextra))
2426 .replace("&", "&&"));
2427 }
2428 }
2429 break;
2430
2431 case FORTIFY:
2433 i.value()->setEnabled(true);
2434 }
2435 break;
2436
2437 case FORTRESS:
2439 i.value()->setEnabled(true);
2440 }
2441 break;
2442
2443 case AIRBASE:
2445 i.value()->setEnabled(true);
2446 }
2447 break;
2448
2449 case CLEAN:
2451 i.value()->setEnabled(true);
2452 }
2453 break;
2454
2455 case SENTRY:
2457 i.value()->setEnabled(true);
2458 }
2459 break;
2460
2461 case PARADROP:
2463 i.value()->setEnabled(true);
2465 .replace("&", "&&"));
2466 }
2467 break;
2468
2469 case PILLAGE:
2471 i.value()->setEnabled(true);
2472 }
2473 break;
2474
2475 case HOMECITY:
2477 i.value()->setEnabled(true);
2478 }
2479 break;
2480
2481 case WAKEUP:
2483 i.value()->setEnabled(true);
2484 }
2485 break;
2486
2487 case AUTOWORKER:
2489 i.value()->setEnabled(true);
2490 }
2492 i.value()->setText(_("Auto Settler"));
2493 } else {
2494 i.value()->setText(_("Auto Worker"));
2495 }
2496 break;
2497 case CONNECT_ROAD:
2499 if (proad != nullptr) {
2500 tgt = road_extra_get(proad);
2501 } else {
2502 break;
2503 }
2505 i.value()->setEnabled(true);
2506 }
2507 break;
2508
2509 case DISBAND:
2511 i.value()->setEnabled(true);
2512 }
2513 break;
2514
2515 case CONNECT_RAIL:
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_MAGLEV:
2529 if (proad != nullptr) {
2530 tgt = road_extra_get(proad);
2531 } else {
2532 break;
2533 }
2535 i.value()->setEnabled(true);
2536 }
2537 break;
2538
2539 case CONNECT_IRRIGATION:
2540 {
2542
2543 if (extra_type_list_size(extras) > 0) {
2544 struct extra_type *pextra;
2545
2548 i.value()->setEnabled(true);
2549 }
2550 }
2551 }
2552 break;
2553
2554 case GOTO_CITY:
2555 if (any_cities) {
2556 i.value()->setEnabled(true);
2557 }
2558 break;
2559
2560 case AIRLIFT:
2561 if (any_cities) {
2562 i.value()->setEnabled(true);
2563 }
2564 break;
2565
2566 case BUILD_WONDER:
2567 i.value()->setText(
2569 .replace("&", "&&"));
2571 i.value()->setEnabled(true);
2572 }
2573 break;
2574
2575 case AUTOTRADEROUTE:
2577 i.value()->setEnabled(true);
2578 }
2579 break;
2580
2581 case ORDER_TRADE_ROUTE:
2582 i.value()->setText(
2584 .replace("&", "&&"));
2586 i.value()->setEnabled(true);
2587 }
2588 break;
2589
2590 case ORDER_DIPLOMAT_DLG:
2592 i.value()->setEnabled(true);
2593 }
2594 break;
2595
2596 case UPGRADE:
2597 if (units_can_upgrade(&(wld.map), punits)) {
2598 i.value()->setEnabled(true);
2599 }
2600 break;
2601 default:
2602 break;
2603 }
2604
2605 i++;
2606 }
2607 }
2608}
2609
2610/**********************************************************************/
2617
2618/**********************************************************************/
2622{
2623 struct player *pplayer = client_player();
2624
2625 if (pplayer != nullptr) {
2626 popup_spaceship_dialog(pplayer);
2627 }
2628}
2629
2630/**********************************************************************/
2637
2638/**********************************************************************/
2642{
2643 ::gui()->game_tab_widget->setCurrentIndex(0);
2644}
2645
2646/**********************************************************************/
2653
2654/**********************************************************************/
2658{
2659 popup_players_dialog(false);
2660}
2661
2662/**********************************************************************/
2669
2670/**********************************************************************/
2674{
2676 /* FIXME: this can provide different actions for different units...
2677 * not good! */
2678 /* Enable the button for adding to a city in all cases, so we
2679 get an eventual error message from the server if we try. */
2684 }
2686}
2687
2688/**********************************************************************/
2692{
2694 struct extra_type *pextra;
2695
2698
2699 if (pextra != nullptr) {
2701 }
2703}
2704
2705/**********************************************************************/
2720
2721/**********************************************************************/
2725{
2727
2728 if (prail != nullptr) {
2729 struct extra_type *tgt;
2730
2731 tgt = road_extra_get(prail);
2733 }
2734}
2735
2736/**********************************************************************/
2740{
2742
2743 if (pmaglev != nullptr) {
2744 struct extra_type *tgt;
2745
2746 tgt = road_extra_get(pmaglev);
2748 }
2749}
2750
2751/**********************************************************************/
2758
2759/**********************************************************************/
2766
2767/**********************************************************************/
2771{
2773
2774 if (proad != nullptr) {
2775 struct extra_type *tgt;
2776
2777 tgt = road_extra_get(proad);
2779 }
2780}
2781
2782/**********************************************************************/
2789
2790/**********************************************************************/
2801
2802/**********************************************************************/
2806{
2808}
2809
2810/**********************************************************************/
2817
2818/**********************************************************************/
2825
2826/**********************************************************************/
2830{
2832 /* FIXME: this can provide different actions for different units...
2833 * not good! */
2835 EC_ROAD,
2837 punit);
2838 bool building_road = false;
2839
2840 if (tgt != nullptr
2843 building_road = true;
2844 }
2845
2848 }
2850}
2851
2852/**********************************************************************/
2859
2860/**********************************************************************/
2867
2868/**********************************************************************/
2872{
2873 key_unit_mine();
2874}
2875
2876/**********************************************************************/
2880{
2882}
2883
2884/**********************************************************************/
2891
2892/**********************************************************************/
2899
2900/**********************************************************************/
2904{
2906}
2907
2908/**********************************************************************/
2915
2916/**********************************************************************/
2920{
2921 delayed_order = false;
2922 units_list.clear();
2923}
2924
2925/**********************************************************************/
2929{
2930 gui()->rallies.hover_tile = false;
2931 gui()->rallies.hover_city = true;
2932}
2933
2934/**********************************************************************/
2938{
2939 gui()->trade_gen.hover_city = true;
2940}
2941
2942/**********************************************************************/
2946{
2947 gui()->trade_gen.add_all_cities();
2948}
2949
2950/**********************************************************************/
2954{
2955 gui()->trade_gen.calculate();
2956}
2957
2958/**********************************************************************/
2962{
2963 gui()->trade_gen.clear_trade_planing();
2964}
2965
2966/**********************************************************************/
2970{
2971 qtiles gilles;
2972 struct unit *punit;
2973 struct city *homecity;
2974 struct tile *home_tile;
2975 struct tile *dest_tile;
2976 bool sent = false;
2977
2979 homecity = game_city_by_number(punit->homecity);
2980 home_tile = homecity->tile;
2981 foreach(gilles, gui()->trade_gen.lines) {
2982 if ((gilles.t1 == home_tile || gilles.t2 == home_tile)
2983 && gilles.autocaravan == nullptr) {
2984 // Send caravan
2985 if (gilles.t1 == home_tile) {
2986 dest_tile = gilles.t2;
2987 } else {
2988 dest_tile = gilles.t1;
2989 }
2990 if (send_goto_tile(punit, dest_tile)) {
2991 int i;
2992 i = gui()->trade_gen.lines.indexOf(gilles);
2993 gilles = gui()->trade_gen.lines.takeAt(i);
2994 gilles.autocaravan = punit;
2995 gui()->trade_gen.lines.append(gilles);
2996 sent = true;
2997 break;
2998 }
2999 }
3000 }
3001
3002 if (!sent) {
3003 gui()->infotab->chtwdg->append(_("Didn't find any trade route"
3004 " to establish"));
3005 }
3006}
3007
3008/**********************************************************************/
3012{
3013 QVariant v;
3014 QAction *act;
3015
3017 v = act->data();
3018 airlift_type_id = v.toInt();
3019}
3020
3021/**********************************************************************/
3025{
3026 QAction *act;
3027
3029 qdef_act::action()->vs_unit_set(act->data().toInt());
3030}
3031
3032/**********************************************************************/
3036{
3037 QAction *act;
3038
3040 qdef_act::action()->vs_city_set(act->data().toInt());
3041}
3042
3043/**********************************************************************/
3047{
3048 quick_airlifting = true;
3049}
3050
3051/**********************************************************************/
3055{
3057 int i = 0;
3059
3060 delayed_order = true;
3061 dg = D_GOTO;
3062
3063 struct unit_list *punits = get_units_in_focus();
3064 if (unit_list_size(punits) == 0) {
3065 return;
3066 }
3067 if (hover_state != HOVER_GOTO) {
3072 control_mouse_cursor(nullptr);
3073 }
3075 i++;
3080}
3081
3082/**********************************************************************/
3086{
3088 struct unit *punit;
3089 struct tile *last_tile;
3090 struct tile *new_tile;
3091 int i = 0;
3092
3093 foreach (fui, units_list.unit_list) {
3094 i++;
3095 punit = unit_list_find(client_player()->units, fui->id);
3096 if (punit == nullptr) {
3097 continue;
3098 }
3099 last_tile = punit->tile;
3101 if (new_tile != nullptr) {
3102 punit->tile = new_tile;
3103 }
3104 if (is_tiles_adjacent(punit->tile, fui->ptile)) {
3107 punit->tile,
3108 fui->ptile));
3109 } else {
3110 send_attack_tile(punit, fui->ptile);
3111 }
3112 punit->tile = last_tile;
3113 }
3114 units_list.clear();
3115}
3116
3117/**********************************************************************/
3126
3127/**********************************************************************/
3131{
3133}
3134
3135/**********************************************************************/
3144
3145/**********************************************************************/
3149{
3151}
3152
3153/**********************************************************************/
3160
3161/**********************************************************************/
3170
3171/**********************************************************************/
3178
3179/**********************************************************************/
3186
3187/**********************************************************************/
3194
3195/**********************************************************************/
3199{
3200 key_unit_goto();
3201}
3202
3203/**********************************************************************/
3210
3211/**********************************************************************/
3218
3219/**********************************************************************/
3223{
3224 if (gui()->interface_locked) {
3225 enable_interface(false);
3226 } else {
3227 enable_interface(true);
3228 }
3229 gui()->interface_locked = !gui()->interface_locked;
3230}
3231
3232/**********************************************************************/
3236{
3240 int i;
3241
3242 lc = gui()->findChildren<close_widget *>();
3243 lm = gui()->findChildren<move_widget *>();
3244 lr = gui()->findChildren<resize_widget *>();
3245
3246 for (i = 0; i < lc.size(); ++i) {
3247 lc.at(i)->setVisible(!enable);
3248 }
3249 for (i = 0; i < lm.size(); ++i) {
3250 lm.at(i)->setVisible(!enable);
3251 }
3252 for (i = 0; i < lr.size(); ++i) {
3253 lr.at(i)->setVisible(!enable);
3254 }
3255}
3256
3257/**********************************************************************/
3261{
3263
3264 gui()->apply_fullscreen();
3265}
3266
3267/**********************************************************************/
3271{
3272 if (minimap_status->isChecked()) {
3273 ::gui()->minimapview_wdg->show();
3274 } else {
3275 ::gui()->minimapview_wdg->hide();
3276 }
3277}
3278
3279/**********************************************************************/
3283{
3284 if (osd_status->isChecked()) {
3285 gui()->qt_settings.show_new_turn_text = true;
3286 } else {
3287 gui()->qt_settings.show_new_turn_text = false;
3288 }
3289}
3290
3291/**********************************************************************/
3295{
3296 if (btlog_status->isChecked()) {
3297 gui()->qt_settings.show_battle_log = true;
3298 } else {
3299 gui()->qt_settings.show_battle_log = false;
3300 }
3301}
3302
3303/**********************************************************************/
3310
3311/**********************************************************************/
3318
3319/**********************************************************************/
3326
3327/**********************************************************************/
3334
3335/**********************************************************************/
3339{
3340 gui()->map_scale = gui()->map_scale * 1.2f;
3341 tilespec_reread(tileset_basename(tileset), true, gui()->map_scale);
3342}
3343
3344/**********************************************************************/
3348{
3349 QFont *qf;
3350
3351 gui()->map_scale = 1.0f;
3353 qf->setPointSize(fc_font::instance()->city_fontsize);
3355 qf->setPointSize(fc_font::instance()->prod_fontsize);
3356 tilespec_reread(tileset_basename(tileset), true, gui()->map_scale);
3357}
3358
3359/**********************************************************************/
3363{
3364 QFont *qf;
3365
3366 if (scale_fonts_status->isChecked()) {
3367 gui()->map_font_scale = true;
3368 } else {
3370 qf->setPointSize(fc_font::instance()->city_fontsize);
3372 qf->setPointSize(fc_font::instance()->prod_fontsize);
3373 gui()->map_font_scale = false;
3374 }
3376}
3377
3378/**********************************************************************/
3382{
3383 gui()->map_scale = gui()->map_scale / 1.2f;
3384 tilespec_reread(tileset_basename(tileset), true, gui()->map_scale);
3385}
3386
3387/**********************************************************************/
3394
3395/**********************************************************************/
3402
3403/**********************************************************************/
3410
3411/**********************************************************************/
3418
3419/**********************************************************************/
3426
3427/**********************************************************************/
3434
3435/**********************************************************************/
3442
3443/**********************************************************************/
3450
3451/**********************************************************************/
3455{
3456 key_unit_done();
3457}
3458
3459/**********************************************************************/
3466
3467/**********************************************************************/
3474
3475/**********************************************************************/
3484
3485/**********************************************************************/
3494
3495/**********************************************************************/
3502
3503/**********************************************************************/
3507{
3508 key_unit_wait();
3509}
3510
3511/**********************************************************************/
3515{
3517
3518 uhs = new unit_hud_selector(gui()->central_wdg);
3519 uhs->show_me();
3520}
3521
3522/**********************************************************************/
3529
3530/**********************************************************************/
3537
3538/**********************************************************************/
3545
3546/**********************************************************************/
3553
3554/**********************************************************************/
3561
3562/**********************************************************************/
3569
3570/**********************************************************************/
3577
3578/**********************************************************************/
3585
3586/**********************************************************************/
3593
3594/**********************************************************************/
3601
3602/**********************************************************************/
3609
3610/**********************************************************************/
3617
3618/**********************************************************************/
3625
3626/**********************************************************************/
3633
3634/**********************************************************************/
3641
3642/**********************************************************************/
3649
3650/**********************************************************************/
3657
3658/**********************************************************************/
3662{
3663 QDialog *dialog = new QDialog(this);
3664 QLabel *label;
3665 QPushButton *but;
3667 const struct strvec *tlset_list;
3668 const struct option *poption;
3670 QString s;
3671
3672 sl << "default_tileset_overhead_name" << "default_tileset_iso_name"
3673 << "default_tileset_hex_name" << "default_tileset_isohex_name";
3674 layout = new QVBoxLayout;
3675 dialog->setWindowTitle(_("Available tilesets"));
3676 label = new QLabel;
3677 label->setText(_("Some tilesets might not be compatible with current"
3678 " map topology!"));
3679 layout->addWidget(label);
3680
3681 foreach (s, sl) {
3683
3684 on_bytes = s.toUtf8();
3687 strvec_iterate(tlset_list, value) {
3688 but = new QPushButton(value);
3689 connect(but, &QAbstractButton::clicked, this, &mr_menu::load_new_tileset);
3690 layout->addWidget(but);
3692 }
3693 dialog->setSizeGripEnabled(true);
3694 dialog->setLayout(layout);
3695 dialog->show();
3696}
3697
3698/**********************************************************************/
3702{
3703 QPushButton *but;
3705
3707 tn_bytes = but->text().toUtf8();
3708 tilespec_reread(tn_bytes.data(), true, 1.0f);
3709 gui()->map_scale = 1.0f;
3710 but->parentWidget()->close();
3711}
3712
3713/**********************************************************************/
3717{
3718 gui()->trade_gen.calculate();
3719}
3720
3721/**********************************************************************/
3728
3729/**********************************************************************/
3736
3737/**********************************************************************/
3740void mr_menu::slot_help(const QString &topic)
3741{
3742 popup_help_dialog_typed(Q_(topic.toStdString().c_str()), HELP_ANY);
3743}
3744
3745/****************************************************************
3746 Actions "BUILD_PATH_*"
3747*****************************************************************/
3760
3761/****************************************************************
3762 Actions "BUILD_BASE_*"
3763*****************************************************************/
3765{
3768 if (pextra->buildable && pextra->id == id
3770 pextra)) {
3772 }
3775}
3776
3777
3778
3779/**********************************************************************/
3783{
3784 gui()->popup_client_options();
3785}
3786
3787/**********************************************************************/
3794
3795/**********************************************************************/
3799{
3800 gui()->pr_options->popup_server_options();
3801}
3802
3803/**********************************************************************/
3810
3811/**********************************************************************/
3815{
3816 options_save(nullptr);
3817}
3818
3819/**********************************************************************/
3826
3827/**********************************************************************/
3831{
3833}
3834
3835/**********************************************************************/
3839{
3842 QString path, storage_path;
3843 hud_message_box *saved = new hud_message_box(gui()->central_wdg);
3844 bool map_saved;
3846
3849 current_width = gui()->mapview_wdg->width();
3850 current_height = gui()->mapview_wdg->height();
3851 if (tileset_hex_width(tileset) > 0) {
3852 full_size_y = full_size_y * 11 / 20;
3853 } else if (tileset_is_isometric(tileset)) {
3855 }
3857 img_name = QString("Freeciv-Turn%1").arg(game.info.turn);
3858 if (client_has_player()) {
3859 img_name = img_name + "-"
3861 }
3863 path = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
3864 if (!storage_path.isEmpty() && QDir(storage_path).isReadable()) {
3866 } else if (!path.isEmpty()) {
3867 img_name = path + DIR_SEPARATOR + img_name;
3868 } else {
3869 img_name = QStandardPaths::writableLocation(QStandardPaths::HomeLocation)
3871 }
3872 map_saved = mapview.store->map_pixmap.save(img_name, "png");
3874 saved->setStandardButtons(QMessageBox::Ok);
3875 saved->setDefaultButton(QMessageBox::Cancel);
3876 saved->setAttribute(Qt::WA_DeleteOnClose);
3877 if (map_saved) {
3878 saved->set_text_title("Image saved as:\n" + img_name, _("Success"));
3879 } else {
3880 saved->set_text_title(_("Failed to save image of the map"), _("Error"));
3881 }
3882 saved->show();
3883}
3884
3885/**********************************************************************/
3889{
3890 send_save_game(nullptr);
3891}
3892
3893/**********************************************************************/
3897{
3898 QString str;
3899 QString current_file;
3900 QString location;
3901
3903 location = dirname;
3904 // choose last location
3906
3907 str = QString(_("Save Games"))
3908 + QString(" (*.sav *.sav.bz2 *.sav.gz *.sav.xz)");
3909 current_file = QFileDialog::getSaveFileName(gui()->central_wdg,
3910 _("Save Game As..."),
3911 location, str);
3912 if (!current_file.isEmpty()) {
3914
3915 cf_bytes = current_file.toUtf8();
3916 send_save_game(cf_bytes.data());
3917 }
3918}
3919
3920/**********************************************************************/
3924{
3926
3927 if (is_server_running()) {
3928 ask = new hud_message_box(gui()->central_wdg);
3929 ask->set_text_title(_("Leaving a local game will end it!"), "Leave game");
3930 ask->setStandardButtons(QMessageBox::Cancel | QMessageBox::Ok);
3931 ask->setDefaultButton(QMessageBox::Cancel);
3932 ask->setAttribute(Qt::WA_DeleteOnClose);
3933
3934 connect(ask, &hud_message_box::accepted, [=]() {
3935 if (client.conn.used) {
3936 gui()->infotab->msgwdg->clr();
3937 disconnect_from_server(TRUE);
3938 }
3939 });
3940 ask->show();
3941 } else {
3943 }
3944}
3945
3946/**********************************************************************/
3957
3958/**********************************************************************/
3969
3970/**********************************************************************/
3974{
3975 hud_message_box* ask = new hud_message_box(gui()->central_wdg);
3976
3977 ask->setIcon(QMessageBox::Warning);
3978 ask->setStandardButtons(QMessageBox::Cancel | QMessageBox::Ok);
3979 ask->setDefaultButton(QMessageBox::Cancel);
3980 ask->setAttribute(Qt::WA_DeleteOnClose);
3981 return (ask->set_text_title(_("Selection will cancel current assignments!"),
3982 _("Confirm Disruptive Selection"), true)
3983 == QMessageBox::Ok);
3984}
3985
3986/**********************************************************************/
3990{
3991 struct tile *ptile;
3992
3994 if (get_city_bonus(pcity, EFT_AIRLIFT) > 0) {
3995 ptile = city_tile(pcity);
3996 unit_list_iterate(ptile->units, punit) {
3997 if (punit->utype == utype_by_number(ut)) {
3999 break;
4000 }
4002 }
4004}
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
bool audio_is_dummy_plugin(void)
Definition audio.c:715
void output_window_append(const struct ft_color color, const char *featured_text)
struct city * create_city_virtual(struct player *pplayer, struct tile *ptile, const char *name)
Definition city.c: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:899
virtual ~go_act_menu()
Definition menu.cpp:711
void start_go_act(int act_id, int sub_tgt_id)
Definition menu.cpp:876
void reset()
Definition menu.cpp:720
static QSet< go_act_menu * > instances
Definition menu.h:238
void update()
Definition menu.cpp:836
go_act_menu(QWidget *parent=nullptr)
Definition menu.cpp:701
static void reset_all()
Definition menu.cpp:889
void create()
Definition menu.cpp:732
QMap< QAction *, int > items
Definition menu.h:240
static QSet< gov_menu * > instances
Definition menu.h:213
virtual ~gov_menu()
Definition menu.cpp:581
static void create_all()
Definition menu.cpp:681
void revolution()
Definition menu.cpp:660
QVector< QAction * > actions
Definition menu.h:215
static void update_all()
Definition menu.cpp:691
void change_gov(int target_gov)
Definition menu.cpp:668
gov_menu(QWidget *parent=0)
Definition menu.cpp:570
void create()
Definition menu.cpp:590
void update()
Definition menu.cpp:632
bool shortcut_2_menustring_inner(const QMenu *m, QKeySequence seq, QString *ret)
Definition menu.cpp:1924
void slot_unit_sentry()
Definition menu.cpp:2895
QActionGroup * action_vs_city
Definition menu.h:268
void slot_bg3select()
Definition menu.cpp:3613
void slot_auto_worker()
Definition menu.cpp:2821
void slot_traveler()
Definition menu.cpp:3557
bool execute_shortcut_inner(const QMenu *m, QKeySequence seq)
Definition menu.cpp:1842
void slot_delayed_goto()
Definition menu.cpp:3054
void zoom_in()
Definition menu.cpp:3338
void slot_autocaravan()
Definition menu.cpp:2969
QMenu * multiplayer_menu
Definition menu.h:265
void slot_build_irrigation()
Definition menu.cpp:2855
void volume_up()
Definition menu.cpp:3949
void slot_execute_orders()
Definition menu.cpp:3085
void update_bases_menu()
Definition menu.cpp:2052
QString shortcut_exist(fc_shortcut *fcs)
Definition menu.cpp:1901
void tileset_custom_load()
Definition menu.cpp:3661
void update_roads_menu()
Definition menu.cpp:2005
void slot_calculate()
Definition menu.cpp:2953
void slot_conn_road()
Definition menu.cpp:2770
void slot_conn_irrigation()
Definition menu.cpp:2708
QMenu * bases_menu
Definition menu.h:264
QActionGroup * airlift_type
Definition menu.h:267
void save_options_exit()
Definition menu.cpp:3822
void slot_quickairlift_set()
Definition menu.cpp:3011
void slot_battlelog()
Definition menu.cpp:3294
QMultiHash< munit, QAction * > menu_list
Definition menu.h:272
void slot_trade_add_all()
Definition menu.cpp:2945
void update_airlift_menu()
Definition menu.cpp:1966
void slot_show_cities()
Definition menu.cpp:2665
void slot_transform()
Definition menu.cpp:2785
void slot_top_cities()
Definition menu.cpp:3549
void slot_action_vs_unit()
Definition menu.cpp:3024
void slot_achievements()
Definition menu.cpp:3533
void slot_show_research_tab()
Definition menu.cpp:2613
void shortcut_options()
Definition menu.cpp:3790
void slot_city_output()
Definition menu.cpp:3406
void slot_show_eco_report()
Definition menu.cpp:2633
QMenu * airlift_menu
Definition menu.h:263
QAction * osd_status
Definition menu.h:288
void slot_bg1select()
Definition menu.cpp:3565
void slot_unload_all()
Definition menu.cpp:3174
void slot_airlift()
Definition menu.cpp:3148
void slot_select_same_continent()
Definition menu.cpp:3478
void slot_city_production()
Definition menu.cpp:3414
void slot_set_home()
Definition menu.cpp:3156
QAction * lock_status
Definition menu.h:287
void slot_native_tiles()
Definition menu.cpp:3314
void slot_unit_explore()
Definition menu.cpp:3206
void slot_bg4assign()
Definition menu.cpp:3645
void slot_bg1append()
Definition menu.cpp:3581
void slot_upgrade()
Definition menu.cpp:3190
void execute_shortcut(int sid)
Definition menu.cpp:1857
void slot_popup_mult_rates()
Definition menu.cpp:3732
void slot_select_same_everywhere()
Definition menu.cpp:3488
void volume_down()
Definition menu.cpp:3961
void slot_map_grid()
Definition menu.cpp:3446
void slot_unit_filter()
Definition menu.cpp:3514
void slot_bg2select()
Definition menu.cpp:3589
void slot_done_moving()
Definition menu.cpp:3454
void calc_trade_routes()
Definition menu.cpp:3716
void slot_city_buycost()
Definition menu.cpp:3322
void slot_action()
Definition menu.cpp:2813
void slot_bg4append()
Definition menu.cpp:3653
QMenu * roads_menu
Definition menu.h:266
QAction * minimap_status
Definition menu.h:285
bool shortcut_exist_inner(const QMenu *m, QKeySequence seq, fc_shortcut *fcs, QString *ret)
Definition menu.cpp:1884
void slot_select_all_tile()
Definition menu.cpp:3462
void save_game()
Definition menu.cpp:3888
struct tile * find_last_unit_pos(struct unit *punit, int pos)
Definition menu.cpp:909
void save_image()
Definition menu.cpp:3838
void slot_pillage()
Definition menu.cpp:2805
void slot_clean()
Definition menu.cpp:2691
void zoom_reset()
Definition menu.cpp:3347
void slot_board()
Definition menu.cpp:3120
void slot_center_view()
Definition menu.cpp:3214
void slot_build_mine()
Definition menu.cpp:2871
void server_options()
Definition menu.cpp:3798
void load_new_tileset()
Definition menu.cpp:3701
void set_tile_for_order(struct tile *ptile)
Definition menu.cpp:1830
void slot_fullscreen()
Definition menu.cpp:3260
void slot_bg4select()
Definition menu.cpp:3637
void slot_show_nations()
Definition menu.cpp:2657
void slot_build_road()
Definition menu.cpp:2829
void slot_unsentry()
Definition menu.cpp:3182
void slot_show_new_turn_text()
Definition menu.cpp:3282
void local_options()
Definition menu.cpp:3782
bool delayed_order
Definition menu.h:292
void slot_borders()
Definition menu.cpp:3306
void slot_clear_trade()
Definition menu.cpp:2961
void zoom_scale_fonts()
Definition menu.cpp:3362
void slot_conn_rail()
Definition menu.cpp:2724
void slot_select_same_tile()
Definition menu.cpp:3498
void slot_convert()
Definition menu.cpp:2903
QMenu * action_unit_menu
Definition menu.h:270
QActionGroup * action_vs_unit
Definition menu.h:269
void slot_endgame()
Definition menu.cpp:3541
void slot_bg2assign()
Definition menu.cpp:3597
void slot_select_one()
Definition menu.cpp:3470
void menus_sensitive()
Definition menu.cpp:2099
void messages_options()
Definition menu.cpp:3806
void slot_unit_goto()
Definition menu.cpp:3198
void slot_cultivate()
Definition menu.cpp:2863
void slot_stack_size()
Definition menu.cpp:3430
void slot_conn_maglev()
Definition menu.cpp:2739
void slot_patrol()
Definition menu.cpp:3130
void slot_unit_fortress()
Definition menu.cpp:2754
void slot_wait()
Definition menu.cpp:3506
void slot_demographics()
Definition menu.cpp:3525
void slot_build_city()
Definition menu.cpp:2673
void slot_city_growth()
Definition menu.cpp:3330
void slot_city_trade_routes()
Definition menu.cpp:3422
void slot_rally()
Definition menu.cpp:2928
void slot_plant()
Definition menu.cpp:2879
void slot_paradrop()
Definition menu.cpp:2793
void slot_build_path(int id)
Definition menu.cpp:3748
void slot_bg1assign()
Definition menu.cpp:3573
void slot_return_to_city()
Definition menu.cpp:3138
Unit_type_id airlift_type_id
Definition menu.h:294
void slot_show_map()
Definition menu.cpp:2641
void slot_bg3assign()
Definition menu.cpp:3621
QAction * scale_fonts_status
Definition menu.h:286
void slot_minimap_view()
Definition menu.cpp:3270
void slot_trade_city()
Definition menu.cpp:2937
void quit_game()
Definition menu.cpp:3830
void slot_help(const QString &topic)
Definition menu.cpp:3740
void save_game_as()
Definition menu.cpp:3896
void slot_bg2append()
Definition menu.cpp:3605
bool quick_airlifting
Definition menu.h:293
void slot_spaceship()
Definition menu.cpp:2621
void slot_city_names()
Definition menu.cpp:3390
QMenu * action_city_menu
Definition menu.h:271
void save_options_now()
Definition menu.cpp:3814
QAction * btlog_status
Definition menu.h:289
void slot_unit_fortify()
Definition menu.cpp:2887
void slot_show_units_report()
Definition menu.cpp:2649
void slot_quickairlift()
Definition menu.cpp:3046
QString shortcut_2_menustring(int sid)
Definition menu.cpp:1942
void slot_lock()
Definition menu.cpp:3222
void back_to_menu()
Definition menu.cpp:3923
void slot_deboard()
Definition menu.cpp:3164
void slot_popup_tax_rates()
Definition menu.cpp:3724
void slot_build_base(int id)
Definition menu.cpp:3764
qfc_units_list units_list
Definition menu.h:273
void setup_menus()
Definition menu.cpp:960
mr_menu()
Definition menu.cpp:951
void slot_bg3append()
Definition menu.cpp:3629
void slot_action_vs_city()
Definition menu.cpp:3035
void zoom_out()
Definition menu.cpp:3381
void slot_disband()
Definition menu.cpp:2911
void slot_unit_airbase()
Definition menu.cpp:2762
void slot_fullbar()
Definition menu.cpp:3438
void slot_city_outlines()
Definition menu.cpp:3398
bool confirm_disruptive_selection()
Definition menu.cpp:3973
void slot_orders_clear()
Definition menu.cpp:2919
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:132
void add(qfc_delayed_unit_item *fui)
Definition menu.cpp:496
int nr_units
Definition menu.h:133
void clear()
Definition menu.cpp:504
bool done
Definition menu.h:144
unsigned trade_num
Definition menu.h:147
int poss_trade_num
Definition menu.h:146
QList< struct city * > pos_cities
Definition menu.h:150
QList< struct city * > new_tr_cities
Definition menu.h:149
int over_max
Definition menu.h:145
trade_city(struct city *pcity)
Definition menu.cpp:69
QList< struct city * > curr_tr_cities
Definition menu.h:148
struct city * city
Definition menu.h:151
void calculate_inner(trade_city *tc)
Definition menu.cpp:217
bool discard_one(trade_city *tc)
Definition menu.cpp:379
void add_city(struct city *pcity)
Definition menu.cpp:128
void find_certain_routes()
Definition menu.cpp:461
QList< trade_city * > cities
Definition menu.h:183
void find_certain_routes_inner(trade_city *tc)
Definition menu.cpp:426
trade_city * find_most_free()
Definition menu.cpp:328
void discard_trade(trade_city *tc1, trade_city *tc2)
Definition menu.cpp:365
void add_tile(struct tile *ptile)
Definition menu.cpp:140
void remove_virtual_city(struct tile *ptile)
Definition menu.cpp:191
bool hover_city
Definition menu.h:180
void add_all_cities()
Definition menu.cpp:88
void clear_trade_planing()
Definition menu.cpp:108
void discard()
Definition menu.cpp:346
void remove_city(struct city *pcity)
Definition menu.cpp:173
QList< qtiles > lines
Definition menu.h:181
bool discard_any(trade_city *tc, int freeroutes)
Definition menu.cpp:405
void check_if_done(trade_city *tc1, trade_city *tc2)
Definition menu.cpp:476
QList< struct city * > virtual_cities
Definition menu.h:182
int find_over_max(struct city *pcity)
Definition menu.cpp:312
void calculate()
Definition menu.cpp:235
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:3768
void request_unit_airlift(struct unit *punit, struct city *pcity)
Definition control.c:1555
void key_city_output_toggle(void)
Definition control.c:3865
void request_unit_return(struct unit *punit)
Definition control.c:1564
void request_unit_caravan_action(struct unit *punit, action_id action)
Definition control.c:2235
void key_unit_auto_explore(void)
Definition control.c:3589
void key_unit_connect(enum unit_activity activity, struct extra_type *tgt)
Definition control.c:3387
void key_city_full_bar_toggle(void)
Definition control.c:3897
void key_map_native_toggle(void)
Definition control.c:3889
void request_unit_goto(enum unit_orders last_order, action_id act_id, int sub_tgt_id)
Definition control.c:1142
void key_unit_paradrop(void)
Definition control.c:3491
struct unit_list * get_units_in_focus(void)
Definition control.c:177
void request_center_focus_unit(void)
Definition control.c:2762
void key_city_productions_toggle(void)
Definition control.c:3931
void key_unit_plant(void)
Definition control.c:3708
void key_unit_fortress(void)
Definition control.c:3636
void key_unit_mine(void)
Definition control.c:3700
void key_unit_pillage(void)
Definition control.c:3720
void request_unit_unload(struct unit *pcargo)
Definition control.c:2206
void request_new_unit_activity_targeted(struct unit *punit, enum unit_activity act, struct extra_type *tgt)
Definition control.c:1950
void key_unit_irrigate(void)
Definition control.c:3680
void request_unit_build_city(struct unit *punit)
Definition control.c:1829
void key_unit_unload_all(void)
Definition control.c:3529
void key_city_outlines_toggle(void)
Definition control.c:3857
void key_unit_homecity(void)
Definition control.c:3653
void set_hover_state(struct unit_list *punits, enum cursor_hover_state state, enum unit_activity activity, struct extra_type *tgt, int last_tgt, int last_sub_tgt, action_id action, enum unit_orders order)
Definition control.c:290
void key_unit_patrol(void)
Definition control.c:3499
void key_unit_wakeup_others(void)
Definition control.c:3562
enum cursor_hover_state hover_state
Definition control.c:89
void key_unit_stack_size_toggle(void)
Definition control.c:3948
void key_unit_wait(void)
Definition control.c:3554
void key_unit_select_battlegroup(int battlegroup, bool append)
Definition control.c:3831
void key_map_grid_toggle(void)
Definition control.c:3873
struct unit * head_of_units_in_focus(void)
Definition control.c:410
void key_city_growth_toggle(void)
Definition control.c:3914
void key_unit_action_select_tgt(void)
Definition control.c:3418
void key_city_buycost_toggle(void)
Definition control.c:3923
int get_num_units_in_focus(void)
Definition control.c:185
void key_unit_transform(void)
Definition control.c:3780
void request_move_unit_direction(struct unit *punit, int dir)
Definition control.c:1891
void key_unit_done(void)
Definition control.c:3475
void key_city_trade_routes_toggle(void)
Definition control.c:3940
void key_city_names_toggle(void)
Definition control.c:3905
void request_unit_select(struct unit_list *punits, enum unit_select_type_mode seltype, enum unit_select_location_mode selloc)
Definition control.c:1633
void key_unit_auto_work(void)
Definition control.c:3602
void key_unit_airbase(void)
Definition control.c:3572
void key_unit_goto(void)
Definition control.c:3483
void control_mouse_cursor(struct tile *ptile)
Definition control.c:1227
void key_unit_convert(void)
Definition control.c:3614
void key_unit_fortify(void)
Definition control.c:3624
void key_unit_assign_battlegroup(int battlegroup, bool append)
Definition control.c:3792
void key_unit_cultivate(void)
Definition control.c:3688
void key_map_borders_toggle(void)
Definition control.c:3881
#define can_unit_do_activity_targeted_client(_punit_, _act_, _tgt_)
Definition control.h:43
#define can_units_do_activity_targeted_client(_punits_, _act_, _tgt_)
Definition control.h:47
@ HOVER_GOTO
Definition control.h:27
#define can_units_do_activity_client(_punits_, _act_)
Definition control.h:45
bool qtg_request_transport(struct unit *pcargo, struct tile *ptile)
Definition dialogs.cpp:4958
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:2347
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:2394
#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:83
@ D_GOTO
Definition menu.h:84
munit
Definition menu.h:39
@ AIRLIFT
Definition menu.h:69
@ CONNECT_RAIL
Definition menu.h:65
@ TRANSFORM
Definition menu.h:51
@ FORTIFY
Definition menu.h:56
@ GOTO_CITY
Definition menu.h:68
@ TRANSPORTER
Definition menu.h:44
@ BUILD
Definition menu.h:54
@ IRRIGATION
Definition menu.h:49
@ CONNECT_IRRIGATION
Definition menu.h:67
@ CONNECT_ROAD
Definition menu.h:64
@ HOMECITY
Definition menu.h:61
@ CONVERT
Definition menu.h:46
@ PILLAGE
Definition menu.h:53
@ TOP_CITIES
Definition menu.h:79
@ BUILD_WONDER
Definition menu.h:70
@ DISBAND
Definition menu.h:45
@ DEBOARD
Definition menu.h:43
@ CLEAN
Definition menu.h:59
@ NOT_4_OBS
Definition menu.h:75
@ UPGRADE
Definition menu.h:74
@ SAVE
Definition menu.h:78
@ MULTIPLIERS
Definition menu.h:76
@ PLANT
Definition menu.h:48
@ ORDER_TRADE_ROUTE
Definition menu.h:72
@ WAKEUP
Definition menu.h:62
@ MINE
Definition menu.h:47
@ SENTRY
Definition menu.h:60
@ ORDER_DIPLOMAT_DLG
Definition menu.h:73
@ EXPLORE
Definition menu.h:41
@ STANDARD
Definition menu.h:40
@ 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
@ AUDIO
Definition menu.h:80
@ ENDGAME
Definition menu.h:77
@ AUTOTRADEROUTE
Definition menu.h:71
@ AIRBASE
Definition menu.h:58
#define enable(id)
Definition widget.h:223
void popup_revolution_dialog(void)
Definition dialogs.c:112
#define HELP_MUSICSET_ITEM
#define HELP_CITIES_ITEM
#define HELP_TERRAIN_ITEM
#define HELP_LANGUAGES_ITEM
#define HELP_CONNECTING_ITEM
#define HELP_TILESET_ITEM
#define HELP_CHATLINE_ITEM
#define HELP_RULESET_ITEM
#define HELP_GOVERNMENT_ITEM
#define HELP_ABOUT_ITEM
#define HELP_MULTIPLIER_ITEM
#define HELP_PLAYING_ITEM
#define HELP_IMPROVEMENTS_ITEM
#define HELP_UNITS_ITEM
#define HELP_ZOC_ITEM
#define HELP_WORKLIST_EDITOR_ITEM
#define HELP_WONDERS_ITEM
#define HELP_COMBAT_ITEM
#define HELP_SPACE_RACE_ITEM
#define HELP_COPYING_ITEM
#define HELP_OVERVIEW_ITEM
#define HELP_NATIONS_ITEM
#define HELP_TECHS_ITEM
#define HELP_DIPLOMACY_ITEM
#define HELP_ECONOMY_ITEM
@ HELP_ANY
Definition helpdlg_g.h:20
#define HELP_CMA_ITEM
#define HELP_CONTROLS_ITEM
#define HELP_COUNTER_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:1497
bool is_tiles_adjacent(const struct tile *tile0, const struct tile *tile1)
Definition map.c:1076
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:3235
void multiairlift(struct city *acity, Unit_type_id ut)
Definition menu.cpp:3989
void real_menus_init(void)
Definition menu.cpp:513
static const char * get_tile_change_menu_text(struct tile *ptile, enum unit_activity activity)
Definition menu.cpp:554
void real_menus_update(void)
Definition menu.cpp:531
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:2020
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:161
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:7040
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