Author: mir3x
Date: Mon Oct 31 16:47:29 2016
New Revision: 34301

URL: http://svn.gna.org/viewcvs/freeciv?rev=34301&view=rev
Log:
Qt client - added transport selection dialog
Reported by Marko Lindqvist <cazfi>

See patch #7154

Modified:
    trunk/client/gui-qt/citydlg.cpp
    trunk/client/gui-qt/dialogs.cpp
    trunk/client/gui-qt/hudwidget.cpp
    trunk/client/gui-qt/hudwidget.h
    trunk/client/gui-qt/menu.cpp

Modified: trunk/client/gui-qt/citydlg.cpp
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/client/gui-qt/citydlg.cpp?rev=34301&r1=34300&r2=34301&view=diff
==============================================================================
--- trunk/client/gui-qt/citydlg.cpp     (original)
+++ trunk/client/gui-qt/citydlg.cpp     Mon Oct 31 16:47:29 2016
@@ -708,7 +708,7 @@
 ****************************************************************************/
 void unit_item::load_unit()
 {
-  request_unit_load(qunit, NULL, unit_tile(qunit));
+  qtg_request_transport(qunit, unit_tile(qunit));
 }
 
 /****************************************************************************

Modified: trunk/client/gui-qt/dialogs.cpp
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/client/gui-qt/dialogs.cpp?rev=34301&r1=34300&r2=34301&view=diff
==============================================================================
--- trunk/client/gui-qt/dialogs.cpp     (original)
+++ trunk/client/gui-qt/dialogs.cpp     Mon Oct 31 16:47:29 2016
@@ -3152,5 +3152,36 @@
 *****************************************************************/
 bool qtg_request_transport(struct unit *pcargo, struct tile *ptile)
 {
-  return false; /* Unit was not handled here. */
-}
+  int tcount;
+  hud_unit_loader *hul;
+  struct unit_list *potential_transports = unit_list_new();
+  struct unit *best_transport = transporter_for_unit(pcargo);
+
+  unit_list_iterate(ptile->units, ptransport) {
+    if (can_unit_transport(ptransport, pcargo)
+        && get_transporter_occupancy(ptransport) < 
get_transporter_capacity(ptransport)) {
+      unit_list_append(potential_transports, ptransport);
+    }
+  } unit_list_iterate_end;
+
+  tcount = unit_list_size(potential_transports);
+
+  if (tcount == 0) {
+    fc_assert(best_transport == NULL);
+    unit_list_destroy(potential_transports);
+
+    return false; /* Unit was not handled here. */
+  } else if (tcount == 1) {
+    /* There's exactly one potential transport - use it automatically */
+    fc_assert(unit_list_get(potential_transports, 0) == best_transport);
+    request_unit_load(pcargo, unit_list_get(potential_transports, 0), ptile);
+
+    unit_list_destroy(potential_transports);
+
+    return true;
+  }
+
+  hul = new hud_unit_loader(pcargo, ptile);
+  hul->show_me();
+  return true;
+}

Modified: trunk/client/gui-qt/hudwidget.cpp
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/client/gui-qt/hudwidget.cpp?rev=34301&r1=34300&r2=34301&view=diff
==============================================================================
--- trunk/client/gui-qt/hudwidget.cpp   (original)
+++ trunk/client/gui-qt/hudwidget.cpp   Mon Oct 31 16:47:29 2016
@@ -21,6 +21,7 @@
 #include <QGridLayout>
 #include <QPaintEvent>
 #include <QLineEdit>
+#include <QHeaderView>
 #include <QHBoxLayout>
 #include <QVBoxLayout>
 #include <QDialogButtonBox>
@@ -40,6 +41,7 @@
 #include "hudwidget.h"
 #include "fonts.h"
 #include "qtg_cxxside.h"
