Freeciv21
Develop your civilization from humble roots to a global empire
effect_edit.cpp
Go to the documentation of this file.
1 /*__ ___ ***************************************
2 / \ / \ Copyright (c) 1996-2020 Freeciv21 and Freeciv
3 \_ \ / __/ contributors. This file is part of Freeciv21.
4  _\ \ / /__ Freeciv21 is free software: you can redistribute it
5  \___ \____/ __/ and/or modify it under the terms of the GNU General
6  \_ _/ Public License as published by the Free Software
7  | @ @ \_ Foundation, either version 3 of the License,
8  | or (at your option) any later version.
9  _/ /\ You should have received a copy of the GNU
10  /o) (o/\ \_ General Public License along with Freeciv21.
11  \_____/ / If not, see https://www.gnu.org/licenses/.
12  \____/ ********************************************************/
13 
14 // Qt
15 #include <QGridLayout>
16 #include <QLabel>
17 #include <QLineEdit>
18 #include <QMenu>
19 #include <QPushButton>
20 #include <QSpinBox>
21 
22 // utility
23 #include "fcintl.h"
24 
25 // common
26 #include "effects.h"
27 
28 // ruledit
29 #include "ruledit.h"
30 #include "ruledit_qt.h"
31 
32 #include "effect_edit.h"
36 effect_edit::effect_edit(ruledit_gui *ui_in, const QString &target,
37  struct universal *filter_in,
38  enum effect_filter_main_class efmc_in)
39  : QDialog()
40 {
41  QVBoxLayout *main_layout = new QVBoxLayout(this);
42  QGridLayout *effect_edit_layout = new QGridLayout();
43  QHBoxLayout *active_layout = new QHBoxLayout();
44  QPushButton *close_button;
45  QPushButton *reqs_button;
46  QMenu *menu;
47  QLabel *lbl;
48  enum effect_type eff;
49 
50  ui = ui_in;
51  selected = nullptr;
52  if (filter_in == nullptr) {
53  fc_assert(efmc_in != EFMC_NORMAL);
54  filter.kind = VUT_NONE;
55  } else {
56  fc_assert(efmc_in == EFMC_NORMAL);
57  filter = *filter_in;
58  }
59  name = target;
60 
61  efmc = efmc_in;
62 
63  list_widget = new QListWidget(this);
64  effects = effect_list_new();
65 
66  connect(list_widget, &QListWidget::itemSelectionChanged, this,
68  main_layout->addWidget(list_widget);
69 
70  lbl = new QLabel(R__("Type:"));
71  active_layout->addWidget(lbl, 0);
72  edit_type_button = new QToolButton(this);
73  menu = new QMenu();
74  edit_type_button->setToolButtonStyle(Qt::ToolButtonTextOnly);
75  edit_type_button->setPopupMode(QToolButton::MenuButtonPopup);
76  connect(menu, &QMenu::triggered, this, &effect_edit::effect_type_menu);
77  edit_type_button->setMenu(menu);
78  for (eff = (enum effect_type) 0; eff < EFT_COUNT;
79  eff = (enum effect_type)(eff + 1)) {
80  menu->addAction(effect_type_name(eff));
81  }
82  active_layout->addWidget(edit_type_button, 1);
83 
84  lbl = new QLabel(R__("Value:"));
85  active_layout->addWidget(lbl, 2);
86  value_box = new QSpinBox(this);
87  active_layout->addWidget(value_box, 3);
88  connect(value_box, QOverload<int>::of(&QSpinBox::valueChanged), this,
90 
91  main_layout->addLayout(active_layout);
92 
93  reqs_button =
94  new QPushButton(QString::fromUtf8(R__("Requirements")), this);
95  connect(reqs_button, &QAbstractButton::pressed, this,
97  effect_edit_layout->addWidget(reqs_button, 0, 0);
98 
99  close_button = new QPushButton(QString::fromUtf8(R__("Close")), this);
100  connect(close_button, &QAbstractButton::pressed, this,
102  effect_edit_layout->addWidget(close_button, 1, 0);
103 
104  refresh();
105 
106  main_layout->addLayout(effect_edit_layout);
107 
108  setLayout(main_layout);
109  setWindowTitle(target);
110 }
111 
115 effect_edit::~effect_edit() { effect_list_destroy(effects); }
116 
120 static bool effect_list_fill_cb(struct effect *peffect, void *data)
121 {
122  struct effect_list_fill_data *cbdata =
123  (struct effect_list_fill_data *) data;
124 
125  if (cbdata->filter->kind == VUT_NONE) {
126  if (cbdata->efmc == EFMC_NONE) {
127  // Look for empty req lists.
128  if (requirement_vector_size(&peffect->reqs) == 0) {
129  cbdata->edit->add_effect_to_list(peffect, cbdata);
130  }
131  } else {
132  fc_assert(cbdata->efmc == EFMC_ALL);
133  cbdata->edit->add_effect_to_list(peffect, cbdata);
134  }
135  } else if (universal_is_mentioned_by_requirements(&peffect->reqs,
136  cbdata->filter)) {
137  cbdata->edit->add_effect_to_list(peffect, cbdata);
138  }
139 
140  return true;
141 }
142 
147 {
148  struct effect_list_fill_data cb_data;
149 
150  list_widget->clear();
151  effect_list_clear(effects);
152  cb_data.filter = &filter;
153  cb_data.efmc = efmc;
154  cb_data.edit = this;
155  cb_data.num = 0;
156 
158 
159  fill_active();
160 }
161 
166  struct effect_list_fill_data *data)
167 {
168  char buf[512];
169  QListWidgetItem *item;
170 
171  fc_snprintf(buf, sizeof(buf), _("Effect #%d: %s"), data->num + 1,
172  effect_type_name(peffect->type));
173 
174  item = new QListWidgetItem(QString::fromUtf8(buf));
175  list_widget->insertItem(data->num++, item);
176  effect_list_append(effects, peffect);
177  if (selected == peffect) {
178  item->setSelected(true);
179  }
180 }
181 
186 
191 {
192  ui->unregister_effect_edit(this);
193  done(0);
194 }
195 
200 {
201  int i = 0;
202 
203  effect_list_iterate(effects, peffect)
204  {
205  QListWidgetItem *item = list_widget->item(i++);
206 
207  if (item != nullptr && item->isSelected()) {
208  selected = peffect;
209  selected_nbr = i;
210  fill_active();
211  return;
212  }
213  }
215 }
216 
221 {
222  if (selected != nullptr) {
223  edit_type_button->setText(effect_type_name(selected->type));
224  value_box->setValue(selected->value);
225  }
226 }
227 
232 {
233  QByteArray en_bytes = action->text().toUtf8();
234  enum effect_type type =
235  effect_type_by_name(en_bytes.data(), fc_strcasecmp);
236 
237  if (selected != nullptr) {
238  selected->type = type;
239  }
240 
242 }
243 
248 {
249  if (selected != nullptr) {
250  selected->value = value;
251  }
252 
254 }
255 
260 {
261  if (selected != nullptr) {
262  char buf[128];
263  QByteArray en_bytes;
264 
265  en_bytes = name.toUtf8();
266  fc_snprintf(buf, sizeof(buf), R__("%s effect #%d"), en_bytes.data(),
267  selected_nbr);
268 
269  ui->open_req_edit(QString::fromUtf8(buf), &selected->reqs);
270  }
271 }
272 
276 void effect_edit::closeEvent(QCloseEvent *event)
277 {
278  ui->unregister_effect_edit(this);
279 }
struct effect_list * effects
Definition: effect_edit.h:67
QToolButton * edit_type_button
Definition: effect_edit.h:72
void close_now()
User pushed close button.
QString name
Definition: effect_edit.h:64
void fill_active()
Fill active menus from selected effect.
void edit_reqs()
User wants to edit requirements.
enum effect_filter_main_class efmc
Definition: effect_edit.h:59
void add_effect_to_list(struct effect *peffect, struct effect_list_fill_data *data)
Add entry to effect list.
void set_value(int value)
Read value from spinbox to effect.
~effect_edit() override
Effect edit destructor.
int selected_nbr
Definition: effect_edit.h:70
struct universal filter
Definition: effect_edit.h:66
QListWidget * list_widget
Definition: effect_edit.h:65
void closeEvent(QCloseEvent *event) override
User clicked windows close button.
struct universal * filter_get()
Getter for filter.
QSpinBox * value_box
Definition: effect_edit.h:73
void refresh()
Refresh the information.
ruledit_gui * ui
Definition: effect_edit.h:62
void effect_type_menu(QAction *action)
User selected type for the effect.
effect_edit(ruledit_gui *ui_in, const QString &target, struct universal *filter_in, enum effect_filter_main_class efmc_in)
Setup effect_edit object.
Definition: effect_edit.cpp:36
struct effect * selected
Definition: effect_edit.h:69
void select_effect()
User selected effect from the list.
void unregister_effect_edit(class effect_edit *e_edit)
Unregisted closed effect_edit dialog.
Definition: ruledit_qt.cpp:382
void refresh_effect_edits()
Refresh all effect edit dialogs.
Definition: ruledit_qt.cpp:390
void open_req_edit(const QString &target, struct requirement_vector *preqs)
Open req_edit dialog.
Definition: ruledit_qt.cpp:278
static bool effect_list_fill_cb(struct effect *peffect, void *data)
Callback to fill effects list from iterate_effect_cache()
effect_filter_main_class
Definition: effect_edit.h:31
@ EFMC_ALL
Definition: effect_edit.h:34
@ EFMC_NORMAL
Definition: effect_edit.h:32
@ EFMC_NONE
Definition: effect_edit.h:33
bool iterate_effect_cache(iec_cb cb, void *data)
Iterate through all the effects in cache, and call callback for each.
Definition: effects.cpp:1259
#define effect_list_iterate_end
Definition: effects.h:349
#define effect_list_iterate(effect_list, peffect)
Definition: effects.h:347
enum event_type event
Definition: events.cpp:68
#define _(String)
Definition: fcintl.h:50
#define R__(String)
Definition: fcintl.h:58
#define fc_assert(condition)
Definition: log.h:89
bool universal_is_mentioned_by_requirements(const struct requirement_vector *reqs, const struct universal *psource)
Returns TRUE iff the universal 'psource' is directly mentioned by any of the requirements in 'reqs'.
struct universal * filter
Definition: effect_edit.h:38
enum effect_filter_main_class efmc
Definition: effect_edit.h:39
class effect_edit * edit
Definition: effect_edit.h:40
int value
Definition: effects.h:336
struct requirement_vector reqs
Definition: effects.h:340
enum effect_type type
Definition: effects.h:328
Definition: climisc.h:66
enum universals_n kind
Definition: fc_types.h:740
universals_u value
Definition: fc_types.h:739
int fc_snprintf(char *str, size_t n, const char *format,...)
See also fc_utf8_snprintf_trunc(), fc_utf8_snprintf_rep().
Definition: support.cpp:537
int fc_strcasecmp(const char *str0, const char *str1)
Compare strings like strcmp(), but ignoring case.
Definition: support.cpp:89