diff --git a/src/gui/dialogs/achievements_dialog.cpp b/src/gui/dialogs/achievements_dialog.cpp index ff9e3912ae4..b04a7e1cb1b 100644 --- a/src/gui/dialogs/achievements_dialog.cpp +++ b/src/gui/dialogs/achievements_dialog.cpp @@ -25,17 +25,17 @@ #include "gui/widgets/progress_bar.hpp" #include "gui/widgets/window.hpp" #include "log.hpp" +#include "preferences/general.hpp" namespace gui2::dialogs { REGISTER_DIALOG(achievements_dialog) -unsigned int achievements_dialog::selected_index_ = 0; - achievements_dialog::achievements_dialog() : modal_dialog(window_id()) , achieve_() + , last_selected_(preferences::selected_achievement_group()) , achievements_box_(nullptr) , content_names_(nullptr) { @@ -50,14 +50,13 @@ void achievements_dialog::pre_show(window& win) achievements_box_ = find_widget(&win, "achievements_list", false, true); std::vector groups = game_config_manager::get()->get_achievements(); - // reset the selected achievement group in case add-ons with achievements are uninstalled between closing and re-opening the dialog - if(selected_index_ > groups.size()) { - selected_index_ = 0; - } + int selected = 0; for(const auto& list : groups) { // only display the achievements for the first dropdown option on first showing the dialog - if(content_list.size() == selected_index_) { + if(list.content_for_ == last_selected_ || last_selected_ == "") { + selected = content_list.size(); + last_selected_ = list.content_for_; int achieved_count = 0; for(const auto& ach : list.achievements_) { @@ -109,21 +108,23 @@ void achievements_dialog::pre_show(window& win) } if(content_list.size() > 0) { content_names_->set_values(content_list); - content_names_->set_selected(selected_index_, false); + content_names_->set_selected(selected, false); } } void achievements_dialog::post_show(window&) { + preferences::set_selected_achievement_group(last_selected_); } void achievements_dialog::set_achievements_content() { achievements_box_->clear(); int achieved_count = 0; - selected_index_ = content_names_->get_value(); - achievement_group list = game_config_manager::get()->get_achievements().at(selected_index_); + achievement_group list = game_config_manager::get()->get_achievements().at(content_names_->get_value()); + last_selected_ = list.content_for_; + for(const auto& ach : list.achievements_) { if(ach.achieved_) { achieved_count++; diff --git a/src/gui/dialogs/achievements_dialog.hpp b/src/gui/dialogs/achievements_dialog.hpp index f7f8b66ab10..89284a6e778 100644 --- a/src/gui/dialogs/achievements_dialog.hpp +++ b/src/gui/dialogs/achievements_dialog.hpp @@ -44,10 +44,9 @@ public: private: achievements achieve_; + std::string last_selected_; listbox* achievements_box_; menu_button* content_names_; - /** variable of the most recently selected achievements, static to persist between closing and re-opening the dialog */ - static unsigned int selected_index_; void set_achievements_content(); diff --git a/src/preferences/general.cpp b/src/preferences/general.cpp index f9ac00cca3a..2abad260255 100644 --- a/src/preferences/general.cpp +++ b/src/preferences/general.cpp @@ -1016,6 +1016,16 @@ void set_addon_manager_saved_order_direction(sort_order::type value) set("addon_manager_saved_order_direction", sort_order::get_string(value)); } +std::string selected_achievement_group() +{ + return get("selected_achievement_group"); +} + +void set_selected_achievement_group(const std::string& content_for) +{ + set("selected_achievement_group", content_for); +} + bool achievement(const std::string& content_for, const std::string& id) { for(config& ach : prefs.child_range("achievements")) diff --git a/src/preferences/general.hpp b/src/preferences/general.hpp index 829501bf750..f27edee1340 100644 --- a/src/preferences/general.hpp +++ b/src/preferences/general.hpp @@ -274,6 +274,9 @@ namespace preferences { sort_order::type addon_manager_saved_order_direction(); void set_addon_manager_saved_order_direction(sort_order::type value); + std::string selected_achievement_group(); + void set_selected_achievement_group(const std::string& content_for); + /** * @param content_for The achievement group the achievement is part of. * @param id The ID of the achievement within the achievement group.