Freeciv21
Develop your civilization from humble roots to a global empire
tab_misc.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 <QHeaderView>
17 #include <QLineEdit>
18 #include <QMessageBox>
19 #include <QPushButton>
20 #include <QRadioButton>
21 #include <QTableWidget>
22 
23 // utility
24 #include "fcintl.h"
25 
26 // common
27 #include "achievements.h"
28 #include "game.h"
29 #include "government.h"
30 #include "multipliers.h"
31 #include "specialist.h"
32 #include "style.h"
33 
34 // server
35 #include "rssanity.h"
36 
37 // ruledit
38 #include "ruledit.h"
39 #include "ruledit_qt.h"
40 #include "rulesave.h"
41 
42 #include "tab_misc.h"
43 
47 tab_misc::tab_misc(ruledit_gui *ui_in) : QWidget()
48 {
49  QGridLayout *main_layout = new QGridLayout(this);
50  QLabel *save_label;
51  QLabel *save_ver_label;
52  QLabel *name_label;
53  QLabel *version_label;
54  QPushButton *save_button;
55  QPushButton *always_active_effects;
56  QPushButton *all_effects;
57  QPushButton *refresh_button;
58  int row = 0;
59  QTableWidgetItem *item;
60 
61  ui = ui_in;
62 
63  main_layout->setSizeConstraint(QLayout::SetMaximumSize);
64 
65  name_label = new QLabel(QString::fromUtf8(R__("Ruleset name")));
66  name_label->setParent(this);
67  main_layout->addWidget(name_label, row, 0);
68  name = new QLineEdit(this);
69  main_layout->addWidget(name, row++, 1);
70  version_label = new QLabel(QString::fromUtf8(R__("Ruleset version")));
71  version_label->setParent(this);
72  main_layout->addWidget(version_label, row, 0);
73  version = new QLineEdit(this);
74  main_layout->addWidget(version, row++, 1);
75  save_label = new QLabel(QString::fromUtf8(R__("Save to directory")));
76  save_label->setParent(this);
77  main_layout->addWidget(save_label, row, 0);
78  savedir = new QLineEdit(this);
79  savedir->setText(QStringLiteral("ruledit-tmp"));
80  savedir->setFocus();
81  main_layout->addWidget(savedir, row++, 1);
82  save_ver_label =
83  new QLabel(QString::fromUtf8(R__("Version suffix to directory name")));
84  save_ver_label->setParent(this);
85  main_layout->addWidget(save_ver_label, row, 0);
86  savedir_version = new QRadioButton(this);
87  main_layout->addWidget(savedir_version, row++, 1);
88  save_button = new QPushButton(QString::fromUtf8(R__("Save now")), this);
89  connect(save_button, &QAbstractButton::pressed, this, &tab_misc::save_now);
90  main_layout->addWidget(save_button, row++, 1);
91  always_active_effects =
92  new QPushButton(QString::fromUtf8(R__("Always active Effects")), this);
93  connect(always_active_effects, &QAbstractButton::pressed, this,
95  main_layout->addWidget(always_active_effects, row++, 1);
96  all_effects = new QPushButton(QString::fromUtf8(R__("All Effects")), this);
97  connect(all_effects, &QAbstractButton::pressed, this,
99  main_layout->addWidget(all_effects, row++, 1);
100 
101  stats = new QTableWidget(this);
102  stats->setColumnCount(8);
103  stats->setRowCount(6);
104  item = new QTableWidgetItem(QString::fromUtf8(RQ_("?stat:Terrains")));
105  stats->setItem(0, 0, item);
106  item = new QTableWidgetItem(QStringLiteral("-"));
107  stats->setItem(0, 1, item);
108  item = new QTableWidgetItem(QString::fromUtf8(RQ_("?stat:Resources")));
109  stats->setItem(1, 0, item);
110  item = new QTableWidgetItem(QStringLiteral("-"));
111  stats->setItem(1, 1, item);
112  item = new QTableWidgetItem(QString::fromUtf8(RQ_("?stat:Tech Classes")));
113  stats->setItem(2, 0, item);
114  item = new QTableWidgetItem(QStringLiteral("-"));
115  stats->setItem(2, 1, item);
116  item = new QTableWidgetItem(QString::fromUtf8(RQ_("?stat:Techs")));
117  stats->setItem(3, 0, item);
118  item = new QTableWidgetItem(QStringLiteral("-"));
119  stats->setItem(3, 1, item);
120  item = new QTableWidgetItem(QString::fromUtf8(RQ_("?stat:Unit Classes")));
121  stats->setItem(4, 0, item);
122  item = new QTableWidgetItem(QStringLiteral("-"));
123  stats->setItem(4, 1, item);
124  item = new QTableWidgetItem(QString::fromUtf8(RQ_("?stat:Unit Types")));
125  stats->setItem(5, 0, item);
126  item = new QTableWidgetItem(QStringLiteral("-"));
127  stats->setItem(5, 1, item);
128  item = new QTableWidgetItem(QString::fromUtf8(RQ_("?stat:Buildings")));
129  stats->setItem(0, 3, item);
130  item = new QTableWidgetItem(QStringLiteral("-"));
131  stats->setItem(0, 4, item);
132  item = new QTableWidgetItem(QString::fromUtf8(RQ_("?stat:Nations")));
133  stats->setItem(1, 3, item);
134  item = new QTableWidgetItem(QStringLiteral("-"));
135  stats->setItem(1, 4, item);
136  item = new QTableWidgetItem(QString::fromUtf8(RQ_("?stat:Styles")));
137  stats->setItem(2, 3, item);
138  item = new QTableWidgetItem(QStringLiteral("-"));
139  stats->setItem(2, 4, item);
140  item = new QTableWidgetItem(QString::fromUtf8(RQ_("?stat:Specialists")));
141  stats->setItem(3, 3, item);
142  item = new QTableWidgetItem(QStringLiteral("-"));
143  stats->setItem(3, 4, item);
144  item = new QTableWidgetItem(QString::fromUtf8(RQ_("?stat:Governments")));
145  stats->setItem(4, 3, item);
146  item = new QTableWidgetItem(QStringLiteral("-"));
147  stats->setItem(4, 4, item);
148  item = new QTableWidgetItem(QString::fromUtf8(RQ_("?stat:Disasters")));
149  stats->setItem(5, 3, item);
150  item = new QTableWidgetItem(QStringLiteral("-"));
151  stats->setItem(5, 4, item);
152  item = new QTableWidgetItem(QString::fromUtf8(RQ_("?stat:Achievements")));
153  stats->setItem(0, 6, item);
154  item = new QTableWidgetItem(QStringLiteral("-"));
155  stats->setItem(0, 7, item);
156  item = new QTableWidgetItem(QString::fromUtf8(RQ_("?stat:Extras")));
157  stats->setItem(1, 6, item);
158  item = new QTableWidgetItem(QStringLiteral("-"));
159  stats->setItem(1, 7, item);
160  item = new QTableWidgetItem(QString::fromUtf8(RQ_("?stat:Bases")));
161  stats->setItem(2, 6, item);
162  item = new QTableWidgetItem(QStringLiteral("-"));
163  stats->setItem(2, 7, item);
164  item = new QTableWidgetItem(QString::fromUtf8(RQ_("?stat:Roads")));
165  stats->setItem(3, 6, item);
166  item = new QTableWidgetItem(QStringLiteral("-"));
167  stats->setItem(3, 7, item);
168  item = new QTableWidgetItem(QString::fromUtf8(RQ_("?stat:Goods")));
169  stats->setItem(4, 6, item);
170  item = new QTableWidgetItem(QStringLiteral("-"));
171  stats->setItem(4, 7, item);
172  item = new QTableWidgetItem(QString::fromUtf8(RQ_("?stat:Multipliers")));
173  stats->setItem(5, 6, item);
174  item = new QTableWidgetItem(QStringLiteral("-"));
175  stats->setItem(5, 7, item);
176  stats->verticalHeader()->setVisible(false);
177  stats->horizontalHeader()->setVisible(false);
178  stats->setEditTriggers(QAbstractItemView::NoEditTriggers);
179  main_layout->addWidget(stats, row++, 0, 1, 2);
180  refresh_button =
181  new QPushButton(QString::fromUtf8(R__("Refresh Stats")), this);
182  connect(refresh_button, &QAbstractButton::pressed, this,
184  main_layout->addWidget(refresh_button, row++, 0, 1, 2);
185 
186  // Stats never change except with experimental features. Hide useless
187  // button.
188  show_experimental(refresh_button);
189 
190  refresh();
191 
192  setLayout(main_layout);
193 }
194 
199 {
200  name->setText(game.control.name);
201  version->setText(game.control.version);
202  refresh_stats();
203 }
204 
209 {
210  char nameUTF8[MAX_LEN_NAME];
211  QString full_dir;
212  QByteArray ba_bytes;
213 
214  ui->flush_widgets();
215 
216  ba_bytes = name->text().toUtf8();
217  qstrncpy(nameUTF8, ba_bytes.data(), sizeof(nameUTF8) - 1);
218 
219  if (nameUTF8[0] != '\0') {
220  qstrncpy(game.control.name, nameUTF8, sizeof(game.control.name));
221  }
222 
223  ba_bytes = version->text().toUtf8();
224  qstrncpy(game.control.version, ba_bytes.data(),
225  sizeof(game.control.version) - 1);
226 
228  QMessageBox *box = new QMessageBox();
229 
230  box->setText(
231  QStringLiteral("Current data fails sanity checks. Save anyway?"));
232  box->setStandardButtons(QMessageBox::Yes | QMessageBox::No);
233  box->exec();
234 
235  if (box->result() != QMessageBox::Yes) {
236  return;
237  }
238  }
239 
240  if (savedir_version->isChecked()) {
241  full_dir = savedir->text() + "-" + version->text();
242  } else {
243  full_dir = savedir->text();
244  }
245 
246  ba_bytes = full_dir.toUtf8();
247  save_ruleset(ba_bytes.data(), nameUTF8, &(ui->data));
248 
249  ui->display_msg(R__("Ruleset saved"));
250 }
251 
256 {
257  int row = 0;
258  int count;
259  int base_count;
260  int road_count;
261 
262  count = 0;
263  terrain_re_active_iterate(pterr) { count++; }
265  stats->item(row++, 1)->setText(QString::number(count));
266 
267  stats->item(row++, 1)->setText(
268  QString::number(game.control.num_resource_types));
269 
270  count = 0;
271  tech_class_re_active_iterate(ptclass) { count++; }
273  stats->item(row++, 1)->setText(QString::number(count));
274 
275  count = 0;
276  advance_re_active_iterate(padv) { count++; }
278  stats->item(row++, 1)->setText(QString::number(count));
279 
280  count = 0;
281  unit_class_re_active_iterate(pclass) { count++; }
283  stats->item(row++, 1)->setText(QString::number(count));
284 
285  count = 0;
286  unit_type_re_active_iterate(ptype) { count++; }
288  stats->item(row++, 1)->setText(QString::number(count));
289 
290  // Second column
291  row = 0;
292  count = 0;
293  improvement_re_active_iterate(pimpr) { count++; }
295  stats->item(row++, 4)->setText(QString::number(count));
296 
297  stats->item(row++, 4)->setText(QString::number(game.control.nation_count));
298 
299  count = 0;
300  styles_re_active_iterate(pstyle) { count++; }
302  stats->item(row++, 4)->setText(QString::number(count));
303 
304  count = 0;
305  specialist_type_re_active_iterate(pspe) { count++; }
307  stats->item(row++, 4)->setText(QString::number(count));
308 
309  count = std::count_if(governments.begin(), governments.end(),
310  [](government &p) { return !p.ruledit_disabled; });
311 
312  stats->item(row++, 4)->setText(QString::number(count));
313 
314  stats->item(row++, 4)->setText(
315  QString::number(game.control.num_disaster_types));
316 
317  // Third column
318  row = 0;
319 
320  count = 0;
321  achievements_re_active_iterate(pach) { count++; }
323  stats->item(row++, 7)->setText(QString::number(count));
324 
325  count = 0;
326  base_count = 0;
327  road_count = 0;
329  {
330  count++;
331  if (is_extra_caused_by(pextra, EC_BASE)) {
332  base_count++;
333  }
334  if (is_extra_caused_by(pextra, EC_ROAD)) {
335  road_count++;
336  }
337  }
339  stats->item(row++, 7)->setText(QString::number(count));
340  stats->item(row++, 7)->setText(QString::number(base_count));
341  stats->item(row++, 7)->setText(QString::number(road_count));
342 
343  count = 0;
344  goods_type_re_active_iterate(pg) { count++; }
346  stats->item(row++, 7)->setText(QString::number(count));
347 
348  count = 0;
349  multipliers_re_active_iterate(pmul) { count++; }
351  stats->item(row++, 7)->setText(QString::number(count));
352 
353  stats->resizeColumnsToContents();
354 }
355 
360 {
361  ui->open_effect_edit(QString::fromUtf8(R__("Always active")), nullptr,
362  EFMC_NONE);
363 }
364 
369 {
370  ui->open_effect_edit(QString::fromUtf8(R__("All effects")), nullptr,
371  EFMC_ALL);
372 }
#define achievements_re_active_iterate(_p)
Definition: achievements.h:68
#define achievements_re_active_iterate_end
Definition: achievements.h:73
Base_type_id base_count()
Return the number of base_types.
Definition: base.cpp:152
void flush_widgets()
Flush information from widgets to stores where it can be saved from.
Definition: ruledit_qt.cpp:273
struct rule_data data
Definition: ruledit_qt.h:107
void display_msg(const char *msg)
Display status message.
Definition: ruledit_qt.cpp:240
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 edit_aae_effects()
User wants to edit always active effects.
Definition: tab_misc.cpp:359
ruledit_gui * ui
Definition: tab_misc.h:41
QLineEdit * savedir
Definition: tab_misc.h:44
void save_now()
User entered savedir.
Definition: tab_misc.cpp:208
QLineEdit * name
Definition: tab_misc.h:42
void edit_all_effects()
User wants to edit effects from full list.
Definition: tab_misc.cpp:368
QRadioButton * savedir_version
Definition: tab_misc.h:45
void refresh_stats()
Recalculate stats.
Definition: tab_misc.cpp:255
QTableWidget * stats
Definition: tab_misc.h:46
QLineEdit * version
Definition: tab_misc.h:43
tab_misc(ruledit_gui *ui_in)
Setup tab_misc object.
Definition: tab_misc.cpp:47
void refresh()
Refresh the information.
Definition: tab_misc.cpp:198
@ EFMC_ALL
Definition: effect_edit.h:34
@ EFMC_NONE
Definition: effect_edit.h:33
#define is_extra_caused_by(e, c)
Definition: extras.h:182
#define extra_type_re_active_iterate_end
Definition: extras.h:294
#define extra_type_re_active_iterate(_p)
Definition: extras.h:289
#define MAX_LEN_NAME
Definition: fc_types.h:61
#define RQ_(String)
Definition: fcintl.h:59
#define R__(String)
Definition: fcintl.h:58
struct civ_game game
Definition: game.cpp:47
std::vector< government > governments
Definition: government.cpp:28
#define improvement_re_active_iterate_end
Definition: improvement.h:209
#define improvement_re_active_iterate(_p)
Definition: improvement.h:204
#define multipliers_re_active_iterate(_mul_)
Definition: multipliers.h:55
#define multipliers_re_active_iterate_end
Definition: multipliers.h:60
Road_type_id road_count()
Return the number of road_types.
Definition: road.cpp:41
bool sanity_check_ruleset_data(bool ignore_retired)
Some more sanity checking once all rulesets are loaded.
Definition: rssanity.cpp:716
bool autoadjust_ruleset_data()
Apply some automatic defaults to already loaded rulesets.
Definition: rssanity.cpp:1389
void show_experimental(QWidget *wdg)
Show widget if experimental features enabled, hide otherwise.
Definition: ruledit.cpp:163
bool save_ruleset(const char *path, const char *name, struct rule_data *data)
Save ruleset to directory given.
Definition: rulesave.cpp:3013
#define specialist_type_re_active_iterate_end
Definition: specialist.h:83
#define specialist_type_re_active_iterate(_p)
Definition: specialist.h:77
struct packet_ruleset_control control
Definition: game.h:74
Definition: climisc.h:66
#define styles_re_active_iterate_end
Definition: style.h:55
#define styles_re_active_iterate(_p)
Definition: style.h:50
#define advance_re_active_iterate(_p)
Definition: tech.h:243
#define tech_class_re_active_iterate(_p)
Definition: tech.h:182
#define advance_re_active_iterate_end
Definition: tech.h:248
#define tech_class_re_active_iterate_end
Definition: tech.h:187
#define terrain_re_active_iterate_end
Definition: terrain.h:347
#define terrain_re_active_iterate(_p)
Definition: terrain.h:342
#define goods_type_re_active_iterate_end
Definition: traderoutes.h:233
#define goods_type_re_active_iterate(_p)
Definition: traderoutes.h:228
#define unit_type_re_active_iterate(_p)
Definition: unittype.h:796
#define unit_class_re_active_iterate_end
Definition: unittype.h:839
#define unit_class_re_active_iterate(_p)
Definition: unittype.h:834
#define unit_type_re_active_iterate_end
Definition: unittype.h:801