/* * CSpellWindow.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 "CWindowObject.h" #include "../widgets/IVideoHolder.h" VCMI_LIB_NAMESPACE_BEGIN class CGHeroInstance; class CSpell; VCMI_LIB_NAMESPACE_END class IImage; class CAnimImage; class CPicture; class CLabel; class CGStatusBar; class CPlayerInterface; class CSpellWindow; class CTextInput; class TransparentFilledRectangle; class CToggleButton; class VideoWidgetOnce; /// The spell window class CSpellWindow : public CWindowObject, public IVideoHolder { class SpellArea : public CIntObject { const CSpell * mySpell; int schoolLevel; //range: 0 none, 3 - expert CSpellWindow * owner; std::shared_ptr image; std::shared_ptr schoolBorder; std::shared_ptr name; std::shared_ptr level; std::shared_ptr cost; public: SpellArea(Rect pos, CSpellWindow * owner); ~SpellArea(); void setSpell(const CSpell * spell); void clickPressed(const Point & cursorPosition) override; void showPopupWindow(const Point & cursorPosition) override; void hover(bool on) override; }; class InteractiveArea : public CIntObject { std::function onLeft; CSpellWindow * owner; std::string hoverText; std::string helpText; public: void clickPressed(const Point & cursorPosition) override; void showPopupWindow(const Point & cursorPosition) override; void hover(bool on) override; InteractiveArea(const Rect &myRect, const std::function & funcL, int helpTextId, CSpellWindow * _owner); InteractiveArea(const Rect &myRect, const std::function & funcL, std::string textId, CSpellWindow * _owner); }; std::shared_ptr leftCorner; std::shared_ptr rightCorner; std::shared_ptr schoolTab; std::vector> schoolTabCustom; std::shared_ptr schoolTabAnyDisabled; std::shared_ptr schoolPicture; std::shared_ptr schoolPictureCustom; std::array, 24> spellAreas; std::shared_ptr mana; std::shared_ptr statusBar; std::vector> interactiveAreas; std::shared_ptr searchBox; std::shared_ptr searchBoxRectangle; std::shared_ptr searchBoxDescription; std::shared_ptr showAllSpells; std::shared_ptr showAllSpellsDescription; std::shared_ptr video; bool isBigSpellbook; int spellsPerPage; int offL; int offR; int offRM; int offT; int offB; std::map sitesPerTabAdv; std::map sitesPerTabBattle; const int MAX_CUSTOM_SPELL_SCHOOLS = 5; const int MAX_CUSTOM_SPELL_SCHOOLS_BIG = 6; std::vector customSpellSchools; bool battleSpellsOnly; //if true, only battle spells are displayed; if false, only adventure map spells are displayed SpellSchool selectedTab; int currentPage; //changes when corners are clicked std::vector mySpells; //all spels in this spellbook const CGHeroInstance * myHero; //hero whose spells are presented CPlayerInterface * myInt; void processSpells(); void searchInput(); void computeSpellsPerArea(); //recalculates spellAreas::mySpell void setSchoolImages(SpellSchool school); void setCurrentPage(int value); void turnPageLeft(); void turnPageRight(); void onVideoPlaybackFinished() override; bool openOnBattleSpells; std::function onSpellSelect; //external processing of selected spell public: CSpellWindow(const CGHeroInstance * _myHero, CPlayerInterface * _myInt, bool openOnBattleSpells = true, const std::function & onSpellSelect = nullptr); ~CSpellWindow(); void fexitb(); void fadvSpellsb(); void fbattleSpellsb(); void toggleSearchBoxFocus(); void fmanaPtsb(); void fLcornerb(); void fRcornerb(); void selectSchool(SpellSchool school); int pagesWithinCurrentTab(); void keyPressed(EShortcut key) override; void show(Canvas & to) override; };