void AddonMenu::install_addon(const Addon& addon) { auto addon_id = addon.get_id(); TransferStatusPtr status = m_addon_manager.request_install_addon(addon_id); std::unique_ptr<DownloadDialog> dialog(new DownloadDialog(status, false, m_auto_install_langpack)); dialog->set_title(str(boost::format( _("Downloading %s") ) % generate_menu_item_text(addon))); status->then([this, addon_id](bool success) { if (success) { try { m_addon_manager.enable_addon(addon_id); if(m_auto_install_langpack) { MenuManager::instance().set_dialog({}); MenuManager::instance().clear_menu_stack(); return; } } catch(const std::exception& err) { log_warning << "Enabling add-on failed: " << err.what() << std::endl; } refresh(); } else { if(m_auto_install_langpack) { MenuManager::instance().set_dialog({}); MenuManager::instance().clear_menu_stack(); } } }); MenuManager::instance().set_dialog(std::move(dialog)); }
void AddonMenu::rebuild_menu() { clear(); add_label(_("Add-ons")); add_hl(); if (m_installed_addons.empty()) { if (!m_repository_addons.empty()) { add_inactive(MNID_NOTHING_NEW, _("No Addons installed")); } else { add_inactive(MNID_NOTHING_NEW, _("No Addons found")); } } else { int idx = 0; for (const auto& addon_id : m_installed_addons) { const Addon& addon = m_addon_manager.get_installed_addon(addon_id); std::string text = generate_menu_item_text(addon); add_toggle(MAKE_INSTALLED_MENU_ID(idx), text, addon.is_enabled()); idx += 1; } } add_hl(); { bool have_new_stuff = false; int idx = 0; for (const auto& addon_id : m_repository_addons) { const Addon& addon = m_addon_manager.get_repository_addon(addon_id); try { // addon is already installed, so check if they are the same Addon& installed_addon = m_addon_manager.get_installed_addon(addon_id); if (installed_addon.get_md5() == addon.get_md5() || installed_addon.get_version() > addon.get_version()) { log_debug << "ignoring already installed addon " << installed_addon.get_id() << std::endl; } else { log_debug << installed_addon.get_id() << " is installed, but updated: '" << installed_addon.get_md5() << "' vs '" << addon.get_md5() << "' '" << installed_addon.get_version() << "' vs '" << addon.get_version() << "'" << std::endl; std::string text = generate_menu_item_text(addon); add_entry(MAKE_REPOSITORY_MENU_ID(idx), str(boost::format( _("Install %s *NEW*") ) % text)); have_new_stuff = true; } } catch(const std::exception& err) { // addon is not installed std::string text = generate_menu_item_text(addon); add_entry(MAKE_REPOSITORY_MENU_ID(idx), str(boost::format( _("Install %s") ) % text)); have_new_stuff = true; } idx += 1; } if (!have_new_stuff && m_addon_manager.has_been_updated()) { add_inactive(MNID_NOTHING_NEW, _("No new Addons found")); } } if (!m_addon_manager.has_online_support()) { add_inactive(MNID_CHECK_ONLINE, std::string(_("Check Online (disabled)"))); } else { add_entry(MNID_CHECK_ONLINE, std::string(_("Check Online"))); } add_hl(); add_back(_("Back")); }
void AddonMenu::menu_action(MenuItem* item) { if (item->id == MNID_CHECK_ONLINE) // check if "Check Online" was chosen { try { TransferStatusPtr status = m_addon_manager.request_check_online(); status->then( [this](bool success) { if (success) { refresh(); } }); std::unique_ptr<DownloadDialog> dialog(new DownloadDialog(status)); dialog->set_title(_("Downloading Add-On Repository Index")); MenuManager::instance().set_dialog(std::move(dialog)); } catch (std::exception& e) { log_warning << "Check for available Add-ons failed: " << e.what() << std::endl; } } else if (MNID_ADDON_LIST_START <= item->id) { if (IS_INSTALLED_MENU_ID(item->id)) { int idx = UNPACK_INSTALLED_MENU_ID(item->id); if (0 <= idx && idx < static_cast<int>(m_installed_addons.size())) { const Addon& addon = m_addon_manager.get_installed_addon(m_installed_addons[idx]); if(addon.is_enabled()) { m_addon_manager.disable_addon(addon.get_id()); set_toggled(item->id, addon.is_enabled()); } else { m_addon_manager.enable_addon(addon.get_id()); set_toggled(item->id, addon.is_enabled()); } } } else if (IS_REPOSITORY_MENU_ID(item->id)) { int idx = UNPACK_REPOSITORY_MENU_ID(item->id); if (0 <= idx && idx < static_cast<int>(m_repository_addons.size())) { const Addon& addon = m_addon_manager.get_repository_addon(m_repository_addons[idx]); auto addon_id = addon.get_id(); TransferStatusPtr status = m_addon_manager.request_install_addon(addon_id); status->then( [this, addon_id](bool success) { if (success) { try { m_addon_manager.enable_addon(addon_id); } catch(const std::exception& err) { log_warning << "Enabling addon failed: " << err.what() << std::endl; } refresh(); } }); std::unique_ptr<DownloadDialog> dialog(new DownloadDialog(status)); dialog->set_title(str(boost::format( _("Downloading %s") ) % generate_menu_item_text(addon))); MenuManager::instance().set_dialog(std::move(dialog)); } } } else { log_warning << "Unknown menu item clicked: " << item->id << std::endl; } }