Author: cazfi
Date: Sat Aug  6 19:34:02 2016
New Revision: 33472

URL: http://svn.gna.org/viewcvs/freeciv?rev=33472&view=rev
Log:
Added support for editing requirement kind and range.

See patch #7551

Modified:
    trunk/common/requirements.c
    trunk/common/requirements.h
    trunk/tools/ruledit/req_edit.cpp
    trunk/tools/ruledit/req_edit.h

Modified: trunk/common/requirements.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/common/requirements.c?rev=33472&r1=33471&r2=33472&view=diff
==============================================================================
--- trunk/common/requirements.c (original)
+++ trunk/common/requirements.c Sat Aug  6 19:34:02 2016
@@ -47,6 +47,27 @@
 typedef enum item_found (*universal_found)(const struct requirement *,
                                            const struct universal *);
 static universal_found universal_found_function[VUT_COUNT] = {NULL};
+
+/************************************************************************
+  Initialize universal value with a value suitable for the kind.
+************************************************************************/
+void universal_value_init(struct universal *src)
+{
+  /* TODO: Implement really */
+  switch (src->kind) {
+  case VUT_NONE:
+    /* Value of None should never be used */
+    break;
+  case VUT_ADVANCE:
+    src->value.advance = advance_by_number(A_NONE);
+    break;
+  case VUT_GOVERNMENT:
+    src->value.govern = game.government_during_revolution;
+    break;
+  default:
+    src->value.advance = NULL;
+  }
+}
 
 /**************************************************************************
   Parse requirement type (kind) and value strings into a universal

Modified: trunk/common/requirements.h
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/common/requirements.h?rev=33472&r1=33471&r2=33472&view=diff
==============================================================================
--- trunk/common/requirements.h (original)
+++ trunk/common/requirements.h Sat Aug  6 19:34:02 2016
@@ -55,6 +55,16 @@
 #define SPECENUM_COUNT REQ_RANGE_COUNT /* keep this last */
 #include "specenum_gen.h"
 
+#define req_range_iterate(_range_) \
+  {                                \
+    enum req_range _range_;        \
+    for (_range_ = REQ_RANGE_LOCAL ; _range_ < REQ_RANGE_COUNT ; \
+         _range_ = (enum req_range)(_range_ + 1)) {
+
+#define req_range_iterate_end \
+    }                         \
+  }
+
 /* A requirement. This requirement is basically a conditional; it may or
  * may not be active on a target.  If it is active then something happens.
  * For instance units and buildings have requirements to be built, techs
@@ -129,6 +139,7 @@
                    const struct requirement_vector *vec);
 
 /* General universal functions. */
+void universal_value_init(struct universal *src);
 int universal_number(const struct universal *source);
 
 struct universal universal_by_number(const enum universals_n kind,
@@ -153,6 +164,15 @@
                                     const struct requirement_vector *reqs,
                                     const struct universal *source);
 
+#define universals_iterate(_univ_) \
+  {                                \
+    enum universals_n _univ_;      \
+    for (_univ_ = VUT_NONE; _univ_ < VUT_COUNT; _univ_ = (enum 
universals_n)(_univ_ + 1)) {
+
+#define universals_iterate_end \
+    }                          \
+  }
+
 /* Accessors to determine if a universal fulfills a requirement vector.
  * When adding an additional accessor, be sure to add the appropriate
  * item_found function in universal_found_callbacks_init(). */

Modified: trunk/tools/ruledit/req_edit.cpp
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/tools/ruledit/req_edit.cpp?rev=33472&r1=33471&r2=33472&view=diff
==============================================================================
--- trunk/tools/ruledit/req_edit.cpp    (original)
+++ trunk/tools/ruledit/req_edit.cpp    Sat Aug  6 19:34:02 2016
@@ -17,6 +17,8 @@
 
 // Qt
 #include <QGridLayout>
+#include <QLabel>
+#include <QMenu>
 #include <QPushButton>
 
 // utility
