1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-11-28 08:48:48 +02:00

Merge pull request #3779 from SoundSSGood/backpackWindow-art-transfer-fix

Backpack window cursor fix
This commit is contained in:
Ivan Savenko 2024-04-18 15:18:36 +03:00 committed by GitHub
commit 0824f50367
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
16 changed files with 75 additions and 41 deletions

View File

@ -25,8 +25,7 @@
#include "../../lib/networkPacks/ArtifactLocation.h"
CArtifactsOfHeroBase::CArtifactsOfHeroBase()
: curHero(nullptr),
putBackPickedArtCallback(nullptr)
: curHero(nullptr)
{
}
@ -45,13 +44,6 @@ void CArtifactsOfHeroBase::putBackPickedArtifact()
LOCPLINT->cb->swapArtifacts(ArtifactLocation(curHero->id, ArtifactPosition::TRANSITION_POS), ArtifactLocation(curHero->id, slot));
}
}
if(putBackPickedArtCallback)
putBackPickedArtCallback();
}
void CArtifactsOfHeroBase::setPutBackPickedArtifactCallback(PutBackPickedArtCallback callback)
{
putBackPickedArtCallback = callback;
}
void CArtifactsOfHeroBase::init(

View File

@ -22,7 +22,6 @@ protected:
public:
using ArtPlaceMap = std::map<ArtifactPosition, ArtPlacePtr>;
using ClickFunctor = std::function<void(CArtifactsOfHeroBase&, CArtPlace&, const Point&)>;
using PutBackPickedArtCallback = std::function<void()>;
ClickFunctor clickPressedCallback;
ClickFunctor showPopupCallback;
@ -30,7 +29,6 @@ public:
CArtifactsOfHeroBase();
virtual void putBackPickedArtifact();
virtual void setPutBackPickedArtifactCallback(PutBackPickedArtCallback callback);
virtual void clickPrassedArtPlace(CArtPlace & artPlace, const Point & cursorPosition);
virtual void showPopupArtPlace(CArtPlace & artPlace, const Point & cursorPosition);
virtual void gestureArtPlace(CArtPlace & artPlace, const Point & cursorPosition);
@ -52,7 +50,6 @@ protected:
std::vector<ArtPlacePtr> backpack;
std::shared_ptr<CButton> leftBackpackRoll;
std::shared_ptr<CButton> rightBackpackRoll;
PutBackPickedArtCallback putBackPickedArtCallback;
const std::vector<Point> slotPos =
{

View File

@ -26,8 +26,7 @@ CArtifactsOfHeroMain::CArtifactsOfHeroMain(const Point & position)
addGestureCallback(std::bind(&CArtifactsOfHeroBase::gestureArtPlace, this, _1, _2));
}
void CArtifactsOfHeroMain::deactivate()
CArtifactsOfHeroMain::~CArtifactsOfHeroMain()
{
putBackPickedArtifact();
CArtifactsOfHeroBase::deactivate();
CArtifactsOfHeroBase::putBackPickedArtifact();
}

View File

@ -21,5 +21,5 @@ class CArtifactsOfHeroMain : public CArtifactsOfHeroBase
{
public:
CArtifactsOfHeroMain(const Point & position);
void deactivate() override;
~CArtifactsOfHeroMain() override;
};

View File

@ -35,6 +35,12 @@
#include "../../CCallback.h"
CWindowWithArtifacts::CWindowWithArtifacts(const std::vector<CArtifactsOfHeroPtr> * artSets)
{
if(artSets)
this->artSets.insert(this->artSets.end(), artSets->begin(), artSets->end());
}
void CWindowWithArtifacts::addSet(CArtifactsOfHeroPtr artSet)
{
artSets.emplace_back(artSet);
@ -42,19 +48,13 @@ void CWindowWithArtifacts::addSet(CArtifactsOfHeroPtr artSet)
void CWindowWithArtifacts::addSetAndCallbacks(CArtifactsOfHeroPtr artSet)
{
CArtifactsOfHeroBase::PutBackPickedArtCallback artPutBackFunctor = []() -> void
{
CCS->curh->dragAndDropCursor(nullptr);
};
addSet(artSet);
std::visit([this, artPutBackFunctor](auto artSetWeak)
std::visit([this](auto artSetWeak)
{
auto artSet = artSetWeak.lock();
artSet->clickPressedCallback = std::bind(&CWindowWithArtifacts::clickPressedArtPlaceHero, this, _1, _2, _3);
artSet->showPopupCallback = std::bind(&CWindowWithArtifacts::showPopupArtPlaceHero, this, _1, _2, _3);
artSet->gestureCallback = std::bind(&CWindowWithArtifacts::gestureArtPlaceHero, this, _1, _2, _3);
artSet->setPutBackPickedArtifactCallback(artPutBackFunctor);
}, artSet);
}
@ -146,7 +146,7 @@ void CWindowWithArtifacts::clickPressedArtPlaceHero(CArtifactsOfHeroBase & artsI
{
if(checkSpecialArts(*art, hero, std::is_same_v<decltype(artSetWeak), std::weak_ptr<CArtifactsOfHeroAltar>> ? true : false))
{
assert(artSetPtr->getHero()->getSlotByInstance(art));
assert(artSetPtr->getHero()->getSlotByInstance(art) != ArtifactPosition::PRE_FIRST);
LOCPLINT->cb->swapArtifacts(ArtifactLocation(artSetPtr->getHero()->id, artSetPtr->getHero()->getSlotByInstance(art)),
ArtifactLocation(artSetPtr->getHero()->id, ArtifactPosition::TRANSITION_POS));
}
@ -296,17 +296,7 @@ void CWindowWithArtifacts::artifactMoved(const ArtifactLocation & srcLoc, const
const auto hero = artSetPtr->getHero();
if(pickedArtInst)
{
markPossibleSlots();
if(pickedArtInst->getTypeId() == ArtifactID::SPELL_SCROLL && pickedArtInst->getScrollSpellID().num >= 0 && settings["general"]["enableUiEnhancements"].Bool())
{
auto anim = GH.renderHandler().loadAnimation(AnimationPath::builtin("spellscr"));
anim->load(pickedArtInst->getScrollSpellID().num);
std::shared_ptr<IImage> img = anim->getImage(pickedArtInst->getScrollSpellID().num);
CCS->curh->dragAndDropCursor(img->scaleFast(Point(44, 34)));
}
else
CCS->curh->dragAndDropCursor(AnimationPath::builtin("artifact"), pickedArtInst->artType->getIconIndex());
setCursorAnimation(*pickedArtInst);
}
else
{
@ -476,3 +466,19 @@ bool CWindowWithArtifacts::checkSpecialArts(const CArtifactInstance & artInst, c
}
return true;
}
void CWindowWithArtifacts::setCursorAnimation(const CArtifactInstance & artInst)
{
markPossibleSlots();
if(artInst.isScroll() && settings["general"]["enableUiEnhancements"].Bool())
{
assert(artInst.getScrollSpellID().num >= 0);
const auto animation = GH.renderHandler().loadAnimation(AnimationPath::builtin("spellscr"));
animation->load(artInst.getScrollSpellID().num);
CCS->curh->dragAndDropCursor(animation->getImage(artInst.getScrollSpellID().num)->scaleFast(Point(44, 34)));
}
else
{
CCS->curh->dragAndDropCursor(AnimationPath::builtin("artifact"), artInst.artType->getIconIndex());
}
}

View File

@ -28,6 +28,7 @@ public:
std::weak_ptr<CArtifactsOfHeroQuickBackpack>>;
using CloseCallback = std::function<void()>;
explicit CWindowWithArtifacts(const std::vector<CArtifactsOfHeroPtr> * artSets = nullptr);
void addSet(CArtifactsOfHeroPtr artSet);
void addSetAndCallbacks(CArtifactsOfHeroPtr artSet);
void addCloseCallback(CloseCallback callback);
@ -51,4 +52,5 @@ protected:
std::optional<CArtifactsOfHeroPtr> findAOHbyRef(CArtifactsOfHeroBase & artsInst);
void markPossibleSlots();
bool checkSpecialArts(const CArtifactInstance & artInst, const CGHeroInstance * hero, bool isTrade);
void setCursorAnimation(const CArtifactInstance & artInst);
};

View File

@ -20,8 +20,9 @@
#include "render/Canvas.h"
#include "CPlayerInterface.h"
CHeroBackpackWindow::CHeroBackpackWindow(const CGHeroInstance * hero)
CHeroBackpackWindow::CHeroBackpackWindow(const CGHeroInstance * hero, const std::vector<CArtifactsOfHeroPtr> & artsSets)
: CStatusbarWindow(0)
, CWindowWithArtifacts(&artsSets)
{
OBJECT_CONSTRUCTION_CAPTURING(255 - DISPOSE);
@ -48,6 +49,13 @@ void CHeroBackpackWindow::showAll(Canvas & to)
CMessage::drawBorder(PlayerColor(LOCPLINT->playerID), to, pos.w+28, pos.h+29, pos.x-14, pos.y-15);
}
void CHeroBackpackWindow::activate()
{
if(const auto art = getPickedArtifact())
setCursorAnimation(*art);
CIntObject::activate();
}
CHeroQuickBackpackWindow::CHeroQuickBackpackWindow(const CGHeroInstance * hero, ArtifactPosition targetSlot)
: CWindowObject(0)
{

View File

@ -17,7 +17,7 @@ class CFilledTexture;
class CHeroBackpackWindow : public CStatusbarWindow, public CWindowWithArtifacts
{
public:
CHeroBackpackWindow(const CGHeroInstance * hero);
CHeroBackpackWindow(const CGHeroInstance * hero, const std::vector<CArtifactsOfHeroPtr> & artsSets);
protected:
std::shared_ptr<CArtifactsOfHeroBackpack> arts;
@ -26,6 +26,7 @@ protected:
const int windowMargin = 5;
void showAll(Canvas & to) override;
void activate() override;
};
class CHeroQuickBackpackWindow : public CWindowObject, public CWindowWithArtifacts

View File

@ -19,6 +19,7 @@
#include "../CPlayerInterface.h"
#include "../gui/CGuiHandler.h"
#include "../gui/CursorHandler.h"
#include "../gui/TextAlignment.h"
#include "../gui/Shortcut.h"
#include "../gui/WindowHandler.h"
@ -325,7 +326,7 @@ void CHeroWindow::dismissCurrent()
void CHeroWindow::createBackpackWindow()
{
GH.windows().createAndPushWindow<CHeroBackpackWindow>(curHero);
GH.windows().createAndPushWindow<CHeroBackpackWindow>(curHero, artSets);
}
void CHeroWindow::commanderWindow()
@ -359,3 +360,9 @@ bool CHeroWindow::holdsGarrison(const CArmedInstance * army)
{
return army == curHero;
}
void CHeroWindow::deactivate()
{
CCS->curh->dragAndDropCursor(nullptr);
CIntObject::deactivate();
}

View File

@ -108,6 +108,7 @@ public:
void switchHero(); //changes displayed hero
void updateGarrisons() override;
bool holdsGarrison(const CArmedInstance * army) override;
void deactivate() override;
void createBackpackWindow();
//friends

View File

@ -19,6 +19,7 @@
#include "../PlayerLocalState.h"
#include "../adventureMap/CResDataBar.h"
#include "../gui/CGuiHandler.h"
#include "../gui/CursorHandler.h"
#include "../gui/Shortcut.h"
#include "../gui/WindowHandler.h"
#include "../widgets/CComponent.h"
@ -729,6 +730,12 @@ bool CKingdHeroList::holdsGarrison(const CArmedInstance * army)
return false;
}
void CKingdHeroList::deactivate()
{
CCS->curh->dragAndDropCursor(nullptr);
CIntObject::deactivate();
}
std::shared_ptr<CIntObject> CKingdHeroList::createHeroItem(size_t index)
{
ui32 picCount = 4; // OVSLOT contains 4 images

View File

@ -344,6 +344,7 @@ public:
void updateGarrisons() override;
bool holdsGarrison(const CArmedInstance * army) override;
void deactivate() override;
};
/// Tab with all town-specific data

View File

@ -12,6 +12,7 @@
#include "CMarketWindow.h"
#include "../gui/CGuiHandler.h"
#include "../gui/CursorHandler.h"
#include "../gui/Shortcut.h"
#include "../widgets/Buttons.h"
@ -261,3 +262,9 @@ void CMarketWindow::createAltarCreatures(const IMarket * market, const CGHeroIns
initWidgetInternals(EMarketMode::CREATURE_EXP, CGI->generaltexth->zelp[568]);
updateHero();
}
void CMarketWindow::deactivate()
{
CCS->curh->dragAndDropCursor(nullptr);
CIntObject::deactivate();
}

View File

@ -25,6 +25,7 @@ public:
bool holdsGarrison(const CArmedInstance * army) override;
void artifactRemoved(const ArtifactLocation & artLoc) override;
void artifactMoved(const ArtifactLocation & srcLoc, const ArtifactLocation & destLoc, bool withRedraw) override;
void deactivate() override;
private:
void createChangeModeButtons(EMarketMode currentMode, const IMarket * market, const CGHeroInstance * hero);

View File

@ -861,9 +861,7 @@ CExchangeWindow::CExchangeWindow(ObjectInstanceID hero1, ObjectInstanceID hero2,
auto openBackpack = [this](const CGHeroInstance * hero) -> void
{
GH.windows().createAndPushWindow<CHeroBackpackWindow>(hero);
for(auto artSet : artSets)
GH.windows().topWindow<CHeroBackpackWindow>()->addSet(artSet);
GH.windows().createAndPushWindow<CHeroBackpackWindow>(hero, artSets);
};
moveAllGarrButtonLeft = std::make_shared<CButton>(Point(325, 118), AnimationPath::builtin(QUICK_EXCHANGE_MOD_PREFIX + "/armRight.DEF"), CButton::tooltip(CGI->generaltexth->qeModCommands[1]),
@ -936,6 +934,12 @@ bool CExchangeWindow::holdsGarrison(const CArmedInstance * army)
return garr->upperArmy() == army || garr->lowerArmy() == army;
}
void CExchangeWindow::deactivate()
{
CCS->curh->dragAndDropCursor(nullptr);
CIntObject::deactivate();
}
void CExchangeWindow::questlog(int whichHero)
{
CCS->curh->dragAndDropCursor(nullptr);

View File

@ -325,6 +325,7 @@ public:
void updateGarrisons() override;
bool holdsGarrison(const CArmedInstance * army) override;
void deactivate() override;
void questlog(int whichHero); //questlog button callback; whichHero: 0 - left, 1 - right