diff --git a/src/addon/state.cpp b/src/addon/state.cpp index d0ee08d721b7..f25b981a8a30 100644 --- a/src/addon/state.cpp +++ b/src/addon/state.cpp @@ -50,6 +50,9 @@ addon_tracking_info get_addon_tracking_info(const addon_info& addon) t.state = ADDON_INSTALLED; } else if(t.remote_version > t.installed_version) { t.state = ADDON_INSTALLED_UPGRADABLE; + } else if(t.remote_version == version_info()) { + // Remote version not set. + t.state = ADDON_INSTALLED_LOCAL_ONLY; } else /* if(remote_version < t.installed_version) */ { t.state = ADDON_INSTALLED_OUTDATED; } diff --git a/src/addon/state.hpp b/src/addon/state.hpp index ffaf4739d627..1ace17ffb04c 100644 --- a/src/addon/state.hpp +++ b/src/addon/state.hpp @@ -28,6 +28,8 @@ enum ADDON_STATUS { ADDON_INSTALLED_UPGRADABLE, /** Version in the server is older than local installation. */ ADDON_INSTALLED_OUTDATED, + /** No version in the server. */ + ADDON_INSTALLED_LOCAL_ONLY, /** Dependencies not satisfied. * @todo This option isn't currently implemented! */ ADDON_INSTALLED_BROKEN, diff --git a/src/gui/dialogs/addon/manager.cpp b/src/gui/dialogs/addon/manager.cpp index deb1e4c8bbe0..3903539697b9 100644 --- a/src/gui/dialogs/addon/manager.cpp +++ b/src/gui/dialogs/addon/manager.cpp @@ -425,8 +425,20 @@ void addon_manager::load_addon_list(window& window) read_addons_list(cfg_, addons_); + addons_including_publishable_ = addons_; + std::vector publishable_addons = available_addons(); + + for(std::string id : publishable_addons) { + if(addons_including_publishable_.find(id) == addons_including_publishable_.end()) { + // Add the add-on to the list. + addon_info addon; + addon.id = id; + addons_including_publishable_[id] = addon; + } + } + addon_list& list = find_widget(&window, "addons", false); - list.set_addons(addons_); + list.set_addons(addons_including_publishable_); bool has_upgradable_addons = false; for(const auto& a : addons_) { diff --git a/src/gui/dialogs/addon/manager.hpp b/src/gui/dialogs/addon/manager.hpp index bf376fd93eb8..e48f2743a53d 100644 --- a/src/gui/dialogs/addon/manager.hpp +++ b/src/gui/dialogs/addon/manager.hpp @@ -59,6 +59,7 @@ class addon_manager : public modal_dialog addons_client& client_; addons_list addons_; + addons_list addons_including_publishable_; addons_tracking_list tracking_info_; diff --git a/src/gui/widgets/addon_list.cpp b/src/gui/widgets/addon_list.cpp index ab2dfd47f0ec..258bbe46326b 100644 --- a/src/gui/widgets/addon_list.cpp +++ b/src/gui/widgets/addon_list.cpp @@ -116,149 +116,132 @@ void addon_list::set_addons(const addons_list& addons) addon_vector_.push_back(&addon); - // Note addons that can be deleted - if(tracking_info.can_publish) { - can_delete_ids_.push_back(addon.id); - } - std::map data; string_map item; item["use_markup"] = "true"; - item["label"] = addon.display_icon(); - data.emplace("icon", item); + if(!tracking_info.can_publish) { + item["label"] = addon.display_icon(); + data.emplace("icon", item); - item["label"] = addon.display_title(); - data.emplace("name", item); + item["label"] = addon.display_title(); + data.emplace("name", item); - item["label"] = describe_status(tracking_info); - data.emplace("installation_status", item); + item["label"] = describe_status(tracking_info); + data.emplace("installation_status", item); - item["label"] = addon.version.str(); - data.emplace("version", item); + item["label"] = addon.version.str(); + data.emplace("version", item); - item["label"] = addon.author; - data.emplace("author", item); + item["label"] = addon.author; + data.emplace("author", item); - item["label"] = size_display_string(addon.size); - data.emplace("size", item); + item["label"] = size_display_string(addon.size); + data.emplace("size", item); - item["label"] = std::to_string(addon.downloads); - data.emplace("downloads", item); + item["label"] = std::to_string(addon.downloads); + data.emplace("downloads", item); - item["label"] = addon.display_type(); - data.emplace("type", item); + item["label"] = addon.display_type(); + data.emplace("type", item); + } else { + item["label"] = "icons/icon-game.png~BLIT(icons/icon-addon-publish.png)"; + data.emplace("icon", item); + + const std::string publish_name = formatter() + << "" // GOOD_COLOR + << vgettext("Publish: $addon_title", { { "addon_title", addon.display_title() } }) + << ""; + + item["label"] = publish_name; + data.emplace("name", item); + } grid* row_grid = &list.add_row(data); stacked_widget& install_update_stack = find_widget(row_grid, "install_update_stack", false); - const bool is_updatable = tracking_info.state == ADDON_INSTALLED_UPGRADABLE; - const bool is_installed = tracking_info.state == ADDON_INSTALLED; + if(!tracking_info.can_publish) { + const bool is_updatable = tracking_info.state == ADDON_INSTALLED_UPGRADABLE; + const bool is_installed = tracking_info.state == ADDON_INSTALLED; + + install_update_stack.select_layer(static_cast(is_updatable)); + + if(!is_updatable) { + find_widget