Author: mir3x
Date: Wed Jul 20 21:48:50 2016
New Revision: 33287

URL: http://svn.gna.org/viewcvs/freeciv?rev=33287&view=rev
Log:
Qt client - added quick airlift.

See patch #7472


Modified:
    branches/S2_6/client/gui-qt/mapctrl.cpp
    branches/S2_6/client/gui-qt/menu.cpp
    branches/S2_6/client/gui-qt/menu.h

Modified: branches/S2_6/client/gui-qt/mapctrl.cpp
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_6/client/gui-qt/mapctrl.cpp?rev=33287&r1=33286&r2=33287&view=diff
==============================================================================
--- branches/S2_6/client/gui-qt/mapctrl.cpp     (original)
+++ branches/S2_6/client/gui-qt/mapctrl.cpp     Wed Jul 20 21:48:50 2016
@@ -308,6 +308,17 @@
   if (event->button() == Qt::LeftButton
       && gui()->infotab->chat_maximized == true) {
         gui()->infotab->restore_chat();
+  }
+  if (event->button() == Qt::LeftButton
+      && gui()->menu_bar->quick_airlifting == true) {
+    ptile = canvas_pos_to_tile(event->pos().x(), event->pos().y());
+    if (tile_city(ptile)) {
+      multiairlift(tile_city(ptile), gui()->menu_bar->airlift_type_id);
+    } else {
+      output_window_append(ftc_client, "No city selected for airlift");
+    }
+    gui()->menu_bar->quick_airlifting = false;
+    return;
   }
   if (event->button() == Qt::LeftButton
       && gui()->menu_bar->delayed_order == false) {

Modified: branches/S2_6/client/gui-qt/menu.cpp
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_6/client/gui-qt/menu.cpp?rev=33287&r1=33286&r2=33287&view=diff
==============================================================================
--- branches/S2_6/client/gui-qt/menu.cpp        (original)
+++ branches/S2_6/client/gui-qt/menu.cpp        Wed Jul 20 21:48:50 2016
@@ -57,6 +57,7 @@
 #include "menu.h"
 
 extern QApplication *qapp;
+static bool has_player_unit_type(Unit_type_id utype);
 
 /**************************************************************************
   New turn callback
@@ -533,6 +534,7 @@
   if (C_S_RUNNING == client_state()) {
     gui()->menuBar()->setVisible(true);
     gui()->menu_bar->menus_sensitive();
+    gui()->menu_bar->update_airlift_menu();
     gov_menu::update_all();
   } else {
     gui()->menuBar()->setVisible(false);
@@ -916,6 +918,8 @@
   QAction *act;
   QMenu *pr;
   delayed_order = false;
+  airlift_type_id = 0;
+  quick_airlifting = false;
 
   /* Game Menu */
   menu = this->addMenu(_("Game"));
@@ -972,7 +976,6 @@
           SLOT(slot_minimap_view()));
   menu->addSeparator();
   act = menu->addAction(_("City Outlines"));
-  act->setShortcut(QKeySequence(tr("Ctrl+y")));
   act->setCheckable(true);
   act->setChecked(gui_options.draw_city_outlines);
   connect(act, SIGNAL(triggered()), this, SLOT(slot_city_outlines()));
@@ -1299,6 +1302,11 @@
   act = menu->addAction(_("Set/Unset rally point"));
   act->setShortcut(QKeySequence(tr("shift+s")));
   connect(act, SIGNAL(triggered()), this, SLOT(slot_rally()));
+  act = menu->addAction(_("Quick Airlift"));
+  act->setShortcut(QKeySequence(tr("ctrl+y")));
+  connect(act, SIGNAL(triggered()), this, SLOT(slot_quickairlift()));
+  airlift_type = new QActionGroup(this);
+  airlift_menu = menu->addMenu(_("Unit type for quickairlifting"));
 
   /* Civilization menu */
   menu = this->addMenu(_("Civilization"));
@@ -1481,6 +1489,36 @@
     units_list.unit_list.at(units_list.unit_list.count() - i -1)->ptile = 
ptile;
   }
 }
