Freeciv21
Develop your civilization from humble roots to a global empire
ratesdlg.cpp
Go to the documentation of this file.
1 /*
2  Copyright (c) 1996-2023 Freeciv21 and Freeciv contributors. This file is
3  part of Freeciv21. Freeciv21 is free software: you can redistribute it
4  and/or modify it under the terms of the GNU General Public License as
5  published by the Free Software Foundation, either version 3 of the
6  License, or (at your option) any later version. You should have received
7  a copy of the GNU General Public License along with Freeciv21. If not,
8  see https://www.gnu.org/licenses/.
9  */
10 
11 #include "ratesdlg.h"
12 // Qt
13 #include <QApplication>
14 #include <QGroupBox>
15 #include <QMouseEvent>
16 #include <QPainter>
17 #include <QScreen>
18 #include <QVBoxLayout>
19 // common
20 #include "effects.h"
21 #include "fc_types.h"
22 #include "government.h"
23 #include "multipliers.h"
24 #include "packets.h"
25 // client
26 #include "client_main.h"
27 #include "dialogs.h"
28 #include "fc_client.h"
29 #include "icons.h"
30 #include "tileset/tilespec.h"
31 #include "widgets/multi_slider.h"
32 
33 static int scale_to_mult(const struct multiplier *pmul, int scale);
34 static int mult_to_scale(const struct multiplier *pmul, int val);
35 
41  : qfc_dialog(parent)
42 {
43  QHBoxLayout *some_layout;
44  QVBoxLayout *main_layout;
45  QPushButton *cancel_button;
46  QPushButton *ok_button;
47  QPushButton *apply_button;
48  QLabel *l2;
49  QString str;
50 
51  setWindowTitle(_("National Budget"));
52  main_layout = new QVBoxLayout;
53 
54  l2 = new QLabel(_("Select tax, luxury and science rates"));
55  l2->setAlignment(Qt::AlignHCenter);
56  m_info = new QLabel(str);
57  m_info->setAlignment(Qt::AlignHCenter);
58  main_layout->addWidget(l2);
59  main_layout->addWidget(m_info);
60  main_layout->addSpacing(20);
61 
62  cancel_button = new QPushButton(_("Cancel"));
63  ok_button = new QPushButton(_("Ok"));
64  apply_button = new QPushButton(_("Apply"));
65  some_layout = new QHBoxLayout;
66  connect(cancel_button, &QAbstractButton::pressed, this, &QWidget::close);
67  connect(apply_button, &QAbstractButton::pressed, this,
69  connect(ok_button, &QAbstractButton::pressed, this,
71  connect(ok_button, &QAbstractButton::pressed, this, &QWidget::close);
72  some_layout->addWidget(cancel_button);
73  some_layout->addWidget(apply_button);
74  some_layout->addWidget(ok_button);
75 
77  main_layout->addWidget(slider);
78 
79  main_layout->addSpacing(20);
80  main_layout->addLayout(some_layout);
81  setLayout(main_layout);
82 }
83 
88 {
89  if (!client.conn.playing) {
90  // The budget dialog doesn't make sense without a player
91  return;
92  }
93 
94  const int max = get_player_bonus(client.conn.playing, EFT_MAX_RATES);
95 
96  // Trans: Government - max rate (of taxes) x%
97  m_info->setText(QString(_("%1 - max rate: %2%"))
99  QString::number(max)));
100 
101  if (!slider_init) {
102  for (auto tax : {O_GOLD, O_SCIENCE, O_LUXURY}) {
103  auto sprite = get_tax_sprite(tileset, tax);
104  slider->add_category(sprite->scaled(sprite->size() * 2));
105  }
106  slider_init = true;
107  }
108  slider->set_range(0, 0, max / 10);
109  slider->set_range(1, 0, max / 10);
110  slider->set_range(2, 0, max / 10);
111  slider->set_values({
115  });
116 }
117 
122 {
123  auto rates = slider->values();
124  dsend_packet_player_rates(&client.conn,
125  10 * rates[0], // Tax
126  10 * rates[2], // Lux
127  10 * rates[1]); // Sci
128 }
129 
135  : QDialog(parent)
136 {
137  QGroupBox *group_box;
138  QHBoxLayout *some_layout;
139  QLabel *label;
140  QSlider *slider;
141  QVBoxLayout *main_layout;
142  struct player *pplayer = client_player();
143 
144  cancel_button = new QPushButton;
145  ok_button = new QPushButton;
146  setWindowTitle(_("Change policies"));
147  main_layout = new QVBoxLayout;
148 
149  multipliers_iterate(pmul)
150  {
151  QHBoxLayout *hb = new QHBoxLayout;
152  int val = player_multiplier_target_value(pplayer, pmul);
153 
154  group_box = new QGroupBox(multiplier_name_translation(pmul));
155  slider = new QSlider(Qt::Horizontal, this);
156  slider->setMinimum(mult_to_scale(pmul, pmul->start));
157  slider->setMaximum(mult_to_scale(pmul, pmul->stop));
158  slider->setValue(mult_to_scale(pmul, val));
159  connect(slider, &QAbstractSlider::valueChanged, this,
161  slider_list.append(slider);
162  label = new QLabel(QString::number(mult_to_scale(pmul, val)));
163  hb->addWidget(slider);
164  slider->setEnabled(multiplier_can_be_changed(pmul, client_player()));
165  hb->addWidget(label);
166  group_box->setLayout(hb);
167  slider->setProperty("lab", QVariant::fromValue((void *) label));
168  main_layout->addWidget(group_box);
169  }
171  some_layout = new QHBoxLayout;
172  cancel_button->setText(_("Cancel"));
173  ok_button->setText(_("Ok"));
174  connect(cancel_button, &QAbstractButton::pressed, this,
176  connect(ok_button, &QAbstractButton::pressed, this,
178  some_layout->addWidget(cancel_button);
179  some_layout->addWidget(ok_button);
180  main_layout->addSpacing(20);
181  main_layout->addLayout(some_layout);
182  setLayout(main_layout);
183 }
184 
189 {
190  Q_UNUSED(i)
191  QSlider *qo;
192  qo = (QSlider *) QObject::sender();
193  QVariant qvar;
194  QLabel *lab;
195 
196  qvar = qo->property("lab");
197  lab = reinterpret_cast<QLabel *>(qvar.value<void *>());
198  lab->setText(QString::number(qo->value()));
199 }
200 
205 {
206  close();
207  deleteLater();
208 }
209 
214 {
215  int j = 0;
216  int value;
217  struct packet_player_multiplier mul;
218 
219  multipliers_iterate(pmul)
220  {
222 
223  value = slider_list.at(j)->value();
224  mul.multipliers[i] = scale_to_mult(pmul, value);
225  j++;
226  }
228  mul.count = multiplier_count();
229  send_packet_player_multiplier(&client.conn, &mul);
230  close();
231  deleteLater();
232 }
233 
237 int mult_to_scale(const struct multiplier *pmul, int val)
238 {
239  return (val - pmul->start) / pmul->step;
240 }
241 
245 int scale_to_mult(const struct multiplier *pmul, int scale)
246 {
247  return scale * pmul->step + pmul->start;
248 }
249 
254 { // PORTME
255  Q_UNUSED(unused)
256 }
257 
262 {
264 
265  if (!can_client_issue_orders()) {
266  return;
267  }
268  mrd = new multipler_rates_dialog(king()->central_wdg);
269  mrd->show();
270 }
A widget that lets the user distribute a fixed number of items across multiple categories.
Definition: multi_slider.h:13
void set_range(std::size_t category, int min, int max)
Sets the minimum and maximum number of items a category can have.
std::vector< int > values() const
Retrieves the number of items in each category.
Definition: multi_slider.h:40
void set_values(const std::vector< int > &values)
Sets the contents of all item categories.
std::size_t add_category(const QPixmap &icon)
Adds a category.
void slot_cancel_button_pressed()
Cancel pressed.
Definition: ratesdlg.cpp:204
QPushButton * ok_button
Definition: ratesdlg.h:57
void slot_set_value(int i)
Slider value changed.
Definition: ratesdlg.cpp:188
QList< QSlider * > slider_list
Definition: ratesdlg.h:55
void slot_ok_button_pressed()
Ok pressed - send mulipliers value.
Definition: ratesdlg.cpp:213
QPushButton * cancel_button
Definition: ratesdlg.h:56
multipler_rates_dialog(QWidget *parent=0)
Multipler rates dialog constructor Inheriting from qfc_dialog will cause crash in Qt5....
Definition: ratesdlg.cpp:134
void refresh()
Refreshes tax rate data.
Definition: ratesdlg.cpp:87
void apply()
Send info to the server.
Definition: ratesdlg.cpp:121
freeciv::multi_slider * slider
Definition: ratesdlg.h:38
national_budget_dialog(QWidget *parent=0)
Dialog constructor for changing rates with sliders.
Definition: ratesdlg.cpp:40
struct player * client_player()
Either controlling or observing.
struct civclient client
bool can_client_issue_orders()
Returns TRUE iff the client can issue orders (such as giving unit commands).
int get_player_bonus(const struct player *pplayer, enum effect_type effect_type)
Returns the effect bonus for a player.
Definition: effects.cpp:673
class fc_client * king()
Return fc_client instance.
Definition: gui_main.cpp:58
@ O_SCIENCE
Definition: fc_types.h:90
@ O_LUXURY
Definition: fc_types.h:89
@ O_GOLD
Definition: fc_types.h:88
int Multiplier_type_id
Definition: fc_types.h:303
#define _(String)
Definition: fcintl.h:50
const char * government_name_for_player(const struct player *pplayer)
Return the (translated) name of the given government of a player.
Definition: government.cpp:147
const char * multiplier_name_translation(const struct multiplier *pmul)
Return the (translated) name of the multiplier.
Definition: multipliers.cpp:94
bool multiplier_can_be_changed(struct multiplier *pmul, struct player *pplayer)
Can player change multiplier value.
Multiplier_type_id multiplier_count()
Return number of loaded multipliers in the ruleset.
Definition: multipliers.cpp:85
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
int player_multiplier_target_value(const struct player *pplayer, const struct multiplier *pmul)
Return the player's target value for a multiplier (which may be different from the value currently in...
Definition: player.cpp:1879
static int scale_to_mult(const struct multiplier *pmul, int scale)
Convert scale units to real multiplier display value.
Definition: ratesdlg.cpp:245
void real_multipliers_dialog_update(void *unused)
Update multipliers (policies) dialog.
Definition: ratesdlg.cpp:253
static int mult_to_scale(const struct multiplier *pmul, int val)
Convert real multiplier display value to scale value.
Definition: ratesdlg.cpp:237
void popup_multiplier_dialog()
Popups multiplier dialog.
Definition: ratesdlg.cpp:261
struct connection conn
Definition: client_main.h:89
struct player * playing
Definition: connection.h:142
Definition: player.h:231
struct player_economic economic
Definition: player.h:266
const QPixmap * get_tax_sprite(const struct tileset *t, Output_type_id otype)
Return a tax sprite for the given output type (usually gold/lux/sci).
Definition: tilespec.cpp:3448