From 9e463fa6d618e193158a773fc6c6af5c02032d48 Mon Sep 17 00:00:00 2001 From: Marko Lindqvist Date: Sun, 22 Jan 2023 06:35:21 +0200 Subject: [PATCH 16/16] Ruledit: Add terrain details editing dialog Thre only values that one can edit in the initial version are movement cost and defense bonus. See osdn #46587 Signed-off-by: Marko Lindqvist --- common/terrain.c | 1 + common/terrain.h | 1 + tools/ruledit/Makefile.am | 3 + tools/ruledit/edit_terrain.cpp | 110 +++++++++++++++++++++++++++++++++ tools/ruledit/edit_terrain.h | 50 +++++++++++++++ tools/ruledit/tab_terrains.cpp | 40 ++++++++++-- tools/ruledit/tab_terrains.h | 1 + 7 files changed, 200 insertions(+), 6 deletions(-) create mode 100644 tools/ruledit/edit_terrain.cpp create mode 100644 tools/ruledit/edit_terrain.h diff --git a/common/terrain.c b/common/terrain.c index 9cfc5fe9b8..ef5893d26b 100644 --- a/common/terrain.c +++ b/common/terrain.c @@ -47,6 +47,7 @@ void terrains_init(void) /* Can't use terrain_by_number here because it does a bounds check. */ civ_terrains[i].item_number = i; civ_terrains[i].disabled = FALSE; + civ_terrains[i].ruledit_dlg = NULL; civ_terrains[i].rgb = NULL; civ_terrains[i].animal = NULL; } diff --git a/common/terrain.h b/common/terrain.h index d1e50a4410..d544a0b948 100644 --- a/common/terrain.h +++ b/common/terrain.h @@ -178,6 +178,7 @@ struct terrain { int item_number; struct name_translation name; bool disabled; /* Does not really exist - hole in terrain array */ + void *ruledit_dlg; char graphic_str[MAX_LEN_NAME]; /* add tile_ prefix */ char graphic_alt[MAX_LEN_NAME]; diff --git a/tools/ruledit/Makefile.am b/tools/ruledit/Makefile.am index 5b3515c025..079974172a 100644 --- a/tools/ruledit/Makefile.am +++ b/tools/ruledit/Makefile.am @@ -28,6 +28,7 @@ freeciv_ruledit_CXXFLAGS = $(ruledit_cxxflags) MOC_FILES = \ meta_conversion_log.cpp \ meta_edit_impr.cpp \ + meta_edit_terrain.cpp \ meta_edit_utype.cpp \ meta_req_edit.cpp \ meta_req_vec_fix.cpp \ @@ -49,6 +50,8 @@ freeciv_ruledit_SOURCES = \ conversion_log.h \ edit_impr.cpp \ edit_impr.h \ + edit_terrain.cpp \ + edit_terrain.h \ edit_utype.cpp \ edit_utype.h \ tab_building.cpp \ diff --git a/tools/ruledit/edit_terrain.cpp b/tools/ruledit/edit_terrain.cpp new file mode 100644 index 0000000000..31319d9f4a --- /dev/null +++ b/tools/ruledit/edit_terrain.cpp @@ -0,0 +1,110 @@ +/*********************************************************************** + Freeciv - Copyright (C) 2023 The Freeciv Team + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. +***********************************************************************/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +// Qt +#include +#include +#include + +// common +#include "terrain.h" + +// ruledit +#include "ruledit.h" +#include "ruledit_qt.h" +#include "tab_tech.h" + +#include "edit_terrain.h" + +/************************************************************************** + Setup edit_terrain object +**************************************************************************/ +edit_terrain::edit_terrain(ruledit_gui *ui_in, struct terrain *ter_in) : QDialog() +{ + QVBoxLayout *main_layout = new QVBoxLayout(this); + QGridLayout *ter_layout = new QGridLayout(); + QLabel *label; + int row = 0; + + ui = ui_in; + ter = ter_in; + + setWindowTitle(QString::fromUtf8(terrain_rule_name(ter))); + + label = new QLabel(QString::fromUtf8(R__("Move Cost"))); + label->setParent(this); + + mcost = new QSpinBox(this); + mcost->setRange(0, 100); + connect(mcost, SIGNAL(valueChanged(int)), this, SLOT(set_mcost_value(int))); + + ter_layout->addWidget(label, row, 0); + ter_layout->addWidget(mcost, row++, 2); + + label = new QLabel(QString::fromUtf8(R__("Defense Bonus %"))); + label->setParent(this); + + defense = new QSpinBox(this); + defense->setRange(0, 1000); + connect(defense, SIGNAL(valueChanged(int)), this, SLOT(set_defense_value(int))); + + ter_layout->addWidget(label, row, 0); + ter_layout->addWidget(defense, row++, 2); + + refresh(); + + main_layout->addLayout(ter_layout); + + setLayout(main_layout); +} + +/************************************************************************** + User is closing dialog. +**************************************************************************/ +void edit_terrain::closeEvent(QCloseEvent *cevent) +{ + ter->ruledit_dlg = nullptr; +} + +/************************************************************************** + Refresh the information. +**************************************************************************/ +void edit_terrain::refresh() +{ + mcost->setValue(ter->movement_cost); + defense->setValue(ter->defense_bonus); +} + +/************************************************************************** + Read movement cost value from spinbox +**************************************************************************/ +void edit_terrain::set_mcost_value(int value) +{ + ter->movement_cost = value; + + refresh(); +} + +/************************************************************************** + Read defense value from spinbox +**************************************************************************/ +void edit_terrain::set_defense_value(int value) +{ + ter->defense_bonus = value; + + refresh(); +} diff --git a/tools/ruledit/edit_terrain.h b/tools/ruledit/edit_terrain.h new file mode 100644 index 0000000000..08fdd83e81 --- /dev/null +++ b/tools/ruledit/edit_terrain.h @@ -0,0 +1,50 @@ +/*********************************************************************** + Freeciv - Copyright (C) 2023 The Freeciv Team + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. +***********************************************************************/ + +#ifndef FC__EDIT_TERRAIN_H +#define FC__EDIT_TERRAIN_H + +#ifdef HAVE_CONFIG_H +#include +#endif + +// Qt +#include + +class QSpinBox; + +class ruledit_gui; + +class edit_terrain : public QDialog +{ + Q_OBJECT + + public: + explicit edit_terrain(ruledit_gui *ui_in, struct terrain *ter_in); + void refresh(); + + private: + ruledit_gui *ui; + struct terrain *ter; + QSpinBox *mcost; + QSpinBox *defense; + + protected: + void closeEvent(QCloseEvent *cevent); + + private slots: + void set_mcost_value(int value); + void set_defense_value(int value); +}; + +#endif // FC__EDIT_TERRAIN_H diff --git a/tools/ruledit/tab_terrains.cpp b/tools/ruledit/tab_terrains.cpp index c760192aab..1ab5f224ba 100644 --- a/tools/ruledit/tab_terrains.cpp +++ b/tools/ruledit/tab_terrains.cpp @@ -33,6 +33,7 @@ #include "terrain.h" // ruledit +#include "edit_terrain.h" #include "req_edit.h" #include "ruledit.h" #include "ruledit_qt.h" @@ -50,6 +51,8 @@ tab_terrains::tab_terrains(ruledit_gui *ui_in) : QWidget() QLabel *label; QPushButton *add_button; QPushButton *delete_button; + QPushButton *edit_button; + int row = 0; ui = ui_in; selected = 0; @@ -66,8 +69,8 @@ tab_terrains::tab_terrains(ruledit_gui *ui_in) : QWidget() rname = new QLineEdit(this); rname->setText(R__("None")); connect(rname, SIGNAL(returnPressed()), this, SLOT(name_given())); - terrains_layout->addWidget(label, 0, 0); - terrains_layout->addWidget(rname, 0, 2); + terrains_layout->addWidget(label, row, 0); + terrains_layout->addWidget(rname, row++, 2); label = new QLabel(QString::fromUtf8(R__("Name"))); label->setParent(this); @@ -76,18 +79,22 @@ tab_terrains::tab_terrains(ruledit_gui *ui_in) : QWidget() name = new QLineEdit(this); name->setText(R__("None")); connect(name, SIGNAL(returnPressed()), this, SLOT(name_given())); - terrains_layout->addWidget(label, 1, 0); - terrains_layout->addWidget(same_name, 1, 1); - terrains_layout->addWidget(name, 1, 2); + terrains_layout->addWidget(label, row, 0); + terrains_layout->addWidget(same_name, row, 1); + terrains_layout->addWidget(name, row++, 2); add_button = new QPushButton(QString::fromUtf8(R__("Add Terrain")), this); connect(add_button, SIGNAL(pressed()), this, SLOT(add_now())); terrains_layout->addWidget(add_button, 2, 0); show_experimental(add_button); + edit_button = new QPushButton(QString::fromUtf8(R__("Edit Values")), this); + connect(edit_button, SIGNAL(pressed()), this, SLOT(edit_now())); + terrains_layout->addWidget(edit_button, row++, 2); + delete_button = new QPushButton(QString::fromUtf8(R__("Remove this Terrain")), this); connect(delete_button, SIGNAL(pressed()), this, SLOT(delete_now())); - terrains_layout->addWidget(delete_button, 2, 2); + terrains_layout->addWidget(delete_button, row++, 2); show_experimental(delete_button); refresh(); @@ -205,6 +212,10 @@ void tab_terrains::delete_now() selected->disabled = true; + if (selected->ruledit_dlg != nullptr) { + ((edit_terrain *)selected->ruledit_dlg)->done(0); + } + refresh(); update_terrain_info(nullptr); } @@ -271,3 +282,20 @@ void tab_terrains::same_name_toggle(bool checked) name->setText(rname->text()); } } + +/**********************************************************************//** + User requested terrain edit dialog +**************************************************************************/ +void tab_terrains::edit_now() +{ + if (selected != nullptr) { + if (selected->ruledit_dlg == nullptr) { + edit_terrain *edit = new edit_terrain(ui, selected); + + edit->show(); + selected->ruledit_dlg = edit; + } else { + ((edit_terrain *)selected->ruledit_dlg)->raise(); + } + } +} diff --git a/tools/ruledit/tab_terrains.h b/tools/ruledit/tab_terrains.h index d47fb9e7f2..3b4f46163d 100644 --- a/tools/ruledit/tab_terrains.h +++ b/tools/ruledit/tab_terrains.h @@ -52,6 +52,7 @@ class tab_terrains : public QWidget void select_terrain(); void add_now(); void delete_now(); + void edit_now(); void same_name_toggle(bool checked); }; -- 2.39.0