+
+/****************************************************************************
+  Updates airlift menu
+****************************************************************************/
+void mr_menu::update_airlift_menu()
+{
+  Unit_type_id utype_id;
+  QAction *act;
+
+  airlift_menu->clear();
+  unit_type_iterate(utype) {
+    utype_id = utype_index(utype);
+
+    if (!can_player_build_unit_now(client.conn.playing, utype)
+        || utype_move_type(utype) != UMT_LAND
+        || utype_has_flag(utype, UTYF_NOBUILD)) {
+      continue;
+    }
+    if (!can_player_build_unit_now(client.conn.playing, utype)
+        && !has_player_unit_type(utype_id)) {
+      continue;
+    }
+    act = airlift_menu->addAction(utype_name_translation(utype));
+    act->setCheckable(true);
+    act->setData(utype_id);
+    connect(act, SIGNAL(triggered()), this, SLOT(slot_quickairlift_set()));
+    airlift_type->addAction(act);
+  } unit_type_iterate_end;
+}
+
 
 
 /****************************************************************************
@@ -2235,6 +2273,28 @@
 }
 
 
+/**************************************************************************
+  Slot for setting quick airlift
+**************************************************************************/
+void mr_menu::slot_quickairlift_set()
+{
+  QVariant v;
+  QAction *act;
+
+  act = qobject_cast<QAction *>(sender());
+  v = act->data();
+  airlift_type_id = v.toInt();
+}
+
+/**************************************************************************
+  Slot for quick airlifting
+**************************************************************************/
+void mr_menu::slot_quickairlift()
+{
+  quick_airlifting = true;
+}
+
+
 /***************************************************************************
   Delayed goto
 ***************************************************************************/
@@ -2766,3 +2826,37 @@
     disconnect_from_server();
   }
 }
+
+/***************************************************************************
+  Returns true if player has any unit of unit_type
+***************************************************************************/
+bool has_player_unit_type(Unit_type_id utype)
+{
+  unit_list_iterate(client.conn.playing->units, punit) {
+    if (utype_number(punit->utype) == utype) {
+      return true;
+    }
+  } unit_list_iterate_end;
+
+  return false;
+}
+
+
+/***************************************************************************
+  Airlift unit type to city acity from each city
+***************************************************************************/
+void multiairlift(struct city *acity, Unit_type_id ut)
+{
+  struct tile *ptile;
+  city_list_iterate(client.conn.playing->cities, pcity) {
+    if (get_city_bonus(pcity, EFT_AIRLIFT) > 0) {
+      ptile = city_tile(pcity);
+      unit_list_iterate(ptile->units, punit) {
+        if (punit->utype == utype_by_number(ut)) {
+          request_unit_airlift(punit, acity);
+          break;
+        }
+      } unit_list_iterate_end;
+    }
+  } city_list_iterate_end;
+}

Modified: branches/S2_6/client/gui-qt/menu.h
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_6/client/gui-qt/menu.h?rev=33287&r1=33286&r2=33287&view=diff
==============================================================================
--- branches/S2_6/client/gui-qt/menu.h  (original)
+++ branches/S2_6/client/gui-qt/menu.h  Wed Jul 20 21:48:50 2016
@@ -111,6 +111,8 @@
   struct city *rally_city;
 };
 
+void multiairlift(struct city *acity, Unit_type_id ut);
+
 /**************************************************************************
   Class representing one unit for delayed goto
 **************************************************************************/
@@ -272,8 +274,10 @@
   Q_OBJECT
   QMenu *menu;
   QMenu *filter_menu;
+  QMenu *airlift_menu;
   QActionGroup *filter_act;
-  QActionGroup *filter_any;;
+  QActionGroup *filter_any;
+  QActionGroup *airlift_type;
   QHash<munit, QAction*> menu_list;
   unit_filter u_filter;
   qfc_units_list units_list;
@@ -281,11 +285,14 @@
   mr_menu();
   void setup_menus();
   void menus_sensitive();
+  void update_airlift_menu();
   void set_tile_for_order(struct tile *ptile);
   QAction *minimap_status;
   QAction *chat_status;
   QAction *messages_status;
   bool delayed_order;
+  bool quick_airlifting;
+  Unit_type_id airlift_type_id;
 private slots:
   /* game menu */
   void local_options();
@@ -374,6 +381,8 @@
   void slot_calculate();
   void slot_clear_trade();
   void slot_rally();
+  void slot_quickairlift_set();
+  void slot_quickairlift();
 
   /*used by civilization menu */
   void slot_show_map();


_______________________________________________
Freeciv-commits mailing list
Freeciv-commits@gna.org
https://mail.gna.org/listinfo/freeciv-commits

Reply via email to