@@ -38,9 +40,12 @@
 {
   QVBoxLayout *main_layout = new QVBoxLayout(this);
   QGridLayout *reqedit_layout = new QGridLayout();
+  QHBoxLayout *active_layout = new QHBoxLayout();
   QPushButton *close_button;
   QPushButton *add_button;
   QPushButton *delete_button;
+  QMenu *menu;
+  QLabel *lbl;
 
   ui = ui_in;
   selected = nullptr;
@@ -50,6 +55,34 @@
 
   connect(req_list, SIGNAL(itemSelectionChanged()), this, SLOT(select_req()));
   main_layout->addWidget(req_list);
+
+  lbl = new QLabel(R__("Type:"));
+  active_layout->addWidget(lbl, 0, 0);
+  edit_type_button = new QToolButton();
+  menu = new QMenu();
+  edit_type_button->setToolButtonStyle(Qt::ToolButtonTextOnly);
+  edit_type_button->setPopupMode(QToolButton::MenuButtonPopup);
+  connect(menu, SIGNAL(triggered(QAction *)), this, SLOT(req_type_menu(QAction 
*)));
+  edit_type_button->setMenu(menu);
+  universals_iterate(univ_id) {
+    menu->addAction(universals_n_name(univ_id));
+  } universals_iterate_end;
+  active_layout->addWidget(edit_type_button, 1, 0);
+
+  lbl = new QLabel(R__("Range:"));
+  active_layout->addWidget(lbl, 2, 0);
+  edit_range_button = new QToolButton();
+  menu = new QMenu();
+  edit_range_button->setToolButtonStyle(Qt::ToolButtonTextOnly);
+  edit_range_button->setPopupMode(QToolButton::MenuButtonPopup);
+  connect(menu, SIGNAL(triggered(QAction *)), this, 
SLOT(req_range_menu(QAction *)));
+  edit_range_button->setMenu(menu);
+  req_range_iterate(range_id) {
+    menu->addAction(req_range_name(range_id));
+  } req_range_iterate_end;
+  active_layout->addWidget(edit_range_button, 3, 0);
+
+  main_layout->addLayout(active_layout);
 
   add_button = new QPushButton(QString::fromUtf8(R__("Add Requirement")), 
this);
   connect(add_button, SIGNAL(pressed()), this, SLOT(add_now()));
@@ -92,6 +125,8 @@
       req_list->insertItem(i++, item);
     }
   } requirement_vector_iterate_end;
+
+  fill_active();
 }
 
 /**************************************************************************
@@ -112,9 +147,52 @@
   requirement_vector_iterate(req_vector, preq) {
     if (req_list->item(i++)->isSelected()) {
       selected = preq;
-      break;
+      fill_active();
+      return;
     }
   } requirement_vector_iterate_end;
+}
+
+/**************************************************************************
+  Fill active menus from selected req.
+**************************************************************************/
+void req_edit::fill_active()
+{
+  if (selected != nullptr) {
+    edit_type_button->setText(universals_n_name(selected->source.kind));
+    edit_range_button->setText(req_range_name(selected->range));
+  }
+}
+
+/**************************************************************************
+  User selected type for the requirement.
+**************************************************************************/
+void req_edit::req_type_menu(QAction *action)
+{
+  enum universals_n univ = universals_n_by_name(action->text().toUtf8().data(),
+                                                fc_strcasecmp);
+
+  if (selected != nullptr) {
+    selected->source.kind = univ;
+    universal_value_init(&selected->source);
+  }
+
+  refresh();
+}
+
+/**************************************************************************
+  User selected range for the requirement.
+**************************************************************************/
+void req_edit::req_range_menu(QAction *action)
+{
+  enum req_range range = req_range_by_name(action->text().toUtf8().data(),
+                                           fc_strcasecmp);
+
+  if (selected != nullptr) {
+    selected->range = range;
+  }
+
+  refresh();
 }
 
 /**************************************************************************

Modified: trunk/tools/ruledit/req_edit.h
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/tools/ruledit/req_edit.h?rev=33472&r1=33471&r2=33472&view=diff
==============================================================================
--- trunk/tools/ruledit/req_edit.h      (original)
+++ trunk/tools/ruledit/req_edit.h      Sat Aug  6 19:34:02 2016
@@ -21,6 +21,7 @@
 // Qt
 #include <QDialog>
 #include <QListWidget>
+#include <QToolButton>
 
 class ruledit_gui;
 
@@ -42,11 +43,18 @@
 
     struct requirement *selected;
 
+    QToolButton *edit_type_button;
+    QToolButton *edit_range_button;
+
   private slots:
     void select_req();
+    void fill_active();
     void add_now();
     void delete_now();
     void close_now();
+
+    void req_type_menu(QAction *action);
+    void req_range_menu(QAction *action);
 };
 
 #endif // FC__REQ_EDIT_H


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

Reply via email to