Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Addon manager: Save the last sort order in a hidden preference #4409

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 26 additions & 7 deletions src/gui/dialogs/addon/manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -206,25 +206,25 @@ const std::vector<std::pair<ADDON_TYPE, std::string>> addon_manager::type_filter
};

const std::vector<addon_manager::addon_order> addon_manager::all_orders_{
{N_("addons_order^Name ($order)"), 0,
{N_("addons_order^Name ($order)"), "name", 0,
[](const addon_info& a, const addon_info& b) { return a.title < b.title; },
[](const addon_info& a, const addon_info& b) { return a.title > b.title; }},
{N_("addons_order^Author ($order)"), 1,
{N_("addons_order^Author ($order)"), "author", 1,
[](const addon_info& a, const addon_info& b) { return a.author < b.author; },
[](const addon_info& a, const addon_info& b) { return a.author > b.author; }},
{N_("addons_order^Size ($order)"), 2,
{N_("addons_order^Size ($order)"), "size", 2,
[](const addon_info& a, const addon_info& b) { return a.size < b.size; },
[](const addon_info& a, const addon_info& b) { return a.size > b.size; }},
{N_("addons_order^Downloads ($order)"), 3,
{N_("addons_order^Downloads ($order)"), "downloads", 3,
[](const addon_info& a, const addon_info& b) { return a.downloads < b.downloads; },
[](const addon_info& a, const addon_info& b) { return a.downloads > b.downloads; }},
{N_("addons_order^Type ($order)"), 4,
{N_("addons_order^Type ($order)"), "type", 4,
[](const addon_info& a, const addon_info& b) { return a.display_type() < b.display_type(); },
[](const addon_info& a, const addon_info& b) { return a.display_type() > b.display_type(); }},
{N_("addons_order^Last updated ($datelike_order)"), -1,
{N_("addons_order^Last updated ($datelike_order)"), "last_updated", -1,
[](const addon_info& a, const addon_info& b) { return a.updated < b.updated; },
[](const addon_info& a, const addon_info& b) { return a.updated > b.updated; }},
{N_("addons_order^First uploaded ($datelike_order)"), -1,
{N_("addons_order^First uploaded ($datelike_order)"), "first_uploaded", -1,
[](const addon_info& a, const addon_info& b) { return a.created < b.created; },
[](const addon_info& a, const addon_info& b) { return a.created > b.created; }}
};
Expand Down Expand Up @@ -368,6 +368,21 @@ void addon_manager::pre_show(window& window)
}

order_dropdown.set_values(order_dropdown_entries);
{
const std::string saved_order_name = preferences::addon_manager_saved_order_name();
const listbox::SORT_ORDER saved_order_direction =
static_cast<listbox::SORT_ORDER>(preferences::addon_manager_saved_order_direction());

if(!saved_order_name.empty()) {
auto order_it = std::find_if(all_orders_.begin(), all_orders_.end(),
[&saved_order_name](const addon_order& order) {return order.as_preference == saved_order_name;});
int index = 2 * (std::distance(all_orders_.begin(), order_it));
if(saved_order_direction == listbox::SORT_DESCENDING) {
++index;
}
find_widget<menu_button>(&window, "order_dropdown", false).set_value(index, false);
}
}

connect_signal_notify_modified(order_dropdown,
std::bind(&addon_manager::order_addons, this, std::ref(window)));
Expand Down Expand Up @@ -618,6 +633,8 @@ void addon_manager::order_addons(window& window)
}

find_widget<addon_list>(&window, "addons", false).set_addon_order(func);
preferences::set_addon_manager_saved_order_name(order_struct.as_preference);
preferences::set_addon_manager_saved_order_direction(order);
}

void addon_manager::on_order_changed(window& window, unsigned int sort_column, listbox::SORT_ORDER order)
Expand All @@ -630,6 +647,8 @@ void addon_manager::on_order_changed(window& window, unsigned int sort_column, l
++index;
}
order_menu.set_value(index);
preferences::set_addon_manager_saved_order_name(order_it->as_preference);
preferences::set_addon_manager_saved_order_direction(order);
}

template<void(addon_manager::*fptr)(const addon_info& addon, window& window)>
Expand Down
10 changes: 8 additions & 2 deletions src/gui/dialogs/addon/manager.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,18 @@ class addon_manager : public modal_dialog
struct addon_order
{
std::string label;
/// The value used in the preferences file
std::string as_preference;
int column_index; // -1 if there is no such column
addon_list::addon_sort_func sort_func_asc;
addon_list::addon_sort_func sort_func_desc;

addon_order(std::string label_, int column, addon_list::addon_sort_func sort_func_asc_, addon_list::addon_sort_func sort_func_desc_)
: label(label_), column_index(column), sort_func_asc(sort_func_asc_), sort_func_desc(sort_func_desc_)
addon_order(std::string label_, std::string as_preference_, int column, addon_list::addon_sort_func sort_func_asc_, addon_list::addon_sort_func sort_func_desc_)
: label(label_)
, as_preference(as_preference_)
, column_index(column)
, sort_func_asc(sort_func_asc_)
, sort_func_desc(sort_func_desc_)
{}
};

Expand Down
1 change: 1 addition & 0 deletions src/gui/widgets/listbox.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,7 @@ class listbox : public scrollbar_container
/** Registers a special sorting function specifically for translatable values. */
void register_translatable_sorting_option(const int col, translatable_sorter_func_t f);

/// The int values of this enum are serialized by preferences::set_addon_manager_saved_order_direction(), don't change them!
enum SORT_ORDER {
SORT_NONE,
SORT_ASCENDING,
Expand Down
21 changes: 21 additions & 0 deletions src/preferences/general.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1074,4 +1074,25 @@ void set_damage_prediction_allow_monte_carlo_simulation(bool value)
set("damage_prediction_allow_monte_carlo_simulation", value);
}

std::string addon_manager_saved_order_name()
{
return get("addon_manager_saved_order_name");
}

void set_addon_manager_saved_order_name(const std::string& value)
{
set("addon_manager_saved_order_name", value);
}

int addon_manager_saved_order_direction()
{
return std::atoi(get("addon_manager_saved_order_direction").c_str());
}

void set_addon_manager_saved_order_direction(const int& value)
{
set("addon_manager_saved_order_direction", std::to_string(value));
}


} // end namespace preferences
7 changes: 7 additions & 0 deletions src/preferences/general.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -283,4 +283,11 @@ namespace preferences {
bool damage_prediction_allow_monte_carlo_simulation();
void set_damage_prediction_allow_monte_carlo_simulation(bool value);

std::string addon_manager_saved_order_name();
void set_addon_manager_saved_order_name(const std::string& value);

// Actually gui2::listbox::SORT_ORDER
int addon_manager_saved_order_direction();
void set_addon_manager_saved_order_direction(const int& value);

} // end namespace preferences