+#include "sprite.h"
 
 /****************************************************************************
   Custom message box constructor
@@ -888,3 +890,107 @@
   setUpdatesEnabled(true);
 }
 
+/****************************************************************************
+  Constructor for widget allowing loading units on transports
+****************************************************************************/
+hud_unit_loader::hud_unit_loader(struct unit *pcargo, struct tile *ptile)
+{
+  setProperty("showGrid", "false");
+  setProperty("selectionBehavior", "SelectRows");
+  setEditTriggers(QAbstractItemView::NoEditTriggers);
+  setSelectionMode(QAbstractItemView::SingleSelection);
+  verticalHeader()->setVisible(false);
+  horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
+  horizontalHeader()->setVisible(false);
+  setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+  setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+  connect(selectionModel(),
+          SIGNAL(selectionChanged(const QItemSelection &,
+                                  const QItemSelection &)), this,
+          SLOT(selection_changed(const QItemSelection &,
+                                 const QItemSelection &)));
+  cargo = pcargo;
+  qtile = ptile;
+
+}
+
+/****************************************************************************
+  Destructor for units loader
+****************************************************************************/
+hud_unit_loader::~hud_unit_loader()
+{
+
+}
+
+/****************************************************************************
+  Shows unit loader, adds possible tranportsand units to table
+  Calculates table size
+****************************************************************************/
+void hud_unit_loader::show_me()
+{
+  QTableWidgetItem *new_item;
+  int max_size = 0;
+  int i, j;
+  int w,h;
+  sprite *spite;
+
+  unit_list_iterate(qtile->units, ptransport) {
+    if (can_unit_transport(ptransport, cargo)
+        && get_transporter_occupancy(ptransport)
+        < get_transporter_capacity(ptransport)) {
+      transports.append(ptransport);
+      max_size = qMax(max_size, get_transporter_occupancy(ptransport));
+    }
+  } unit_list_iterate_end;
+
+  setRowCount(transports.count());
+  setColumnCount(max_size + 1);
+  for (i = 0 ; i < transports.count(); i++) {
+    QString str;
+    spite = get_unittype_sprite(tileset, transports.at(i)->utype,
+                                direction8_invalid());
+    str = utype_rule_name(transports.at(i)->utype);
+    /* TRANS: MP - just movement points */
+    str = str + " ("
+          + QString(move_points_text(transports.at(i)->moves_left, false))
+          + _("MP") + ")";
+    new_item = new QTableWidgetItem(QIcon(*spite->pm), str);
+    setItem(i, 0, new_item);
+    j = 1;
+    unit_list_iterate(transports.at(i)->transporting, tunit) {
+      spite = get_unittype_sprite(tileset, tunit->utype,
+                                  direction8_invalid());
+      new_item = new QTableWidgetItem(QIcon(*spite->pm), "");
+      setItem(i, j, new_item);
+      j++;
+    } unit_list_iterate_end;
+  }
+
+   w = verticalHeader()->width() + 4;
+   for (i = 0; i < columnCount(); i++) {
+      w += columnWidth(i);
+   }
+   h = horizontalHeader()->height() + 4;
+   for (i = 0; i < rowCount(); i++) {
+      h += rowHeight(i);
+   }
+
+  resize(w, h);
+  setWindowFlags(Qt::WindowStaysOnTopHint | Qt::Dialog
+                 | Qt::FramelessWindowHint);
+  show();
+}
+
+/****************************************************************************
+  Selects given tranport and closes widget
+****************************************************************************/
+void hud_unit_loader::selection_changed(const QItemSelection& s1,
+                                        const QItemSelection& s2)
+{
+  int curr_row;
+
+  curr_row = s1.indexes().at(0).row();
+  request_unit_load(cargo, transports.at(curr_row), qtile);
+  close();
+}
+

Modified: trunk/client/gui-qt/hudwidget.h
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/client/gui-qt/hudwidget.h?rev=34301&r1=34300&r2=34301&view=diff
==============================================================================
--- trunk/client/gui-qt/hudwidget.h     (original)
+++ trunk/client/gui-qt/hudwidget.h     Mon Oct 31 16:47:29 2016
@@ -20,6 +20,7 @@
 #include <QMessageBox>
 #include <QElapsedTimer>
 #include <QLineEdit>
+#include <QTableWidget>
 
 #include "shortcuts.h"
 
@@ -175,6 +176,23 @@
   tile *current_tile;
 };
 
+/****************************************************************************
+  Widget allowing load units on transport
+****************************************************************************/
+class hud_unit_loader : public QTableWidget
+{
+  QList<unit * > transports;
+  Q_OBJECT
+public:
+  hud_unit_loader(struct unit *pcargo, struct tile *ptile);
+  ~hud_unit_loader();
+  void show_me();
+protected slots:
+  void selection_changed(const QItemSelection&, const QItemSelection&);
+private:
+  struct unit *cargo;
+  struct tile *qtile;
+};
 
 #endif /* FC__HUDWIDGET_H */
 

Modified: trunk/client/gui-qt/menu.cpp
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/client/gui-qt/menu.cpp?rev=34301&r1=34300&r2=34301&view=diff
==============================================================================
--- trunk/client/gui-qt/menu.cpp        (original)
+++ trunk/client/gui-qt/menu.cpp        Mon Oct 31 16:47:29 2016
@@ -2680,7 +2680,7 @@
 void mr_menu::slot_load()
 {
   unit_list_iterate(get_units_in_focus(), punit) {
-    request_unit_load(punit, NULL, unit_tile(punit));
+    qtg_request_transport(punit, unit_tile(punit));
   } unit_list_iterate_end;
 }
 


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

Reply via email to