The Battle for Wesnoth  1.15.2+dev
generator_settings.cpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2010 - 2018 by the Battle for Wesnoth Project https://www.wesnoth.org/
3 
4  This program is free software; you can redistribute it and/or modify
5  it under the terms of the GNU General Public License as published by
6  the Free Software Foundation; either version 2 of the License, or
7  (at your option) any later version.
8  This program is distributed in the hope that it will be useful,
9  but WITHOUT ANY WARRANTY.
10 
11  See the COPYING file for more details.
12 */
13 
14 #define GETTEXT_DOMAIN "wesnoth-lib"
15 
17 
18 #include "formatter.hpp"
19 #include "gui/auxiliary/field.hpp"
20 #include "gui/widgets/settings.hpp"
21 #include "gui/widgets/slider.hpp"
23 #include "gettext.hpp"
24 
25 #include "utils/functional.hpp"
26 
27 namespace gui2
28 {
29 namespace dialogs
30 {
31 
32 static int max_coastal = 5;
33 static int extra_size_per_player = 2;
34 static int min_size = 20;
35 
37 
39  : players_(register_integer("players", true, data.nplayers))
40  , width_(register_integer("width", true, data.width))
41  , height_(register_integer("height", true, data.height))
42  , update_width_label_()
43  , update_height_label_()
44 {
45  register_integer("hills_num", true, data.iterations);
46  register_integer("hills_size", true, data.hill_size);
47  register_integer("villages", true, data.nvillages);
48  register_integer("castle_size", true, data.castle_size);
49  register_integer("landform", true, data.island_size);
50 
51  register_bool("connect_castles", true, data.link_castles);
52  register_bool("show_labels", true, data.show_labels);
53 }
54 
56 {
57  // We adjust the minimum values of the width and height sliders when the number of players changes.
58  // This is done because the map generator needs more space to generate more castles for more players.
60  &generator_settings::adjust_minimum_size_by_players, this, std::ref(window)));
61 
62  gui2::bind_status_label<slider>(&window, "players");
63 
64  update_width_label_ = gui2::bind_status_label<slider>(&window, "width");
65  update_height_label_ = gui2::bind_status_label<slider>(&window, "height");
66 
67  // Update min size initially.
68  // Do this *after* assigning the 'update_*_label_` functions or the game will crash!
70 
71  gui2::bind_status_label<slider>(&window, "villages", [](slider& s)->std::string { return formatter() << s.get_value() << _("/1000 tiles"); });
72  gui2::bind_status_label<slider>(&window, "castle_size");
73  gui2::bind_status_label<slider>(&window, "landform", [](slider& s)->std::string {
74  return s.get_value() == 0 ? _("Inland") : (s.get_value() < max_coastal ? _("Coastal") : _("Island")); });
75 }
76 
78 {
79  const int extra_size = (players_->get_widget_value(window) - 2) * extra_size_per_player;
80 
81  const auto update_dimension_slider = [&](field_integer* field) {
82  slider& w = dynamic_cast<slider&>(*field->get_widget());
83  w.set_value_range(min_size + extra_size, w.get_maximum_value());
84  };
85 
86  update_dimension_slider(width_);
87  update_dimension_slider(height_);
88 
91 }
92 
93 } // namespace dialogs
94 } // namespace gui2
T get_widget_value(window &window)
Gets the value of the field.
Definition: field.hpp:395
Implements some helper classes to ease adding fields to a dialog and hide the synchronization needed...
field_integer * players_
We need to own these fields to access the underlying widget.
virtual void pre_show(window &window) override
The execute function.
void adjust_minimum_size_by_players(window &window)
Generic file dialog.
Definition: field-fwd.hpp:22
static int extra_size_per_player
static UNUSEDNOWARN std::string _(const char *str)
Definition: gettext.hpp:91
void set_value_range(int min_value, int max_value)
Definition: slider.cpp:254
virtual int get_maximum_value() const override
Inherited from integer_selector.
Definition: slider.hpp:65
void connect_signal_notify_modified(dispatcher &dispatcher, const signal_notification_function &signal)
Connects a signal handler for getting a notification upon modification.
Definition: dispatcher.cpp:248
This file contains the settings handling of the widget library.
std::ostringstream wrapper.
Definition: formatter.hpp:38
static void field(LexState *ls, struct ConsControl *cc)
Definition: lparser.cpp:702
std::function< void()> update_width_label_
std::function< void()> update_height_label_
Various uncategorised dialogs.
styled_widget * get_widget()
Definition: field.hpp:206
static map_location::DIRECTION s
int w
A slider.
Definition: slider.hpp:33
static int max_coastal
base class of top level items, the only item which needs to store the final canvases to draw on ...
Definition: window.hpp:63
Template class to implement the generic field implementation.
Definition: field-fwd.hpp:35