diff --git a/src/gui/dialogs/addon/manager.cpp b/src/gui/dialogs/addon/manager.cpp index a4d234064b5..02157ef4bfc 100644 --- a/src/gui/dialogs/addon/manager.cpp +++ b/src/gui/dialogs/addon/manager.cpp @@ -335,6 +335,8 @@ void addon_manager::pre_show(window& window) this, std::placeholders::_1, std::ref(window))); list.set_uninstall_function(std::bind(&addon_manager::uninstall_addon, this, std::placeholders::_1, std::ref(window))); + list.set_update_function(std::bind(&addon_manager::update_addon, + this, std::placeholders::_1, std::ref(window))); list.set_publish_function(std::bind(&addon_manager::publish_addon, this, std::placeholders::_1, std::ref(window))); @@ -589,6 +591,24 @@ void addon_manager::uninstall_addon(const addon_info& addon, window& window) } } +void addon_manager::update_addon(const addon_info& addon, window& window) +{ + addon_list& addons = find_widget(&window, "addons", false); + const std::string id = addon.id; + + addons_client::install_result result = client_.install_addon_with_checks(addons_, addon); + + if(result.outcome != addons_client::install_outcome::abort) { + need_wml_cache_refresh_ = true; + + load_addon_list(window); + + // Reselect the add-on. + addons.select_addon(id); + on_addon_select(window); + } +} + void addon_manager::update_all_addons(window& window) { for(const auto& a : addons_) { diff --git a/src/gui/dialogs/addon/manager.hpp b/src/gui/dialogs/addon/manager.hpp index 768739d08d2..3316dbde8a0 100644 --- a/src/gui/dialogs/addon/manager.hpp +++ b/src/gui/dialogs/addon/manager.hpp @@ -89,6 +89,12 @@ private: execute_action_on_selected_addon<&addon_manager::uninstall_addon>(window); } + void update_addon(const addon_info& addon, window& window); + void update_selected_addon(window& window) + { + execute_action_on_selected_addon<&addon_manager::update_addon>(window); + } + void publish_addon(const addon_info& addon, window& window); void publish_selected_addon(window& window) { diff --git a/src/gui/widgets/addon_list.cpp b/src/gui/widgets/addon_list.cpp index cc5f5cb9220..9a87f98e855 100644 --- a/src/gui/widgets/addon_list.cpp +++ b/src/gui/widgets/addon_list.cpp @@ -172,7 +172,8 @@ void addon_list::set_addons(const addons_list& addons) if(!tracking_info.can_publish) { const bool is_updatable = tracking_info.state == ADDON_INSTALLED_UPGRADABLE; - const bool is_installed = tracking_info.state == ADDON_INSTALLED; + const bool is_installed = + tracking_info.state == ADDON_INSTALLED || tracking_info.state == ADDON_INSTALLED_UPGRADABLE; install_update_stack.select_layer(static_cast(is_updatable)); @@ -188,6 +189,18 @@ void addon_list::set_addons(const addons_list& addons) halt = true; }); } + } else { + find_widget