From 3b88de6cbc474a0e29f2b87d29a556bb3e200aa6 Mon Sep 17 00:00:00 2001 From: Jyrki Vesterinen Date: Sat, 10 Feb 2018 18:06:38 +0200 Subject: [PATCH] Add sort order dropdown to add-on manager (#1747) This dropdown allows the player to sort add-ons by name, author, size, download count, type, or the time of last update or original upload. Sorting by the last two hasn't been possible in the GUI2 add-on manager before. Closes #1747. --- changelog | 2 ++ data/gui/window/addon_manager.cfg | 27 +++++++++++++- players_changelog | 3 ++ src/gui/dialogs/addon/manager.cpp | 59 ++++++++++++++++++++++++++++++- src/gui/dialogs/addon/manager.hpp | 16 +++++++++ src/gui/widgets/addon_list.cpp | 14 ++++++++ src/gui/widgets/addon_list.hpp | 4 +++ src/gui/widgets/listbox.cpp | 9 +++++ src/gui/widgets/listbox.hpp | 3 ++ 9 files changed, 135 insertions(+), 2 deletions(-) diff --git a/changelog b/changelog index 7ba5765c93e5..260adeac1d8a 100644 --- a/changelog +++ b/changelog @@ -1,5 +1,7 @@ Version 1.13.11: * Add-ons client: + * Added an order dropdown that allows you to sort add-ons by the time of + latest update or original upload (issue #1747) * Players will now be prompted to update outdated dependencies alongside missing once when installing an add-on. * Campaigns: diff --git a/data/gui/window/addon_manager.cfg b/data/gui/window/addon_manager.cfg index f6086f34d105..998a8de7b241 100644 --- a/data/gui/window/addon_manager.cfg +++ b/data/gui/window/addon_manager.cfg @@ -735,7 +735,7 @@ [/column] [column] - grow_factor = 1 + grow_factor = 0 border = "all" border_size = 5 @@ -748,6 +748,31 @@ [/multimenu_button] [/column] + [column] + grow_factor = 0 + border = "all" + border_size = 5 + horizontal_alignment = "left" + + [label] + definition = "default" + label = _ "Order:" + [/label] + [/column] + + [column] + grow_factor = 1 + border = "all" + border_size = 5 + + horizontal_alignment = "left" + + [menu_button] + id = "order_dropdown" + definition = "default" + [/menu_button] + [/column] + [column] grow_factor = 0 border = "all" diff --git a/players_changelog b/players_changelog index 1b72f998105c..9d04c5db97a6 100644 --- a/players_changelog +++ b/players_changelog @@ -3,6 +3,9 @@ changes may be omitted). For a complete list of changes, see the main changelog: https://github.com/wesnoth/wesnoth/blob/master/changelog Version 1.13.11: + * Add-ons client: + * Added an order dropdown that allows you to sort add-ons by the time of + latest update or original upload (issue #1747) * Campaigns: * An Orcish Incursion: * New story art. diff --git a/src/gui/dialogs/addon/manager.cpp b/src/gui/dialogs/addon/manager.cpp index cc897443c5de..1ca4eca2b6b1 100644 --- a/src/gui/dialogs/addon/manager.cpp +++ b/src/gui/dialogs/addon/manager.cpp @@ -30,7 +30,6 @@ #include "gui/dialogs/helper.hpp" #include "gui/dialogs/message.hpp" #include "gui/dialogs/transient_message.hpp" -#include "gui/widgets/addon_list.hpp" #include "gui/widgets/button.hpp" #include "gui/widgets/label.hpp" #include "gui/widgets/menu_button.hpp" @@ -212,6 +211,30 @@ const std::vector> addon_manager::type_filter {ADDON_UNKNOWN, N_("addons_of_type^Unknown")}, }; +const std::vector addon_manager::all_orders_{ + {N_("addons_order^Name ($order)"), + [](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)"), + [](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)"), + [](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)"), + [](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)"), + [](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 ($order)"), + [](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 ($order)"), + [](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; }} +}; + addon_manager::addon_manager(addons_client& client) : orders_() , cfg_() @@ -329,6 +352,25 @@ void addon_manager::pre_show(window& window) connect_signal_notify_modified(type_filter, std::bind(&addon_manager::apply_filters, this, std::ref(window))); + menu_button& order_dropdown = find_widget(&window, "order_dropdown", false); + + std::vector order_dropdown_entries; + for(const auto& f : all_orders_) { + utils::string_map symbols; + + // TRANSLATORS: ascending + symbols["order"] = _("asc"); + config entry{"label", VGETTEXT(f.label.c_str(), symbols)}; + order_dropdown_entries.push_back(entry); + // TRANSLATORS: descending + symbols["order"] = _("desc"); + entry["label"] = VGETTEXT(f.label.c_str(), symbols); + order_dropdown_entries.push_back(entry); + } + + order_dropdown.set_values(order_dropdown_entries); + order_dropdown.connect_click_handler(std::bind(&addon_manager::order_addons, this, std::ref(window))); + button& url_go_button = find_widget