Skip to content

Commit

Permalink
fix recrision in gui2 mp create depckeck
Browse files Browse the repository at this point in the history
selectable::set_value now takes an optional fire_vent parmeter

also we fix a case where display_games_of_type always invoked a
on_game_select for the first element in the list before the correct
level was selected.
  • Loading branch information
gfgtdf authored and GregoryLundberg committed Nov 30, 2017
1 parent 56791ee commit 7d253cf
Show file tree
Hide file tree
Showing 9 changed files with 44 additions and 42 deletions.
27 changes: 16 additions & 11 deletions src/gui/dialogs/multiplayer/mp_create_game.cpp
Expand Up @@ -153,12 +153,12 @@ void mp_create_game::pre_show(window& win)
// Set up filtering
//
connect_signal_notify_modified(find_widget<slider>(&win, "num_players", false),
std::bind(&mp_create_game::on_filter_change<slider>, this, std::ref(win), "num_players"));
std::bind(&mp_create_game::on_filter_change<slider>, this, std::ref(win), "num_players", true));

text_box& filter = find_widget<text_box>(&win, "game_filter", false);

filter.set_text_changed_callback(
std::bind(&mp_create_game::on_filter_change<text_box>, this, std::ref(win), "game_filter"));
std::bind(&mp_create_game::on_filter_change<text_box>, this, std::ref(win), "game_filter", true));

// Note this cannot be in the keyboard chain or it will capture focus from other text boxes
win.keyboard_capture(&filter);
Expand Down Expand Up @@ -218,8 +218,8 @@ void mp_create_game::pre_show(window& win)
create_engine_.active_mods().push_back(mod->id);
mog_toggle.set_value_bool(true);
}

connect_signal_notify_modified(mog_toggle, std::bind(&mp_create_game::on_mod_toggle, this, std::ref(win), i));
auto pmog_toggle = &mog_toggle;
connect_signal_notify_modified(mog_toggle, std::bind(&mp_create_game::on_mod_toggle, this, std::ref(win), i, pmog_toggle));
}

// No mods, hide the header
Expand Down Expand Up @@ -366,7 +366,7 @@ void mp_create_game::pre_show(window& win)
create_engine_.set_current_era_index(cfg["index"].to_int()); }, true);

plugins_context_->set_callback("select_mod", [this, &win](const config& cfg) {
on_mod_toggle(win, cfg["index"].to_int());
on_mod_toggle(win, cfg["index"].to_int(), nullptr);
}, true);

plugins_context_->set_accessor("game_config", [this](const config&) {return cfg_; });
Expand Down Expand Up @@ -437,7 +437,7 @@ void mp_create_game::sync_with_depcheck(window& window)
}

template<typename widget>
void mp_create_game::on_filter_change(window& window, const std::string& id)
void mp_create_game::on_filter_change(window& window, const std::string& id, bool do_select)
{
create_engine_.apply_level_filter(find_widget<widget>(&window, id, false).get_value());

Expand All @@ -449,8 +449,9 @@ void mp_create_game::on_filter_change(window& window, const std::string& id)
}

game_list.set_row_shown(filtered);

on_game_select(window);
if(do_select) {
on_game_select(window);
}
}

void mp_create_game::on_game_select(window& window)
Expand Down Expand Up @@ -513,8 +514,12 @@ void mp_create_game::on_tab_select(window& window)
}
}

