Skip to content

Commit

Permalink
Preferences Dialog: made sound setting changes apply immediately (fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
Vultraz committed Feb 24, 2018
1 parent 4b6a74b commit f722a09
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 22 deletions.
69 changes: 47 additions & 22 deletions src/gui/dialogs/preferences_dialog.cpp
Expand Up @@ -93,6 +93,23 @@ int index_in_pager_range(const int first, const stacked_widget& pager)
return utils::clamp<int>(first, 0, pager.get_layer_count() - 1);
}

// Helper to make it easier to immediately apply sound toggles immediately.
template<bool(*fptr)(bool)>
void sound_toggle_on_change(window& window, const std::string& id_to_toggle, widget& w)
{
(*fptr)(dynamic_cast<selectable_item&>(w).get_value_bool());

// Toggle the corresponding slider.
disable_widget_on_toggle<slider>(window, w, id_to_toggle);
}

// Helper to make it easier to immediately apply volume (music, etc) setings on change.
template<void(*fptr)(int)>
void volume_setter_on_change(widget& w)
{
(*fptr)(dynamic_cast<integer_selector&>(w).get_value());
}

} // end anon namespace

using namespace preferences;
Expand Down Expand Up @@ -307,6 +324,32 @@ void preferences_dialog::remove_friend_list_entry(listbox& friends_list, text_bo
update_friends_list_controls(window, list);
}

template<bool(*toggle_getter)(), bool(*toggle_setter)(bool), int(*vol_getter)(), void(*vol_setter)(int)>
void preferences_dialog::initialize_sound_option_group(const std::string& id_suffix)
{
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, bind_void(toggle_setter, _1),
std::bind(sound_toggle_on_change<toggle_setter>, std::ref(window), volume_widget_id, _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
// class of is own.
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),
std::bind(volume_setter_on_change<vol_setter>, _1));
}

/**
* Sets up states and callbacks for each of the widgets
*/
Expand Down Expand Up @@ -447,42 +490,24 @@ void preferences_dialog::post_build(window& window)
find_widget<button>(&window, "choose_theme", false),
bind_void(&show_theme_dialog));


//
// SOUND PANEL
//

/* SOUND FX */
register_bool("sound_toggle_sfx", true, sound_on, bind_void(set_sound, _1),
[&](widget& w) { disable_widget_on_toggle<slider>(window, w, "sound_volume_sfx"); }, true);

register_integer("sound_volume_sfx", true,
sound_volume, set_sound_volume);
initialize_sound_option_group<sound_on, set_sound, sound_volume, set_sound_volume>("sfx");

/* MUSIC */
register_bool("sound_toggle_music", true, music_on, bind_void(set_music, _1),
[&](widget& w) { disable_widget_on_toggle<slider>(window, w, "sound_volume_music"); }, true);

register_integer("sound_volume_music", true,
music_volume, set_music_volume);
initialize_sound_option_group<music_on, set_music, music_volume, set_music_volume>("music");

register_bool("sound_toggle_stop_music_in_background", true,
stop_music_in_background, set_stop_music_in_background);

/* TURN BELL */
register_bool("sound_toggle_bell", true, turn_bell, bind_void(set_turn_bell, _1),
[&](widget& w) { disable_widget_on_toggle<slider>(window, w, "sound_volume_bell"); }, true);

register_integer("sound_volume_bell", true,
bell_volume, set_bell_volume);
initialize_sound_option_group<turn_bell, set_turn_bell, bell_volume, set_bell_volume>("bell");

/* UI FX */
register_bool("sound_toggle_uisfx", true, UI_sound_on, bind_void(set_UI_sound, _1),
[&](widget& w) { disable_widget_on_toggle<slider>(window, w, "sound_volume_uisfx"); }, true);

register_integer("sound_volume_uisfx", true,
UI_volume, set_UI_volume);

initialize_sound_option_group<UI_sound_on, set_UI_sound, UI_volume, set_UI_volume>("uisfx");

//
// MULTIPLAYER PANEL
Expand Down
3 changes: 3 additions & 0 deletions src/gui/dialogs/preferences_dialog.hpp
Expand Up @@ -95,6 +95,9 @@ class preferences_dialog : public modal_dialog
void set_resolution_list(menu_button& res_list, CVideo& video);
listbox& setup_hotkey_list(window& window);

template<bool(*toggle_getter)(), bool(*toggle_setter)(bool), int(*vol_getter)(), void(*vol_setter)(int)>
void initialize_sound_option_group(const std::string& id_suffix);

std::map<std::string, string_map> get_friends_list_row_data(const preferences::acquaintance& entry);

void add_friend_list_entry(const bool is_friend, text_box& textbox, window& window);
Expand Down

0 comments on commit f722a09

Please sign in to comment.