Freeciv21
Develop your civilization from humble roots to a global empire
tab_multiplier.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 <QLineEdit>
17 #include <QListWidget>
18 #include <QMenu>
19 #include <QPushButton>
20 #include <QRadioButton>
21 
22 // utility
23 #include "fcintl.h"
24 
25 // common
26 #include "game.h"
27 #include "multipliers.h"
28 
29 // ruledit
30 #include "req_edit.h"
31 #include "ruledit.h"
32 #include "ruledit_qt.h"
33 #include "validity.h"
34 
35 #include "tab_multiplier.h"
36 
41 {
42  QVBoxLayout *main_layout = new QVBoxLayout(this);
43  QGridLayout *mpr_layout = new QGridLayout();
44  QLabel *label;
45  QPushButton *add_button;
46  QPushButton *delete_button;
47  QPushButton *reqs_button;
48 
49  ui = ui_in;
50  selected = 0;
51 
52  mpr_list = new QListWidget(this);
53 
54  connect(mpr_list, &QListWidget::itemSelectionChanged, this,
56  main_layout->addWidget(mpr_list);
57 
58  mpr_layout->setSizeConstraint(QLayout::SetMaximumSize);
59 
60  label = new QLabel(QString::fromUtf8(R__("Rule Name")));
61  label->setParent(this);
62  rname = new QLineEdit(this);
63  rname->setText(QStringLiteral("None"));
64  connect(rname, &QLineEdit::returnPressed, this,
66  mpr_layout->addWidget(label, 0, 0);
67  mpr_layout->addWidget(rname, 0, 2);
68 
69  label = new QLabel(QString::fromUtf8(R__("Name")));
70  label->setParent(this);
71  same_name = new QRadioButton();
72  connect(same_name, &QAbstractButton::toggled, this,
74  name = new QLineEdit(this);
75  name->setText(QStringLiteral("None"));
76  connect(name, &QLineEdit::returnPressed, this,
78  mpr_layout->addWidget(label, 1, 0);
79  mpr_layout->addWidget(same_name, 1, 1);
80  mpr_layout->addWidget(name, 1, 2);
81 
82  reqs_button =
83  new QPushButton(QString::fromUtf8(R__("Requirements")), this);
84  connect(reqs_button, &QAbstractButton::pressed, this,
86  mpr_layout->addWidget(reqs_button, 2, 2);
87 
88  add_button =
89  new QPushButton(QString::fromUtf8(R__("Add Multiplier")), this);
90  connect(add_button, &QAbstractButton::pressed, this,
92  mpr_layout->addWidget(add_button, 4, 0);
93  show_experimental(add_button);
94 
95  delete_button = new QPushButton(
96  QString::fromUtf8(R__("Remove this Multiplier")), this);
97  connect(delete_button, &QAbstractButton::pressed, this,
99  mpr_layout->addWidget(delete_button, 4, 2);
100  show_experimental(delete_button);
101 
102  refresh();
103 
104  main_layout->addLayout(mpr_layout);
105 
106  setLayout(main_layout);
107 }
108 
113 {
114  mpr_list->clear();
115 
116  multipliers_iterate(pmul)
117  {
118  if (!pmul->ruledit_disabled) {
119  QListWidgetItem *item =
120  new QListWidgetItem(QString::fromUtf8(multiplier_rule_name(pmul)));
121 
122  mpr_list->insertItem(multiplier_index(pmul), item);
123  }
124  }
126 }
127 
132 {
133  selected = pmul;
134 
135  if (selected != 0) {
136  QString dispn = QString::fromUtf8(untranslated_name(&(pmul->name)));
137  QString rulen = QString::fromUtf8(multiplier_rule_name(pmul));
138 
139  name->setText(dispn);
140  rname->setText(rulen);
141  if (dispn == rulen) {
142  name->setEnabled(false);
143  same_name->setChecked(true);
144  } else {
145  same_name->setChecked(false);
146  name->setEnabled(true);
147  }
148  } else {
149  name->setText(QStringLiteral("None"));
150  rname->setText(QStringLiteral("None"));
151  same_name->setChecked(true);
152  name->setEnabled(false);
153  }
154 }
155 
160 {
161  QList<QListWidgetItem *> select_list = mpr_list->selectedItems();
162 
163  if (!select_list.isEmpty()) {
164  QByteArray mn_bytes;
165 
166  mn_bytes = select_list.at(0)->text().toUtf8();
168  }
169 }
170 
175 {
176  if (selected != nullptr) {
177  QByteArray name_bytes;
178  QByteArray rname_bytes;
179 
180  multipliers_iterate(pmul)
181  {
182  if (pmul != selected && !pmul->ruledit_disabled) {
183  rname_bytes = rname->text().toUtf8();
184  if (!strcmp(multiplier_rule_name(pmul), rname_bytes.data())) {
185  ui->display_msg(
186  R__("A multiplier with that rule name already exists!"));
187  return;
188  }
189  }
190  }
192 
193  if (same_name->isChecked()) {
194  name->setText(rname->text());
195  }
196 
197  name_bytes = name->text().toUtf8();
198  rname_bytes = rname->text().toUtf8();
199  names_set(&(selected->name), 0, name_bytes.data(), rname_bytes.data());
200  refresh();
201  }
202 }
203 
208 {
209  if (selected != 0) {
210  requirers_dlg *requirers;
211 
214  requirers)) {
215  return;
216  }
217 
218  selected->ruledit_disabled = true;
219 
220  refresh();
221  update_multiplier_info(nullptr);
222  }
223 }
224 
229 {
230  if (multiplier_by_rule_name("New Multiplier") != nullptr) {
231  return false;
232  }
233 
234  name_set(&(pmul->name), 0, "New Multiplier");
235 
236  return true;
237 }
238 
243 {
244  struct multiplier *new_multiplier;
245 
246  // Try to reuse freed multiplier slot
247  multipliers_iterate(pmul)
248  {
249  if (pmul->ruledit_disabled) {
250  if (initialize_new_multiplier(pmul)) {
251  pmul->ruledit_disabled = false;
253  refresh();
254  }
255  return;
256  }
257  }
259 
260  // Try to add completely new multiplier
261  if (game.control.num_multipliers >= MAX_NUM_MULTIPLIERS) {
262  return;
263  }
264 
265  // num_multipliers must be big enough to hold new multiplier or
266  // multiplier_by_number() fails.
267  game.control.num_multipliers++;
268  new_multiplier = multiplier_by_number(game.control.num_multipliers - 1);
269  if (initialize_new_multiplier(new_multiplier)) {
270  update_multiplier_info(new_multiplier);
271 
272  refresh();
273  } else {
274  game.control.num_multipliers--; // Restore
275  }
276 }
277 
282 {
283  name->setEnabled(!checked);
284  if (checked) {
285  name->setText(rname->text());
286  }
287 }
288 
293 {
294  if (selected != nullptr) {
295  req_edit *redit =
296  new req_edit(ui, QString::fromUtf8(multiplier_rule_name(selected)),
297  &selected->reqs);
298 
299  redit->show();
300  }
301 }
void display_msg(const char *msg)
Display status message.
Definition: ruledit_qt.cpp:240
requirers_dlg * create_requirers(const char *title)
Create requirers dlg.
Definition: ruledit_qt.cpp:248
ruledit_gui * ui
tab_multiplier(ruledit_gui *ui_in)
Setup tab_multiplier object.
QRadioButton * same_name
void same_name_toggle(bool checked)
Toggled whether rule_name and name should be kept identical.
void edit_reqs()
User wants to edit reqs.
void delete_now()
User requested multiplier deletion.
QLineEdit * name
void refresh()
Refresh the information.
void select_multiplier()
User selected multiplier from the list.
void update_multiplier_info(struct multiplier *pmul)
Update info of the multiplier.
QListWidget * mpr_list
void add_now()
User requested new multiplier.
void name_given()
User entered name for the multiplier.
struct multiplier * selected
bool initialize_new_multiplier(struct multiplier *pmul)
Initialize new multiplier for use.
QLineEdit * rname
#define MAX_NUM_MULTIPLIERS
Definition: fc_types.h:49
#define R__(String)
Definition: fcintl.h:58
struct civ_game game
Definition: game.cpp:47
struct multiplier * multiplier_by_number(Multiplier_type_id id)
Returns multiplier associated to given number.
Definition: multipliers.cpp:54
const char * multiplier_rule_name(const struct multiplier *pmul)
Return the (untranslated) rule name of the multiplier.
struct multiplier * multiplier_by_rule_name(const char *name)
Returns multiplier matching rule name, or nullptr if there is no multiplier with such a name.
Multiplier_type_id multiplier_index(const struct multiplier *pmul)
Returns multiplier index.
Definition: multipliers.cpp:77
#define multipliers_iterate(_mul_)
Definition: multipliers.h:45
#define multipliers_iterate_end
Definition: multipliers.h:51
static void name_set(struct name_translation *ptrans, const char *domain, const char *vernacular_name)
static const char * untranslated_name(const struct name_translation *ptrans)
static void names_set(struct name_translation *ptrans, const char *domain, const char *vernacular_name, const char *rule_name)
void show_experimental(QWidget *wdg)
Show widget if experimental features enabled, hide otherwise.
Definition: ruledit.cpp:163
void ruledit_qt_display_requirers(const char *msg, void *data)
Display requirer list.
Definition: ruledit_qt.cpp:67
struct packet_ruleset_control control
Definition: game.h:74
Definition: climisc.h:66
struct requirement_vector reqs
Definition: multipliers.h:25
bool ruledit_disabled
Definition: multipliers.h:17
struct name_translation name
Definition: multipliers.h:16
bool is_multiplier_needed(struct multiplier *pmul, requirers_cb cb, void *data)
Check if anything in ruleset needs multiplier.
Definition: validity.cpp:337