diff --git a/client/widgets/CArtifactsOfHeroBackpack.cpp b/client/widgets/CArtifactsOfHeroBackpack.cpp index 48a8824a4..983a5b57d 100644 --- a/client/widgets/CArtifactsOfHeroBackpack.cpp +++ b/client/widgets/CArtifactsOfHeroBackpack.cpp @@ -18,10 +18,11 @@ #include "IHandlerBase.h" #include "../CPlayerInterface.h" +#include "../../lib/mapObjects/CGHeroInstance.h" #include "../../CCallback.h" -CArtifactsOfHeroBackpack::CArtifactsOfHeroBackpack(const Point & position, DestroyHandler destroyThisCallback) +CArtifactsOfHeroBackpack::CArtifactsOfHeroBackpack(const Point & position) { OBJECT_CONSTRUCTION_CAPTURING(255 - DISPOSE); pos += position; @@ -44,13 +45,12 @@ CArtifactsOfHeroBackpack::CArtifactsOfHeroBackpack(const Point & position, Destr } if(backpackCap < 0 || visibleCapasityMax < backpackCap) { - auto scrollHandler = std::bind(&CArtifactsOfHeroBase::scrollBackpack, this, _1); - leftBackpackRoll = std::make_shared(Point(-20, 0), "hsbtns3.def", CButton::tooltip(), [scrollHandler]() { scrollHandler(-1); }, EShortcut::MOVE_LEFT); - rightBackpackRoll = std::make_shared(Point(368, 318), "hsbtns5.def", CButton::tooltip(), [scrollHandler]() { scrollHandler(+1); }, EShortcut::MOVE_RIGHT); + auto scrollHandler = std::bind(&CArtifactsOfHeroBackpack::scrollBackpack, this, _1); + leftBackpackRoll = std::make_shared(Point(-20, 0), "hsbtns3.def", CButton::tooltip(), [=]() { scrollHandler(-HERO_BACKPACK_WINDOW_SLOT_COLUMNS); }, EShortcut::MOVE_LEFT); + rightBackpackRoll = std::make_shared(Point(368, 318), "hsbtns5.def", CButton::tooltip(), [=]() { scrollHandler(HERO_BACKPACK_WINDOW_SLOT_COLUMNS); }, EShortcut::MOVE_RIGHT); leftBackpackRoll->block(true); rightBackpackRoll->block(true); } - this->destroyThisCallback = destroyThisCallback; } void CArtifactsOfHeroBackpack::swapArtifacts(const ArtifactLocation & srcLoc, const ArtifactLocation & dstLoc) @@ -64,8 +64,28 @@ void CArtifactsOfHeroBackpack::pickUpArtifact(CHeroArtPlace & artPlace) ArtifactLocation(curHero, ArtifactPosition::TRANSITION_POS)); } -void CArtifactsOfHeroBackpack::destroyThis() +void CArtifactsOfHeroBackpack::scrollBackpack(int offset) { - if(destroyThisCallback) - destroyThisCallback(); + if(isScrollStraight) + { + // offset==-1 => to up; offset==1 => to down + backpackPos += offset; + auto slot = ArtifactPosition(GameConstants::BACKPACK_START + backpackPos); + for(auto artPlace : backpack) + { + setSlotData(artPlace, slot, *curHero); + slot = slot + 1; + } + + // Blocking scrolling if there is not enough artifacts to scroll + if(leftBackpackRoll) + leftBackpackRoll->block(backpackPos <= 0); + if(rightBackpackRoll) + rightBackpackRoll->block(backpackPos + backpack.size() >= curHero->artifactsInBackpack.size()); + redraw(); + } + else + { + CArtifactsOfHeroBase::scrollBackpack(offset); + } } diff --git a/client/widgets/CArtifactsOfHeroBackpack.h b/client/widgets/CArtifactsOfHeroBackpack.h index 47131b751..bc8c51cc8 100644 --- a/client/widgets/CArtifactsOfHeroBackpack.h +++ b/client/widgets/CArtifactsOfHeroBackpack.h @@ -20,16 +20,13 @@ VCMI_LIB_NAMESPACE_END class CArtifactsOfHeroBackpack : public CArtifactsOfHeroBase { public: - using DestroyHandler = std::function; - - CArtifactsOfHeroBackpack(const Point & position, DestroyHandler destroyThisCallback); + CArtifactsOfHeroBackpack(const Point & position); void swapArtifacts(const ArtifactLocation & srcLoc, const ArtifactLocation & dstLoc); void pickUpArtifact(CHeroArtPlace & artPlace); - void destroyThis(); - -private: - DestroyHandler destroyThisCallback; + void scrollBackpack(int offset); + bool isScrollStraight = false; +private: const size_t HERO_BACKPACK_WINDOW_SLOT_COLUMNS = 8; const size_t HERO_BACKPACK_WINDOW_SLOT_LINES = 8; -}; \ No newline at end of file +}; diff --git a/client/widgets/CArtifactsOfHeroBase.cpp b/client/widgets/CArtifactsOfHeroBase.cpp index 2e629b8b8..cbd108267 100644 --- a/client/widgets/CArtifactsOfHeroBase.cpp +++ b/client/widgets/CArtifactsOfHeroBase.cpp @@ -116,7 +116,7 @@ void CArtifactsOfHeroBase::setHero(const CGHeroInstance * hero) { setSlotData(slot.second, slot.first, *curHero); } - scrollBackpackForArtSet(0, *curHero); + scrollBackpack(0); } const CGHeroInstance * CArtifactsOfHeroBase::getHero() const diff --git a/client/widgets/CWindowWithArtifacts.cpp b/client/widgets/CWindowWithArtifacts.cpp index 840bab28e..5bd2a00a3 100644 --- a/client/widgets/CWindowWithArtifacts.cpp +++ b/client/widgets/CWindowWithArtifacts.cpp @@ -43,6 +43,11 @@ void CWindowWithArtifacts::addSet(CArtifactsOfHeroPtr artSet) }, artSet); } +void CWindowWithArtifacts::addCloseCallback(CloseCallback callback) +{ + closeCallback = callback; +} + const CGHeroInstance * CWindowWithArtifacts::getHeroPickedArtifact() { auto res = getState(); @@ -161,7 +166,10 @@ void CWindowWithArtifacts::leftClickArtPlaceHero(CArtifactsOfHeroBase & artsInst if constexpr(std::is_same_v>) { if(!isTransferAllowed) - artSetPtr->destroyThis(); + { + if(closeCallback) + closeCallback(); + } } else { diff --git a/client/widgets/CWindowWithArtifacts.h b/client/widgets/CWindowWithArtifacts.h index 8c463d9ac..c5180c688 100644 --- a/client/widgets/CWindowWithArtifacts.h +++ b/client/widgets/CWindowWithArtifacts.h @@ -25,8 +25,10 @@ public: std::weak_ptr, std::weak_ptr, std::weak_ptr>; + using CloseCallback = std::function; void addSet(CArtifactsOfHeroPtr artSet); + void addCloseCallback(CloseCallback callback); const CGHeroInstance * getHeroPickedArtifact(); const CArtifactInstance * getPickedArtifact(); void leftClickArtPlaceHero(CArtifactsOfHeroBase & artsInst, CHeroArtPlace & artPlace); @@ -39,6 +41,7 @@ public: private: std::vector artSets; + CloseCallback closeCallback; void updateSlots(const ArtifactPosition & slot); std::optional> getState(); diff --git a/client/windows/CHeroBackpackWindow.cpp b/client/windows/CHeroBackpackWindow.cpp index 56b1b6b28..e99ee2b41 100644 --- a/client/windows/CHeroBackpackWindow.cpp +++ b/client/windows/CHeroBackpackWindow.cpp @@ -17,7 +17,14 @@ CHeroBackpackWindow::CHeroBackpackWindow(const CGHeroInstance * hero) { OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); - arts = std::make_shared(Point(-100, -170), std::bind(&CHeroBackpackWindow::close, this)); + arts = std::make_shared(Point(-100, -170)); arts->setHero(hero); addSet(arts); -} \ No newline at end of file + + arts_straight = std::make_shared(Point(-500, -170)); + arts_straight->setHero(hero); + arts_straight->isScrollStraight = true; + addSet(arts_straight); + + addCloseCallback(std::bind(&CHeroBackpackWindow::close, this)); +} diff --git a/client/windows/CHeroBackpackWindow.h b/client/windows/CHeroBackpackWindow.h index 5e9882340..42208622a 100644 --- a/client/windows/CHeroBackpackWindow.h +++ b/client/windows/CHeroBackpackWindow.h @@ -19,4 +19,5 @@ public: private: std::shared_ptr arts; -}; \ No newline at end of file + std::shared_ptr arts_straight; +};