Freeciv-3.4
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 "specialist.h"
38#include "unit.h"
39
40// client
41#include "audio.h"
42#include "connectdlg_common.h"
43#include "control.h"
44#include "helpdata.h"
45
46// gui-qt
47#include "fc_client.h"
48#include "chatline.h"
49#include "cityrep.h"
50#include "dialogs.h"
51#include "gotodlg.h"
52#include "gui_main.h"
53#include "hudwidget.h"
54#include "mapctrl.h"
55#include "messagedlg.h"
56#include "plrdlg.h"
57#include "ratesdlg.h"
58#include "repodlgs.h"
59#include "shortcuts.h"
60#include "spaceshipdlg.h"
61#include "sprite.h"
62
63#include "menu.h"
64
65static void enable_interface(bool enable);
66
67/**********************************************************************/
71{
72 city = pcity;
73 tile = nullptr;
74 trade_num = 0;
76}
77
78/**********************************************************************/
85
86/**********************************************************************/
90{
91 int i, s;
92 struct city *pcity;
93 struct player *pplayer = client_player();
94
96 s = city_list_size(pplayer->cities);
97 if (s == 0) {
98 return;
99 }
100 for (i = 0; i < s; i++) {
101 pcity = city_list_get(pplayer->cities, i);
103 }
104}
105
106/**********************************************************************/
110{
111 struct city *pcity;
112 trade_city *tc;
113
114 foreach(pcity, virtual_cities) {
116 }
117 virtual_cities.clear();
118 foreach(tc, cities) {
119 delete tc;
120 }
121 cities.clear();
122 lines.clear();
123 gui()->mapview_wdg->repaint();
124}
125
126/**********************************************************************/
130{
131 trade_city *tc = new trade_city(pcity);
132
133 cities.append(tc);
134 gui()->infotab->chtwdg->append(QString(_("Adding city %1 to trade planning"))
135 .arg(tc->city->name));
136}
137
138/**********************************************************************/
142{
143 struct city *pcity;
144 trade_city *tc;
145
146 pcity = tile_city(ptile);
147
148 foreach (tc, cities) {
149 if (pcity != nullptr) {
150 if (tc->city == pcity) {
152 return;
153 }
154 }
155 if (tc->city->tile == ptile) {
156 remove_virtual_city(ptile);
157 return;
158 }
159 }
160
161 if (pcity != nullptr) {
163 return;
164 }
165
166 pcity = create_city_virtual(client_player(), ptile, "Virtual");
168 virtual_cities.append(pcity);
169}
170
171/**********************************************************************/
175{
176 trade_city *tc;
177
178 foreach (tc, cities) {
179 if (tc->city->tile == pcity->tile) {
180 cities.removeAll(tc);
181 gui()->infotab->chtwdg->append(
182 QString(_("Removing city %1 from trade planning"))
183 .arg(tc->city->name));
184 return;
185 }
186 }
187}
188
189/**********************************************************************/
193{
194 struct city *c;
195 trade_city *tc;
196
197 foreach (c, virtual_cities) {
198 if (c->tile == ptile) {
199 virtual_cities.removeAll(c);
200 gui()->infotab->chtwdg->append(
201 QString(_("Removing city %1 from trade planning")).arg(c->name));
202 }
203 }
204
205 foreach (tc, cities) {
206 if (tc->city->tile == ptile) {
207 cities.removeAll(tc);
208 return;
209 }
210 }
211}
212
213/**********************************************************************/
219{
221
222 foreach (ttc, cities) {
223 if (!have_cities_trade_route(tc->city, ttc->city)
225 tc->poss_trade_num++;
226 tc->pos_cities.append(ttc->city);
227 }
228 tc->over_max = tc->trade_num + tc->poss_trade_num
229 - max_trade_routes(tc->city);
230 }
231}
232
233/**********************************************************************/
237{
238 trade_city *tc;
239 int i;
240 bool tdone;
241 int count = cities.size();
242 int *cities_ids = (int *)fc_malloc(sizeof(int) * count);
243 trade_city **cities_order = (trade_city **)fc_malloc(sizeof(trade_city *) * count);
244
245 for (i = 0; i < 100; i++) {
246 int n;
247
248 tdone = true;
249
250 for (n = 0; n < count; n++) {
251 cities_ids[n] = n;
253 }
255
256 cities.clear();
257 for (n = 0; n < count; n++) {
259 }
260
261 lines.clear();
262 foreach (tc, cities) {
263 tc->pos_cities.clear();
264 tc->new_tr_cities.clear();
265 tc->curr_tr_cities.clear();
266 }
267 foreach (tc, cities) {
269 tc->poss_trade_num = 0;
270 tc->pos_cities.clear();
271 tc->new_tr_cities.clear();
272 tc->curr_tr_cities.clear();
273 tc->done = false;
274 calculate_inner(tc);
275 }
276
278 discard();
280
281 foreach (tc, cities) {
282 if (!tc->done) {
283 tdone = false;
284 }
285 }
286 if (tdone) {
287 break;
288 }
289 }
290 foreach (tc, cities) {
291 if (!tc->done) {
292 char text[1024];
293 fc_snprintf(text, sizeof(text),
294 PL_("City %s - 1 free trade route.",
295 "City %s - %d free trade routes.",
296 max_trade_routes(tc->city) - tc->trade_num),
297 city_link(tc->city),
298 max_trade_routes(tc->city) - tc->trade_num);
300 }
301 }
302
305
306 gui()->mapview_wdg->repaint();
307}
308
309/**********************************************************************/
314{
315 trade_city *tc;
316 int max = 0;
317
318 foreach (tc, cities) {
319 if (pcity != tc->city) {
320 max = qMax(max, tc->over_max);
321 }
322 }
323 return max;
324}
325
326/**********************************************************************/
330{
331 trade_city *tc;
332 trade_city *rc = nullptr;
333 int max = 0;
334
335 foreach (tc, cities) {
336 if (max < tc->over_max) {
337 max = tc->over_max;
338 rc = tc;
339 }
340 }
341 return rc;
342}
343
344/**********************************************************************/
348{
349 trade_city *tc;
350 int j = 5;
351
352 for (int i = j; i > -j; i--) {
353 while ((tc = find_most_free())) {
354 if (!discard_one(tc)) {
355 if (!discard_any(tc, i)) {
356 break;
357 }
358 }
359 }
360 }
361}
362
363/**********************************************************************/
367{
368 tc->pos_cities.removeOne(ttc->city);
369 ttc->pos_cities.removeOne(tc->city);
370 tc->poss_trade_num--;
371 ttc->poss_trade_num--;
372 tc->over_max--;
373 ttc->over_max--;
374 check_if_done(tc, ttc);
375}
376
377/**********************************************************************/
381{
382 int best = 0;
383 int current_candidate = 0;
384 int best_id;
386
387 for (int i = cities.size() - 1 ; i >= 0; i--) {
388 ttc = cities.at(i);
390 if (current_candidate > best) {
391 best_id = i;
392 }
393 }
394 if (best == 0) {
395 return false;
396 }
397
398 ttc = cities.at(best_id);
399 discard_trade(tc, ttc);
400 return true;
401}
402
403/**********************************************************************/
407{
409
410 for (int i = cities.size() - 1 ; i >= 0; i--) {
411 ttc = cities.at(i);
412 if (tc->pos_cities.contains(ttc->city)
413 && ttc->pos_cities.contains(tc->city)
414 && ttc->over_max > freeroutes) {
415 discard_trade(tc, ttc);
416 return true;
417 }
418 }
419 return false;
420}
421
422/**********************************************************************/
428{
430
431 foreach (ttc, cities) {
432 if (ttc->done || ttc->over_max > 0
433 || tc == ttc || tc->done || tc->over_max > 0) {
434 continue;
435 }
436 if (tc->pos_cities.contains(ttc->city)
437 && ttc->pos_cities.contains(tc->city)) {
438 struct qtiles gilles;
439
440 tc->pos_cities.removeOne(ttc->city);
441 ttc->pos_cities.removeOne(tc->city);
442 tc->poss_trade_num--;
443 ttc->poss_trade_num--;
444 tc->new_tr_cities.append(ttc->city);
445 ttc->new_tr_cities.append(ttc->city);
446 tc->trade_num++;
447 ttc->trade_num++;
448 tc->over_max--;
449 ttc->over_max--;
450 check_if_done(tc, ttc);
451 gilles.t1 = tc->city->tile;
452 gilles.t2 = ttc->city->tile;
453 gilles.autocaravan = nullptr;
454 lines.append(gilles);
455 }
456 }
457}
458
459/**********************************************************************/
463{
464 trade_city *tc;
465
466 foreach (tc, cities) {
467 if (tc->done || tc->over_max > 0) {
468 continue;
469 }
471 }
472}
473
474/**********************************************************************/
478{
479 if (tc1->trade_num == max_trade_routes(tc1->city)) {
480 tc1->done = true;
481 }
482 if (tc2->trade_num == max_trade_routes(tc2->city)) {
483 tc2->done = true;
484 }
485}
486
487/**********************************************************************/
493
494/**********************************************************************/
501
502/**********************************************************************/
506{
507 unit_list.clear();
508}
509
510/**********************************************************************/
515{
517 return;
518 }
519 gui()->menu_bar->clear();
520 gui()->menu_bar->setup_menus();
521
523
524 // A new ruleset may have been loaded.
526}
527
528/**********************************************************************/
533{
534 if (C_S_RUNNING <= client_state()) {
535 gui()->menuBar()->setVisible(true);
536 if (!is_waiting_turn_change()) {
537 gui()->menu_bar->menus_sensitive();
538 gui()->menu_bar->update_airlift_menu();
539 gui()->menu_bar->update_roads_menu();
540 gui()->menu_bar->update_bases_menu();
543 gui()->unitinfo_wdg->update_actions(nullptr);
544 }
545 } else {
546 gui()->menuBar()->setVisible(false);
547 }
548}
549
550/**********************************************************************/
555static const char *get_tile_change_menu_text(struct tile *ptile,
556 enum unit_activity activity)
557{
558 struct tile *newtile = tile_virtual_new(ptile);
559 const char *text;
560
561 tile_apply_activity(newtile, activity, nullptr);
562 text = tile_get_info_text(newtile, FALSE, 0);
564
565 return text;
566}
567
568/**********************************************************************/
572 QMenu(_("Government"), parent)
573{
574 // Register ourselves to get updates for free.
575 instances << this;
576 setAttribute(Qt::WA_TranslucentBackground);
577}
578
579/**********************************************************************/
583{
585 instances.remove(this);
586}
587
588/**********************************************************************/
593 struct government *gov, *revol_gov;
594 int gov_count, i;
595
596 // Clear any content
597 foreach(action, QWidget::actions()) {
599 action->deleteLater();
600 }
601 actions.clear();
602
604 actions.reserve(gov_count + 1);
605 action = addAction(_("Revolution..."));
606 action->setShortcut(QKeySequence(tr("ctrl+shift+g")));
607 connect(action, &QAction::triggered, this, &gov_menu::revolution);
608 actions.append(action);
609
610 addSeparator();
611
612 // Add an action for each government. There is no icon yet.
614 for (i = 0; i < gov_count; ++i) {
615 gov = government_by_number(i);
616 if (gov != revol_gov) { // Skip revolution government
617 // Defeat keyboard shortcut mnemonics
619 .replace("&", "&&"));
620 // We need to keep track of the gov <-> action mapping to be able to
621 // set enabled/disabled depending on available govs.
622 actions.append(action);
623 QObject::connect(action, &QAction::triggered, [this,i]() {
624 change_gov(i);
625 });
626 }
627 }
628}
629
630/**********************************************************************/
634{
635 struct government *gov, *revol_gov;
636 struct sprite *sprite;
637 int gov_count, i, j;
638
641 for (i = 0, j = 0; i < gov_count; i++) {
642 gov = government_by_number(i);
643 if (gov != revol_gov) { // Skip revolution government
645 if (sprite != nullptr) {
646 actions[j + 1]->setIcon(QIcon(*(sprite->pm)));
647 }
648 actions[j + 1]->setEnabled(
650 j++;
651 } else {
652 actions[0]->setEnabled(!client_is_observer()
654 }
655 }
656}
657
658/**********************************************************************/
665
666/**********************************************************************/
673
674/**************************************************************************
675 Keeps track of all gov_menu instances.
676**************************************************************************/
678
679/**********************************************************************/
683{
684 foreach (gov_menu *m, instances) {
685 m->create();
686 }
687}
688
689/**********************************************************************/
693{
694 foreach (gov_menu *m, instances) {
695 m->update();
696 }
697}
698
699/**********************************************************************/
703 : QMenu(_("Go to and..."), parent)
704{
705 // Will need auto updates etc.
706 instances << this;
707}
708
709/**********************************************************************/
713{
714 // Updates are no longer needed.
715 instances.remove(this);
716}
717
718/**********************************************************************/
722{
723 // Clear menu item to action ID mapping.
724 items.clear();
725
726 // Remove the menu items
727 clear();
728}
729
730/**********************************************************************/
734{
735 QAction *item;
736 int tgt_kind_group;
737
738 // Group goto and perform action menu items by target kind.
741 struct action *paction = action_by_number(act_id);
743 .replace("&", "&&"));
744
745 if (action_id_get_actor_kind(act_id) != AAK_UNIT) {
746 // This action isn't performed by an unit.
747 continue;
748 }
749
751 // Wrong group.
752 continue;
753 }
754
755 if (action_id_has_complex_target(act_id)) {
757 items.insert(sub_target_menu->menuAction(), act_id);
758
759#define CREATE_SUB_ITEM(_menu_, _act_id_, _sub_tgt_id_, _sub_tgt_name_) \
760 { \
761 QAction *_sub_item_ = _menu_->addAction(_sub_tgt_name_); \
762 int _sub_target_id_ = _sub_tgt_id_; \
763 QObject::connect(_sub_item_, &QAction::triggered, \
764 [this, _act_id_, _sub_target_id_]() { \
765 start_go_act(_act_id_, _sub_target_id_); \
766 }); \
767 }
768
770 case ASTK_BUILDING:
776 break;
777 case ASTK_TECH:
783 break;
784 case ASTK_EXTRA:
786 extra_type_iterate(pextra) {
787 if (!actres_creates_extra(paction->result, pextra)
788 && !actres_removes_extra(paction->result, pextra)) {
789 // Not relevant
790 continue;
791 }
792
794 extra_number(pextra),
795 extra_name_translation(pextra));
797 break;
798 case ASTK_SPECIALIST:
803 break;
804 case ASTK_NONE:
805 // Should not be here.
807 break;
808 case ASTK_COUNT:
809 // Should not exits
811 break;
812 }
813 continue;
814 }
815
816#define ADD_OLD_SHORTCUT(wanted_action_id, sc_id) \
817 if (act_id == wanted_action_id) { \
818 item->setShortcut(QKeySequence(shortcut_to_string( \
819 fc_shortcuts::sc()->get_shortcut(sc_id)))); \
820 }
821
822 /* Create and add the menu item. It will be hidden or shown based on
823 * unit type. */
825 items.insert(item, act_id);
826
827 /* Add the keyboard shortcuts for "Go to and..." menu items that
828 * existed independently before the "Go to and..." menu arrived. */
832
833 QObject::connect(item, &QAction::triggered, [this,act_id]() {
834 start_go_act(act_id, NO_TARGET);
835 });
837 }
838}
839
840/**********************************************************************/
844{
845 bool can_do_something = false;
846
847 if (!actions_are_ready()) {
848 // Nothing to do.
849 return;
850 }
851
852 if (items.isEmpty()) {
853 // The goto and act menu needs menu items.
854 create();
855 }
856
857 /* Enable a menu item if it is theoretically possible that one of the
858 * selected units can perform it. Checking if the action can be performed
859 * at the current tile is pointless since it should be performed at the
860 * target tile. */
861 foreach(QAction *item, items.keys()) {
863 items.value(item), TRUE)) {
864 item->setVisible(true);
865 can_do_something = true;
866 } else {
867 item->setVisible(false);
868 }
869 }
870
871 if (can_do_something) {
872 // At least one menu item is enabled for one of the selected units.
873 setEnabled(true);
874 } else {
875 // No menu item is enabled any of the selected units.
876 setEnabled(false);
877 }
878}
879
880/**********************************************************************/
883void go_act_menu::start_go_act(int act_id, int sub_tgt_id)
884{
885 request_unit_goto(ORDER_PERFORM_ACTION, act_id, sub_tgt_id);
886}
887
888/**************************************************************************
889 Store all goto and act menu items so they can be updated etc
890**************************************************************************/
892
893/**********************************************************************/
897{
898 foreach (go_act_menu *m, instances) {
899 m->reset();
900 }
901}
902
903/**********************************************************************/
907{
908 foreach (go_act_menu *m, instances) {
909 m->update();
910 }
911}
912
913/**********************************************************************/
917{
919 struct tile *ptile = nullptr;
920 struct unit *zunit;
921 struct unit *qunit;
922
923 int i = 0;
924 qunit = punit;
925 foreach (fui, units_list.unit_list) {
926 zunit = unit_list_find(client_player()->units, fui->id);
927 i++;
928 if (i >= pos) {
929 punit = qunit;
930 return ptile;
931 }
932 if (zunit == nullptr) {
933 continue;
934 }
935
936 if (punit == zunit) { // Unit found
937 /* Unit was ordered to attack city so it might stay in
938 front of that city */
940 ptile = tile_before_end_path(punit, fui->ptile);
941 if (ptile == nullptr) {
942 ptile = fui->ptile;
943 }
944 } else {
945 ptile = fui->ptile;
946 }
947 // Unit found in transport
948 } else if (unit_contained_in(punit, zunit)) {
949 ptile = fui->ptile;
950 }
951 }
952 return nullptr;
953}
954
955/**********************************************************************/
958mr_menu::mr_menu() : QMenuBar()
959{
960}
961
962/**********************************************************************/
968{
969 QAction *act;
970 QMenu *sub_menu;
971 QMenu *main_menu;
973 int i;
974
975 delayed_order = false;
976 airlift_type_id = 0;
977 quick_airlifting = false;
978
979 // Game Menu
980 main_menu = this->addMenu(_("Game"));
981
982#ifdef __APPLE__
983 // On Mac, Qt would try to move menu entry named just "Options" to
984 // application menu, but as this is submenu and not an action
985 // 1) It would fail to appear in the destination
986 // 2) It's impossible to override the behavior with QAction::menuRule()
987 // We add an invisible character for the string comparison to fail.
988 sub_menu = main_menu->addMenu(QString("\u200B") + _("Options"));
989#else // __APPLE__
990 sub_menu = main_menu->addMenu(_("Options"));
991#endif // __APPLE__
992
993 act = sub_menu->addAction(_("Set local options"));
994 connect(act, &QAction::triggered, this, &mr_menu::local_options);
995 act = sub_menu->addAction(_("Server Options"));
996 connect(act, &QAction::triggered, this, &mr_menu::server_options);
997 act = sub_menu->addAction(_("Messages"));
998 connect(act, &QAction::triggered, this, &mr_menu::messages_options);
999 act = sub_menu->addAction(_("Shortcuts"));
1000 connect(act, &QAction::triggered, this, &mr_menu::shortcut_options);
1001 act = sub_menu->addAction(_("Load another tileset"));
1002 connect(act, &QAction::triggered, this, &mr_menu::tileset_custom_load);
1003 act = sub_menu->addAction(_("Save Options Now"));
1004 act->setIcon(style()->standardIcon(QStyle::SP_DialogSaveButton));
1005 connect(act, &QAction::triggered, this, &mr_menu::save_options_now);
1006 act = sub_menu->addAction(_("Save Options on Exit"));
1007 act->setCheckable(true);
1008 act->setChecked(gui_options.save_options_on_exit);
1009 connect(act, &QAction::triggered, this, &mr_menu::save_options_exit);
1010 main_menu->addSeparator();
1011 act = main_menu->addAction(_("Save Game"));
1012 act->setShortcut(QKeySequence(tr("Ctrl+s")));
1013 act->setIcon(style()->standardIcon(QStyle::SP_DialogSaveButton));
1014 menu_list.insert(SAVE, act);
1015 connect(act, &QAction::triggered, this, &mr_menu::save_game);
1016 act = main_menu->addAction(_("Save Game As..."));
1017 menu_list.insert(SAVE, act);
1018 act->setIcon(style()->standardIcon(QStyle::SP_DialogSaveButton));
1019 connect(act, &QAction::triggered, this, &mr_menu::save_game_as);
1020 act = main_menu->addAction(_("Save Map to Image"));
1021 connect(act, &QAction::triggered, this, &mr_menu::save_image);
1022 main_menu->addSeparator();
1023 act = main_menu->addAction(_("Volume Up"));
1024 menu_list.insert(AUDIO, act);
1025 act->setShortcut(QKeySequence(tr(">")));
1026 connect(act, &QAction::triggered, this, &mr_menu::volume_up);
1027 act = main_menu->addAction(_("Volume Down"));
1028 menu_list.insert(AUDIO, act);
1029 act->setShortcut(QKeySequence(tr("<")));
1030 connect(act, &QAction::triggered, this, &mr_menu::volume_down);
1031 main_menu->addSeparator();
1032 act = main_menu->addAction(_("Leave game"));
1033 act->setIcon(style()->standardIcon(QStyle::SP_DialogDiscardButton));
1034 connect(act, &QAction::triggered, this, &mr_menu::back_to_menu);
1035 act = main_menu->addAction(_("Quit"));
1036 act->setIcon(style()->standardIcon(QStyle::SP_TitleBarCloseButton));
1037 connect(act, &QAction::triggered, this, &mr_menu::quit_game);
1038
1039 // View Menu
1040 main_menu = this->addMenu(Q_("?verb:View"));
1041 act = main_menu->addAction(_("Center View"));
1042 act->setShortcut(QKeySequence(shortcut_to_string(
1043 fc_shortcuts::sc()->get_shortcut(SC_CENTER_VIEW))));
1044 connect(act, &QAction::triggered, this, &mr_menu::slot_center_view);
1045 main_menu->addSeparator();
1046 act = main_menu->addAction(_("Fullscreen"));
1047 act->setShortcut(QKeySequence(shortcut_to_string(
1048 fc_shortcuts::sc()->get_shortcut(SC_FULLSCREEN))));
1049 act->setCheckable(true);
1050 act->setChecked(gui_options.gui_qt_fullscreen);
1051 connect(act, &QAction::triggered, this, &mr_menu::slot_fullscreen);
1052 main_menu->addSeparator();
1053 minimap_status = main_menu->addAction(_("Minimap"));
1054 minimap_status->setCheckable(true);
1056 fc_shortcuts::sc()->get_shortcut(SC_MINIMAP))));
1057 minimap_status->setChecked(true);
1058 connect(minimap_status, &QAction::triggered, this,
1060 osd_status = main_menu->addAction(_("Show new turn information"));
1061 osd_status->setCheckable(true);
1062 osd_status->setChecked(gui()->qt_settings.show_new_turn_text);
1063 connect(osd_status, &QAction::triggered, this,
1065 btlog_status = main_menu->addAction(_("Show combat detailed information"));
1066 btlog_status->setCheckable(true);
1067 btlog_status->setChecked(gui()->qt_settings.show_battle_log);
1068 connect(btlog_status, &QAction::triggered, this, &mr_menu::slot_battlelog);
1069 lock_status = main_menu->addAction(_("Lock interface"));
1070 lock_status->setCheckable(true);
1072 fc_shortcuts::sc()->get_shortcut(SC_IFACE_LOCK))));
1073 lock_status->setChecked(false);
1074 connect(lock_status, &QAction::triggered, this, &mr_menu::slot_lock);
1075 connect(minimap_status, &QAction::triggered, this, &mr_menu::slot_lock);
1076 main_menu->addSeparator();
1077 act = main_menu->addAction(_("Zoom in"));
1078 act->setShortcut(QKeySequence(shortcut_to_string(
1079 fc_shortcuts::sc()->get_shortcut(SC_ZOOM_IN))));
1080 connect(act, &QAction::triggered, this, &mr_menu::zoom_in);
1081 act = main_menu->addAction(_("Zoom default"));
1082 act->setShortcut(QKeySequence(shortcut_to_string(
1083 fc_shortcuts::sc()->get_shortcut(SC_ZOOM_RESET))));
1084 connect(act, &QAction::triggered, this, &mr_menu::zoom_reset);
1085 act = main_menu->addAction(_("Zoom out"));
1086 act->setShortcut(QKeySequence(shortcut_to_string(
1087 fc_shortcuts::sc()->get_shortcut(SC_ZOOM_OUT))));
1088 connect(act, &QAction::triggered, this, &mr_menu::zoom_out);
1089 scale_fonts_status = main_menu->addAction(_("Scale fonts"));
1090 connect(scale_fonts_status, &QAction::triggered, this,
1092 scale_fonts_status->setCheckable(true);
1093 scale_fonts_status->setChecked(true);
1094 main_menu->addSeparator();
1095 act = main_menu->addAction(_("City Outlines"));
1096 act->setShortcut(QKeySequence(tr("ctrl+y")));
1097 act->setCheckable(true);
1098 act->setChecked(gui_options.draw_city_outlines);
1099 connect(act, &QAction::triggered, this, &mr_menu::slot_city_outlines);
1100 act = main_menu->addAction(_("City Output"));
1101 act->setCheckable(true);
1102 act->setChecked(gui_options.draw_city_output);
1103 act->setShortcut(QKeySequence(shortcut_to_string(
1104 fc_shortcuts::sc()->get_shortcut(SC_CITY_OUTPUT))));
1105 connect(act, &QAction::triggered, this, &mr_menu::slot_city_output);
1106 act = main_menu->addAction(_("Map Grid"));
1107 act->setShortcut(QKeySequence(shortcut_to_string(
1108 fc_shortcuts::sc()->get_shortcut(SC_MAP_GRID))));
1109 act->setCheckable(true);
1110 act->setChecked(gui_options.draw_map_grid);
1111 connect(act, &QAction::triggered, this, &mr_menu::slot_map_grid);
1112 act = main_menu->addAction(_("National Borders"));
1113 act->setCheckable(true);
1114 act->setChecked(gui_options.draw_borders);
1115 act->setShortcut(QKeySequence(shortcut_to_string(
1116 fc_shortcuts::sc()->get_shortcut(SC_NAT_BORDERS))));
1117 connect(act, &QAction::triggered, this, &mr_menu::slot_borders);
1118 act = main_menu->addAction(_("Native Tiles"));
1119 act->setCheckable(true);
1120 act->setChecked(gui_options.draw_native);
1121 act->setShortcut(QKeySequence(tr("ctrl+shift+n")));
1122 connect(act, &QAction::triggered, this, &mr_menu::slot_native_tiles);
1123 act = main_menu->addAction(_("City Full Bar"));
1124 act->setCheckable(true);
1125 act->setShortcut(QKeySequence(shortcut_to_string(
1126 fc_shortcuts::sc()->get_shortcut(SC_SHOW_FULLBAR))));
1127 act->setChecked(gui_options.draw_full_citybar);
1128 connect(act, &QAction::triggered, this, &mr_menu::slot_fullbar);
1129 act = main_menu->addAction(_("City Names"));
1130 act->setCheckable(true);
1131 act->setChecked(gui_options.draw_city_names);
1132 act->setShortcut(QKeySequence(shortcut_to_string(
1133 fc_shortcuts::sc()->get_shortcut(SC_CITY_NAMES))));
1134 connect(act, &QAction::triggered, this, &mr_menu::slot_city_names);
1135 act = main_menu->addAction(_("City Growth"));
1136 act->setCheckable(true);
1137 act->setChecked(gui_options.draw_city_growth);
1138 act->setShortcut(QKeySequence(tr("ctrl+o")));
1139 connect(act, &QAction::triggered, this, &mr_menu::slot_city_growth);
1140 act = main_menu->addAction(_("City Production"));
1141 act->setCheckable(true);
1142 act->setChecked(gui_options.draw_city_productions);
1143 act->setShortcut(QKeySequence(shortcut_to_string(
1144 fc_shortcuts::sc()->get_shortcut(SC_CITY_PROD))));
1145 connect(act, &QAction::triggered, this, &mr_menu::slot_city_production);
1146 act = main_menu->addAction(_("City Buy Cost"));
1147 act->setCheckable(true);
1148 act->setChecked(gui_options.draw_city_buycost);
1149 connect(act, &QAction::triggered, this, &mr_menu::slot_city_buycost);
1150 act = main_menu->addAction(_("City Trade Routes"));
1151 act->setCheckable(true);
1152 act->setChecked(gui_options.draw_city_trade_routes);
1153 act->setShortcut(QKeySequence(shortcut_to_string(
1154 fc_shortcuts::sc()->get_shortcut(SC_TRADE_ROUTES))));
1155 connect(act, &QAction::triggered, this, &mr_menu::slot_city_trade_routes);
1156 act = main_menu->addAction(_("Unit Stack Size"));
1157 act->setCheckable(true);
1158 act->setChecked(gui_options.draw_unit_stack_size);
1159 act->setShortcut(QKeySequence(shortcut_to_string(
1160 fc_shortcuts::sc()->get_shortcut(SC_STACK_SIZE))));
1161 connect(act, &QAction::triggered, this, &mr_menu::slot_stack_size);
1162
1163 // Select Menu
1164 main_menu = this->addMenu(_("Select"));
1165 act = main_menu->addAction(_("Single Unit (Unselect Others)"));
1166 act->setShortcut(QKeySequence(tr("z")));
1167 menu_list.insert(STANDARD, act);
1168 connect(act, &QAction::triggered, this, &mr_menu::slot_select_one);
1169 act = main_menu->addAction(_("All On Tile"));
1170 act->setShortcut(QKeySequence(tr("v")));
1171 menu_list.insert(STANDARD, act);
1172 connect(act, &QAction::triggered, this, &mr_menu::slot_select_all_tile);
1173 main_menu->addSeparator();
1174 act = main_menu->addAction(_("Same Type on Tile"));
1175 act->setShortcut(QKeySequence(tr("shift+v")));
1176 menu_list.insert(STANDARD, act);
1177 connect(act, &QAction::triggered, this, &mr_menu::slot_select_same_tile);
1178 act = main_menu->addAction(_("Same Type on Continent"));
1179 act->setShortcut(QKeySequence(tr("shift+c")));
1180 menu_list.insert(STANDARD, act);
1181 connect(act, &QAction::triggered, this,
1183 act = main_menu->addAction(_("Same Type Everywhere"));
1184 act->setShortcut(QKeySequence(tr("shift+x")));
1185 menu_list.insert(STANDARD, act);
1186 connect(act, &QAction::triggered, this,
1188 main_menu->addSeparator();
1189 act = main_menu->addAction(_("Wait"));
1190 act->setShortcut(QKeySequence(shortcut_to_string(
1191 fc_shortcuts::sc()->get_shortcut(SC_WAIT))));
1192 menu_list.insert(STANDARD, act);
1193 connect(act, &QAction::triggered, this, &mr_menu::slot_wait);
1194 act = main_menu->addAction(_("Done"));
1195 act->setShortcut(QKeySequence(shortcut_to_string(
1196 fc_shortcuts::sc()->get_shortcut(SC_DONE_MOVING))));
1197 menu_list.insert(STANDARD, act);
1198 connect(act, &QAction::triggered, this, &mr_menu::slot_done_moving);
1199
1200 act = main_menu->addAction(_("Advanced unit selection"));
1201 act->setShortcut(QKeySequence(tr("ctrl+e")));
1202 menu_list.insert(NOT_4_OBS, act);
1203 connect(act, &QAction::triggered, this, &mr_menu::slot_unit_filter);
1204
1205 // Unit Menu
1206 main_menu = this->addMenu(_("Unit"));
1207 act = main_menu->addAction(_("Go to Tile"));
1208 act->setShortcut(QKeySequence(shortcut_to_string(
1209 fc_shortcuts::sc()->get_shortcut(SC_GOTO))));
1210 menu_list.insert(STANDARD, act);
1211 connect(act, &QAction::triggered, this, &mr_menu::slot_unit_goto);
1212
1213 // The goto and act sub menu is handled as a separate object.
1214 main_menu->addMenu(new go_act_menu(this));
1215
1216 act = main_menu->addAction(_("Go to Nearest City"));
1217 act->setShortcut(QKeySequence(tr("shift+g")));
1218 menu_list.insert(GOTO_CITY, act);
1219 connect(act, &QAction::triggered, this, &mr_menu::slot_return_to_city);
1220 act = main_menu->addAction(_("Go to/Airlift to City..."));
1221 act->setShortcut(QKeySequence(shortcut_to_string(
1222 fc_shortcuts::sc()->get_shortcut(SC_GOTOAIRLIFT))));
1223 menu_list.insert(AIRLIFT, act);
1224 connect(act, &QAction::triggered, this, &mr_menu::slot_airlift);
1225 main_menu->addSeparator();
1226 act = main_menu->addAction(_("Auto Explore"));
1227 menu_list.insert(EXPLORE, act);
1228 act->setShortcut(QKeySequence(shortcut_to_string(
1229 fc_shortcuts::sc()->get_shortcut(SC_AUTOEXPLORE))));
1230 connect(act, &QAction::triggered, this, &mr_menu::slot_unit_explore);
1231 act = main_menu->addAction(_("Patrol"));
1232 menu_list.insert(STANDARD, act);
1233 act->setEnabled(false);
1234 act->setShortcut(QKeySequence(shortcut_to_string(
1235 fc_shortcuts::sc()->get_shortcut(SC_PATROL))));
1236 connect(act, &QAction::triggered, this, &mr_menu::slot_patrol);
1237 main_menu->addSeparator();
1238 act = main_menu->addAction(_("Sentry"));
1239 act->setShortcut(QKeySequence(shortcut_to_string(
1240 fc_shortcuts::sc()->get_shortcut(SC_SENTRY))));
1241 menu_list.insert(SENTRY, act);
1242 connect(act, &QAction::triggered, this, &mr_menu::slot_unit_sentry);
1243 act = main_menu->addAction(_("Unsentry All On Tile"));
1244 act->setShortcut(QKeySequence(shortcut_to_string(
1245 fc_shortcuts::sc()->get_shortcut(SC_UNSENTRY_TILE))));
1246 menu_list.insert(WAKEUP, act);
1247 connect(act, &QAction::triggered, this, &mr_menu::slot_unsentry);
1248 main_menu->addSeparator();
1249 act = main_menu->addAction(_("Load"));
1250 act->setShortcut(QKeySequence(shortcut_to_string(
1251 fc_shortcuts::sc()->get_shortcut(SC_BOARD))));
1252 menu_list.insert(BOARD, act);
1253 connect(act, &QAction::triggered, this, &mr_menu::slot_board);
1254 act = main_menu->addAction(_("Unload"));
1255 act->setShortcut(QKeySequence(shortcut_to_string(
1256 fc_shortcuts::sc()->get_shortcut(SC_DEBOARD))));
1257 menu_list.insert(DEBOARD, act);
1258 connect(act, &QAction::triggered, this, &mr_menu::slot_deboard);
1259 act = main_menu->addAction(_("Unload All From Transporter"));
1260 act->setShortcut(QKeySequence(tr("shift+t")));
1261 menu_list.insert(TRANSPORTER, act);
1262 connect(act, &QAction::triggered, this, &mr_menu::slot_unload_all);
1263 main_menu->addSeparator();
1264
1265 // Defeat keyboard shortcut mnemonics
1267 .replace("&", "&&"));
1268 menu_list.insert(HOMECITY, act);
1269 act->setShortcut(QKeySequence(shortcut_to_string(
1270 fc_shortcuts::sc()->get_shortcut(SC_SETHOME))));
1271 connect(act, &QAction::triggered, this, &mr_menu::slot_set_home);
1272 act = main_menu->addAction(_("Upgrade"));
1273 act->setShortcut(QKeySequence(shortcut_to_string(
1274 fc_shortcuts::sc()->get_shortcut(SC_UPGRADE_UNIT))));
1275 menu_list.insert(UPGRADE, act);
1276 connect(act, &QAction::triggered, this, &mr_menu::slot_upgrade);
1277 act = main_menu->addAction(_("Convert"));
1278 act->setShortcut(QKeySequence(tr("shift+o")));
1279 menu_list.insert(CONVERT, act);
1280 connect(act, &QAction::triggered, this, &mr_menu::slot_convert);
1281 act = main_menu->addAction(_("Disband"));
1282 act->setShortcut(QKeySequence(tr("shift+d")));
1283 menu_list.insert(DISBAND, act);
1284 connect(act, &QAction::triggered, this, &mr_menu::slot_disband);
1285
1286 // Combat Menu
1287 main_menu = this->addMenu(_("Combat"));
1288 act = main_menu->addAction(_("Fortify Unit"));
1289 menu_list.insert(FORTIFY, act);
1290 act->setShortcut(QKeySequence(shortcut_to_string(
1291 fc_shortcuts::sc()->get_shortcut(SC_FORTIFY))));
1292 connect(act, &QAction::triggered, this, &mr_menu::slot_unit_fortify);
1293 act = main_menu->addAction(QString(Q_(terrain_control.gui_type_base0))
1294 .replace("&", "&&"));
1295 menu_list.insert(FORTRESS, act);
1296 act->setShortcut(QKeySequence(tr("shift+f")));
1297 connect(act, &QAction::triggered, this, &mr_menu::slot_unit_fortress);
1298 act = main_menu->addAction(QString(Q_(terrain_control.gui_type_base1))
1299 .replace("&", "&&"));
1300 menu_list.insert(AIRBASE, act);
1301 act->setShortcut(QKeySequence(tr("shift+e")));
1302 connect(act, &QAction::triggered, this, &mr_menu::slot_unit_airbase);
1303 bases_menu = main_menu->addMenu(_("Build Base"));
1304 main_menu->addSeparator();
1305 act = main_menu->addAction(_("Paradrop"));
1306 menu_list.insert(PARADROP, act);
1307 act->setShortcut(QKeySequence(shortcut_to_string(
1308 fc_shortcuts::sc()->get_shortcut(SC_PARADROP))));
1309 connect(act, &QAction::triggered, this, &mr_menu::slot_paradrop);
1310 act = main_menu->addAction(_("Pillage"));
1311 menu_list.insert(PILLAGE, act);
1312 act->setShortcut(QKeySequence(tr("shift+p")));
1313 connect(act, &QAction::triggered, this, &mr_menu::slot_pillage);
1314 // TRANS: Menu item to bring up the action selection dialog.
1315 act = main_menu->addAction(_("Do..."));
1316 menu_list.insert(ORDER_DIPLOMAT_DLG, act);
1317 act->setShortcut(QKeySequence(shortcut_to_string(
1318 fc_shortcuts::sc()->get_shortcut(SC_DO))));
1319 connect(act, &QAction::triggered, this, &mr_menu::slot_action);
1320
1321 // Work Menu
1322 main_menu = this->addMenu(_("Work"));
1324 .replace("&", "&&"));
1325 act->setShortcut(QKeySequence(shortcut_to_string(
1326 fc_shortcuts::sc()->get_shortcut(SC_BUILDCITY))));
1327 menu_list.insert(BUILD, act);
1328 connect(act, &QAction::triggered, this, &mr_menu::slot_build_city);
1329 act = main_menu->addAction(_("Auto Worker"));
1330 act->setShortcut(QKeySequence(shortcut_to_string(
1331 fc_shortcuts::sc()->get_shortcut(SC_AUTOMATE))));
1332 menu_list.insert(AUTOWORKER, act);
1333 connect(act, &QAction::triggered, this, &mr_menu::slot_auto_worker);
1334 main_menu->addSeparator();
1335 act = main_menu->addAction(_("Build Road"));
1336 menu_list.insert(ROAD, act);
1337 act->setShortcut(QKeySequence(shortcut_to_string(
1338 fc_shortcuts::sc()->get_shortcut(SC_BUILDROAD))));
1339 connect(act, &QAction::triggered, this, &mr_menu::slot_build_road);
1340 roads_menu = main_menu->addMenu(_("Build Path"));
1341 act = main_menu->addAction(_("Build Irrigation"));
1342 act->setShortcut(QKeySequence(shortcut_to_string(
1343 fc_shortcuts::sc()->get_shortcut(SC_BUILDIRRIGATION))));
1344 menu_list.insert(IRRIGATION, act);
1345 connect(act, &QAction::triggered, this, &mr_menu::slot_build_irrigation);
1346 act = main_menu->addAction(_("Cultivate"));
1347 act->setShortcut(QKeySequence(shortcut_to_string(
1348 fc_shortcuts::sc()->get_shortcut(SC_CULTIVATE))));
1349 menu_list.insert(CULTIVATE, act);
1350 connect(act, &QAction::triggered, this, &mr_menu::slot_cultivate);
1351 act = main_menu->addAction(_("Build Mine"));
1352 act->setShortcut(QKeySequence(shortcut_to_string(
1353 fc_shortcuts::sc()->get_shortcut(SC_BUILDMINE))));
1354 menu_list.insert(MINE, act);
1355 connect(act, &QAction::triggered, this, &mr_menu::slot_build_mine);
1356 act = main_menu->addAction(_("Plant"));
1357 act->setShortcut(QKeySequence(shortcut_to_string(
1358 fc_shortcuts::sc()->get_shortcut(SC_PLANT))));
1359 menu_list.insert(PLANT, act);
1360 connect(act, &QAction::triggered, this, &mr_menu::slot_plant);
1361 main_menu->addSeparator();
1362 act = main_menu->addAction(_("Connect With Road"));
1363 act->setShortcut(QKeySequence(tr("ctrl+r")));
1364 menu_list.insert(CONNECT_ROAD, act);
1365 connect(act, &QAction::triggered, this, &mr_menu::slot_conn_road);
1366 act = main_menu->addAction(_("Connect With Railroad"));
1367 menu_list.insert(CONNECT_RAIL, act);
1368 act->setShortcut(QKeySequence(tr("ctrl+l")));
1369 connect(act, &QAction::triggered, this, &mr_menu::slot_conn_rail);
1370 act = main_menu->addAction(_("Connect With Maglev"));
1371 menu_list.insert(CONNECT_MAGLEV, act);
1372 act->setShortcut(QKeySequence(tr("ctrl+m")));
1373 connect(act, &QAction::triggered, this, &mr_menu::slot_conn_maglev);
1374 act = main_menu->addAction(_("Connect With Irrigation"));
1375 menu_list.insert(CONNECT_IRRIGATION, act);
1376 act->setShortcut(QKeySequence(tr("ctrl+i")));
1377 connect(act, &QAction::triggered, this, &mr_menu::slot_conn_irrigation);
1378 main_menu->addSeparator();
1379 act = main_menu->addAction(_("Transform Terrain"));
1380 menu_list.insert(TRANSFORM, act);
1381 act->setShortcut(QKeySequence(shortcut_to_string(
1382 fc_shortcuts::sc()->get_shortcut(SC_TRANSFORM))));
1383 connect(act, &QAction::triggered, this, &mr_menu::slot_transform);
1384 act = main_menu->addAction(_("Clean"));
1385 menu_list.insert(CLEAN, act);
1386 act->setShortcut(QKeySequence(shortcut_to_string(
1387 fc_shortcuts::sc()->get_shortcut(SC_CLEAN))));
1388 connect(act, &QAction::triggered, this, &mr_menu::slot_clean);
1390 .replace("&", "&&"));
1391 act->setShortcut(QKeySequence(tr("b")));
1392 menu_list.insert(BUILD_WONDER, act);
1393 connect(act, &QAction::triggered, this, &mr_menu::slot_build_city);
1395 .replace("&", "&&"));
1396 act->setShortcut(QKeySequence(tr("r")));
1397 menu_list.insert(ORDER_TRADE_ROUTE, act);
1398 connect(act, &QAction::triggered, this, &mr_menu::slot_build_road);
1399
1400 // Multiplayer Menu
1401 multiplayer_menu = this->addMenu(_("Multiplayer"));
1402 act = multiplayer_menu->addAction(_("Delayed Goto"));
1403 act->setShortcut(QKeySequence(tr("z")));
1404 connect(act, &QAction::triggered, this, &mr_menu::slot_delayed_goto);
1405 act = multiplayer_menu->addAction(_("Delayed Orders Execute"));
1406 act->setShortcut(QKeySequence(tr("ctrl+z")));
1407 connect(act, &QAction::triggered, this, &mr_menu::slot_execute_orders);
1408 act = multiplayer_menu->addAction(_("Clear Orders"));
1409 act->setShortcut(QKeySequence(tr("ctrl+shift+c")));
1410 connect(act, &QAction::triggered, this, &mr_menu::slot_orders_clear);
1411 act = multiplayer_menu->addAction(_("Add all cities to trade planning"));
1412 connect(act, &QAction::triggered, this, &mr_menu::slot_trade_add_all);
1413 act = multiplayer_menu->addAction(_("Calculate trade planning"));
1414 connect(act, &QAction::triggered, this, &mr_menu::slot_calculate);
1415 act = multiplayer_menu->addAction(_("Add/Remove City"));
1416 act->setShortcut(QKeySequence(tr("ctrl+t")));
1417 connect(act, &QAction::triggered, this, &mr_menu::slot_trade_city);
1418 act = multiplayer_menu->addAction(_("Clear Trade Planning"));
1419 connect(act, &QAction::triggered, this, &mr_menu::slot_clear_trade);
1420 act = multiplayer_menu->addAction(_("Automatic caravan"));
1421 menu_list.insert(AUTOTRADEROUTE, act);
1422 connect(act, &QAction::triggered, this, &mr_menu::slot_autocaravan);
1423 act->setShortcut(QKeySequence(tr("ctrl+j")));
1424 act = multiplayer_menu->addAction(_("Set/Unset rally point"));
1425 act->setShortcut(QKeySequence(tr("shift+ctrl+r")));
1426 connect(act, &QAction::triggered, this, &mr_menu::slot_rally);
1427 act = multiplayer_menu->addAction(_("Quick Airlift"));
1428 act->setShortcut(QKeySequence(tr("shift+ctrl+y")));
1429 connect(act, &QAction::triggered, this, &mr_menu::slot_quickairlift);
1430 airlift_type = new QActionGroup(this);
1431 airlift_menu = multiplayer_menu->addMenu(_("Unit type for quickairlifting"));
1432
1433 // Default diplo
1434 action_vs_city = new QActionGroup(this);
1435 action_vs_unit = new QActionGroup(this);
1436 action_unit_menu = multiplayer_menu->addMenu(_("Default action vs unit"));
1437
1438 act = action_unit_menu->addAction(_("Ask"));
1439 act->setCheckable(true);
1440 act->setChecked(true);
1441 act->setData(-1);
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(_("Bribe Unit"));
1446 act->setCheckable(true);
1447 act->setChecked(false);
1448 act->setData(ACTION_SPY_BRIBE_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"));
1453 act->setCheckable(true);
1454 act->setChecked(false);
1455 act->setData(ACTION_SPY_SABOTAGE_UNIT);
1456 action_vs_unit->addAction(act);
1457 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_unit);
1458
1459 act = action_unit_menu->addAction(_("Sabotage Unit Escape"));
1460 act->setCheckable(true);
1461 act->setChecked(false);
1462 act->setData(ACTION_SPY_SABOTAGE_UNIT_ESC);
1463 action_vs_unit->addAction(act);
1464 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_unit);
1465
1466 action_city_menu = multiplayer_menu->addMenu(_("Default action vs city"));
1467 act = action_city_menu->addAction(_("Ask"));
1468 act->setCheckable(true);
1469 act->setChecked(true);
1470 act->setData(-1);
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"));
1475 act->setCheckable(true);
1476 act->setChecked(false);
1477 act->setData(ACTION_SPY_INVESTIGATE_CITY);
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(_("Investigate city (spends the unit)"));
1482 act->setCheckable(true);
1483 act->setChecked(false);
1484 act->setData(ACTION_INV_CITY_SPEND);
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(_("Establish embassy"));
1489 act->setCheckable(true);
1490 act->setChecked(false);
1491 act->setData(ACTION_ESTABLISH_EMBASSY);
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(_("Become Ambassador"));
1496 act->setCheckable(true);
1497 act->setChecked(false);
1498 act->setData(ACTION_ESTABLISH_EMBASSY_STAY);
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"));
1503 act->setCheckable(true);
1504 act->setChecked(false);
1505 act->setData(ACTION_SPY_STEAL_TECH);
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(_("Steal technology and escape"));
1510 act->setCheckable(true);
1511 act->setChecked(false);
1512 act->setData(ACTION_SPY_STEAL_TECH_ESC);
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"));
1517 act->setCheckable(true);
1518 act->setChecked(false);
1519 act->setData(ACTION_SPY_INCITE_CITY);
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(_("Incite a Revolt and Escape"));
1524 act->setCheckable(true);
1525 act->setChecked(false);
1526 act->setData(ACTION_SPY_INCITE_CITY_ESC);
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"));
1531 act->setCheckable(true);
1532 act->setChecked(false);
1533 act->setData(ACTION_SPY_POISON);
1534 action_vs_city->addAction(act);
1535 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1536
1537 act = action_city_menu->addAction(_("Poison City Escape"));
1538 act->setCheckable(true);
1539 act->setChecked(false);
1540 act->setData(ACTION_SPY_POISON_ESC);
1541 action_vs_city->addAction(act);
1542 connect(act, &QAction::triggered, this, &mr_menu::slot_action_vs_city);
1543
1544 // Civilization menu
1545 main_menu = this->addMenu(_("Civilization"));
1546 act = main_menu->addAction(_("Tax Rates..."));
1547 act->setShortcut(QKeySequence(tr("ctrl+t")));
1548 menu_list.insert(NOT_4_OBS, act);
1549 connect(act, &QAction::triggered, this, &mr_menu::slot_popup_tax_rates);
1550 main_menu->addSeparator();
1551
1552 act = main_menu->addAction(_("Policies..."));
1553 menu_list.insert(MULTIPLIERS, act);
1554 connect(act, &QAction::triggered, this, &mr_menu::slot_popup_mult_rates);
1555 main_menu->addSeparator();
1556
1557 main_menu->addMenu(new class gov_menu(this));
1558 main_menu->addSeparator();
1559
1560 act = main_menu->addAction(Q_("?noun:View"));
1561 act->setShortcut(QKeySequence(tr("F1")));
1562 connect(act, &QAction::triggered, this, &mr_menu::slot_show_map);
1563
1564 act = main_menu->addAction(_("Units"));
1565 act->setShortcut(QKeySequence(tr("F2")));
1566 connect(act, &QAction::triggered, this, &mr_menu::slot_show_units_report);
1567
1568 act = main_menu->addAction(_("Nations"));
1569 act->setShortcut(QKeySequence(tr("F3")));
1570 connect(act, &QAction::triggered, this, &mr_menu::slot_show_nations);
1571
1572 act = main_menu->addAction(_("Cities"));
1573 act->setShortcut(QKeySequence(tr("F4")));
1574 connect(act, &QAction::triggered, this, &mr_menu::slot_show_cities);
1575
1576 act = main_menu->addAction(_("Economy"));
1577 act->setShortcut(QKeySequence(tr("F5")));
1578 connect(act, &QAction::triggered, this, &mr_menu::slot_show_eco_report);
1579
1580 act = main_menu->addAction(_("Research"));
1581 act->setShortcut(QKeySequence(tr("F6")));
1582 connect(act, &QAction::triggered, this, &mr_menu::slot_show_research_tab);
1583
1584 act = main_menu->addAction(_("Wonders of the World"));
1585 act->setShortcut(QKeySequence(tr("F7")));
1586 connect(act, &QAction::triggered, this, &mr_menu::slot_traveler);
1587
1588 act = main_menu->addAction(_("Top Cities"));
1589 act->setShortcut(QKeySequence(tr("F8")));
1590 menu_list.insert(TOP_CITIES, act);
1591 connect(act, &QAction::triggered, this, &mr_menu::slot_top_cities);
1592
1593 act = main_menu->addAction(_("Demographics"));
1594 act->setShortcut(QKeySequence(tr("F11")));
1595 connect(act, &QAction::triggered, this, &mr_menu::slot_demographics);
1596
1597 act = main_menu->addAction(_("Spaceship"));
1598 act->setShortcut(QKeySequence(tr("F12")));
1599 connect(act, &QAction::triggered, this, &mr_menu::slot_spaceship);
1600
1601 act = main_menu->addAction(_("Achievements"));
1602 connect(act, &QAction::triggered, this, &mr_menu::slot_achievements);
1603
1604 act = main_menu->addAction(_("Endgame report"));
1605 menu_list.insert(ENDGAME, act);
1606 connect(act, &QAction::triggered, this, &mr_menu::slot_endgame);
1607
1608 // Battle Groups Menu
1609 main_menu = this->addMenu(_("Battle Groups"));
1610
1611 act = main_menu->addAction(_("Select Battle Group 1"));
1612 act->setShortcut(QKeySequence(tr("Shift+F1")));
1613 connect(act, &QAction::triggered, this, &mr_menu::slot_bg1select);
1614
1615 act = main_menu->addAction(_("Assign Battle Group 1"));
1616 act->setShortcut(QKeySequence(tr("Ctrl+F1")));
1617 connect(act, &QAction::triggered, this, &mr_menu::slot_bg1assign);
1618
1619 act = main_menu->addAction(_("Append to Battle Group 1"));
1620 act->setShortcut(QKeySequence(tr("Ctrl+Shift+F1")));
1621 connect(act, &QAction::triggered, this, &mr_menu::slot_bg1append);
1622
1623 act = main_menu->addAction(_("Select Battle Group 2"));
1624 act->setShortcut(QKeySequence(tr("Shift+F2")));
1625 connect(act, &QAction::triggered, this, &mr_menu::slot_bg2select);
1626
1627 act = main_menu->addAction(_("Assign Battle Group 2"));
1628 act->setShortcut(QKeySequence(tr("Ctrl+F2")));
1629 connect(act, &QAction::triggered, this, &mr_menu::slot_bg2assign);
1630
1631 act = main_menu->addAction(_("Append to Battle Group 2"));
1632 act->setShortcut(QKeySequence(tr("Ctrl+Shift+F2")));
1633 connect(act, &QAction::triggered, this, &mr_menu::slot_bg2append);
1634
1635 act = main_menu->addAction(_("Select Battle Group 3"));
1636 act->setShortcut(QKeySequence(tr("Shift+F3")));
1637 connect(act, &QAction::triggered, this, &mr_menu::slot_bg3select);
1638
1639 act = main_menu->addAction(_("Assign Battle Group 3"));
1640 act->setShortcut(QKeySequence(tr("Ctrl+F3")));
1641 connect(act, &QAction::triggered, this, &mr_menu::slot_bg3assign);
1642
1643 act = main_menu->addAction(_("Append to Battle Group 3"));
1644 act->setShortcut(QKeySequence(tr("Ctrl+Shift+F3")));
1645 connect(act, &QAction::triggered, this, &mr_menu::slot_bg3append);
1646
1647 act = main_menu->addAction(_("Select Battle Group 4"));
1648 act->setShortcut(QKeySequence(tr("Shift+F4")));
1649 connect(act, &QAction::triggered, this, &mr_menu::slot_bg4select);
1650
1651 act = main_menu->addAction(_("Assign Battle Group 4"));
1652 act->setShortcut(QKeySequence(tr("Ctrl+F4")));
1653 connect(act, &QAction::triggered, this, &mr_menu::slot_bg4assign);
1654
1655 act = main_menu->addAction(_("Append to Battle Group 4"));
1656 act->setShortcut(QKeySequence(tr("Ctrl+Shift+F4")));
1657 connect(act, &QAction::triggered, this, &mr_menu::slot_bg4append);
1658
1659 // Help Menu
1660 main_menu = this->addMenu(_("Help"));
1661
1662 act = main_menu->addAction(Q_(HELP_OVERVIEW_ITEM));
1663 QObject::connect(act, &QAction::triggered, [this]() {
1665 });
1666
1667 act = main_menu->addAction(Q_(HELP_PLAYING_ITEM));
1668 QObject::connect(act, &QAction::triggered, [this]() {
1670 });
1671
1672 act = main_menu->addAction(Q_(HELP_TERRAIN_ITEM));
1673 QObject::connect(act, &QAction::triggered, [this]() {
1675 });
1676
1677 act = main_menu->addAction(Q_(HELP_ECONOMY_ITEM));
1678 QObject::connect(act, &QAction::triggered, [this]() {
1680 });
1681
1682 act = main_menu->addAction(Q_(HELP_CITIES_ITEM));
1683 QObject::connect(act, &QAction::triggered, [this]() {
1685 });
1686
1687 act = main_menu->addAction(Q_(HELP_IMPROVEMENTS_ITEM));
1688 QObject::connect(act, &QAction::triggered, [this]() {
1690 });
1691
1692 act = main_menu->addAction(Q_(HELP_WONDERS_ITEM));
1693 QObject::connect(act, &QAction::triggered, [this]() {
1695 });
1696
1697 act = main_menu->addAction(Q_(HELP_UNITS_ITEM));
1698 QObject::connect(act, &QAction::triggered, [this]() {
1700 });
1701
1702 act = main_menu->addAction(Q_(HELP_COMBAT_ITEM));
1703 QObject::connect(act, &QAction::triggered, [this]() {
1705 });
1706
1707 act = main_menu->addAction(Q_(HELP_COUNTER_ITEM));
1708 QObject::connect(act, &QAction::triggered, [this]() {
1710 });
1711
1712 act = main_menu->addAction(Q_(HELP_ZOC_ITEM));
1713 QObject::connect(act, &QAction::triggered, [this]() {
1715 });
1716
1717 act = main_menu->addAction(Q_(HELP_GOVERNMENT_ITEM));
1718 QObject::connect(act, &QAction::triggered, [this]() {
1720 });
1721
1722 act = main_menu->addAction(Q_(HELP_MULTIPLIER_ITEM));
1723 QObject::connect(act, &QAction::triggered, [this]() {
1725 });
1726
1727 act = main_menu->addAction(Q_(HELP_DIPLOMACY_ITEM));
1728 QObject::connect(act, &QAction::triggered, [this]() {
1730 });
1731
1732 act = main_menu->addAction(Q_(HELP_TECHS_ITEM));
1733 QObject::connect(act, &QAction::triggered, [this]() {
1735 });
1736
1737 act = main_menu->addAction(Q_(HELP_SPACE_RACE_ITEM));
1738 QObject::connect(act, &QAction::triggered, [this]() {
1740 });
1741
1742 act = main_menu->addAction(Q_(HELP_RULESET_ITEM));
1743#ifdef __APPLE__
1744 // only needed on Mac, prevents qt from moving the menu item
1745 act->setMenuRole(QAction::NoRole);
1746#endif // __APPLE__
1747 QObject::connect(act, &QAction::triggered, [this]() {
1749 });
1750
1751 act = main_menu->addAction(Q_(HELP_TILESET_ITEM));
1752#ifdef __APPLE__
1753 // only needed on Mac, prevents qt from moving the menu item
1754 act->setMenuRole(QAction::NoRole);
1755#endif // __APPLE__
1756 QObject::connect(act, &QAction::triggered, [this]() {
1758 });
1759
1760 act = main_menu->addAction(Q_(HELP_MUSICSET_ITEM));
1761#ifdef __APPLE__
1762 // only needed on Mac, prevents qt from moving the menu item
1763 act->setMenuRole(QAction::NoRole);
1764#endif // __APPLE__
1765 QObject::connect(act, &QAction::triggered, [this]() {
1767 });
1768
1769 act = main_menu->addAction(Q_(HELP_NATIONS_ITEM));
1770#ifdef __APPLE__
1771 // only needed on Mac, prevents qt from moving the menu item
1772 act->setMenuRole(QAction::NoRole);
1773#endif // __APPLE__
1774 QObject::connect(act, &QAction::triggered, [this]() {
1776 });
1777
1778 main_menu->addSeparator();
1779
1780 act = main_menu->addAction(Q_(HELP_CONNECTING_ITEM));
1781 QObject::connect(act, &QAction::triggered, [this]() {
1783 });
1784
1785 act = main_menu->addAction(Q_(HELP_CONTROLS_ITEM));
1786 QObject::connect(act, &QAction::triggered, [this]() {
1788 });
1789
1790 act = main_menu->addAction(Q_(HELP_CMA_ITEM));
1791 QObject::connect(act, &QAction::triggered, [this]() {
1793 });
1794
1795 act = main_menu->addAction(Q_(HELP_CHATLINE_ITEM));
1796 QObject::connect(act, &QAction::triggered, [this]() {
1798 });
1799
1800 act = main_menu->addAction(Q_(HELP_WORKLIST_EDITOR_ITEM));
1801 QObject::connect(act, &QAction::triggered, [this]() {
1803 });
1804
1805 main_menu->addSeparator();
1806
1807 act = main_menu->addAction(Q_(HELP_LANGUAGES_ITEM));
1808 QObject::connect(act, &QAction::triggered, [this]() {
1810 });
1811
1812 act = main_menu->addAction(Q_(HELP_COPYING_ITEM));
1813 QObject::connect(act, &QAction::triggered, [this]() {
1815 });
1816
1817 act = main_menu->addAction(Q_(HELP_ABOUT_ITEM));
1818#ifdef __APPLE__
1819 // only needed on Mac, prevents qt from moving the menu item
1820 act->setMenuRole(QAction::NoRole);
1821#endif // __APPLE__
1822 QObject::connect(act, &QAction::triggered, [this]() {
1824 });
1825
1826 menus = this->findChildren<QMenu*>();
1827 for (i = 0; i < menus.count(); i++) {
1828 menus[i]->setAttribute(Qt::WA_TranslucentBackground);
1829 }
1830
1831 this->setVisible(false);
1832}
1833
1834/**********************************************************************/
1838{
1839 for (int i = 0; i < units_list.nr_units; i++) {
1840 units_list.unit_list.at(units_list.unit_list.count() - i -1)->ptile = ptile;
1841 }
1842}
1843
1844/**********************************************************************/
1850{
1851 foreach (QAction *a, m->actions()) {
1852 if (a->shortcut() == seq && a->isEnabled()) {
1853 a->activate(QAction::Trigger);
1854 return TRUE;
1855 }
1856 }
1857
1858 return FALSE;
1859}
1860
1861/**********************************************************************/
1865{
1869
1870 if (sid == SC_GOTO) {
1871 gui()->mapview_wdg->menu_click = true;
1873 return;
1874 }
1875 fcs = fc_shortcuts::sc()->get_shortcut(static_cast<shortcut_id>(sid));
1877
1879 foreach (const QMenu *m, menus) {
1881 return;
1882 }
1883 }
1884}
1885
1886/**********************************************************************/
1893{
1894 foreach (QAction *a, m->actions()) {
1895 if (a->shortcut() == seq && fcs->mouse == Qt::AllButtons) {
1896 *ret = a->text();
1897
1898 return TRUE;
1899 }
1900 }
1901
1902 return FALSE;
1903}
1904
1905/**********************************************************************/
1909{
1912
1915 foreach (const QMenu *m, menus) {
1916 QString ret;
1917
1918 if (shortcut_exist_inner(m, seq, fcs, &ret)) {
1919 return ret;
1920 }
1921 }
1922
1923 return QString();
1924}
1925
1926/**********************************************************************/
1932 QString *ret)
1933{
1934 foreach (QAction *a, m->actions()) {
1935 if (a->shortcut() == seq) {
1936 *ret = a->text() + " ("
1937 + a->shortcut().toString(QKeySequence::NativeText) + ")";
1938
1939 return TRUE;
1940 }
1941 }
1942
1943 return FALSE;
1944}
1945
1946/**********************************************************************/
1950{
1954
1955 fcs = fc_shortcuts::sc()->get_shortcut(static_cast<shortcut_id>(sid));
1957
1959 foreach (const QMenu *m, menus) {
1960 QString ret;
1961
1963 return ret;
1964 }
1965 }
1966
1967 return QString();
1968}
1969
1970/**********************************************************************/
1974{
1976 QAction *act;
1977 struct player *pplayer;
1978
1979 airlift_menu->clear();
1980 if (client_is_observer()) {
1981 return;
1982 }
1983
1984 pplayer = client_player();
1985 unit_type_iterate(utype) {
1986 utype_id = utype_index(utype);
1987
1988 if (!can_player_build_unit_now(pplayer, utype, RPT_CERTAIN)
1989 || !utype_can_do_action(utype, ACTION_AIRLIFT)) {
1990 continue;
1991 }
1992 if (!can_player_build_unit_now(pplayer, utype, RPT_CERTAIN)
1994 continue;
1995 }
1996 // Defeat keyboard shortcut mnemonics
1997 act = airlift_menu->addAction(QString(utype_name_translation(utype))
1998 .replace("&", "&&"));
1999 act->setCheckable(true);
2000 act->setData(utype_id);
2001 if (airlift_type_id == utype_id) {
2002 act->setChecked(true);
2003 }
2004 connect(act, &QAction::triggered, this, &mr_menu::slot_quickairlift_set);
2005 airlift_type->addAction(act);
2007}
2008
2009/****************************************************************************
2010 Updates "build path" menu
2011****************************************************************************/
2013{
2014 QAction *act;
2015 struct unit_list *punits = nullptr;
2016 bool enabled = false;
2017
2018 foreach(act, roads_menu->actions()) {
2019 removeAction(act);
2020 act->deleteLater();
2021 }
2022 roads_menu->clear();
2023 roads_menu->setDisabled(true);
2024 if (client_is_observer()) {
2025 return;
2026 }
2027
2030 if (pextra->buildable) {
2031 int road_id;
2032
2033 // Defeat keyboard shortcut mnemonics
2034 act = roads_menu->addAction(QString(extra_name_translation(pextra))
2035 .replace("&", "&&"));
2036 road_id = pextra->id;
2037 act->setData(road_id);
2038 QObject::connect(act, &QAction::triggered, [this,road_id]() {
2040 });
2042 ACTIVITY_GEN_ROAD, pextra)) {
2043 act->setEnabled(true);
2044 enabled = true;
2045 } else {
2046 act->setDisabled(true);
2047 }
2048 }
2050
2051 if (enabled) {
2052 roads_menu->setEnabled(true);
2053 }
2054}
2055
2056/****************************************************************************
2057 Updates "build bases" menu
2058****************************************************************************/
2060{
2061 QAction *act;
2062 struct unit_list *punits = nullptr;
2063 bool enabled = false;
2064
2065 foreach(act, bases_menu->actions()) {
2066 removeAction(act);
2067 act->deleteLater();
2068 }
2069 bases_menu->clear();
2070 bases_menu->setDisabled(true);
2071
2072 if (client_is_observer()) {
2073 return;
2074 }
2075
2078 if (pextra->buildable) {
2079 int base_id;
2080
2081 // Defeat keyboard shortcut mnemonics
2082 act = bases_menu->addAction(QString(extra_name_translation(pextra))
2083 .replace("&", "&&"));
2084 base_id = pextra->id;
2085 act->setData(base_id);
2086 QObject::connect(act, &QAction::triggered, [this,base_id]() {
2088 });
2090 act->setEnabled(true);
2091 enabled = true;
2092 } else {
2093 act->setDisabled(true);
2094 }
2095 }
2097
2098 if (enabled) {
2099 bases_menu->setEnabled(true);
2100 }
2101}
2102
2103/**********************************************************************/
2107{
2108 QList <QAction * >values;
2110 QMultiHash <munit, QAction *>::iterator i;
2111 struct unit_list *punits = nullptr;
2112 struct road_type *proad;
2113 struct extra_type *tgt;
2114 bool any_cities = false;
2115 bool city_on_tile = false;
2116 bool units_all_same_tile = true;
2117 const struct tile *ptile = nullptr;
2118 const struct unit_type *ptype = nullptr;
2119
2120 players_iterate(pplayer) {
2121 if (city_list_size(pplayer->cities)) {
2122 any_cities = true;
2123 break;
2124 }
2126
2127 // Disable first all sensitive menus
2128 foreach(QAction *a, menu_list) {
2129 a->setEnabled(false);
2130 }
2131
2132 if (client_is_observer()) {
2133 multiplayer_menu->setDisabled(true);
2134 } else {
2135 multiplayer_menu->setDisabled(false);
2136 }
2137
2138 // Non unit menus
2139 keys = menu_list.keys();
2140 foreach (munit key, keys) {
2141 i = menu_list.find(key);
2142 while (i != menu_list.end() && i.key() == key) {
2143 switch (key) {
2144 case SAVE:
2146 i.value()->setEnabled(true);
2147 }
2148 break;
2149 case NOT_4_OBS:
2150 if (!client_is_observer()) {
2151 i.value()->setEnabled(true);
2152 }
2153 break;
2154 case MULTIPLIERS:
2155 if (!client_is_observer() && multiplier_count() > 0) {
2156 i.value()->setEnabled(true);
2157 i.value()->setVisible(true);
2158 } else {
2159 i.value()->setVisible(false);
2160 }
2161 break;
2162 case ENDGAME:
2163 if (gui()->is_repo_dlg_open("END")) {
2164 i.value()->setEnabled(true);
2165 i.value()->setVisible(true);
2166 } else {
2167 i.value()->setVisible(false);
2168 }
2169 break;
2170 case TOP_CITIES:
2171 i.value()->setEnabled(game.info.top_cities_count > 0);
2172 if (game.info.top_cities_count > 0) {
2173 i.value()->setText(QString(PL_("Top %1 City", "Top %1 Cities",
2175 .arg(game.info.top_cities_count));
2176 } else {
2177 i.value()->setText(QString(_("Top Cities")));
2178 }
2179 break;
2180 case AUDIO:
2181 i.value()->setEnabled(!audio_is_dummy_plugin());
2182 break;
2183 default:
2184 break;
2185 }
2186 i++;
2187 }
2188 }
2189
2191 return;
2192 }
2193
2196 if (tile_city(unit_tile(punit))) {
2197 city_on_tile = true;
2198 break;
2199 }
2201
2203 const struct unit_type *ntype;
2204
2205 fc_assert((ptile == nullptr) == (ptype == nullptr));
2206
2208
2209 // 'ntype == ptype' is correct check even when ptype is still nullptr
2210 if (ptile != nullptr && ntype == ptype && unit_tile(punit) != ptile) {
2211 units_all_same_tile = false;
2212 }
2213
2214 if (ptype == nullptr || ntype == ptype) {
2215 ptile = unit_tile(punit);
2216 ptype = ntype;
2217 }
2219
2220 keys = menu_list.keys();
2221 foreach(munit key, keys) {
2222 i = menu_list.find(key);
2223 while (i != menu_list.end() && i.key() == key) {
2224 switch (key) {
2225 case STANDARD:
2226 i.value()->setEnabled(true);
2227 break;
2228
2229 case EXPLORE:
2231 i.value()->setEnabled(true);
2232 }
2233 break;
2234
2235 case BOARD:
2236 if (units_can_load(punits)) {
2237 i.value()->setEnabled(true);
2238 }
2239 break;
2240
2241 case DEBOARD:
2242 if (units_can_unload(&(wld.map), punits)) {
2243 i.value()->setEnabled(true);
2244 }
2245 break;
2246
2247 case TRANSPORTER:
2249 i.value()->setEnabled(true);
2250 }
2251 break;
2252
2253 case CONVERT:
2254 if (units_can_convert(&(wld.map), punits)) {
2255 i.value()->setEnabled(true);
2256 }
2257 break;
2258
2259 case MINE:
2261 i.value()->setEnabled(true);
2262 }
2263
2264 if (units_all_same_tile) {
2266 struct extra_type *pextra = nullptr;
2267
2268 /* FIXME: this overloading doesn't work well with multiple focus
2269 * units. */
2273 if (pextra != nullptr) {
2274 break;
2275 }
2277
2278 if (pextra != nullptr) {
2279 i.value()->setText(
2280 // TRANS: Build mine of specific type
2281 QString(_("Build %1"))
2282 .arg(extra_name_translation(pextra))
2283 .replace("&", "&&"));
2284 } else {
2285 i.value()->setText(QString(_("Build Mine")));
2286 }
2287 } else {
2288 i.value()->setText(QString(_("Build Mine")));
2289 }
2290 }
2291 break;
2292
2293 case IRRIGATION:
2295 i.value()->setEnabled(true);
2296 }
2297 if (units_all_same_tile) {
2299 struct extra_type *pextra = nullptr;
2300
2301 /* FIXME: this overloading doesn't work well with multiple focus
2302 * units. */
2306 if (pextra != nullptr) {
2307 break;
2308 }
2310
2311 if (pextra != nullptr) {
2312 i.value()->setText(
2313 // TRANS: Build irrigation of specific type
2314 QString(_("Build %1"))
2315 .arg(extra_name_translation(pextra))
2316 .replace("&", "&&"));
2317 } else {
2318 i.value()->setText(QString(_("Build Irrigation")));
2319 }
2320 } else {
2321 i.value()->setText(QString(_("Build Irrigation")));
2322 }
2323 }
2324 break;
2325
2326 case CULTIVATE:
2328 i.value()->setEnabled(true);
2329 }
2330 if (units_all_same_tile) {
2331 struct unit *punit = unit_list_get(punits, 0);
2332 struct tile *atile = unit_tile(punit);
2333 struct terrain *pterrain = tile_terrain(atile);
2334
2335 if (pterrain->cultivate_result != T_NONE) {
2336 i.value()->setText(
2337 // TRANS: Transform terrain to specific type
2338 QString(_("Cultivate to %1"))
2340 .replace("&", "&&"));
2341 } else {
2342 i.value()->setText(QString(_("Cultivate")));
2343 }
2344 } else {
2345 i.value()->setText(QString(_("Cultivate")));
2346 }
2347 break;
2348
2349 case PLANT:
2351 i.value()->setEnabled(true);
2352 }
2353 if (units_all_same_tile) {
2354 struct unit *punit = unit_list_get(punits, 0);
2355 struct tile *atile = unit_tile(punit);
2356 struct terrain *pterrain = tile_terrain(atile);
2357
2358 if (pterrain->plant_result != T_NONE) {
2359 i.value()->setText(
2360 // TRANS: Transform terrain to specific type
2361 QString(_("Plant to %1"))
2363 .replace("&", "&&"));
2364 } else {
2365 i.value()->setText(QString(_("Plant")));
2366 }
2367 } else {
2368 i.value()->setText(QString(_("Plant")));
2369 }
2370 break;
2371
2372 case TRANSFORM:
2374 i.value()->setEnabled(true);
2375 } else {
2376 break;
2377 }
2378 if (units_all_same_tile) {
2379 struct unit *punit = unit_list_get(punits, 0);
2380 struct tile *atile = unit_tile(punit);
2381 struct terrain *pterrain = tile_terrain(atile);
2382
2383 if (pterrain->transform_result != T_NONE
2384 && pterrain->transform_result != pterrain) {
2385 i.value()->setText(
2386 // TRANS: Transform terrain to specific type
2387 QString(_("Transform to %1"))
2389 .replace("&", "&&"));
2390 } else {
2391 i.value()->setText(_("Transform Terrain"));
2392 }
2393 }
2394 break;
2395
2396 case BUILD:
2399 i.value()->setEnabled(true);
2400 }
2401 if (city_on_tile
2403 i.value()->setText(
2405 .replace("&", "&&"));
2406 } else {
2407 i.value()->setText(
2409 .replace("&", "&&"));
2410 }
2411 break;
2412
2413 case ROAD:
2414 {
2415 struct extra_type *pextra = nullptr;
2416
2418 i.value()->setEnabled(true);
2419 }
2423 if (pextra != nullptr) {
2424 break;
2425 }
2427
2428 if (pextra != nullptr) {
2429 i.value()->setText(
2430 // TRANS: Build road of specific type
2431 QString(_("Build %1"))
2432 .arg(extra_name_translation(pextra))
2433 .replace("&", "&&"));
2434 }
2435 }
2436 break;
2437
2438 case FORTIFY:
2440 i.value()->setEnabled(true);
2441 }
2442 break;
2443
2444 case FORTRESS:
2446 i.value()->setEnabled(true);
2447 }
2448 break;
2449
2450 case AIRBASE:
2452 i.value()->setEnabled(true);
2453 }
2454 break;
2455
2456 case CLEAN:
2458 i.value()->setEnabled(true);
2459 }
2460 break;
2461
2462 case SENTRY:
2464 i.value()->setEnabled(true);
2465 }
2466 break;
2467
2468 case PARADROP:
2470 i.value()->setEnabled(true);
2472 .replace("&", "&&"));
2473 }
2474 break;
2475
2476 case PILLAGE:
2478 i.value()->setEnabled(true);
2479 }
2480 break;
2481
2482 case HOMECITY:
2484 i.value()->setEnabled(true);
2485 }
2486 break;
2487
2488 case WAKEUP:
2490 i.value()->setEnabled(true);
2491 }
2492 break;
2493
2494 case AUTOWORKER:
2496 i.value()->setEnabled(true);
2497 }
2499 i.value()->setText(_("Auto Settler"));
2500 } else {
2501 i.value()->setText(_("Auto Worker"));
2502 }
2503 break;
2504 case CONNECT_ROAD:
2506 if (proad != nullptr) {
2507 tgt = road_extra_get(proad);
2508 } else {
2509 break;
2510 }
2512 i.value()->setEnabled(true);
2513 }
2514 break;
2515
2516 case DISBAND:
2518 i.value()->setEnabled(true);
2519 }
2520 break;
2521
2522 case CONNECT_RAIL:
2524 if (proad != nullptr) {
2525 tgt = road_extra_get(proad);
2526 } else {
2527 break;
2528 }
2530 i.value()->setEnabled(true);
2531 }
2532 break;
2533
2534 case CONNECT_MAGLEV:
2536 if (proad != nullptr) {
2537 tgt = road_extra_get(proad);
2538 } else {
2539 break;
2540 }
2542 i.value()->setEnabled(true);
2543 }
2544 break;
2545
2546 case CONNECT_IRRIGATION:
2547 {
2549
2550 if (extra_type_list_size(extras) > 0) {
2551 struct extra_type *pextra;
2552
2555 i.value()->setEnabled(true);
2556 }
2557 }
2558 }
2559 break;
2560
2561 case GOTO_CITY:
2562 if (any_cities) {
2563 i.value()->setEnabled(true);
2564 }
2565 break;
2566
2567 case AIRLIFT:
2568 if (any_cities) {
2569 i.value()->setEnabled(true);
2570 }
2571 break;
2572
2573 case BUILD_WONDER:
2574 i.value()->setText(
2576 .replace("&", "&&"));
2578 i.value()->setEnabled(true);
2579 }
2580 break;
2581
2582 case AUTOTRADEROUTE:
2584 i.value()->setEnabled(true);
2585 }
2586 break;
2587
2588 case ORDER_TRADE_ROUTE:
2589 i.value()->setText(
2591 .replace("&", "&&"));
2593 i.value()->setEnabled(true);
2594 }
2595 break;
2596
2597 case ORDER_DIPLOMAT_DLG:
2599 i.value()->setEnabled(true);
2600 }
2601 break;
2602
2603 case UPGRADE:
2604 if (units_can_upgrade(&(wld.map), punits)) {
2605 i.value()->setEnabled(true);
2606 }
2607 break;
2608 default:
2609 break;
2610 }
2611
2612 i++;
2613 }
2614 }
2615}
2616
2617/**********************************************************************/
2624
2625/**********************************************************************/
2629{
2630 struct player *pplayer = client_player();
2631
2632 if (pplayer != nullptr) {
2633 popup_spaceship_dialog(pplayer);
2634 }
2635}
2636
2637/**********************************************************************/
2644
2645/**********************************************************************/
2649{
2650 ::gui()->game_tab_widget->setCurrentIndex(0);
2651}
2652
2653/**********************************************************************/
2660
2661/**********************************************************************/
2665{
2666 popup_players_dialog(false);
2667}
2668
2669/**********************************************************************/
2676
2677/**********************************************************************/
2681{
2683 /* FIXME: this can provide different actions for different units...
2684 * not good! */
2685 /* Enable the button for adding to a city in all cases, so we
2686 get an eventual error message from the server if we try. */
2691 }
2693}
2694
2695/**********************************************************************/
2699{
2701 struct extra_type *pextra;
2702
2705
2706 if (pextra != nullptr) {
2708 }
2710}
2711
2712/**********************************************************************/
2727
2728/**********************************************************************/
2732{
2734
2735 if (prail != nullptr) {
2736 struct extra_type *tgt;
2737
2738 tgt = road_extra_get(prail);
2740 }
2741}
2742
2743/**********************************************************************/
2747{
2749
2750 if (pmaglev != nullptr) {
2751 struct extra_type *tgt;
2752
2753 tgt = road_extra_get(pmaglev);
2755 }
2756}
2757
2758/**********************************************************************/
2765
2766/**********************************************************************/
2773
2774/**********************************************************************/
2778{
2780
2781 if (proad != nullptr) {
2782 struct extra_type *tgt;
2783
2784 tgt = road_extra_get(proad);
2786 }
2787}
2788
2789/**********************************************************************/
2796
2797/**********************************************************************/
2808
2809/**********************************************************************/
2813{
2815}
2816
2817/**********************************************************************/
2824
2825/**********************************************************************/
2832
2833/**********************************************************************/
2837{
2839 /* FIXME: this can provide different actions for different units...
2840 * not good! */
2842 EC_ROAD,
2844 punit);
2845 bool building_road = false;
2846
2847 if (tgt != nullptr
2850 building_road = true;
2851 }
2852
2855 }
2857}
2858
2859/**********************************************************************/
2866
2867/**********************************************************************/
2874
2875/**********************************************************************/
2879{
2880 key_unit_mine();
2881}
2882
2883/**********************************************************************/
2887{
2889}
2890
2891/**********************************************************************/
2898
2899/**********************************************************************/
2906
2907/**********************************************************************/
2911{
2913}
2914
2915/**********************************************************************/
2922
2923/**********************************************************************/
2927{
2928 delayed_order = false;
2929 units_list.clear();
2930}
2931
2932/**********************************************************************/
2936{
2937 gui()->rallies.hover_tile = false;
2938 gui()->rallies.hover_city = true;
2939}
2940
2941/**********************************************************************/
2945{
2946 gui()->trade_gen.hover_city = true;
2947}
2948
2949/**********************************************************************/
2953{
2954 gui()->trade_gen.add_all_cities();
2955}
2956
2957/**********************************************************************/
2961{
2962 gui()->trade_gen.calculate();
2963}
2964
2965/**********************************************************************/
2969{
2970 gui()->trade_gen.clear_trade_planing();
2971}
2972
2973/**********************************************************************/
2977{
2978 qtiles gilles;
2979 struct unit *punit;
2980 struct city *homecity;
2981 struct tile *home_tile;
2982 struct tile *dest_tile;
2983 bool sent = false;
2984
2986 homecity = game_city_by_number(punit->homecity);
2987 home_tile = homecity->tile;
2988 foreach(gilles, gui()->trade_gen.lines) {
2989 if ((gilles.t1 == home_tile || gilles.t2 == home_tile)
2990 && gilles.autocaravan == nullptr) {
2991 // Send caravan
2992 if (gilles.t1 == home_tile) {
2993 dest_tile = gilles.t2;
2994 } else {
2995 dest_tile = gilles.t1;
2996 }
2997 if (send_goto_tile(punit, dest_tile)) {
2998 int i;
2999 i = gui()->trade_gen.lines.indexOf(gilles);
3000 gilles = gui()->trade_gen.lines.takeAt(i);
3001 gilles.autocaravan = punit;
3002 gui()->trade_gen.lines.append(gilles);
3003 sent = true;
3004 break;
3005 }
3006 }
3007 }
3008
3009 if (!sent) {
3010 gui()->infotab->chtwdg->append(_("Didn't find any trade route"
3011 " to establish"));
3012 }
3013}
3014
3015/**********************************************************************/
3019{
3020 QVariant v;
3021 QAction *act;
3022
3024 v = act->data();
3025 airlift_type_id = v.toInt();
3026}
3027
3028/**********************************************************************/
3032{
3033 QAction *act;
3034
3036 qdef_act::action()->vs_unit_set(act->data().toInt());
3037}
3038
3039/**********************************************************************/
3043{
3044 QAction *act;
3045
3047 qdef_act::action()->vs_city_set(act->data().toInt());
3048}
3049
3050/**********************************************************************/
3054{
3055 quick_airlifting = true;
3056}
3057
3058/**********************************************************************/
3062{
3064 int i = 0;
3066
3067 delayed_order = true;
3068 dg = D_GOTO;
3069
3070 struct unit_list *punits = get_units_in_focus();
3071 if (unit_list_size(punits) == 0) {
3072 return;
3073 }
3074 if (hover_state != HOVER_GOTO) {
3079 control_mouse_cursor(nullptr);
3080 }
3082 i++;
3087}
3088
3089/**********************************************************************/
3093{
3095 struct unit *punit;
3096 struct tile *last_tile;
3097 struct tile *new_tile;
3098 int i = 0;
3099
3100 foreach (fui, units_list.unit_list) {
3101 i++;
3102 punit = unit_list_find(client_player()->units, fui->id);
3103 if (punit == nullptr) {
3104 continue;
3105 }
3106 last_tile = punit->tile;
3108 if (new_tile != nullptr) {
3109 punit->tile = new_tile;
3110 }
3111 if (is_tiles_adjacent(punit->tile, fui->ptile)) {
3114 punit->tile,
3115 fui->ptile));
3116 } else {
3117 send_attack_tile(punit, fui->ptile);
3118 }
3119 punit->tile = last_tile;
3120 }
3121 units_list.clear();
3122}
3123
3124/**********************************************************************/
3133
3134/**********************************************************************/
3138{
3140}
3141
3142/**********************************************************************/
3151
3152/**********************************************************************/
3156{
3158}
3159
3160/**********************************************************************/
3167
3168/**********************************************************************/
3177
3178/**********************************************************************/
3185
3186/**********************************************************************/
3193
3194/**********************************************************************/
3201
3202/**********************************************************************/
3206{
3207 key_unit_goto();
3208}
3209
3210/**********************************************************************/
3217
3218/**********************************************************************/
3225
3226/**********************************************************************/
3230{
3231 if (gui()->interface_locked) {
3232 enable_interface(false);
3233 } else {
3234 enable_interface(true);
3235 }
3236 gui()->interface_locked = !gui()->interface_locked;
3237}
3238
3239/**********************************************************************/
3243{
3247 int i;
3248
3249 lc = gui()->findChildren<close_widget *>();
3250 lm = gui()->findChildren<move_widget *>();
3251 lr = gui()->findChildren<resize_widget *>();
3252
3253 for (i = 0; i < lc.size(); ++i) {
3254 lc.at(i)->setVisible(!enable);
3255 }
3256 for (i = 0; i < lm.size(); ++i) {
3257 lm.at(i)->setVisible(!enable);
3258 }
3259 for (i = 0; i < lr.size(); ++i) {
3260 lr.at(i)->setVisible(!enable);
3261 }
3262}
3263
3264/**********************************************************************/
3268{
3270
3271 gui()->apply_fullscreen();
3272}
3273
3274/**********************************************************************/
3278{
3279 if (minimap_status->isChecked()) {
3280 ::gui()->minimapview_wdg->show();
3281 } else {
3282 ::gui()->minimapview_wdg->hide();
3283 }
3284}
3285
3286/**********************************************************************/
3290{
3291 if (osd_status->isChecked()) {
3292 gui()->qt_settings.show_new_turn_text = true;
3293 } else {
3294 gui()->qt_settings.show_new_turn_text = false;
3295 }
3296}
3297
3298/**********************************************************************/
3302{
3303 if (btlog_status->isChecked()) {
3304 gui()->qt_settings.show_battle_log = true;
3305 } else {
3306 gui()->qt_settings.show_battle_log = false;
3307 }
3308}
3309
3310/**********************************************************************/
3317
3318/**********************************************************************/
3325
3326/**********************************************************************/
3333
3334/**********************************************************************/
3341
3342/**********************************************************************/
3346{
3347 gui()->map_scale = gui()->map_scale * 1.2f;
3348 tilespec_reread(tileset_basename(tileset), true, gui()->map_scale);
3349}
3350
3351/**********************************************************************/
3355{
3356 QFont *qf;
3357
3358 gui()->map_scale = 1.0f;
3360 qf->setPointSize(fc_font::instance()->city_fontsize);
3362 qf->setPointSize(fc_font::instance()->prod_fontsize);
3363 tilespec_reread(tileset_basename(tileset), true, gui()->map_scale);
3364}
3365
3366/**********************************************************************/
3370{
3371 QFont *qf;
3372
3373 if (scale_fonts_status->isChecked()) {
3374 gui()->map_font_scale = true;
3375 } else {
3377 qf->setPointSize(fc_font::instance()->city_fontsize);
3379 qf->setPointSize(fc_font::instance()->prod_fontsize);
3380 gui()->map_font_scale = false;
3381 }
3383}
3384
3385/**********************************************************************/
3389{
3390 gui()->map_scale = gui()->map_scale / 1.2f;
3391 tilespec_reread(tileset_basename(tileset), true, gui()->map_scale);
3392}
3393
3394/**********************************************************************/
3401
3402/**********************************************************************/
3409
3410/**********************************************************************/
3417
3418/**********************************************************************/
3425
3426/**********************************************************************/
3433
3434/**********************************************************************/
3441
3442/**********************************************************************/
3449
3450/**********************************************************************/
3457
3458/**********************************************************************/
3462{
3463 key_unit_done();
3464}
3465
3466/**********************************************************************/
3473
3474/**********************************************************************/
3481
3482/**********************************************************************/
3491
3492/**********************************************************************/
3501
3502/**********************************************************************/
3509
3510/**********************************************************************/
3514{
3515 key_unit_wait();
3516}
3517
3518/**********************************************************************/
3522{
3524
3525 uhs = new unit_hud_selector(gui()->central_wdg);
3526 uhs->show_me();
3527}
3528
3529/**********************************************************************/
3536
3537/**********************************************************************/
3544
3545/**********************************************************************/
3552
3553/**********************************************************************/
3560
3561/**********************************************************************/
3568
3569/**********************************************************************/
3576
3577/**********************************************************************/
3584
3585/**********************************************************************/
3592
3593/**********************************************************************/
3600
3601/**********************************************************************/
3608
3609/**********************************************************************/
3616
3617/**********************************************************************/
3624
3625/**********************************************************************/
3632
3633/**********************************************************************/
3640
3641/**********************************************************************/
3648
3649/**********************************************************************/
3656
3657/**********************************************************************/
3664
3665/**********************************************************************/
3669{
3670 QDialog *dialog = new QDialog(this);
3671 QLabel *label;
3672 QPushButton *but;
3674 const struct strvec *tlset_list;
3675 const struct option *poption;
3677 QString s;
3678
3679 sl << "default_tileset_overhead_name" << "default_tileset_iso_name"
3680 << "default_tileset_hex_name" << "default_tileset_isohex_name";
3681 layout = new QVBoxLayout;
3682 dialog->setWindowTitle(_("Available tilesets"));
3683 label = new QLabel;
3684 label->setText(_("Some tilesets might not be compatible with current"
3685 " map topology!"));
3686 layout->addWidget(label);
3687
3688 foreach (s, sl) {
3690
3691 on_bytes = s.toUtf8();
3694 strvec_iterate(tlset_list, value) {
3695 but = new QPushButton(value);
3696 connect(but, &QAbstractButton::clicked, this, &mr_menu::load_new_tileset);
3697 layout->addWidget(but);
3699 }
3700 dialog->setSizeGripEnabled(true);
3701 dialog->setLayout(layout);
3702 dialog->show();
3703}
3704
3705/**********************************************************************/
3709{
3710 QPushButton *but;
3712
3714 tn_bytes = but->text().toUtf8();
3715 tilespec_reread(tn_bytes.data(), true, 1.0f);
3716 gui()->map_scale = 1.0f;
3717 but->parentWidget()->close();
3718}
3719
3720/**********************************************************************/
3724{
3725 gui()->trade_gen.calculate();
3726}
3727
3728/**********************************************************************/
3735
3736/**********************************************************************/
3743
3744/**********************************************************************/
3747void mr_menu::slot_help(const QString &topic)
3748{
3749 popup_help_dialog_typed(Q_(topic.toStdString().c_str()), HELP_ANY);
3750}
3751
3752/****************************************************************
3753 Actions "BUILD_PATH_*"
3754*****************************************************************/
3767
3768/****************************************************************
3769 Actions "BUILD_BASE_*"
3770*****************************************************************/
3772{
3775 if (pextra->buildable && pextra->id == id
3777 pextra)) {
3779 }
3782}
3783
3784
3785
3786/**********************************************************************/
3790{
3791 gui()->popup_client_options();
3792}
3793
3794/**********************************************************************/
3801
3802/**********************************************************************/
3806{
3807 gui()->pr_options->popup_server_options();
3808}
3809
3810/**********************************************************************/
3817
3818/**********************************************************************/
3822{
3823 options_save(nullptr);
3824}
3825
3826/**********************************************************************/
3833
3834/**********************************************************************/
3838{
3840}
3841
3842/**********************************************************************/
3846{
3849 QString path, storage_path;
3850 hud_message_box *saved = new hud_message_box(gui()->central_wdg);
3851 bool map_saved;
3853
3856 current_width = gui()->mapview_wdg->width();
3857 current_height = gui()->mapview_wdg->height();
3858 if (tileset_hex_width(tileset) > 0) {
3859 full_size_y = full_size_y * 11 / 20;
3860 } else if (tileset_is_isometric(tileset)) {
3862 }
3864 img_name = QString("Freeciv-Turn%1").arg(game.info.turn);
3865 if (client_has_player()) {
3866 img_name = img_name + "-"
3868 }
3870 path = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
3871 if (!storage_path.isEmpty() && QDir(storage_path).isReadable()) {
3873 } else if (!path.isEmpty()) {
3874 img_name = path + DIR_SEPARATOR + img_name;
3875 } else {
3876 img_name = QStandardPaths::writableLocation(QStandardPaths::HomeLocation)
3878 }
3879 map_saved = mapview.store->map_pixmap.save(img_name, "png");
3881 saved->setStandardButtons(QMessageBox::Ok);
3882 saved->setDefaultButton(QMessageBox::Cancel);
3883 saved->setAttribute(Qt::WA_DeleteOnClose);
3884 if (map_saved) {
3885 saved->set_text_title("Image saved as:\n" + img_name, _("Success"));
3886 } else {
3887 saved->set_text_title(_("Failed to save image of the map"), _("Error"));
3888 }
3889 saved->show();
3890}
3891
3892/**********************************************************************/
3896{
3897 send_save_game(nullptr);
3898}
3899
3900/**********************************************************************/
3904{
3905 QString str;
3906 QString current_file;
3907 QString location;
3908
3910 location = dirname;
3911 // choose last location
3913
3914 str = QString(_("Save Games"))
3915 + QString(" (*.sav *.sav.bz2 *.sav.gz *.sav.xz)");
3916 current_file = QFileDialog::getSaveFileName(gui()->central_wdg,
3917 _("Save Game As..."),
3918 location, str);
3919 if (!current_file.isEmpty()) {
3921
3922 cf_bytes = current_file.toUtf8();
3923 send_save_game(cf_bytes.data());
3924 }
3925}
3926
3927/**********************************************************************/
3931{
3933
3934 if (is_server_running()) {
3935 ask = new hud_message_box(gui()->central_wdg);
3936 ask->set_text_title(_("Leaving a local game will end it!"), "Leave game");
3937 ask->setStandardButtons(QMessageBox::Cancel | QMessageBox::Ok);
3938 ask->setDefaultButton(QMessageBox::Cancel);
3939 ask->setAttribute(Qt::WA_DeleteOnClose);
3940
3941 connect(ask, &hud_message_box::accepted, [=]() {
3942 if (client.conn.used) {
3943 gui()->infotab->msgwdg->clr();
3944 disconnect_from_server(TRUE);
3945 }
3946 });
3947 ask->show();
3948 } else {
3950 }
3951}
3952
3953/**********************************************************************/
3964
3965/**********************************************************************/
3976
3977/**********************************************************************/
3981{
3982 hud_message_box* ask = new hud_message_box(gui()->central_wdg);
3983
3984 ask->setIcon(QMessageBox::Warning);
3985 ask->setStandardButtons(QMessageBox::Cancel | QMessageBox::Ok);
3986 ask->setDefaultButton(QMessageBox::Cancel);
3987 ask->setAttribute(Qt::WA_DeleteOnClose);
3988 return (ask->set_text_title(_("Selection will cancel current assignments!"),
3989 _("Confirm Disruptive Selection"), true)
3990 == QMessageBox::Ok);
3991}
3992
3993/**********************************************************************/
3997{
3998 struct tile *ptile;
3999
4001 if (get_city_bonus(pcity, EFT_AIRLIFT) > 0) {
4002 ptile = city_tile(pcity);
4003 unit_list_iterate(ptile->units, punit) {
4004 if (punit->utype == utype_by_number(ut)) {
4006 break;
4007 }
4009 }
4011}
const char * action_id_name_translation(action_id act_id)
Definition actions.c:1271
const char * action_name_translation(const struct action *paction)
Definition actions.c:1251
enum action_sub_target_kind action_get_sub_target_kind(const struct action *paction)
Definition actions.c:1140
bool actions_are_ready(void)
Definition actions.c:951
#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:811
bool actres_creates_extra(enum action_result result, const struct extra_type *pextra)
Definition actres.c:790
#define str
Definition astring.c:76
#define n
Definition astring.c:77
bool audio_is_dummy_plugin(void)
Definition audio.c:717
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:3542
void destroy_city_virtual(struct city *pcity)
Definition city.c:3632
static bool is_non_allied_city_tile(const struct tile *ptile, const struct player *pplayer)
Definition city.h:778
#define city_list_iterate(citylist, pcity)
Definition city.h:508
#define city_tile(_pcity_)
Definition city.h:565
#define city_list_iterate_end
Definition city.h:510
static fc_font * instance()
Definition fonts.cpp:41
QFont * get_font(QString name)
Definition fonts.cpp:63
static fc_shortcuts * sc()
fc_shortcut * get_shortcut(shortcut_id id)
static void update_all()
Definition menu.cpp:906
virtual ~go_act_menu()
Definition menu.cpp:712
void start_go_act(int act_id, int sub_tgt_id)
Definition menu.cpp:883
void reset()
Definition menu.cpp:721
static QSet< go_act_menu * > instances
Definition menu.h:238
void update()
Definition menu.cpp:843
go_act_menu(QWidget *parent=nullptr)
Definition menu.cpp:702
static void reset_all()
Definition menu.cpp:896
void create()
Definition menu.cpp:733
QMap< QAction *, int > items
Definition menu.h:240
static QSet< gov_menu * > instances
Definition menu.h:213
virtual ~gov_menu()
Definition menu.cpp:582
static void create_all()
Definition menu.cpp:682
void revolution()
Definition menu.cpp:661
QVector< QAction * > actions
Definition menu.h:215
static void update_all()
Definition menu.cpp:692
void change_gov(int target_gov)
Definition menu.cpp:669
gov_menu(QWidget *parent=0)
Definition menu.cpp:571
void create()
Definition menu.cpp:591
void update()
Definition menu.cpp:633
bool shortcut_2_menustring_inner(const QMenu *m, QKeySequence seq, QString *ret)
Definition menu.cpp:1931
void slot_unit_sentry()
Definition menu.cpp:2902
QActionGroup * action_vs_city
Definition menu.h:268
void slot_bg3select()
Definition menu.cpp:3620
void slot_auto_worker()
Definition menu.cpp:2828
void slot_traveler()
Definition menu.cpp:3564
bool execute_shortcut_inner(const QMenu *m, QKeySequence seq)
Definition menu.cpp:1849
void slot_delayed_goto()
Definition menu.cpp:3061
void zoom_in()
Definition menu.cpp:3345
void slot_autocaravan()
Definition menu.cpp:2976
QMenu * multiplayer_menu
Definition menu.h:265
void slot_build_irrigation()
Definition menu.cpp:2862
void volume_up()
Definition menu.cpp:3956
void slot_execute_orders()
Definition menu.cpp:3092
void update_bases_menu()
Definition menu.cpp:2059
QString shortcut_exist(fc_shortcut *fcs)
Definition menu.cpp:1908
void tileset_custom_load()
Definition menu.cpp:3668
void update_roads_menu()
Definition menu.cpp:2012
void slot_calculate()
Definition menu.cpp:2960
void slot_conn_road()
Definition menu.cpp:2777
void slot_conn_irrigation()
Definition menu.cpp:2715
QMenu * bases_menu
Definition menu.h:264
QActionGroup * airlift_type
Definition menu.h:267
void save_options_exit()
Definition menu.cpp:3829
void slot_quickairlift_set()
Definition menu.cpp:3018
void slot_battlelog()
Definition menu.cpp:3301
QMultiHash< munit, QAction * > menu_list
Definition menu.h:272
void slot_trade_add_all()
Definition menu.cpp:2952
void update_airlift_menu()
Definition menu.cpp:1973
void slot_show_cities()
Definition menu.cpp:2672
void slot_transform()
Definition menu.cpp:2792
void slot_top_cities()
Definition menu.cpp:3556
void slot_action_vs_unit()
Definition menu.cpp:3031
void slot_achievements()
Definition menu.cpp:3540
void slot_show_research_tab()
Definition menu.cpp:2620
void shortcut_options()
Definition menu.cpp:3797
void slot_city_output()
Definition menu.cpp:3413
void slot_show_eco_report()
Definition menu.cpp:2640
QMenu * airlift_menu
Definition menu.h:263
QAction * osd_status
Definition menu.h:288
void slot_bg1select()
Definition menu.cpp:3572
void slot_unload_all()
Definition menu.cpp:3181
void slot_airlift()
Definition menu.cpp:3155
void slot_select_same_continent()
Definition menu.cpp:3485
void slot_city_production()
Definition menu.cpp:3421
void slot_set_home()
Definition menu.cpp:3163
QAction * lock_status
Definition menu.h:287
void slot_native_tiles()
Definition menu.cpp:3321
void slot_unit_explore()
Definition menu.cpp:3213
void slot_bg4assign()
Definition menu.cpp:3652
void slot_bg1append()
Definition menu.cpp:3588
void slot_upgrade()
Definition menu.cpp:3197
void execute_shortcut(int sid)
Definition menu.cpp:1864
void slot_popup_mult_rates()
Definition menu.cpp:3739
void slot_select_same_everywhere()
Definition menu.cpp:3495
void volume_down()
Definition menu.cpp:3968
void slot_map_grid()
Definition menu.cpp:3453
void slot_unit_filter()
Definition menu.cpp:3521
void slot_bg2select()
Definition menu.cpp:3596
void slot_done_moving()
Definition menu.cpp:3461
void calc_trade_routes()
Definition menu.cpp:3723
void slot_city_buycost()
Definition menu.cpp:3329
void slot_action()
Definition menu.cpp:2820
void slot_bg4append()
Definition menu.cpp:3660
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:1891
void slot_select_all_tile()
Definition menu.cpp:3469
void save_game()
Definition menu.cpp:3895
struct tile * find_last_unit_pos(struct unit *punit, int pos)
Definition menu.cpp:916
void save_image()
Definition menu.cpp:3845
void slot_pillage()
Definition menu.cpp:2812
void slot_clean()
Definition menu.cpp:2698
void zoom_reset()
Definition menu.cpp:3354
void slot_board()
Definition menu.cpp:3127
void slot_center_view()
Definition menu.cpp:3221
void slot_build_mine()
Definition menu.cpp:2878
void server_options()
Definition menu.cpp:3805
void load_new_tileset()
Definition menu.cpp:3708
void set_tile_for_order(struct tile *ptile)
Definition menu.cpp:1837
void slot_fullscreen()
Definition menu.cpp:3267
void slot_bg4select()
Definition menu.cpp:3644
void slot_show_nations()
Definition menu.cpp:2664
void slot_build_road()
Definition menu.cpp:2836
void slot_unsentry()
Definition menu.cpp:3189
void slot_show_new_turn_text()
Definition menu.cpp:3289
void local_options()
Definition menu.cpp:3789
bool delayed_order
Definition menu.h:292
void slot_borders()
Definition menu.cpp:3313
void slot_clear_trade()
Definition menu.cpp:2968
void zoom_scale_fonts()
Definition menu.cpp:3369
void slot_conn_rail()
Definition menu.cpp:2731
void slot_select_same_tile()
Definition menu.cpp:3505
void slot_convert()
Definition menu.cpp:2910
QMenu * action_unit_menu
Definition menu.h:270
QActionGroup * action_vs_unit
Definition menu.h:269
void slot_endgame()
Definition menu.cpp:3548
void slot_bg2assign()
Definition menu.cpp:3604
void slot_select_one()
Definition menu.cpp:3477
void menus_sensitive()
Definition menu.cpp:2106
void messages_options()
Definition menu.cpp:3813
void slot_unit_goto()
Definition menu.cpp:3205
void slot_cultivate()
Definition menu.cpp:2870
void slot_stack_size()
Definition menu.cpp:3437
void slot_conn_maglev()
Definition menu.cpp:2746
void slot_patrol()
Definition menu.cpp:3137
void slot_unit_fortress()
Definition menu.cpp:2761
void slot_wait()
Definition menu.cpp:3513
void slot_demographics()
Definition menu.cpp:3532
void slot_build_city()
Definition menu.cpp:2680
void slot_city_growth()
Definition menu.cpp:3337
void slot_city_trade_routes()
Definition menu.cpp:3429
void slot_rally()
Definition menu.cpp:2935
void slot_plant()
Definition menu.cpp:2886
void slot_paradrop()
Definition menu.cpp:2800
void slot_build_path(int id)
Definition menu.cpp:3755
void slot_bg1assign()
Definition menu.cpp:3580
void slot_return_to_city()
Definition menu.cpp:3145
Unit_type_id airlift_type_id
Definition menu.h:294
void slot_show_map()
Definition menu.cpp:2648
void slot_bg3assign()
Definition menu.cpp:3628
QAction * scale_fonts_status
Definition menu.h:286
void slot_minimap_view()
Definition menu.cpp:3277
void slot_trade_city()
Definition menu.cpp:2944
void quit_game()
Definition menu.cpp:3837
void slot_help(const QString &topic)
Definition menu.cpp:3747
void save_game_as()
Definition menu.cpp:3903
void slot_bg2append()
Definition menu.cpp:3612
bool quick_airlifting
Definition menu.h:293
void slot_spaceship()
Definition menu.cpp:2628
void slot_city_names()
Definition menu.cpp:3397
QMenu * action_city_menu
Definition menu.h:271
void save_options_now()
Definition menu.cpp:3821
QAction * btlog_status
Definition menu.h:289
void slot_unit_fortify()
Definition menu.cpp:2894
void slot_show_units_report()
Definition menu.cpp:2656
void slot_quickairlift()
Definition menu.cpp:3053
QString shortcut_2_menustring(int sid)
Definition menu.cpp:1949
void slot_lock()
Definition menu.cpp:3229
void back_to_menu()
Definition menu.cpp:3930
void slot_deboard()
Definition menu.cpp:3171
void slot_popup_tax_rates()
Definition menu.cpp:3731
void slot_build_base(int id)
Definition menu.cpp:3771
qfc_units_list units_list
Definition menu.h:273
void setup_menus()
Definition menu.cpp:967
mr_menu()
Definition menu.cpp:958
void slot_bg3append()
Definition menu.cpp:3636
void slot_action_vs_city()
Definition menu.cpp:3042
void zoom_out()
Definition menu.cpp:3388
void slot_disband()
Definition menu.cpp:2918
void slot_unit_airbase()
Definition menu.cpp:2769
void slot_fullbar()
Definition menu.cpp:3445
void slot_city_outlines()
Definition menu.cpp:3405
bool confirm_disruptive_selection()
Definition menu.cpp:3980
void slot_orders_clear()
Definition menu.cpp:2926
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:497
int nr_units
Definition menu.h:133
void clear()
Definition menu.cpp:505
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:70
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:218
bool discard_one(trade_city *tc)
Definition menu.cpp:380
void add_city(struct city *pcity)
Definition menu.cpp:129
void find_certain_routes()
Definition menu.cpp:462
QList< trade_city * > cities
Definition menu.h:183
void find_certain_routes_inner(trade_city *tc)
Definition menu.cpp:427
trade_city * find_most_free()
Definition menu.cpp:329
void discard_trade(trade_city *tc1, trade_city *tc2)
Definition menu.cpp:366
void add_tile(struct tile *ptile)
Definition menu.cpp:141
void remove_virtual_city(struct tile *ptile)
Definition menu.cpp:192
bool hover_city
Definition menu.h:180
void add_all_cities()
Definition menu.cpp:89
void clear_trade_planing()
Definition menu.cpp:109
void discard()
Definition menu.cpp:347
void remove_city(struct city *pcity)
Definition menu.cpp:174
QList< qtiles > lines
Definition menu.h:181
bool discard_any(trade_city *tc, int freeroutes)
Definition menu.cpp:406
void check_if_done(trade_city *tc1, trade_city *tc2)
Definition menu.cpp:477
QList< struct city * > virtual_cities
Definition menu.h:182
int find_over_max(struct city *pcity)
Definition menu.cpp:313
void calculate()
Definition menu.cpp:236
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:1247
void disconnect_from_server(bool leaving_sound)
Definition clinet.c:306
char * incite_cost
Definition comments.c:77
@ 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:4959
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:215
@ RPT_CERTAIN
Definition fc_types.h:516
int Unit_type_id
Definition fc_types.h:243
#define Q_(String)
Definition fcintl.h:70
#define PL_(String1, String2, n)
Definition fcintl.h:71
#define _(String)
Definition fcintl.h:67
const struct ft_color ftc_client
const char * city_link(const struct city *pcity)
struct civ_game game
Definition game.c:62
struct world wld
Definition game.c:63
struct city * game_city_by_number(int id)
Definition game.c: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:141
bool untargeted_revolution_allowed(void)
Definition government.c:563
Government_type_id government_count(void)
Definition government.c:73
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:166
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:2415
#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:3242
void multiairlift(struct city *acity, Unit_type_id ut)
Definition menu.cpp:3996
void real_menus_init(void)
Definition menu.cpp:514
static const char * get_tile_change_menu_text(struct tile *ptile, enum unit_activity activity)
Definition menu.cpp:555
void real_menus_update(void)
Definition menu.cpp:532
static mpgui * gui
Definition mpgui_qt.cpp:53
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:799
const struct option_set * client_optset
Definition options.c:1331
void options_save(option_save_log_callback log_cb)
Definition options.c:6472
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:482
struct city_list * cities
Definition packhand.c:121
void popup_shortcuts_dialog()
void toggle_units_report(bool)
#define players_iterate_end
Definition player.h:552
#define players_iterate(_pplayer)
Definition player.h:547
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:181
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
struct specialist * specialist_by_number(const Specialist_type_id id)
Definition specialist.c:110
const char * specialist_plural_translation(const struct specialist *sp)
Definition specialist.c:166
#define specialist_type_iterate_end
Definition specialist.h:85
#define specialist_type_iterate(sp)
Definition specialist.h:79
#define strvec_iterate(psv, str)
#define strvec_iterate_end
QPixmap map_pixmap
Definition canvas.h:25
Definition city.h:318
char * name
Definition city.h:319
struct tile * tile
Definition city.h:320
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:454
bool draw_native
Definition options.h:216
bool draw_city_output
Definition options.h:195
bool draw_city_names
Definition options.h:197
bool draw_city_productions
Definition options.h:199
bool draw_borders
Definition options.h:215
bool draw_city_buycost
Definition options.h:200
bool draw_unit_stack_size
Definition options.h:219
bool draw_city_trade_routes
Definition options.h:201
bool unit_selection_clears_orders
Definition options.h:176
bool save_options_on_exit
Definition options.h:125
int sound_effects_volume
Definition options.h:191
bool draw_map_grid
Definition options.h:196
bool draw_city_growth
Definition options.h:198
bool draw_city_outlines
Definition options.h:194
bool draw_full_citybar
Definition options.h:217
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:305
Tech_type_id advance_number(const struct advance *padvance)
Definition tech.c:100
#define advance_iterate(_p)
Definition tech.h:273
#define advance_iterate_end
Definition tech.h:274
#define T_NONE
Definition terrain.h:61
void tile_virtual_destroy(struct tile *vtile)
Definition tile.c:1036
bool tile_apply_activity(struct tile *ptile, Activity_type_id act, struct extra_type *tgt)
Definition tile.c:682
struct tile * tile_virtual_new(const struct tile *ptile)
Definition tile.c:982
const char * tile_get_info_text(const struct tile *ptile, bool include_nuisances, int linebreaks)
Definition tile.c:772
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:7043
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:303
bool unit_can_add_or_build_city(const struct civ_map *nmap, const struct unit *punit)
Definition unit.c:491
bool can_unit_change_homecity(const struct civ_map *nmap, const struct unit *punit)
Definition unit.c:524
bool unit_contained_in(const struct unit *pcargo, const struct unit *ptrans)
Definition unit.c:2601
bool can_unit_do_autoworker(const struct unit *punit)
Definition unit.c:647
bool can_unit_paradrop(const struct civ_map *nmap, const struct unit *punit)
Definition unit.c:863
bool unit_can_help_build_wonder_here(const struct civ_map *nmap, const struct unit *punit)
Definition unit.c:277
#define unit_tile(_pu)
Definition unit.h:408
@ ORDER_LAST
Definition unit.h:50
@ ORDER_PERFORM_ACTION
Definition unit.h:48
#define unit_owner(_pu)
Definition unit.h:407
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:126
struct unit_type * utype_by_number(const Unit_type_id id)
Definition unittype.c:114
bool can_player_build_unit_now(const struct player *p, const struct unit_type *punittype, const enum req_problem_type prob_type)
Definition unittype.c:2108
Unit_type_id utype_index(const struct unit_type *punittype)
Definition unittype.c:93
const char * utype_name_translation(const struct unit_type *punittype)
Definition unittype.c:1586
bool utype_can_do_action(const struct unit_type *putype, const action_id act_id)
Definition unittype.c:396
#define unit_type_iterate(_p)
Definition unittype.h:865
#define unit_type_iterate_end
Definition unittype.h:872
#define MAP_NATIVE_WIDTH
#define MAP_NATIVE_HEIGHT