Add badge to indicate new addons for downloading

This commit is contained in:
Benau 2020-11-28 00:57:40 +08:00
parent ae077290bb
commit 273c157b93
5 changed files with 27 additions and 4 deletions

View File

@ -59,6 +59,7 @@ AddonsManager* addons_manager = 0;
AddonsManager::AddonsManager() : m_addons_list(std::vector<Addon>() ), AddonsManager::AddonsManager() : m_addons_list(std::vector<Addon>() ),
m_state(STATE_INIT) m_state(STATE_INIT)
{ {
m_has_new_addons = false;
m_downloaded_icons = false; m_downloaded_icons = false;
// Clean .part file which may be left behind // Clean .part file which may be left behind
std::string addons_part = file_manager->getAddonsFile("addons.xml.part"); std::string addons_part = file_manager->getAddonsFile("addons.xml.part");
@ -96,6 +97,7 @@ AddonsManager::~AddonsManager()
void AddonsManager::init(const XMLNode *xml, void AddonsManager::init(const XMLNode *xml,
bool force_refresh) bool force_refresh)
{ {
m_has_new_addons = false;
std::string addon_list_url(""); std::string addon_list_url("");
StkTime::TimeType mtime(0); StkTime::TimeType mtime(0);
const XMLNode *include = xml->getNode("include"); const XMLNode *include = xml->getNode("include");
@ -125,6 +127,7 @@ void AddonsManager::init(const XMLNode *xml,
&& UserConfigParams::m_internet_status == RequestManager::IPERM_ALLOWED && UserConfigParams::m_internet_status == RequestManager::IPERM_ALLOWED
&& !file_manager->fileExists(filename_part); && !file_manager->fileExists(filename_part);
int timestamp_check = -1;
if (download) if (download)
{ {
Log::info("addons", "Downloading updated addons.xml."); Log::info("addons", "Downloading updated addons.xml.");
@ -137,6 +140,7 @@ void AddonsManager::init(const XMLNode *xml,
download_request->getDownloadErrorMessage()); download_request->getDownloadErrorMessage());
return; return;
} }
timestamp_check = UserConfigParams::m_addons_last_updated;
UserConfigParams::m_addons_last_updated=StkTime::getTimeSinceEpoch(); UserConfigParams::m_addons_last_updated=StkTime::getTimeSinceEpoch();
} }
else else
@ -153,7 +157,7 @@ void AddonsManager::init(const XMLNode *xml,
} }
if (!xml_addons) if (!xml_addons)
return; return;
addons_manager->initAddons(xml_addons); // will free xml_addons addons_manager->initAddons(xml_addons, timestamp_check); // will free xml_addons
if(UserConfigParams::logAddons()) if(UserConfigParams::logAddons())
Log::info("addons", "Addons manager list downloaded."); Log::info("addons", "Addons manager list downloaded.");
} // init } // init
@ -165,8 +169,9 @@ void AddonsManager::init(const XMLNode *xml,
* without blocking the GUI. This function will update the state variable. * without blocking the GUI. This function will update the state variable.
* \param xml The xml tree of addons.xml with information about all available * \param xml The xml tree of addons.xml with information about all available
* addons. * addons.
* \param timestamp_check To determine m_has_new_addons.
*/ */
void AddonsManager::initAddons(const XMLNode *xml) void AddonsManager::initAddons(const XMLNode *xml, int timestamp_check)
{ {
m_addons_list.lock(); m_addons_list.lock();
// Clear the list in case that a reinit is being done. // Clear the list in case that a reinit is being done.
@ -185,6 +190,8 @@ void AddonsManager::initAddons(const XMLNode *xml)
node->getName()=="arena" ) node->getName()=="arena" )
{ {
Addon addon(*node); Addon addon(*node);
if (timestamp_check != -1 && addon.getDate() > timestamp_check)
m_has_new_addons = true;
int index = getAddonIndex(addon.getId()); int index = getAddonIndex(addon.getId());
int stk_version=0; int stk_version=0;

View File

@ -21,6 +21,7 @@
#ifndef SERVER_ONLY #ifndef SERVER_ONLY
#include <atomic>
#include <string> #include <string>
#include <map> #include <map>
#include <memory> #include <memory>
@ -60,13 +61,15 @@ private:
* background. */ * background. */
bool m_downloaded_icons; bool m_downloaded_icons;
std::atomic_bool m_has_new_addons;
void loadInstalledAddons(); void loadInstalledAddons();
public: public:
AddonsManager(); AddonsManager();
~AddonsManager(); ~AddonsManager();
void init(const XMLNode *xml, bool force_refresh); void init(const XMLNode *xml, bool force_refresh);
void initAddons(const XMLNode *xml); void initAddons(const XMLNode *xml, int timestamp_check = -1);
void checkInstalledAddons(); void checkInstalledAddons();
Addon* getAddon(const std::string &id); Addon* getAddon(const std::string &id);
int getAddonIndex(const std::string &id) const; int getAddonIndex(const std::string &id) const;
@ -98,6 +101,8 @@ public:
const Addon& getAddon(unsigned int i) { return m_addons_list.getData()[i];} const Addon& getAddon(unsigned int i) { return m_addons_list.getData()[i];}
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
bool hasDownloadedIcons() const { return m_downloaded_icons; } bool hasDownloadedIcons() const { return m_downloaded_icons; }
// ------------------------------------------------------------------------
bool hasNewAddons() const { return m_has_new_addons; }
}; // class AddonsManager }; // class AddonsManager
extern AddonsManager *addons_manager; extern AddonsManager *addons_manager;

View File

@ -2427,6 +2427,13 @@ void Skin::drawBadgeOn(const Widget* widget, const core::recti& rect)
"anchor-icon.png"); "anchor-icon.png");
doDrawBadge(texture, rect, max_icon_size, false); doDrawBadge(texture, rect, max_icon_size, false);
} }
if (widget->m_badges & DOWN_BADGE)
{
float max_icon_size = 0.43f;
video::ITexture* texture = irr_driver->getTexture(FileManager::GUI_ICON,
"down.png");
doDrawBadge(texture, rect, max_icon_size, false);
}
} // drawBadgeOn } // drawBadgeOn
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------

View File

@ -78,7 +78,9 @@ namespace GUIEngine
/** A zipper badge to indicate that this player receives a boost */ /** A zipper badge to indicate that this player receives a boost */
ZIPPER_BADGE = 128, ZIPPER_BADGE = 128,
/** A anchor badge to indicate that this player receives a handicap */ /** A anchor badge to indicate that this player receives a handicap */
ANCHOR_BADGE = 256 ANCHOR_BADGE = 256,
/** A down arrow badge to indicate new addons for downloading */
DOWN_BADGE = 512
}; };

View File

@ -208,6 +208,8 @@ void MainMenuScreen::onUpdate(float delta)
{ {
addons_icon->setActive(true); addons_icon->setActive(true);
addons_icon->resetAllBadges(); addons_icon->resetAllBadges();
if (addons_manager->hasNewAddons())
addons_icon->setBadge(DOWN_BADGE);
} }
// maybe add a new badge when not allowed to access the net // maybe add a new badge when not allowed to access the net
} }