Make last selected achievement group persistent.

This commit is contained in:
Pentarctagon 2023-02-05 00:00:14 -06:00 committed by Pentarctagon
parent 7825de6a71
commit 97478c5bc0
4 changed files with 25 additions and 12 deletions

View file

@ -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<listbox>(&win, "achievements_list", false, true);
std::vector<achievement_group> 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++;

View file

@ -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();

View file

@ -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"))

View file

@ -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.