Freeciv21
Develop your civilization from humble roots to a global empire
tab_terrains.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 "terrain.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_terrains.h"
36 
41 {
42  QVBoxLayout *main_layout = new QVBoxLayout(this);
43  QGridLayout *terrains_layout = new QGridLayout();
44  QLabel *label;
45  QPushButton *effects_button;
46  QPushButton *add_button;
47  QPushButton *delete_button;
48 
49  ui = ui_in;
50  selected = 0;
51 
52  terrain_list = new QListWidget(this);
53 
54  connect(terrain_list, &QListWidget::itemSelectionChanged, this,
56  main_layout->addWidget(terrain_list);
57 
58  terrains_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, &tab_terrains::name_given);
65  terrains_layout->addWidget(label, 0, 0);
66  terrains_layout->addWidget(rname, 0, 2);
67 
68  label = new QLabel(QString::fromUtf8(R__("Name")));
69  label->setParent(this);
70  same_name = new QRadioButton();
71  connect(same_name, &QAbstractButton::toggled, this,
73  name = new QLineEdit(this);
74  name->setText(QStringLiteral("None"));
75  connect(name, &QLineEdit::returnPressed, this, &tab_terrains::name_given);
76  terrains_layout->addWidget(label, 1, 0);
77  terrains_layout->addWidget(same_name, 1, 1);
78  terrains_layout->addWidget(name, 1, 2);
79 
80  effects_button = new QPushButton(QString::fromUtf8(R__("Effects")), this);
81  connect(effects_button, &QAbstractButton::pressed, this,
83  terrains_layout->addWidget(effects_button, 2, 2);
84 
85  add_button = new QPushButton(QString::fromUtf8(R__("Add Terrain")), this);
86  connect(add_button, &QAbstractButton::pressed, this,
88  terrains_layout->addWidget(add_button, 3, 0);
89  show_experimental(add_button);
90 
91  delete_button =
92  new QPushButton(QString::fromUtf8(R__("Remove this Terrain")), this);
93  connect(delete_button, &QAbstractButton::pressed, this,
95  terrains_layout->addWidget(delete_button, 3, 2);
96  show_experimental(delete_button);
97 
98  refresh();
99 
100  main_layout->addLayout(terrains_layout);
101 
102  setLayout(main_layout);
103 }
104 
109 {
110  terrain_list->clear();
111 
112  terrain_type_iterate(pterr)
113  {
114  if (!pterr->ruledit_disabled) {
115  QListWidgetItem *item =
116  new QListWidgetItem(QString::fromUtf8(terrain_rule_name(pterr)));
117 
118  terrain_list->insertItem(terrain_index(pterr), item);
119  }
120  }
122 }
123 
128 {
129  selected = pterr;
130 
131  if (selected != nullptr) {
132  QString dispn = QString::fromUtf8(untranslated_name(&(pterr->name)));
133  QString rulen = QString::fromUtf8(terrain_rule_name(pterr));
134 
135  name->setText(dispn);
136  rname->setText(rulen);
137  if (dispn == rulen) {
138  name->setEnabled(false);
139  same_name->setChecked(true);
140  } else {
141  same_name->setChecked(false);
142  name->setEnabled(true);
143  }
144  } else {
145  name->setText(QStringLiteral("None"));
146  rname->setText(QStringLiteral("None"));
147  same_name->setChecked(true);
148  name->setEnabled(false);
149  }
150 }
151 
156 {
157  QList<QListWidgetItem *> select_list = terrain_list->selectedItems();
158 
159  if (!select_list.isEmpty()) {
160  QByteArray tn_bytes;
161 
162  tn_bytes = select_list.at(0)->text().toUtf8();
163  update_terrain_info(terrain_by_rule_name(tn_bytes.data()));
164  }
165 }
166 
171 {
172  if (selected != nullptr) {
173  QByteArray name_bytes;
174  QByteArray rname_bytes;
175 
176  terrain_type_iterate(pterr)
177  {
178  if (pterr != selected && !pterr->ruledit_disabled) {
179  rname_bytes = rname->text().toUtf8();
180  if (!strcmp(terrain_rule_name(pterr), rname_bytes.data())) {
181  ui->display_msg(
182  R__("A terrain with that rule name already exists!"));
183  return;
184  }
185  }
186  }
188 
189  if (same_name->isChecked()) {
190  name->setText(rname->text());
191  }
192 
193  name_bytes = name->text().toUtf8();
194  rname_bytes = rname->text().toUtf8();
195  names_set(&(selected->name), 0, name_bytes.data(), rname_bytes.data());
196  refresh();
197  }
198 }
199 
204 {
205  if (selected != nullptr) {
206  requirers_dlg *requirers;
207 
210  requirers)) {
211  return;
212  }
213 
214  selected->ruledit_disabled = true;
215 
216  refresh();
217  update_terrain_info(nullptr);
218  }
219 }
220 
225 {
226  if (terrain_by_rule_name("New Terrain") != nullptr) {
227  return false;
228  }
229 
230  name_set(&(pterr->name), 0, "New Terrain");
231 
232  return true;
233 }
234 
239 {
240  struct terrain *new_terr;
241 
242  // Try to reuse freed terrain slot
243  terrain_type_iterate(pterr)
244  {
245  if (pterr->ruledit_disabled) {
246  if (initialize_new_terrain(pterr)) {
247  pterr->ruledit_disabled = false;
248  update_terrain_info(pterr);
249  refresh();
250  }
251  return;
252  }
253  }
255 
256  // Try to add completely new terrain
257  if (game.control.terrain_count >= MAX_NUM_TERRAINS) {
258  return;
259  }
260 
261  // terrain_count must be big enough to hold new extra or
262  // terrain_by_number() fails.
263  game.control.terrain_count++;
264  new_terr = terrain_by_number(game.control.terrain_count - 1);
265  if (initialize_new_terrain(new_terr)) {
266  update_terrain_info(new_terr);
267 
268  refresh();
269  } else {
270  game.control.terrain_count--; // Restore
271  }
272 }
273 
278 {
279  name->setEnabled(!checked);
280  if (checked) {
281  name->setText(rname->text());
282  }
283 }
284 
289 {
290  if (selected != nullptr) {
291  struct universal uni;
292 
293  uni.value.terrain = selected;
294  uni.kind = VUT_TERRAIN;
295 
296  ui->open_effect_edit(QString::fromUtf8(terrain_rule_name(selected)),
297  &uni, EFMC_NORMAL);
298  }
299 }
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
void open_effect_edit(const QString &target, struct universal *uni, enum effect_filter_main_class efmc)
Open effect_edit dialog.
Definition: ruledit_qt.cpp:350
void same_name_toggle(bool checked)
Toggled whether rule_name and name should be kept identical.
QRadioButton * same_name
Definition: tab_terrains.h:43
QLineEdit * rname
Definition: tab_terrains.h:41
void add_now()
User requested new terrain.
void edit_effects()
User wants to edit effects.
tab_terrains(ruledit_gui *ui_in)
Setup tab_terrains object.
bool initialize_new_terrain(struct terrain *pterr)
Initialize new terrain for use.
QLineEdit * name
Definition: tab_terrains.h:40
void select_terrain()
User selected terrain from the list.
struct terrain * selected
Definition: tab_terrains.h:45
void refresh()
Refresh the information.
void update_terrain_info(struct terrain *pterr)
Update info of the terrain.
ruledit_gui * ui
Definition: tab_terrains.h:36
void delete_now()
User requested terrain deletion.
QListWidget * terrain_list
Definition: tab_terrains.h:42
void name_given()
User entered name for the terrain.
@ EFMC_NORMAL
Definition: effect_edit.h:32
#define R__(String)
Definition: fcintl.h:58
struct civ_game game
Definition: game.cpp:47
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 name_translation name
Definition: terrain.h:172
bool ruledit_disabled
Definition: terrain.h:173
enum universals_n kind
Definition: fc_types.h:740
universals_u value
Definition: fc_types.h:739
struct terrain * terrain_by_number(const Terrain_type_id type)
Return the terrain for the given terrain index.
Definition: terrain.cpp:128
const char * terrain_rule_name(const struct terrain *pterrain)
Return the (untranslated) rule name of the terrain.
Definition: terrain.cpp:184
struct terrain * terrain_by_rule_name(const char *name)
Return the terrain type matching the name, or T_UNKNOWN if none matches.
Definition: terrain.cpp:140
Terrain_type_id terrain_index(const struct terrain *pterrain)
Return the terrain index.
Definition: terrain.cpp:110
#define terrain_type_iterate(_p)
Definition: terrain.h:331
#define terrain_type_iterate_end
Definition: terrain.h:337
#define MAX_NUM_TERRAINS
Definition: terrain.h:58
struct terrain * terrain
Definition: fc_types.h:583
bool is_terrain_needed(struct terrain *pterr, requirers_cb cb, void *data)
Check if anything in ruleset needs terrain type.
Definition: validity.cpp:286