GUI2: a modal_dialog is now a window

As it always should have been.

There may be some bugs with semi-persistent windows, i haven't
thoroughly checked whether they should explicitly hide.
This commit is contained in:
Tommy 2022-07-30 02:08:07 +12:00
parent 465e5c1a4d
commit af81bba53b
97 changed files with 307 additions and 293 deletions

View file

@ -29,7 +29,8 @@ namespace gui2::dialogs
REGISTER_DIALOG(addon_auth)
addon_auth::addon_auth(config& cfg)
: cfg_(cfg)
: modal_dialog(window_id())
, cfg_(cfg)
{
register_bool("remember_password", false,
&preferences::remember_password,

View file

@ -31,9 +31,9 @@ namespace gui2::dialogs
REGISTER_DIALOG(addon_connect)
addon_connect::addon_connect(std::string& host_name,
const bool allow_remove)
: allow_remove_(allow_remove)
addon_connect::addon_connect(std::string& host_name, bool allow_remove)
: modal_dialog(window_id())
, allow_remove_(allow_remove)
{
register_text("host_name", false, host_name, true);
}

View file

@ -43,8 +43,7 @@ public:
* undefined otherwise.
* @param allow_remove Sets @ref allow_remove_.
*/
addon_connect(std::string& host_name,
const bool allow_remove);
addon_connect(std::string& host_name, bool allow_remove);
private:
/** Enable the addon remove button? */

View file

@ -26,7 +26,7 @@ class install_dependencies : public modal_dialog
{
public:
explicit install_dependencies(const addons_list& addons)
: addons_(addons)
: modal_dialog(window_id()), addons_(addons)
{}
DEFINE_SIMPLE_EXECUTE_WRAPPER(install_dependencies)

View file

@ -24,6 +24,7 @@ namespace gui2::dialogs
REGISTER_DIALOG(addon_license_prompt)
addon_license_prompt::addon_license_prompt(const std::string& license_terms)
: modal_dialog(window_id())
{
register_label("terms", true, license_terms, true);
}

View file

@ -242,7 +242,8 @@ const std::vector<addon_tag> tag_filter_types_{
};
addon_manager::addon_manager(addons_client& client)
: orders_()
: modal_dialog(window_id())
, orders_()
, cfg_()
, client_(client)
, addons_()

View file

@ -44,7 +44,8 @@ public:
*/
explicit addon_uninstall_list(
const std::map<std::string, std::string>& addon_titles_map)
: titles_map_(addon_titles_map), ids_(), selections_()
: modal_dialog(window_id())
, titles_map_(addon_titles_map), ids_(), selections_()
{
}

View file

@ -48,7 +48,8 @@ const unsigned int attack_predictions::graph_height = 170;
const unsigned int attack_predictions::graph_max_rows = 10;
attack_predictions::attack_predictions(battle_context& bc, unit_const_ptr attacker, unit_const_ptr defender)
: attacker_data_(attacker, bc.get_attacker_combatant(), bc.get_attacker_stats())
: modal_dialog(window_id())
, attacker_data_(attacker, bc.get_attacker_combatant(), bc.get_attacker_stats())
, defender_data_(defender, bc.get_defender_combatant(), bc.get_defender_stats())
{
}

View file

@ -56,7 +56,8 @@ config generate_difficulty_config(const config& source)
}
campaign_difficulty::campaign_difficulty(const config& campaign)
: difficulties_(generate_difficulty_config(campaign))
: modal_dialog(window_id())
, difficulties_(generate_difficulty_config(campaign))
, campaign_id_(campaign["id"])
, selected_difficulty_("CANCEL")
{

View file

@ -46,7 +46,7 @@ REGISTER_DIALOG(campaign_selection)
void campaign_selection::campaign_selected()
{
tree_view& tree = find_widget<tree_view>(get_window(), "campaign_tree", false);
tree_view& tree = find_widget<tree_view>(this, "campaign_tree", false);
if(tree.empty()) {
return;
}
@ -61,18 +61,18 @@ void campaign_selection::campaign_selected()
return;
}
multi_page& pages = find_widget<multi_page>(get_window(), "campaign_details", false);
multi_page& pages = find_widget<multi_page>(this, "campaign_details", false);
pages.select_page(choice);
engine_.set_current_level(choice);
styled_widget& background = find_widget<styled_widget>(get_window(), "campaign_background", false);
styled_widget& background = find_widget<styled_widget>(this, "campaign_background", false);
background.set_label(engine_.current_level().data()["background"].str());
// Rebuild difficulty menu
difficulties_.clear();
auto& diff_menu = find_widget<menu_button>(get_window(), "difficulty_menu", false);
auto& diff_menu = find_widget<menu_button>(this, "difficulty_menu", false);
const auto& diff_config = generate_difficulty_config(engine_.current_level().data());
diff_menu.set_active(diff_config.child_count("difficulty") > 1);
@ -141,7 +141,7 @@ void campaign_selection::campaign_selected()
void campaign_selection::difficulty_selected()
{
const std::size_t selection = find_widget<menu_button>(get_window(), "difficulty_menu", false).get_value();
const std::size_t selection = find_widget<menu_button>(this, "difficulty_menu", false).get_value();
current_difficulty_ = difficulties_.at(std::min(difficulties_.size() - 1, selection));
}
@ -189,7 +189,7 @@ void campaign_selection::sort_campaigns(campaign_selection::CAMPAIGN_ORDER order
break;
}
tree_view& tree = find_widget<tree_view>(get_window(), "campaign_tree", false);
tree_view& tree = find_widget<tree_view>(this, "campaign_tree", false);
// Remember which campaign was selected...
std::string was_selected;
@ -233,7 +233,7 @@ void campaign_selection::sort_campaigns(campaign_selection::CAMPAIGN_ORDER order
}
if(!was_selected.empty() && exists_in_filtered_result) {
find_widget<tree_view_node>(get_window(), was_selected, false).select_node();
find_widget<tree_view_node>(this, was_selected, false).select_node();
} else {
campaign_selected();
}
@ -263,9 +263,9 @@ void campaign_selection::toggle_sorting_selection(CAMPAIGN_ORDER order)
force = true;
if(order == NAME) {
find_widget<toggle_button>(get_window(), "sort_time", false).set_value(0);
find_widget<toggle_button>(this, "sort_time", false).set_value(0);
} else if(order == DATE) {
find_widget<toggle_button>(get_window(), "sort_name", false).set_value(0);
find_widget<toggle_button>(this, "sort_name", false).set_value(0);
}
force = false;
@ -368,7 +368,7 @@ void campaign_selection::pre_show(window& window)
//
// Set up Difficulty dropdown
//
menu_button& diff_menu = find_widget<menu_button>(get_window(), "difficulty_menu", false);
menu_button& diff_menu = find_widget<menu_button>(this, "difficulty_menu", false);
diff_menu.set_use_markup(true);
connect_signal_notify_modified(diff_menu, std::bind(&campaign_selection::difficulty_selected, this));
@ -376,9 +376,9 @@ void campaign_selection::pre_show(window& window)
campaign_selected();
}
void campaign_selection::add_campaign_to_tree(const config& campaign) const
void campaign_selection::add_campaign_to_tree(const config& campaign)
{
tree_view& tree = find_widget<tree_view>(get_window(), "campaign_tree", false);
tree_view& tree = find_widget<tree_view>(this, "campaign_tree", false);
widget_data data;
widget_item item;
@ -448,7 +448,7 @@ void campaign_selection::post_show(window& window)
void campaign_selection::mod_toggled()
{
boost::dynamic_bitset<> new_mod_states =
find_widget<multimenu_button>(get_window(), "mods_menu", false).get_toggle_states();
find_widget<multimenu_button>(this, "mods_menu", false).get_toggle_states();
// Get a mask of any mods that were toggled, regardless of new state
mod_states_ = mod_states_ ^ new_mod_states;

View file

@ -57,7 +57,8 @@ public:
};
explicit campaign_selection(ng::create_engine& eng)
: engine_(eng)
: modal_dialog(window_id())
, engine_(eng)
, choice_(-1)
, rng_mode_(RNG_DEFAULT)
, mod_states_()
@ -101,7 +102,7 @@ private:
void sort_campaigns(CAMPAIGN_ORDER order, bool ascending);
void add_campaign_to_tree(const config& campaign) const;
void add_campaign_to_tree(const config& campaign);
void toggle_sorting_selection(CAMPAIGN_ORDER order);

View file

@ -409,7 +409,9 @@ private:
};
chat_log::chat_log(const vconfig& cfg, const replay& r) : view_()
chat_log::chat_log(const vconfig& cfg, const replay& r)
: modal_dialog(window_id())
, view_()
{
LOG_CHAT_LOG << "Entering chat_log::chat_log";
view_ = std::make_shared<view>(cfg, r);

View file

@ -32,14 +32,14 @@ namespace gui2::dialogs
REGISTER_DIALOG(core_selection)
void core_selection::core_selected() const
void core_selection::core_selected()
{
const int selected_row
= find_widget<listbox>(get_window(), "core_list", false)
= find_widget<listbox>(this, "core_list", false)
.get_selected_row();
multi_page& pages
= find_widget<multi_page>(get_window(), "core_details", false);
= find_widget<multi_page>(this, "core_details", false);
pages.select_page(selected_row);
}

View file

@ -39,7 +39,8 @@ class core_selection : public modal_dialog
{
public:
explicit core_selection(const std::vector<config>& cores, int choice)
: cores_(cores), choice_(choice)
: modal_dialog(window_id())
, cores_(cores), choice_(choice)
{
}
@ -52,7 +53,7 @@ public:
private:
/** Called when another core is selected. */
void core_selected() const;
void core_selected();
virtual const std::string& window_id() const override;

View file

@ -31,6 +31,7 @@ depcheck_confirm_change::depcheck_confirm_change(
bool action,
const std::vector<std::string>& mods,
const std::string& requester)
: modal_dialog(window_id())
{
utils::string_map symbols;
symbols["requester"] = requester;

View file

@ -31,9 +31,10 @@ REGISTER_DIALOG(depcheck_select_new)
depcheck_select_new::depcheck_select_new(
ng::depcheck::component_type name,
const std::vector<std::string>& items)
: items_(items), result_(-1)
: modal_dialog(window_id())
, items_(items)
, result_(-1)
{
std::string message;
switch(name) {

View file

@ -83,7 +83,8 @@ namespace
}
drop_down_menu::drop_down_menu(styled_widget* parent, const std::vector<config>& items, int selected_item, bool keep_open)
: parent_(parent)
: modal_dialog(window_id())
, parent_(parent)
, items_(items.begin(), items.end())
, button_pos_(parent->get_rectangle())
, selected_item_(selected_item)
@ -94,7 +95,8 @@ drop_down_menu::drop_down_menu(styled_widget* parent, const std::vector<config>&
}
drop_down_menu::drop_down_menu(SDL_Rect button_pos, const std::vector<config>& items, int selected_item, bool use_markup, bool keep_open)
: parent_(nullptr)
: modal_dialog(window_id())
, parent_(nullptr)
, items_(items.begin(), items.end())
, button_pos_(button_pos)
, selected_item_(selected_item)

View file

@ -25,6 +25,7 @@ namespace gui2::dialogs
REGISTER_DIALOG(edit_label)
edit_label::edit_label(std::string& label, bool& team_only)
: modal_dialog(window_id())
{
register_text("label", true, label, true);
register_bool("team_only_toggle", true, team_only);

View file

@ -33,7 +33,8 @@ edit_text::edit_text(const std::string& title,
const std::string& label,
std::string& text,
bool disallow_empty)
: disallow_empty_(disallow_empty)
: modal_dialog(window_id())
, disallow_empty_(disallow_empty)
{
register_label("title", true, title, true);
register_label("label", true, label, true);

View file

@ -57,7 +57,8 @@ static custom_tod::string_pair tod_getter_sound(const time_of_day& tod)
REGISTER_DIALOG(custom_tod)
custom_tod::custom_tod(const std::vector<time_of_day>& times, int current_time)
: times_(times)
: modal_dialog(window_id())
, times_(times)
, current_tod_(current_time)
, color_field_r_(register_integer("tod_red", true))
, color_field_g_(register_integer("tod_green", true))

View file

@ -35,7 +35,8 @@ editor_edit_label::editor_edit_label(std::string& text,
bool& visible_shroud,
color_t& color,
std::string& category)
: color_store(color)
: modal_dialog(window_id())
, color_store(color)
{
register_text("label", true, text, true);
register_text("category", true, category, false);

View file

@ -35,6 +35,7 @@ editor_edit_scenario::editor_edit_scenario(
int& experience_modifier,
bool& victory_when_enemies_defeated,
bool& random_start_time)
: modal_dialog(window_id())
{
register_text("id", true, id, true);
register_text("name", true, name, false);

View file

@ -29,7 +29,8 @@ namespace gui2::dialogs
REGISTER_DIALOG(editor_edit_side)
editor_edit_side::editor_edit_side(editor::editor_team_info& info)
: controller_(info.controller)
: modal_dialog(window_id())
, controller_(info.controller)
, share_vision_(info.share_vision)
{
register_label("side_number", true, std::to_string(info.side), true);

View file

@ -38,7 +38,8 @@ namespace gui2::dialogs
REGISTER_DIALOG(editor_generate_map)
editor_generate_map::editor_generate_map(std::vector<std::unique_ptr<map_generator>>& mg)
: map_generators_(mg)
: modal_dialog(window_id())
, map_generators_(mg)
, last_map_generator_(nullptr)
, current_map_generator_(0)
, random_seed_()

View file

@ -35,7 +35,8 @@ static int min_size = 20;
REGISTER_DIALOG(generator_settings)
generator_settings::generator_settings(generator_data& data)
: players_(register_integer("players", true, data.nplayers))
: modal_dialog(window_id())
, players_(register_integer("players", true, data.nplayers))
, width_(register_integer("width", true, data.width))
, height_(register_integer("height", true, data.height))
, update_width_label_()

View file

@ -25,6 +25,7 @@ namespace gui2::dialogs
REGISTER_DIALOG(editor_new_map)
editor_new_map::editor_new_map(const t_string& title, int& width, int& height)
: modal_dialog(window_id())
{
register_label("title", true, title);

View file

@ -33,7 +33,8 @@ editor_resize_map::editor_resize_map(int& width,
int& height,
EXPAND_DIRECTION& expand_direction,
bool& copy_edge_terrain)
: width_(register_integer("width", true, width))
: modal_dialog(window_id())
, width_(register_integer("width", true, width))
, height_(register_integer("height", true, height))
, old_width_(width)
, old_height_(height)

View file

@ -38,7 +38,8 @@ namespace gui2::dialogs
REGISTER_DIALOG(end_credits)
end_credits::end_credits(const std::string& campaign)
: focus_on_(campaign)
: modal_dialog(window_id())
, focus_on_(campaign)
, backgrounds_()
, text_widget_(nullptr)
, scroll_speed_(100)

View file

@ -103,7 +103,8 @@ namespace gui2::dialogs
REGISTER_DIALOG(file_dialog)
file_dialog::file_dialog()
: title_(_("Find File"))
: modal_dialog(window_id())
, title_(_("Find File"))
, msg_()
, ok_label_()
, extension_()

View file

@ -29,7 +29,8 @@ namespace gui2::dialogs
REGISTER_DIALOG(folder_create)
folder_create::folder_create(std::string& folder_name)
: bookmark_mode_(false)
: modal_dialog(window_id())
, bookmark_mode_(false)
{
register_text("name", true, folder_name, true);
}

View file

@ -42,7 +42,8 @@ namespace gui2::dialogs
class formula_debugger : public modal_dialog
{
public:
explicit formula_debugger(wfl::formula_debugger& fdb) : fdb_(fdb)
explicit formula_debugger(wfl::formula_debugger& fdb)
: modal_dialog(window_id()) , fdb_(fdb)
{
}

View file

@ -40,7 +40,8 @@ namespace gui2::dialogs
REGISTER_DIALOG(game_cache_options)
game_cache_options::game_cache_options()
: cache_path_(filesystem::get_cache_dir())
: modal_dialog(window_id())
, cache_path_(filesystem::get_cache_dir())
, clean_button_(nullptr)
, purge_button_(nullptr)
, size_label_(nullptr)

View file

@ -44,6 +44,7 @@ static void set_dont_ask_again(const bool ask_again)
}
game_delete::game_delete()
: modal_dialog(window_id())
{
register_bool(
"dont_ask_again", true, &get_dont_ask_again, &set_dont_ask_again);

View file

@ -81,7 +81,8 @@ bool game_load::execute(const game_config_view& cache_config, savegame::load_gam
}
game_load::game_load(const game_config_view& cache_config, savegame::load_game_metadata& data)
: filename_(data.filename)
: modal_dialog(window_id())
, filename_(data.filename)
, save_index_manager_(data.manager)
, change_difficulty_(register_bool("change_difficulty", true, data.select_difficulty))
, show_replay_(register_bool("show_replay", true, data.show_replay))

View file

@ -29,6 +29,7 @@ namespace gui2::dialogs
REGISTER_DIALOG(game_save)
game_save::game_save(std::string& filename, const std::string& title)
: modal_dialog(window_id())
{
register_text("txtFilename", false, filename, true);
register_label("lblTitle", true, title);
@ -39,6 +40,7 @@ REGISTER_DIALOG(game_save_message)
game_save_message::game_save_message(std::string& filename,
const std::string& title,
const std::string& message)
: modal_dialog(window_id())
{
register_label("lblTitle", true, title);
register_text("txtFilename", false, filename, true);
@ -51,6 +53,7 @@ game_save_oos::game_save_oos(bool& ignore_all,
std::string& filename,
const std::string& title,
const std::string& message)
: modal_dialog(window_id())
{
register_label("lblTitle", true, title);
register_text("txtFilename", false, filename, true);

View file

@ -48,7 +48,8 @@ namespace gui2::dialogs
REGISTER_DIALOG(game_stats)
game_stats::game_stats(const display_context& board, const int viewing_team, int& selected_side_number)
: board_(board)
: modal_dialog(window_id())
, board_(board)
, viewing_team_(board_.teams()[viewing_team])
, selected_side_number_(selected_side_number)
{

View file

@ -53,7 +53,8 @@ namespace gui2::dialogs
REGISTER_DIALOG(game_version)
game_version::game_version()
: path_wid_stem_("path_")
: modal_dialog(window_id())
, path_wid_stem_("path_")
, copy_wid_stem_("copy_")
, browse_wid_stem_("browse_")
, path_map_()

View file

@ -907,7 +907,8 @@ void team_mode_controller::show_array(tree_view_node& node, int side)
REGISTER_DIALOG(gamestate_inspector)
gamestate_inspector::gamestate_inspector(const config& vars, const game_events::manager& events, const display_context& dc, const std::string& title)
: title_(title)
: modal_dialog(window_id())
, title_(title)
, vars_(vars)
, events_(events)
, dc_(dc)

View file

@ -44,7 +44,8 @@ namespace gui2::dialogs
REGISTER_DIALOG(help_browser)
help_browser::help_browser()
: initial_topic_("introduction")
: modal_dialog(window_id())
, initial_topic_("introduction")
, help_cfg_(game_config_manager::get()->game_config().child("help"))
{
}

View file

@ -27,7 +27,8 @@ namespace gui2::dialogs
REGISTER_DIALOG(hotkey_bind)
hotkey_bind::hotkey_bind(const std::string& hotkey_id)
: hotkey_id_(hotkey_id)
: modal_dialog(window_id())
, hotkey_id_(hotkey_id)
, new_binding_()
{
}

View file

@ -38,7 +38,8 @@ namespace gui2::dialogs
REGISTER_DIALOG(label_settings)
label_settings::label_settings(display_context& dc)
: viewer_(dc)
: modal_dialog(window_id())
, viewer_(dc)
{
const std::vector<std::string>& all_categories = display::get_singleton()->labels().all_categories();
const std::vector<std::string>& hidden_categories = viewer_.hidden_label_categories();

View file

@ -34,6 +34,7 @@ class language_selection : public modal_dialog
{
public:
language_selection()
: modal_dialog(window_id())
{
}

View file

@ -81,7 +81,8 @@ REGISTER_DIALOG(loading_screen)
loading_screen* loading_screen::singleton_ = nullptr;
loading_screen::loading_screen(std::function<void()> f)
: load_funcs_{f}
: modal_dialog(window_id())
, load_funcs_{f}
, worker_result_()
, cursor_setter_()
, progress_stage_label_(nullptr)
@ -173,13 +174,15 @@ void loading_screen::process(events::pump_info&)
// If there's nothing more to do, close.
if (load_funcs_.empty()) {
draw_manager::invalidate_region(get_window()->get_rectangle());
get_window()->close();
queue_redraw();
window::close();
}
}
void loading_screen::layout()
{
modal_dialog::layout();
DBG_DP << "loading_screen::layout";
loading_stage stage = current_stage_.load(std::memory_order_acquire);
@ -207,17 +210,6 @@ void loading_screen::layout()
animation_->queue_redraw();
}
bool loading_screen::expose(const rect& region)
{
DBG_DP << "loading_screen::expose " << region;
return get_window()->expose(region);
}
rect loading_screen::screen_location()
{
return get_window()->screen_location();
}
loading_screen::~loading_screen()
{
LOG_LS << "Loading screen destroyed.";

View file

@ -73,7 +73,7 @@ class window;
namespace dialogs
{
class loading_screen : public modal_dialog, public events::pump_monitor, public gui2::top_level_drawable
class loading_screen : public modal_dialog, public events::pump_monitor
{
public:
loading_screen(std::function<void()> f);
@ -130,16 +130,6 @@ private:
/** Called by draw_manager to assign concrete layout. */
virtual void layout() override;
/**
* Called by draw_manager when it believes a redraw is necessary.
*
* Currently this is every frame, as pre_show() registers as an animator.
*/
virtual bool expose(const rect& region) override;
/** The current draw location of the window, on the screen. */
virtual rect screen_location() override;
static loading_screen* singleton_;
std::vector<std::function<void()>> load_funcs_;

View file

@ -33,7 +33,8 @@ namespace gui2::dialogs
REGISTER_DIALOG(log_settings)
log_settings::log_settings()
: last_words_()
: modal_dialog(window_id())
, last_words_()
{
//list of names must match those in logging.cfg
widget_id_.push_back("none");

View file

@ -709,7 +709,8 @@ void lua_interpreter::pre_show(window& window)
}
lua_interpreter::lua_interpreter(lua_kernel_base & lk)
: controller_(new lua_interpreter::controller(lk))
: modal_dialog(window_id())
, controller_(new lua_interpreter::controller(lk))
{
LOG_LUA << "entering lua_interpreter ctor...";
LOG_LUA << "finished lua_interpreter ctor...";

View file

@ -42,7 +42,8 @@ public:
const bool auto_close,
const bool message_use_markup,
const bool title_use_markup)
: title_(title)
: modal_dialog(window_id())
, title_(title)
, image_()
, message_(message)
, auto_close_(auto_close)

View file

@ -48,6 +48,7 @@ void migrate_version_selection::execute()
}
migrate_version_selection::migrate_version_selection()
: modal_dialog(window_id())
{
version_info current_version = game_config::wesnoth_version;
std::string current_version_str = filesystem::get_version_path_suffix();

View file

@ -20,6 +20,7 @@
#include "cursor.hpp"
#include "events.hpp"
#include "gui/auxiliary/field.hpp"
#include "gui/core/gui_definition.hpp" // get_window_builder
#include "gui/widgets/integer_selector.hpp"
#include "scripting/plugins/context.hpp"
#include "scripting/plugins/manager.hpp"
@ -31,8 +32,9 @@ static lg::log_domain log_display("display");
namespace gui2::dialogs
{
modal_dialog::modal_dialog()
: window_(nullptr)
modal_dialog::modal_dialog(const std::string& window_id)
: window(get_window_builder(window_id))
, retval_(retval::NONE)
, always_save_fields_(false)
, fields_()
@ -40,6 +42,8 @@ modal_dialog::modal_dialog()
, allow_plugin_skip_(true)
, show_even_without_video_(false)
{
window::finish_build(get_window_builder(window_id));
widget::set_id(window_id);
}
modal_dialog::~modal_dialog()
@ -48,13 +52,13 @@ modal_dialog::~modal_dialog()
namespace {
struct window_stack_handler {
window_stack_handler(std::unique_ptr<window>& win) : local_window(win) {
open_window_stack.push_back(local_window.get());
window_stack_handler(window* win) : local_window(win) {
open_window_stack.push_back(local_window);
}
~window_stack_handler() {
remove_from_window_stack(local_window.get());
remove_from_window_stack(local_window);
}
std::unique_ptr<window>& local_window;
window* local_window;
};
}
@ -78,21 +82,14 @@ bool modal_dialog::show(const unsigned auto_close_time)
return false;
}
window_ = build_window();
assert(window_.get());
init_fields(*this);
post_build(*window_);
window_->set_owner(this);
init_fields(*window_);
pre_show(*window_);
pre_show(*this);
{ // Scope the window stack
cursor::setter cur{cursor::NORMAL};
window_stack_handler push_window_stack(window_);
retval_ = window_->show(auto_close_time);
window_stack_handler push_window_stack(this);
retval_ = window::show(auto_close_time);
}
/*
@ -111,24 +108,14 @@ bool modal_dialog::show(const unsigned auto_close_time)
finalize_fields((retval_ == retval::OK || always_save_fields_));
post_show(*window_);
post_show(*this);
// post_show may have updated the window retval. Update it here.
retval_ = window_->get_retval();
// Reset window object.
window_.reset(nullptr);
retval_ = window::get_retval();
return retval_ == retval::OK;
}
void modal_dialog::set_retval(int retval)
{
if(window_) {
window_->set_retval(retval);
}
}
template<typename T, typename... Args>
T* modal_dialog::register_field(Args&&... args)
{
@ -239,16 +226,6 @@ field_label* modal_dialog::register_label(const std::string& id,
return field;
}
std::unique_ptr<window> modal_dialog::build_window() const
{
return build(window_id());
}
void modal_dialog::post_build(window& /*window*/)
{
/* DO NOTHING */
}
void modal_dialog::pre_show(window& /*window*/)
{
/* DO NOTHING */

View file

@ -17,8 +17,9 @@
#include "gui/auxiliary/field-fwd.hpp"
#include "gui/core/static_registry.hpp"
#include <functional>
#include "gui/widgets/window.hpp"
#include <functional>
#include <string>
#include <vector>
@ -141,7 +142,7 @@ namespace gui2::dialogs
* was pressed to close the dialog. See editor_new_map::execute for an
* example.
*/
class modal_dialog
class modal_dialog : public window
{
/**
* Special helper function to get the id of the window.
@ -152,7 +153,7 @@ class modal_dialog
friend std::string unit_test_mark_as_tested(const modal_dialog& dialog);
public:
modal_dialog();
explicit modal_dialog(const std::string& window_id);
virtual ~modal_dialog();
@ -171,10 +172,15 @@ public:
/***** ***** ***** setters / getters for members ***** ****** *****/
// TODO: this is now completely redundant, as a modal dialog is a window
/** Returns a pointer to the dialog's window. Will be null if it hasn't been built yet. */
window* get_window() const
window* get_window()
{
return window_.get();
return this;
}
const window* get_window() const
{
return this;
}
/** Returns the cached window exit code. */
@ -183,9 +189,6 @@ public:
return retval_;
}
/** Convenience wrapper to set the window's exit code. */
void set_retval(int retval);
void set_always_save_fields(const bool always_save_fields)
{
always_save_fields_ = always_save_fields;
@ -335,10 +338,6 @@ protected:
return register_label(id, mandatory, filename);
}
protected:
/** The window object build for this dialog. */
std::unique_ptr<window> window_;
private:
/**
* The window's exit code (return value).
@ -391,28 +390,9 @@ private:
*/
bool show_even_without_video_;
/** The id of the window to build. */
/** The ID of the window to build. Usually set by REGISTER_DIALOG. */
virtual const std::string& window_id() const = 0;
/**
* Builds the window.
*
* Every dialog shows it's own kind of window, this function should return
* the window to show.
*
* @returns The window to show.
*/
std::unique_ptr<window> build_window() const;
/**
* Actions to be taken directly after the window is build.
*
* At this point the registered fields are not yet registered.
*
* @param window The window just created.
*/
virtual void post_build(window& window);
/**
* Actions to be taken before showing the window.
*
@ -422,6 +402,7 @@ private:
* @param window The window to be shown.
*/
virtual void pre_show(window& window);
// TODO: this window parameter is now redundant
/**
* Actions to be taken after the window has been shown.
@ -432,6 +413,7 @@ private:
* @param window The window which has been shown.
*/
virtual void post_show(window& window);
// TODO: this window parameter is now redundant
/**
* Initializes all fields in the dialog and set the keyboard focus.
@ -439,6 +421,7 @@ private:
* @param window The window which has been shown.
*/
virtual void init_fields(window& window);
// TODO: this window parameter is now redundant
/**
* When the dialog is closed with the OK status saves all fields.

View file

@ -41,7 +41,8 @@ namespace gui2::dialogs
REGISTER_DIALOG(faction_select)
faction_select::faction_select(ng::flg_manager& flg_manager, const std::string& color, const int side)
: flg_manager_(flg_manager)
: modal_dialog(window_id())
, flg_manager_(flg_manager)
, tc_color_(color)
, side_(side)
, last_faction_(flg_manager.current_faction_index())

View file

@ -69,7 +69,8 @@ bool mp_lobby::logout_prompt()
}
mp_lobby::mp_lobby(mp::lobby_info& info, wesnothd_connection& connection, int& joined_game)
: quit_confirmation(&mp_lobby::logout_prompt)
: modal_dialog(window_id())
, quit_confirmation(&mp_lobby::logout_prompt)
, gamelistbox_(nullptr)
, lobby_info_(info)
, chatbox_(nullptr)
@ -107,10 +108,16 @@ mp_lobby::mp_lobby(mp::lobby_info& info, wesnothd_connection& connection, int& j
, delay_gamelist_update_(false)
, joined_game_id_(joined_game)
{
// Need to set this in the constructor, pre_show() is too late
set_show_even_without_video(true);
set_allow_plugin_skip(false);
set_always_save_fields(true);
/*** Local hotkeys. ***/
window::register_hotkey(hotkey::HOTKEY_HELP,
std::bind(&mp_lobby::show_help_callback, this));
window::register_hotkey(hotkey::HOTKEY_PREFERENCES,
std::bind(&mp_lobby::show_preferences_button_callback, this));
}
struct lobby_delay_gamelist_update_guard
@ -133,16 +140,6 @@ mp_lobby::~mp_lobby()
}
}
void mp_lobby::post_build(window& win)
{
/*** Local hotkeys. ***/
win.register_hotkey(hotkey::HOTKEY_HELP,
std::bind(&mp_lobby::show_help_callback, this));
win.register_hotkey(hotkey::HOTKEY_PREFERENCES,
std::bind(&mp_lobby::show_preferences_button_callback, this));
}
namespace
{
void modify_grid_with_data(grid* grid, const widget_data& map)

View file

@ -129,8 +129,6 @@ private:
virtual const std::string& window_id() const override;
virtual void post_build(window& window) override;
virtual void pre_show(window& window) override;
virtual void post_show(window& window) override;

View file

@ -25,7 +25,8 @@ namespace gui2::dialogs
REGISTER_DIALOG(mp_match_history)
mp_match_history::mp_match_history(mp::user_info& info, wesnothd_connection& connection)
: info_(info)
: modal_dialog(window_id())
, info_(info)
, connection_(connection)
{
register_label("title", true, VGETTEXT("Match History — $player", {{"player", info_.name}}));

View file

@ -91,6 +91,7 @@ static void revert_to_default_pref_values(window & window)
REGISTER_DIALOG(mp_alerts_options)
mp_alerts_options::mp_alerts_options()
: modal_dialog(window_id())
{
}

View file

@ -46,7 +46,8 @@ namespace gui2::dialogs
REGISTER_DIALOG(mp_change_control)
mp_change_control::mp_change_control(events::menu_handler& mh)
: menu_handler_(mh)
: modal_dialog(window_id())
, menu_handler_(mh)
, selected_side_(0)
, selected_nick_(0)
, sides_()

View file

@ -63,7 +63,8 @@ namespace dialogs
REGISTER_DIALOG(mp_connect)
mp_connect::mp_connect()
: host_name_(register_text("host_name",
: modal_dialog(window_id())
, host_name_(register_text("host_name",
true,
preferences::network_host,
preferences::set_network_host,

View file

@ -66,7 +66,8 @@ namespace prefs = preferences;
REGISTER_DIALOG(mp_create_game)
mp_create_game::mp_create_game(saved_game& state, bool local_mode)
: create_engine_(state)
: modal_dialog(window_id())
, create_engine_(state)
, config_engine_()
, options_manager_()
, selected_game_index_(-1)

View file

@ -41,6 +41,7 @@ static void set_do_not_show_again(const bool do_not_show_again)
}
mp_host_game_prompt::mp_host_game_prompt()
: modal_dialog(window_id())
{
register_bool("do_not_show_again",
true,

View file

@ -61,7 +61,8 @@ namespace gui2::dialogs
REGISTER_DIALOG(mp_join_game)
mp_join_game::mp_join_game(saved_game& state, wesnothd_connection& connection, const bool first_scenario, const bool observe_game)
: level_()
: modal_dialog(window_id())
, level_()
, state_(state)
, network_connection_(connection)
, update_timer_(0)

View file

@ -24,6 +24,7 @@ REGISTER_DIALOG(mp_join_game_password_prompt)
mp_join_game_password_prompt::mp_join_game_password_prompt(
std::string& password)
: modal_dialog(window_id())
{
register_text("password", true, password, true);
}

View file

@ -33,7 +33,9 @@ namespace gui2::dialogs
REGISTER_DIALOG(mp_login)
mp_login::mp_login(const std::string& host, const std::string& label, const bool focus_password)
: host_(host), focus_password_(focus_password)
: modal_dialog(window_id())
, host_(host)
, focus_password_(focus_password)
{
register_label("login_label", false, label);
username_ = register_text("user_name", true,
@ -46,15 +48,15 @@ mp_login::mp_login(const std::string& host, const std::string& label, const bool
&preferences::set_remember_password);
}
void mp_login::load_password() const
void mp_login::load_password()
{
text_box& pwd = find_widget<text_box>(get_window(), "password", false);
text_box& pwd = find_widget<text_box>(this, "password", false);
pwd.set_value(preferences::password(host_, username_->get_widget_value()));
}
void mp_login::save_password() const
void mp_login::save_password()
{
password_box& pwd = find_widget<password_box>(get_window(), "password", false);
password_box& pwd = find_widget<password_box>(this, "password", false);
preferences::set_password(host_, username_->get_widget_value(), pwd.get_real_value());
}

View file

@ -49,8 +49,8 @@ private:
virtual void post_show(window& window) override;
void load_password() const;
void save_password() const;
void load_password();
void save_password();
const std::string host_;
field_text* username_;

View file

@ -35,7 +35,8 @@ public:
/** Corresponds to each connection option. */
enum class choice { JOIN = 0, CONNECT, HOST, LOCAL };
mp_method_selection() : user_name_(), choice_()
mp_method_selection()
: modal_dialog(window_id()) , user_name_(), choice_()
{
}

View file

@ -48,7 +48,8 @@ namespace gui2::dialogs
REGISTER_DIALOG(mp_staging)
mp_staging::mp_staging(ng::connect_engine& connect_engine, wesnothd_connection* connection)
: connect_engine_(connect_engine)
: modal_dialog(window_id())
, connect_engine_(connect_engine)
, ai_algorithms_(ai::configuration::get_available_ais())
, network_connection_(connection)
, update_timer_(0)

View file

@ -37,7 +37,8 @@ REGISTER_DIALOG(lobby_player_info)
lobby_player_info::lobby_player_info(events::chat_handler& chat,
const mp::user_info& info,
const mp::lobby_info& li)
: chat_(chat)
: modal_dialog(window_id())
, chat_(chat)
, info_(info)
, reason_(nullptr)
, time_(nullptr)

View file

@ -35,7 +35,8 @@ namespace gui2::dialogs
REGISTER_DIALOG(synched_choice_wait)
synched_choice_wait::synched_choice_wait(user_choice_manager& mgr)
: mgr_(mgr)
: modal_dialog(window_id())
, mgr_(mgr)
, message_()
{
mgr_.changed_event_.attach_handler(this);

View file

@ -63,7 +63,8 @@ network_transmission::network_transmission(
connection_data& connection,
const std::string& title,
const std::string& subtitle)
: connection_(&connection)
: modal_dialog(window_id())
, connection_(&connection)
, pump_monitor_(connection_)
, subtitle_(subtitle)
{

View file

@ -33,7 +33,8 @@ namespace gui2::dialogs
REGISTER_DIALOG(outro)
outro::outro(const game_classification& info)
: text_()
: modal_dialog(window_id())
, text_()
, current_text_()
, duration_(info.end_text_duration)
, fade_step_(0)

View file

@ -111,7 +111,8 @@ using avp = preferences::advanced_manager::option;
REGISTER_DIALOG(preferences_dialog)
preferences_dialog::preferences_dialog(const PREFERENCE_VIEW initial_view)
: adv_preferences_(preferences::get_advanced_preferences())
: modal_dialog(window_id())
, adv_preferences_(preferences::get_advanced_preferences())
, resolutions_() // should be populated by set_resolution_list before use
, last_selected_item_(0)
, accl_speeds_({0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 3, 4, 8, 16})
@ -119,6 +120,7 @@ preferences_dialog::preferences_dialog(const PREFERENCE_VIEW initial_view)
, visible_categories_()
, initial_index_(pef_view_map[initial_view])
{
initialize_callbacks();
}
// Helper function to refresh resolution list
@ -203,9 +205,9 @@ void preferences_dialog::update_friends_list_controls(listbox& list)
list.select_row(std::min(static_cast<int>(list.get_item_count()) - 1, list.get_selected_row()));
}
find_widget<button>(get_window(), "remove", false).set_active(!list_empty);
find_widget<button>(this, "remove", false).set_active(!list_empty);
find_widget<label>(get_window(), "no_friends_notice", false).set_visible(
find_widget<label>(this, "no_friends_notice", false).set_visible(
list_empty ? widget::visibility::visible : widget::visibility::invisible);
}
@ -234,7 +236,7 @@ void preferences_dialog::add_friend_list_entry(const bool is_friend, text_box& t
textbox.clear();
listbox& list = find_widget<listbox>(get_window(), "friends_list", false);
listbox& list = find_widget<listbox>(this, "friends_list", false);
//
// If this is a new entry, just add a new row. If it's not, we find the relevant
@ -281,7 +283,7 @@ void preferences_dialog::remove_friend_list_entry(listbox& friends_list, text_bo
textbox.clear();
listbox& list = find_widget<listbox>(get_window(), "friends_list", false);
listbox& list = find_widget<listbox>(this, "friends_list", false);
list.remove_row(selected_row);
update_friends_list_controls(list);
@ -293,15 +295,13 @@ void preferences_dialog::initialize_sound_option_group(const std::string& id_suf
const std::string toggle_widget_id = "sound_toggle_" + id_suffix;
const std::string volume_widget_id = "sound_volume_" + id_suffix;
window& window = *get_window();
// Set up the toggle. We utilize field_bool's callback-on-changed mechanism instead
// of manually registering the callback. Since we want the effects to apply immediately,
// the callback the setter callback is duplicated in the on-change callback. The field
// class could possibly use some reworking to make this less redundant, but for now it
// works well enough.
register_bool(toggle_widget_id, true, toggle_getter, std::bind(toggle_setter, std::placeholders::_1),
std::bind(sound_toggle_on_change<toggle_setter>, std::ref(window), volume_widget_id, std::placeholders::_1), true);
std::bind(sound_toggle_on_change<toggle_setter>, std::ref(*this), volume_widget_id, std::placeholders::_1), true);
// Set up the volume slider. integer_field doesn't have a callback-on-changed mechanism.
// To add one would either mean adding it to the base field class or make it a proper
@ -309,19 +309,19 @@ void preferences_dialog::initialize_sound_option_group(const std::string& id_suf
register_integer(volume_widget_id, true, vol_getter, vol_setter);
// Callback to actually immediately apply the volume effect.
connect_signal_notify_modified(find_widget<slider>(&window, volume_widget_id, false),
connect_signal_notify_modified(find_widget<slider>(this, volume_widget_id, false),
std::bind(volume_setter_on_change<vol_setter>, std::placeholders::_1));
}
void preferences_dialog::apply_pixel_scale()
{
// Update pixel scale preference.
slider& ps_slider = find_widget<slider>(get_window(), "pixel_scale_slider", false);
slider& ps_slider = find_widget<slider>(this, "pixel_scale_slider", false);
set_pixel_scale(ps_slider.get_value());
// Update auto pixel scale preference.
toggle_button& auto_ps_toggle =
find_widget<toggle_button>(get_window(), "auto_pixel_scale", false);
find_widget<toggle_button>(this, "auto_pixel_scale", false);
set_auto_pixel_scale(auto_ps_toggle.get_value_bool());
// Update draw buffers, taking these into account.
@ -340,7 +340,7 @@ void preferences_dialog::apply_pixel_scale()
/**
* Sets up states and callbacks for each of the widgets
*/
void preferences_dialog::post_build(window& window)
void preferences_dialog::initialize_callbacks()
{
//
// GENERAL PANEL
@ -365,7 +365,7 @@ void preferences_dialog::post_build(window& window)
accl_load, accl_save);
// Set the value label transform function.
find_widget<slider>(&window, "turbo_slider", false).set_value_labels(
find_widget<slider>(this, "turbo_slider", false).set_value_labels(
[this](int pos, int /*max*/)->t_string { return lexical_cast<std::string>(accl_speeds_[pos]); }
);
@ -406,7 +406,7 @@ void preferences_dialog::post_build(window& window)
autosavemax, set_autosavemax);
/* CACHE MANAGE */
connect_signal_mouse_left_click(find_widget<button>(&window, "cachemg", false),
connect_signal_mouse_left_click(find_widget<button>(this, "cachemg", false),
std::bind(&gui2::dialogs::game_cache_options::display<>));
//
@ -415,7 +415,7 @@ void preferences_dialog::post_build(window& window)
/* FULLSCREEN TOGGLE */
toggle_button& toggle_fullscreen =
find_widget<toggle_button>(&window, "fullscreen", false);
find_widget<toggle_button>(this, "fullscreen", false);
toggle_fullscreen.set_value(fullscreen());
@ -424,7 +424,7 @@ void preferences_dialog::post_build(window& window)
&preferences_dialog::fullscreen_toggle_callback, this));
/* SET RESOLUTION */
menu_button& res_list = find_widget<menu_button>(&window, "resolution_set", false);
menu_button& res_list = find_widget<menu_button>(this, "resolution_set", false);
res_list.set_use_markup(true);
res_list.set_active(!fullscreen());
@ -439,17 +439,17 @@ void preferences_dialog::post_build(window& window)
pixel_scale, set_pixel_scale);
slider& ps_slider =
find_widget<slider>(&window, "pixel_scale_slider", false);
find_widget<slider>(this, "pixel_scale_slider", false);
connect_signal_mouse_left_release(ps_slider,
std::bind(&preferences_dialog::apply_pixel_scale, this));
/* AUTOMATIC PIXEL SCALE */
register_bool("auto_pixel_scale", true,
auto_pixel_scale, set_auto_pixel_scale,
[&](widget& w) { disable_widget_on_toggle_inverted<slider>(window, w, "pixel_scale_slider"); }, true);
[&](widget& w) { disable_widget_on_toggle_inverted<slider>(*this, w, "pixel_scale_slider"); }, true);
toggle_button& auto_ps_toggle =
find_widget<toggle_button>(get_window(), "auto_pixel_scale", false);
find_widget<toggle_button>(this, "auto_pixel_scale", false);
connect_signal_mouse_left_click(auto_ps_toggle,
std::bind(&preferences_dialog::apply_pixel_scale, this));
@ -467,7 +467,7 @@ void preferences_dialog::post_build(window& window)
/* ANIMATE MAP */
register_bool("animate_terrains", true, animate_map, set_animate_map,
[&](widget& w) { disable_widget_on_toggle<toggle_button>(window, w, "animate_water"); }, true);
[&](widget& w) { disable_widget_on_toggle<toggle_button>(*this, w, "animate_water"); }, true);
/* ANIMATE WATER */
register_bool("animate_water", true,
@ -479,7 +479,7 @@ void preferences_dialog::post_build(window& window)
/* SHOW UNIT IDLE ANIMS */
register_bool("animate_units_idle", true, idle_anim, set_idle_anim,
[&](widget& w) { disable_widget_on_toggle<slider>(window, w, "idle_anim_frequency"); });
[&](widget& w) { disable_widget_on_toggle<slider>(*this, w, "idle_anim_frequency"); });
register_integer("idle_anim_frequency", true,
idle_anim_rate, set_idle_anim_rate);
@ -497,7 +497,7 @@ void preferences_dialog::post_build(window& window)
/* SELECT THEME */
connect_signal_mouse_left_click(
find_widget<button>(&window, "choose_theme", false),
find_widget<button>(this, "choose_theme", false),
std::bind(&show_theme_dialog));
//
@ -540,9 +540,9 @@ void preferences_dialog::post_build(window& window)
whisper_friends_only, set_whisper_friends_only);
/* LOBBY JOIN NOTIFICATIONS */
lobby_joins_group.add_member(find_widget<toggle_button>(&window, "lobby_joins_none", false, true), lobby_joins::show_none);
lobby_joins_group.add_member(find_widget<toggle_button>(&window, "lobby_joins_friends", false, true), lobby_joins::show_friends);
lobby_joins_group.add_member(find_widget<toggle_button>(&window, "lobby_joins_all", false, true), lobby_joins::show_all);
lobby_joins_group.add_member(find_widget<toggle_button>(this, "lobby_joins_none", false, true), lobby_joins::show_none);
lobby_joins_group.add_member(find_widget<toggle_button>(this, "lobby_joins_friends", false, true), lobby_joins::show_friends);
lobby_joins_group.add_member(find_widget<toggle_button>(this, "lobby_joins_all", false, true), lobby_joins::show_all);
lobby_joins_group.set_member_states(get_lobby_joins());
@ -551,7 +551,7 @@ void preferences_dialog::post_build(window& window)
});
/* FRIENDS LIST */
listbox& friends_list = find_widget<listbox>(&window, "friends_list", false);
listbox& friends_list = find_widget<listbox>(this, "friends_list", false);
friends_list.clear();
@ -561,22 +561,22 @@ void preferences_dialog::post_build(window& window)
update_friends_list_controls(friends_list);
text_box& textbox = find_widget<text_box>(&window, "friend_name_box", false);
text_box& textbox = find_widget<text_box>(this, "friend_name_box", false);
connect_signal_mouse_left_click(
find_widget<button>(&window, "add_friend", false), std::bind(
find_widget<button>(this, "add_friend", false), std::bind(
&preferences_dialog::add_friend_list_entry,
this, true,
std::ref(textbox)));
connect_signal_mouse_left_click(
find_widget<button>(&window, "add_ignored", false), std::bind(
find_widget<button>(this, "add_ignored", false), std::bind(
&preferences_dialog::add_friend_list_entry,
this, false,
std::ref(textbox)));
connect_signal_mouse_left_click(
find_widget<button>(&window, "remove", false), std::bind(
find_widget<button>(this, "remove", false), std::bind(
&preferences_dialog::remove_friend_list_entry,
this,
std::ref(friends_list),
@ -590,12 +590,12 @@ void preferences_dialog::post_build(window& window)
/* ALERTS */
connect_signal_mouse_left_click(
find_widget<button>(&window, "mp_alerts", false),
find_widget<button>(this, "mp_alerts", false),
std::bind(&gui2::dialogs::mp_alerts_options::display<>));
/* SET WESNOTHD PATH */
connect_signal_mouse_left_click(
find_widget<button>(&window, "mp_wesnothd", false), std::bind(
find_widget<button>(this, "mp_wesnothd", false), std::bind(
&show_wesnothd_server_search));
@ -603,7 +603,7 @@ void preferences_dialog::post_build(window& window)
// ADVANCED PANEL
//
listbox& advanced = find_widget<listbox>(&window, "advanced_prefs", false);
listbox& advanced = find_widget<listbox>(this, "advanced_prefs", false);
widget_data row_data;
@ -735,13 +735,13 @@ void preferences_dialog::post_build(window& window)
// HOTKEYS PANEL
//
multimenu_button& hotkey_menu = find_widget<multimenu_button>(&window, "hotkey_category_menu", false);
multimenu_button& hotkey_menu = find_widget<multimenu_button>(this, "hotkey_category_menu", false);
connect_signal_notify_modified(hotkey_menu,
std::bind(&preferences_dialog::hotkey_filter_callback, this));
listbox& hotkey_list = setup_hotkey_list();
text_box& filter = find_widget<text_box>(&window, "filter", false);
text_box& filter = find_widget<text_box>(this, "filter", false);
filter.set_text_changed_callback(std::bind(&preferences_dialog::hotkey_filter_callback, this));
// Action column
@ -758,19 +758,19 @@ void preferences_dialog::post_build(window& window)
hotkey_list.set_active_sorting_option({0, sort_order::type::ascending}, true);
connect_signal_mouse_left_click(
find_widget<button>(&window, "btn_add_hotkey", false), std::bind(
find_widget<button>(this, "btn_add_hotkey", false), std::bind(
&preferences_dialog::add_hotkey_callback,
this,
std::ref(hotkey_list)));
connect_signal_mouse_left_click(
find_widget<button>(&window, "btn_clear_hotkey", false), std::bind(
find_widget<button>(this, "btn_clear_hotkey", false), std::bind(
&preferences_dialog::remove_hotkey_callback,
this,
std::ref(hotkey_list)));
connect_signal_mouse_left_click(
find_widget<button>(&window, "btn_reset_hotkeys", false), std::bind(
find_widget<button>(this, "btn_reset_hotkeys", false), std::bind(
&preferences_dialog::default_hotkey_callback,
this));
}
@ -787,7 +787,7 @@ listbox& preferences_dialog::setup_hotkey_list()
t_string& row_is_e = row_data["lbl_is_editor"]["label"];
t_string& row_is_m = row_data["lbl_is_mainmenu"]["label"];
listbox& hotkey_list = find_widget<listbox>(get_window(), "list_hotkeys", false);
listbox& hotkey_list = find_widget<listbox>(this, "list_hotkeys", false);
hotkey_list.clear();
visible_hotkeys_.clear();
@ -837,7 +837,7 @@ listbox& preferences_dialog::setup_hotkey_list()
filter_ops.emplace_back("label", t_string{cat_names.at(cat), "wesnoth-lib"}, "checkbox", false);
}
find_widget<multimenu_button>(get_window(), "hotkey_category_menu", false).set_values(filter_ops);
find_widget<multimenu_button>(this, "hotkey_category_menu", false).set_values(filter_ops);
return hotkey_list;
}
@ -919,10 +919,10 @@ void preferences_dialog::remove_hotkey_callback(listbox& hotkeys)
find_widget<label>(hotkeys.get_row_grid(row_number), "lbl_hotkey", false).set_label(hotkey::get_names(hotkey_item.id));
}
void preferences_dialog::hotkey_filter_callback() const
void preferences_dialog::hotkey_filter_callback()
{
const multimenu_button& hotkey_menu = find_widget<const multimenu_button>(get_window(), "hotkey_category_menu", false);
const text_box& name_filter = find_widget<const text_box>(get_window(), "filter", false);
const multimenu_button& hotkey_menu = find_widget<const multimenu_button>(this, "hotkey_category_menu", false);
const text_box& name_filter = find_widget<const text_box>(this, "filter", false);
boost::dynamic_bitset<> toggle_states = hotkey_menu.get_toggle_states();
boost::dynamic_bitset<> res(visible_hotkeys_.size());
@ -969,7 +969,7 @@ void preferences_dialog::hotkey_filter_callback() const
}
}
find_widget<listbox>(get_window(), "list_hotkeys", false).set_row_shown(res);
find_widget<listbox>(this, "list_hotkeys", false).set_row_shown(res);
}
void preferences_dialog::on_advanced_prefs_list_select(listbox& list)
@ -1078,16 +1078,16 @@ void preferences_dialog::pre_show(window& window)
void preferences_dialog::set_visible_page(unsigned int page, const std::string& pager_id)
{
find_widget<stacked_widget>(get_window(), pager_id, false).select_layer(page);
find_widget<stacked_widget>(this, pager_id, false).select_layer(page);
}
// Special fullsceen callback
void preferences_dialog::fullscreen_toggle_callback()
{
const bool ison = find_widget<toggle_button>(get_window(), "fullscreen", false).get_value_bool();
const bool ison = find_widget<toggle_button>(this, "fullscreen", false).get_value_bool();
video::set_fullscreen(ison);
menu_button& res_list = find_widget<menu_button>(get_window(), "resolution_set", false);
menu_button& res_list = find_widget<menu_button>(this, "resolution_set", false);
set_resolution_list(res_list);
res_list.set_active(!ison);
@ -1095,7 +1095,7 @@ void preferences_dialog::fullscreen_toggle_callback()
void preferences_dialog::handle_res_select()
{
menu_button& res_list = find_widget<menu_button>(get_window(), "resolution_set", false);
menu_button& res_list = find_widget<menu_button>(this, "resolution_set", false);
if(video::set_resolution(resolutions_[res_list.get_value()])) {
set_resolution_list(res_list);
@ -1105,14 +1105,14 @@ void preferences_dialog::handle_res_select()
void preferences_dialog::on_page_select()
{
const int selected_row =
std::max(0, find_widget<listbox>(get_window(), "selector", false).get_selected_row());
std::max(0, find_widget<listbox>(this, "selector", false).get_selected_row());
set_visible_page(static_cast<unsigned int>(selected_row), "pager");
}
void preferences_dialog::on_tab_select()
{
const int selected_row =
std::max(0, find_widget<listbox>(get_window(), "tab_selector", false).get_selected_row());
std::max(0, find_widget<listbox>(this, "tab_selector", false).get_selected_row());
set_visible_page(static_cast<unsigned int>(selected_row), "tab_pager");
}

View file

@ -77,11 +77,11 @@ public:
private:
virtual const std::string& window_id() const override;
virtual void post_build(window& window) override;
virtual void pre_show(window& window) override;
virtual void post_show(window& /*window*/) override;
/** Initializers */
void initialize_callbacks();
void initialize_tabs(listbox& selector);
void set_resolution_list(menu_button& res_list);
listbox& setup_hotkey_list();
@ -112,7 +112,7 @@ private:
void add_hotkey_callback(listbox& hotkeys);
void remove_hotkey_callback(listbox& hotkeys);
void default_hotkey_callback();
void hotkey_filter_callback() const;
void hotkey_filter_callback();
group<preferences::lobby_joins> lobby_joins_group;

View file

@ -41,7 +41,8 @@ namespace gui2::dialogs
REGISTER_DIALOG(screenshot_notification)
screenshot_notification::screenshot_notification(const std::string& path, surface screenshot)
: path_(path)
: modal_dialog(window_id())
, path_(path)
, screenshots_dir_path_(filesystem::get_screenshot_dir())
, screenshot_(screenshot)
{

View file

@ -43,7 +43,8 @@ std::string get_orb_widget_prefix(const std::string& base_id)
REGISTER_DIALOG(select_orb_colors)
select_orb_colors::select_orb_colors()
: show_unmoved_(preferences::show_unmoved_orb())
: modal_dialog(window_id())
, show_unmoved_(preferences::show_unmoved_orb())
, show_partial_(preferences::show_partial_orb())
, show_disengaged_(preferences::show_disengaged_orb())
, show_moved_(preferences::show_moved_orb())

View file

@ -28,10 +28,10 @@ namespace gui2::dialogs
REGISTER_DIALOG(server_info)
server_info::server_info(const std::string& info, const std::string& announcements)
: server_information_(info)
, announcements_(announcements)
: modal_dialog(window_id())
, server_information_(info)
, announcements_(announcements)
{
}
void server_info::pre_show(window& window)

View file

@ -34,7 +34,8 @@ simple_item_selector::simple_item_selector(const std::string& title,
const list_type& items,
bool title_uses_markup,
bool message_uses_markup)
: index_(-1)
: modal_dialog(window_id())
, index_(-1)
, single_button_(false)
, items_(items)
, ok_label_()

View file

@ -24,7 +24,8 @@ namespace gui2::dialogs
REGISTER_DIALOG(sp_options_configure)
sp_options_configure::sp_options_configure(ng::create_engine& create_engine, ng::configure_engine& config_engine)
: create_engine_(create_engine)
: modal_dialog(window_id())
, create_engine_(create_engine)
, config_engine_(config_engine)
, options_manager_()
{

View file

@ -54,7 +54,8 @@ namespace gui2::dialogs
REGISTER_DIALOG(statistics_dialog)
statistics_dialog::statistics_dialog(const team& current_team)
: current_team_(current_team)
: modal_dialog(window_id())
, current_team_(current_team)
, campaign_(statistics::calculate_stats(current_team.save_id_or_number()))
, scenarios_(statistics::level_stats(current_team.save_id_or_number()))
, selection_index_(scenarios_.size()) // The extra All Scenarios menu entry makes size() a valid initial index.

View file

@ -55,7 +55,8 @@ static const unsigned int LAYER_TEXT = 2;
REGISTER_DIALOG(story_viewer)
story_viewer::story_viewer(const std::string& scenario_name, const config& cfg_parsed)
: controller_(vconfig(cfg_parsed, true), scenario_name)
: modal_dialog(window_id())
, controller_(vconfig(cfg_parsed, true), scenario_name)
, part_index_(0)
, current_part_(nullptr)
, timer_id_(0)
@ -459,8 +460,10 @@ void story_viewer::halt_fade_draw()
fade_state_ = NOT_FADING;
}
void story_viewer::layout()
void story_viewer::update()
{
modal_dialog::update();
if(next_draw_ && SDL_GetTicks() < next_draw_) {
return;
}

View file

@ -25,7 +25,7 @@ namespace gui2::dialogs
{
/** Dialog to view the storyscreen. */
class story_viewer : public modal_dialog, public top_level_drawable
class story_viewer : public modal_dialog
{
public:
story_viewer(const std::string& scenario_name, const config& cfg_parsed);
@ -42,13 +42,8 @@ public:
} catch(const std::out_of_range&) {}
}
// top_level_drawable overrides
// used to animate the view
// TODO: draw_manager - better animation step / hook
// TODO: draw_manager - i still am horrified that a modal_dialog is not a window
virtual void layout() override;
virtual bool expose(const rect&) override { return false; }
virtual rect screen_location() override { return {0,0,0,0}; }
/** top_level_drawable hook to animate the view */
virtual void update() override;
private:
virtual const std::string& window_id() const override;

View file

@ -24,6 +24,7 @@ REGISTER_DIALOG(surrender_quit)
surrender_quit::surrender_quit()
: modal_dialog(window_id())
{
}

View file

@ -31,7 +31,8 @@ namespace gui2::dialogs
REGISTER_DIALOG(terrain_layers)
terrain_layers::terrain_layers(display_t& disp, const map_location& loc)
: tile_(nullptr)
: modal_dialog(window_id())
, tile_(nullptr)
, tile_logs_()
{
terrain_builder& builder = disp.get_builder();

View file

@ -27,7 +27,9 @@ namespace gui2::dialogs
REGISTER_DIALOG(theme_list)
theme_list::theme_list(const std::vector<theme_info>& themes, int selection)
: index_(selection), themes_(themes)
: modal_dialog(window_id())
, index_(selection)
, themes_(themes)
{
}

View file

@ -73,10 +73,10 @@ REGISTER_DIALOG(title_screen)
bool show_debug_clock_button = false;
title_screen::title_screen(game_launcher& game)
: debug_clock_()
: modal_dialog(window_id())
, debug_clock_()
, game_(game)
{
// Need to set this in the constructor, pre_show() / post_build() is too late
set_allow_plugin_skip(false);
}

View file

@ -36,7 +36,9 @@ transient_message::transient_message(const std::string& title,
const std::string& message,
const bool message_use_markup,
const std::string& image)
: hide_title_(title.empty()), hide_image_(image.empty())
: modal_dialog(window_id())
, hide_title_(title.empty())
, hide_image_(image.empty())
{
register_label("title", true, title, title_use_markup);
register_label("message", true, message, message_use_markup);

View file

@ -36,7 +36,8 @@ namespace gui2::dialogs
REGISTER_DIALOG(unit_advance)
unit_advance::unit_advance(const std::vector<unit_const_ptr>& samples, std::size_t real)
: previews_(samples)
: modal_dialog(window_id())
, previews_(samples)
, selected_index_(0)
, last_real_advancement_(real)
{

View file

@ -46,7 +46,8 @@ unit_attack::unit_attack(const unit_map::iterator& attacker_itor,
const unit_map::iterator& defender_itor,
std::vector<battle_context>&& weapons,
const int best_weapon)
: selected_weapon_(-1)
: modal_dialog(window_id())
, selected_weapon_(-1)
, attacker_itor_(attacker_itor)
, defender_itor_(defender_itor)
, weapons_(std::move(weapons))

View file

@ -48,7 +48,8 @@ namespace gui2::dialogs
REGISTER_DIALOG(unit_create)
unit_create::unit_create()
: gender_(last_gender)
: modal_dialog(window_id())
, gender_(last_gender)
, choice_(last_chosen_type_id)
, variation_(last_variation)
, last_words_()
@ -155,12 +156,10 @@ void unit_create::post_show(window& window)
last_variation = variation_;
}
void unit_create::update_displayed_type() const
void unit_create::update_displayed_type()
{
window* w = get_window();
const int selected_row
= find_widget<listbox>(w, "unit_type_list", false).get_selected_row();
= find_widget<listbox>(this, "unit_type_list", false).get_selected_row();
if(selected_row == -1) {
return;
@ -174,13 +173,13 @@ void unit_create::update_displayed_type() const
ut = &ut->get_variation(variation_);
}
find_widget<unit_preview_pane>(w, "unit_details", false).set_displayed_type(*ut);
find_widget<unit_preview_pane>(this, "unit_details", false).set_displayed_type(*ut);
}
void unit_create::list_item_clicked()
{
const int selected_row
= find_widget<listbox>(get_window(), "unit_type_list", false).get_selected_row();
= find_widget<listbox>(this, "unit_type_list", false).get_selected_row();
if(selected_row == -1) {
return;
@ -192,7 +191,7 @@ void unit_create::list_item_clicked()
return units_[selected_row]->has_gender_variation(gender);
});
menu_button& var_box = find_widget<menu_button>(get_window(), "variation_box", false);
menu_button& var_box = find_widget<menu_button>(this, "variation_box", false);
std::vector<config> var_box_values;
var_box_values.emplace_back("label", _("unit_variation^Default Variation"), "variation_id", "");
@ -236,7 +235,7 @@ void unit_create::list_item_clicked()
void unit_create::filter_text_changed(const std::string& text)
{
listbox& list = find_widget<listbox>(get_window(), "unit_type_list", false);
listbox& list = find_widget<listbox>(this, "unit_type_list", false);
const std::vector<std::string> words = utils::split(text, ' ');
@ -289,8 +288,7 @@ void unit_create::gender_toggle_callback(const unit_race::GENDER val)
void unit_create::variation_menu_callback()
{
window& window = *this->get_window();
menu_button& var_box = find_widget<menu_button>(&window, "variation_box", false);
menu_button& var_box = find_widget<menu_button>(this, "variation_box", false);
variation_ = var_box.get_value_config()["variation_id"].str();
update_displayed_type();

View file

@ -98,7 +98,7 @@ private:
void gender_toggle_callback(const unit_race::GENDER val);
void variation_menu_callback();
void update_displayed_type() const;
void update_displayed_type();
group<unit_race::GENDER> gender_toggle;
};

View file

@ -45,7 +45,8 @@ namespace gui2::dialogs
REGISTER_DIALOG(unit_list)
unit_list::unit_list(std::vector<unit_const_ptr>& unit_list, map_location& scroll_to)
: unit_list_(unit_list)
: modal_dialog(window_id())
, unit_list_(unit_list)
, scroll_to_(scroll_to)
{
}

View file

@ -59,7 +59,8 @@ static listbox::order_pair sort_default { 2, sort_order::type::descending};
REGISTER_DIALOG(unit_recall)
unit_recall::unit_recall(std::vector<unit_const_ptr>& recall_list, team& team)
: recall_list_(recall_list)
: modal_dialog(window_id())
, recall_list_(recall_list)
, team_(team)
, selected_index_()
, filter_options_()

View file

@ -42,7 +42,8 @@ namespace gui2::dialogs
REGISTER_DIALOG(unit_recruit)
unit_recruit::unit_recruit(std::map<const unit_type*, t_string>& recruit_map, team& team)
: recruit_list_()
: modal_dialog(window_id())
, recruit_list_()
, recruit_map_(recruit_map)
, team_(team)
, selected_index_(0)

View file

@ -139,7 +139,8 @@ wml_error::wml_error(const std::string& summary,
const std::string& post_summary,
const std::vector<std::string>& files,
const std::string& details)
: have_files_(!files.empty())
: modal_dialog(window_id())
, have_files_(!files.empty())
, have_post_summary_(!post_summary.empty())
, report_()
{

View file

@ -45,11 +45,14 @@ private:
class wml_message_base : public modal_dialog
{
public:
wml_message_base(const std::string& title,
const std::string& message,
const std::string& portrait,
const bool mirror)
: title_(title)
wml_message_base(
const std::string& window_id,
const std::string& title,
const std::string& message,
const std::string& portrait,
const bool mirror)
: modal_dialog(window_id)
, title_(title)
, image_("")
, message_(message)
, portrait_(portrait)
@ -137,7 +140,7 @@ public:
const std::string& message,
const std::string& portrait,
const bool mirror)
: wml_message_base(title, message, portrait, mirror)
: wml_message_base(window_id(), title, message, portrait, mirror)
{
}
@ -153,7 +156,7 @@ public:
const std::string& message,
const std::string& portrait,
const bool mirror)
: wml_message_base(title, message, portrait, mirror)
: wml_message_base(window_id(), title, message, portrait, mirror)
{
}

View file

@ -275,7 +275,7 @@ point container_base::border_space() const
void container_base::inject_linked_groups()
{
for(const auto& lg : config()->linked_groups) {
for(const auto& lg : get_config()->linked_groups) {
if(!get_window()->has_linked_size_group(lg.id)) {
get_window()->init_linked_size_group(lg.id, lg.fixed_width, lg.fixed_height);
}

View file

@ -297,12 +297,12 @@ public:
}
protected:
resolution_definition_ptr config()
resolution_definition_ptr get_config()
{
return config_;
}
resolution_definition_const_ptr config() const
resolution_definition_const_ptr get_config() const
{
return config_;
}
@ -323,7 +323,7 @@ protected:
"Given type's resolution object does not derive from resolution_definition."
);
return std::static_pointer_cast<const typename T::resolution>(config());
return std::static_pointer_cast<const typename T::resolution>(get_config());
}
void set_config(resolution_definition_ptr config)

View file

@ -59,7 +59,7 @@ toggle_button::toggle_button(const implementation::builder_toggle_button& builde
unsigned toggle_button::num_states() const
{
std::div_t res = std::div(this->config()->state.size(), COUNT);
std::div_t res = std::div(this->get_config()->state.size(), COUNT);
assert(res.rem == 0);
assert(res.quot > 0);
return res.quot;

View file

@ -80,7 +80,7 @@ toggle_panel::toggle_panel(const implementation::builder_toggle_panel& builder)
unsigned toggle_panel::num_states() const
{
std::div_t res = std::div(this->config()->state.size(), COUNT);
std::div_t res = std::div(this->get_config()->state.size(), COUNT);
assert(res.rem == 0);
assert(res.quot > 0);
return res.quot;