1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-24 22:14:36 +02:00

Add border around selected commander "grandmaster ability" on levelup

This commit is contained in:
Dydzio 2023-08-28 23:36:45 +02:00
parent eafa9cbae1
commit dacf6c9d08
2 changed files with 30 additions and 5 deletions

View File

@ -15,6 +15,7 @@
#include "../CGameInfo.h"
#include "../CPlayerInterface.h"
#include "../render/Canvas.h"
#include "../widgets/Buttons.h"
#include "../widgets/CArtifactHolder.h"
#include "../widgets/CComponent.h"
@ -84,7 +85,6 @@ public:
{
}
std::string getName() const
{
if(commander)
@ -96,11 +96,14 @@ private:
};
CCommanderSkillIcon::CCommanderSkillIcon(std::shared_ptr<CIntObject> object_, std::function<void()> callback)
CCommanderSkillIcon::CCommanderSkillIcon(std::shared_ptr<CIntObject> object_, bool isGrandmasterAbility_, std::function<void()> callback)
: object(),
isGrandmasterAbility(isGrandmasterAbility_),
isSelected(false),
callback(callback)
{
pos = object_->pos;
this->isGrandmasterAbility = isGrandmasterAbility_;
setObject(object_);
}
@ -117,6 +120,20 @@ void CCommanderSkillIcon::setObject(std::shared_ptr<CIntObject> newObject)
void CCommanderSkillIcon::clickPressed(const Point & cursorPosition)
{
callback();
isSelected = true;
}
void CCommanderSkillIcon::deselect()
{
isSelected = false;
}
void CCommanderSkillIcon::show(Canvas &to)
{
CIntObject::show(to);
if(isGrandmasterAbility && isSelected)
to.drawBorder(pos, Colors::YELLOW, 2);
}
static std::string skillToFile(int skill, int level, bool selected)
@ -376,7 +393,7 @@ CStackWindow::CommanderMainSection::CommanderMainSection(CStackWindow * owner, i
{
Point skillPos = getSkillPos(index);
auto icon = std::make_shared<CCommanderSkillIcon>(std::make_shared<CPicture>(getSkillImage(index), skillPos.x, skillPos.y), [=]()
auto icon = std::make_shared<CCommanderSkillIcon>(std::make_shared<CPicture>(getSkillImage(index), skillPos.x, skillPos.y), false, [=]()
{
LOCPLINT->showInfoDialog(getSkillDescription(index));
});
@ -430,7 +447,7 @@ CStackWindow::CommanderMainSection::CommanderMainSection(CStackWindow * owner, i
{
const auto bonus = CGI->creh->skillRequirements[skillID-100].first;
const CStackInstance * stack = parent->info->commander;
auto icon = std::make_shared<CCommanderSkillIcon>(std::make_shared<CPicture>(stack->bonusToGraphics(bonus)), [](){});
auto icon = std::make_shared<CCommanderSkillIcon>(std::make_shared<CPicture>(stack->bonusToGraphics(bonus)), true, [](){});
icon->callback = [=]()
{
parent->setSelection(skillID, icon);
@ -897,7 +914,10 @@ void CStackWindow::setSelection(si32 newSkill, std::shared_ptr<CCommanderSkillIc
selectedIcon->setObject(std::make_shared<CPicture>(getSkillImage(oldSelection)));
if(selectedIcon)
{
selectedIcon->text = getSkillDescription(oldSelection, false); //update previously selected icon's message to existing skill level
selectedIcon->deselect();
}
selectedIcon = newIcon; // update new selection
if(newSkill < 100)

View File

@ -32,14 +32,19 @@ class CCommanderArtPlace;
class CCommanderSkillIcon : public LRClickableAreaWText //TODO: maybe bring commander skill button initialization logic inside?
{
std::shared_ptr<CIntObject> object; // passive object that will be used to determine clickable area
bool isGrandmasterAbility; // refers to WoG abilities obtainable via combining grandmaster skills (for example attack + speed unlocks shoot)
bool isSelected; // used only for programatically created border around selected "grandmaster abilities"
public:
CCommanderSkillIcon(std::shared_ptr<CIntObject> object_, std::function<void()> callback);
CCommanderSkillIcon(std::shared_ptr<CIntObject> object_, bool isGrandmasterAbility, std::function<void()> callback);
std::function<void()> callback;
void clickPressed(const Point & cursorPosition) override;
void setObject(std::shared_ptr<CIntObject> object);
void deselect(); //TODO: consider using observer pattern instead?
void show(Canvas &to) override;
};
class CStackWindow : public CWindowObject