void mp_create_game::on_mod_toggle(window& window, const int index)
void mp_create_game::on_mod_toggle(window& window, const int index, toggle_button* sender)
{
(void)sender;
if(sender && (sender->get_value_bool() == create_engine_.dependency_manager().is_modification_active(index))) {
assert(false);
}
create_engine_.toggle_mod(index);

sync_with_depcheck(window);
Expand Down Expand Up @@ -582,8 +587,8 @@ void mp_create_game::display_games_of_type(window& window, ng::level::TYPE type,

if(!level.empty() && !list.get_rows_shown().empty()) {
// Recalculate which rows should be visible
on_filter_change<slider>(window, "num_players");
on_filter_change<text_box>(window, "game_filter");
on_filter_change<slider>(window, "num_players", false);
on_filter_change<text_box>(window, "game_filter", false);

int level_index = create_engine_.find_level_by_id(level).second;
if(level_index >= 0 && size_t(level_index) < list.get_item_count()) {
Expand Down
4 changes: 2 additions & 2 deletions src/gui/dialogs/multiplayer/mp_create_game.hpp
Expand Up @@ -109,12 +109,12 @@ class mp_create_game : public modal_dialog, private plugin_executor
field_integer* action_bonus_;

template<typename widget>
void on_filter_change(window& window, const std::string& id);
void on_filter_change(window& window, const std::string& id, bool do_select);

void on_game_select(window& window);
void on_tab_select(window& window);
void on_era_select(window& window);
void on_mod_toggle(window& window, const int index);
void on_mod_toggle(window& window, const int index, toggle_button* sender);
void on_random_faction_mode_select(window& window);

std::vector<std::string> get_active_mods(window& window);
Expand Down
9 changes: 5 additions & 4 deletions src/gui/widgets/menu_button.cpp
Expand Up @@ -143,7 +143,7 @@ void menu_button::signal_handler_left_button_click(const event::ui_event event,
return;
}

set_selected(selected);
set_selected(selected, true);

if(retval_ != 0) {
if(window* window = get_window()) {
Expand Down Expand Up @@ -171,7 +171,7 @@ void menu_button::set_values(const std::vector<::config>& values, int selected)
set_label(values_[selected_]["label"]);
}

void menu_button::set_selected(int selected)
void menu_button::set_selected(int selected, bool fire_event)
{
assert(static_cast<size_t>(selected) < values_.size());
assert(static_cast<size_t>(selected_) < values_.size());
Expand All @@ -183,8 +183,9 @@ void menu_button::set_selected(int selected)
selected_ = selected;

set_label(values_[selected_]["label"]);

fire(event::NOTIFY_MODIFIED, *this, nullptr);
if (fire_event) {
fire(event::NOTIFY_MODIFIED, *this, nullptr);
}
}

// }---------- DEFINITION ---------{
Expand Down
4 changes: 2 additions & 2 deletions src/gui/widgets/menu_button.hpp
Expand Up @@ -75,13 +75,13 @@ class menu_button : public styled_widget, public selectable_item

void set_values(const std::vector<::config>& values, int selected = 0);

void set_selected(int selected);
void set_selected(int selected, bool fire_event = true);

/** Inherited from selectable_item */
virtual unsigned get_value() const override { return selected_; }

/** Inherited from selectable_item */
virtual void set_value(const unsigned value ) override { set_selected(value); }
virtual void set_value(unsigned value, bool fire_event = false) override { set_selected(value, fire_event); }

/** Inherited from selectable_item */
virtual unsigned num_states() const override { return values_.size(); }
Expand Down
6 changes: 3 additions & 3 deletions src/gui/widgets/selectable_item.hpp
Expand Up @@ -39,7 +39,7 @@ class selectable_item
virtual unsigned get_value() const = 0;

/** Select the styled_widget. */
virtual void set_value(const unsigned) = 0;
virtual void set_value(unsigned value, bool fire_event = false) = 0;

/** The number of states, that is 2 for normal buttons, 3 for tristate buttons. */
virtual unsigned num_states() const = 0;
Expand All @@ -50,10 +50,10 @@ class selectable_item
return get_value() != 0;
}

void set_value_bool(const bool value)
void set_value_bool(bool value, bool fire_event = false)
{
assert(num_states() == 2);
return set_value(value);
return set_value(value, fire_event);
}
};

Expand Down
12 changes: 7 additions & 5 deletions src/gui/widgets/toggle_button.cpp
Expand Up @@ -110,21 +110,23 @@ void toggle_button::update_canvas()
set_is_dirty(true);
}

void toggle_button::set_value(const unsigned selected)
void toggle_button::set_value(unsigned selected, bool fire_event)
{
selected = selected % num_states();
if(selected == get_value()) {
return;
}
state_num_ = selected % num_states();
state_num_ = selected;
set_is_dirty(true);

// Check for get_window() is here to prevent the callback from
// being called when the initial value is set.
if(!get_window()) {
return;
}

fire(event::NOTIFY_MODIFIED, *this, nullptr);
if (fire_event) {
fire(event::NOTIFY_MODIFIED, *this, nullptr);
}
}

void toggle_button::set_retval(const int retval)
Expand Down Expand Up @@ -168,7 +170,7 @@ void toggle_button::signal_handler_left_button_click(const event::ui_event event

sound::play_UI_sound(settings::sound_toggle_button_click);

set_value(get_value() + 1);
set_value(get_value() + 1, true);

handled = true;
}
Expand Down
2 changes: 1 addition & 1 deletion src/gui/widgets/toggle_button.hpp
Expand Up @@ -62,7 +62,7 @@ class toggle_button : public styled_widget, public selectable_item
/** Inherited from selectable_item */
unsigned num_states() const override;
/** Inherited from selectable_item */
void set_value(const unsigned selected) override;
void set_value(unsigned selected, bool fire_event = false) override;

/***** ***** ***** setters / getters for members ***** ****** *****/

Expand Down
20 changes: 7 additions & 13 deletions src/gui/widgets/toggle_panel.cpp
Expand Up @@ -159,15 +159,15 @@ point toggle_panel::border_space() const
return point(conf->left_border + conf->right_border, conf->top_border + conf->bottom_border);
}

void toggle_panel::set_value(const unsigned selected)
void toggle_panel::set_value(unsigned selected, bool fire_event)
{
selected = selected % num_states();
if(selected == get_value()) {
return;
}
state_num_ = selected % num_states();
state_num_ = selected;
set_is_dirty(true);

#if 0
/*
* Disabled since this causes problems all over the place.
* This was added in acea15c312f178b2b6fe4556ca6b190b00866557 but clashes with the
Expand All @@ -185,12 +185,9 @@ void toggle_panel::set_value(const unsigned selected)

// Check for get_window() is here to prevent the callback from
// being called when the initial value is set.
if(!get_window()) {
return;
if(get_window() && fire_event) {
fire(event::NOTIFY_MODIFIED, *this, nullptr);
}

fire(event::NOTIFY_MODIFIED, *this, nullptr);
#endif
}

void toggle_panel::set_retval(const int retval)
Expand Down Expand Up @@ -252,7 +249,7 @@ toggle_panel::signal_handler_pre_left_button_click(const event::ui_event event)
{
DBG_GUI_E << get_control_type() << "[" << id() << "]: " << event << ".\n";

set_value(1);
set_value(1, true);

#if 0
/*
Expand Down Expand Up @@ -281,10 +278,7 @@ void toggle_panel::signal_handler_left_button_click(const event::ui_event event,

sound::play_UI_sound(settings::sound_toggle_panel_click);

set_value(get_value() + 1);

/** @todo remove. See comment in @ref set_value. */
fire(event::NOTIFY_MODIFIED, *this, nullptr);
set_value(get_value() + 1, true);

handled = true;
}
Expand Down
2 changes: 1 addition & 1 deletion src/gui/widgets/toggle_panel.hpp
Expand Up @@ -96,7 +96,7 @@ class toggle_panel : public panel, public selectable_item
}

/** Inherited from selectable_item */
void set_value(const unsigned selected) override;
void set_value(const unsigned selected, bool fire_event = false) override;

/** Inherited from selectable_item */
unsigned num_states() const override;
Expand Down

0 comments on commit 7d253cf

Please sign in to comment.