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