123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 |
- /*
- * CInfoBar.h, part of VCMI engine
- *
- * Authors: listed in file AUTHORS in main folder
- *
- * License: GNU General Public License v2.0 or later
- * Full text of license available in license.txt file, in main folder
- *
- */
- #pragma once
- #include "../gui/CIntObject.h"
- #include "CConfigHandler.h"
- #include "../../lib/filesystem/ResourcePath.h"
- #include "../../lib/networkPacks/Component.h"
- VCMI_LIB_NAMESPACE_BEGIN
- class CGHeroInstance;
- class CGTownInstance;
- struct Component;
- class PlayerColor;
- VCMI_LIB_NAMESPACE_END
- class CAnimImage;
- class CShowableAnim;
- class CComponent;
- class CComponentBox;
- class CHeroTooltip;
- class CInteractableHeroTooltip;
- class CTownTooltip;
- class CInteractableTownTooltip;
- class CLabel;
- class CMultiLineLabel;
- /// Info box which shows next week/day information, hold the current date
- class CInfoBar : public CIntObject
- {
- private:
- /// Infobar actually have a fixed size
- /// Declare before to compute correct size of widgets
- static constexpr int width = 192;
- static constexpr int height = 192;
- static constexpr int offset = 4;
- //all visible information located in one object - for ease of replacing
- class CVisibleInfo : public CIntObject
- {
- public:
- static constexpr int offset_x = 8;
- static constexpr int offset_y = 12;
- void show(Canvas & to) override;
- protected:
- std::shared_ptr<CPicture> background;
- std::list<std::shared_ptr<CIntObject>> forceRefresh;
- CVisibleInfo();
- };
- static constexpr int data_width = width - 2 * CVisibleInfo::offset_x;
- static constexpr int data_height = height - 2 * CVisibleInfo::offset_y;
- class EmptyVisibleInfo : public CVisibleInfo
- {
- public:
- EmptyVisibleInfo();
- };
- class VisibleHeroInfo : public CVisibleInfo
- {
- std::shared_ptr<CIntObject> heroTooltip; //should have CHeroTooltip or CInteractableHeroTooltip;
- public:
- VisibleHeroInfo(const CGHeroInstance * hero);
- };
- class VisibleTownInfo : public CVisibleInfo
- {
- std::shared_ptr<CIntObject> townTooltip; //should have CTownTooltip or CInteractableTownTooltip;
- public:
- VisibleTownInfo(const CGTownInstance * town);
- };
- class VisibleDateInfo : public CVisibleInfo
- {
- std::shared_ptr<CShowableAnim> animation;
- std::shared_ptr<CLabel> label;
- AnimationPath getNewDayName();
- public:
- VisibleDateInfo();
- };
- class VisibleEnemyTurnInfo : public CVisibleInfo
- {
- std::shared_ptr<CAnimImage> banner;
- std::shared_ptr<CShowableAnim> glass;
- std::shared_ptr<CShowableAnim> sand;
- public:
- VisibleEnemyTurnInfo(PlayerColor player);
- };
- class VisibleGameStatusInfo : public CVisibleInfo
- {
- std::shared_ptr<CLabel> allyLabel;
- std::shared_ptr<CLabel> enemyLabel;
- std::vector<std::shared_ptr<CAnimImage>> flags;
- std::vector<std::shared_ptr<CAnimImage>> hallIcons;
- std::vector<std::shared_ptr<CLabel>> hallLabels;
- public:
- VisibleGameStatusInfo();
- };
- class VisibleComponentInfo : public CVisibleInfo
- {
- std::shared_ptr<CComponentBox> comps;
- std::shared_ptr<CMultiLineLabel> text;
- public:
- struct Cache
- {
- std::vector<Component> compsToDisplay;
- std::string message;
- int textH;
- bool tiny;
- Cache(std::vector<Component> comps, std::string msg, int textH, bool tiny):
- compsToDisplay(std::move(comps)),
- message(std::move(msg)),
- textH(textH),
- tiny(tiny)
- {}
- };
- VisibleComponentInfo(const Cache & c): VisibleComponentInfo(c.compsToDisplay, c.message, c.textH, c.tiny) {}
- VisibleComponentInfo(const std::vector<Component> & compsToDisplay, std::string message, int textH, bool tiny);
- };
- enum class EState
- {
- EMPTY, HERO, TOWN, DATE, GAME, AITURN, COMPONENT
- };
- std::shared_ptr<CVisibleInfo> visibleInfo;
- EState state;
- uint32_t timerCounter;
- bool shouldPopAll = false;
- SettingsListener listener;
- std::queue<std::pair<VisibleComponentInfo::Cache, int>> componentsQueue;
- //private helper for showing components
- void showComponents(const std::vector<Component> & comps, std::string message, int textH, bool tiny, int timer);
- void pushComponents(const std::vector<Component> & comps, std::string message, int textH, bool tiny, int timer);
- void prepareComponents(const std::vector<Component> & comps, std::string message, int timer);
- void popComponents(bool remove = false);
- //removes all information about current state, deactivates timer (if any)
- void reset();
- void tick(uint32_t msPassed) override;
- void clickReleased(const Point & cursorPosition, bool lastActivated) override;
- void showPopupWindow(const Point & cursorPosition) override;
- void hover(bool on) override;
- void playNewDaySound();
- void setTimer(uint32_t msToTrigger);
- public:
- CInfoBar(const Rect & pos);
- CInfoBar(const Point & pos);
- /// show new day/week animation
- void showDate();
- /// show components for 3 seconds. Used to display picked up resources. Can display up to 8 components
- void pushComponents(const std::vector<Component> & comps, std::string message, int timer = 3000);
- /// Remove all queued components
- void popAll();
- /// Request infobar to pop all after next InfoWindow arrives.
- void requestPopAll();
- /// print enemy turn progress
- void startEnemyTurn(PlayerColor color);
- /// reset to default view - selected object
- void showSelection();
- /// show hero\town information
- void showHeroSelection(const CGHeroInstance * hero);
- void showTownSelection(const CGTownInstance * town);
- /// for 3 seconds shows amount of town halls and players status
- void showGameStatus();
- /// check if infobar is showed something about pickups
- bool showingComponents();
- /// event handler for custom listening on game setting change
- void OnInfoBarCreatureManagementChanged();
- };
|