15 #define GETTEXT_DOMAIN "wesnoth-lib"
35 : create_engine_(create_engine)
43 for(
const auto& saved_option :
c.cfg.child_range(
"option")) {
44 options_data_[
c.cfg[
"id"]][saved_option[
"id"]] = saved_option[
"value"];
84 static const std::string
type =
"era";
95 static const std::string
type =
"modification";
110 return source.level_type == type;
121 data = &node_data_map_iter->second;
127 int& position =
data->position;
130 for(
auto i = type_node_vector.rbegin();
i != type_node_vector.rend();
i++) {
134 type_node_vector.clear();
170 }
else if(source.
level_type ==
"modification") {
184 T*
widget =
dynamic_cast<T*
>(node.
find(
id,
true));
187 const std::string widget_id = cfg[
"id"];
190 if(!option_config.has_attribute(widget_id) || option_config[widget_id].empty()) {
191 option_config[widget_id] = cfg[
"default"];
195 widget->set_tooltip(cfg[
"description"]);
197 return {
widget, option_config[widget_id]};
221 item[
"label"] = cfg[
"name"];
222 data.emplace(
"tree_view_node_label",
item);
225 type_node_vector.push_back(&option_node);
231 const config& option_cfg = opt.cfg;
233 const auto add_name = [&](
const std::string&
id) {
234 item[
"label"] = option_cfg[
"name"];
240 if(opt.key ==
"checkbox") {
244 std::tie(checkbox, val) = add_node_and_get_widget<toggle_button>(option_node,
"option_checkbox",
data, option_cfg);
249 std::bind(&mp_options_helper::update_options_data_map<toggle_button>,
this, checkbox,
visible_options_.back()));
251 }
else if(opt.key ==
"spacer") {
252 option_node.
add_child(
"options_spacer_node", empty_map);
254 }
else if(opt.key ==
"choice") {
261 std::vector<config> combo_items;
262 std::vector<std::string> combo_values;
266 i[
"label"] =
i[
"name"];
268 combo_items.push_back(
i);
269 combo_values.push_back(
i[
"value"]);
273 std::tie(menu, val) = add_node_and_get_widget<menu_button>(option_node,
"option_menu_button",
data, option_cfg);
278 auto iter = std::find(combo_values.begin(), combo_values.end(), val.
str());
280 if(iter != combo_values.end()) {
281 menu->
set_selected(std::distance(combo_values.begin(), iter));
287 }
else if(opt.key ==
"slider") {
291 std::tie(slide, val) = add_node_and_get_widget<slider>(option_node,
"option_slider",
data, option_cfg);
293 slide->
set_value_range(option_cfg[
"min"].to_int(), option_cfg[
"max"].to_int());
298 std::bind(&mp_options_helper::update_options_data_map<slider>,
this, slide,
visible_options_.back()));
300 }
else if(opt.key ==
"entry") {
304 std::tie(textbox, val) = add_node_and_get_widget<text_box>(option_node,
"option_text_entry",
data, option_cfg);
308 std::bind(&mp_options_helper::update_options_data_map<text_box>,
this, textbox,
visible_options_.back()));
317 std::placeholders::_3, std::placeholders::_4));
326 mod[
"id"] = source.id;
331 for(
const auto& option :
options_data_[source.id].attribute_range()) {
332 mod.
add_child(
"option",
config {
"id", option.first,
"value", option.second});
static void add_name(std::string &temp_string, bool active, const std::string name, std::set< std::string > &checking_name)
Variant for storing WML attributes.
std::string str(const std::string &fallback="") const
int to_int(int def=0) const
bool to_bool(bool def=false) const
A config object defines a single node in a WML file, with access to child nodes.
bool has_child(config_key_type key) const
Determine whether a config has a child or not.
const_all_children_itors all_children_range() const
In-order iteration over all children.
child_itors child_range(config_key_type key)
config & add_child(config_key_type key)
std::map< std::string, config > options_data_
ng::create_engine & create_engine_
void update_status_label()
void update_mod_options()
void reset_options_data(const option_source &source, bool &handled, bool &halt)
mp_options_helper(window &window, ng::create_engine &create_engine)
styled_widget & no_options_notice_
void update_options_data_map_menu_button(menu_button *widget, const option_source &source, const config &cfg)
void display_custom_options(const std::string &type, int node_position, const config &data)
void update_era_options()
std::map< std::string, type_node_data > node_data_map_
std::vector< tree_view_node * > node_vector
config get_options_config()
std::pair< T *, config::attribute_value > add_node_and_get_widget(tree_view_node &option_node, const std::string &id, data_map &data, const config &cfg)
void update_game_options()
std::vector< option_source > visible_options_
int remove_nodes_for_type(const std::string &type)
tree_view & options_tree_
void update_all_options()
void update_options_data_map(T *widget, const option_source &source)
A slider is a control that can select a value by moving a grip on a groove.
void set_step_size(int step_size)
virtual void set_value(int value) override
Inherited from integer_selector.
void set_value_range(int min_value, int max_value)
virtual void set_value(const std::string &text)
The set_value is virtual for the password_box class.
void set_text_changed_callback(std::function< void(text_box_base *textbox, const std::string text)> cb)
Set the text_changed callback.
Class for a single line text area.
widget * find(const std::string &id, const bool must_be_active) override
See widget::find.
tree_view_node & add_child(const std::string &id, const widget_data &data, const int index=-1)
Constructs a new child node.
A tree view is a control that holds several items of the same or different types.
tree_view_node & add_node(const std::string &id, const widget_data &data, const int index=-1)
std::pair< std::shared_ptr< tree_view_node >, int > remove_node(tree_view_node *node)
Removes the given node as a child of its parent node.
base class of top level items, the only item which needs to store the final canvases to draw on.
const config & curent_era_cfg() const
std::vector< extras_metadata_ptr > active_mods_data()
bool is_campaign() const
Wrapper to simplify the is-type-campaign-or-sp-campaign check.
level & current_level() const
const config & data() const
std::string id
Text to match against addon_info.tags()
void connect_signal_notify_modified(dispatcher &dispatcher, const signal_notification &signal)
Connects a signal handler for getting a notification upon modification.
void connect_signal_mouse_left_click(dispatcher &dispatcher, const signal &signal)
Connects a signal handler for a left mouse button click.
t_string missing_widget(const std::string &id)
Returns a default error message if a mandatory widget is omitted.
std::map< std::string, widget_item > widget_data
std::map< std::string, t_string > widget_item
T * find_widget(utils::const_clone_ptr< widget, T > widget, const std::string &id, const bool must_be_active, const bool must_exist)
Gets a widget with the wanted id.
std::pair< std::string, unsigned > item
#define VALIDATE(cond, message)
The macro to use for the validation of WML.