1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-08-13 19:54:17 +02:00

two scrolling modes demo

This commit is contained in:
SoundSSGood
2023-07-16 21:16:12 +03:00
parent 9427de6344
commit b1351d8532
7 changed files with 57 additions and 21 deletions

View File

@@ -18,10 +18,11 @@
#include "IHandlerBase.h" #include "IHandlerBase.h"
#include "../CPlayerInterface.h" #include "../CPlayerInterface.h"
#include "../../lib/mapObjects/CGHeroInstance.h"
#include "../../CCallback.h" #include "../../CCallback.h"
CArtifactsOfHeroBackpack::CArtifactsOfHeroBackpack(const Point & position, DestroyHandler destroyThisCallback) CArtifactsOfHeroBackpack::CArtifactsOfHeroBackpack(const Point & position)
{ {
OBJECT_CONSTRUCTION_CAPTURING(255 - DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255 - DISPOSE);
pos += position; pos += position;
@@ -44,13 +45,12 @@ CArtifactsOfHeroBackpack::CArtifactsOfHeroBackpack(const Point & position, Destr
} }
if(backpackCap < 0 || visibleCapasityMax < backpackCap) if(backpackCap < 0 || visibleCapasityMax < backpackCap)
{ {
auto scrollHandler = std::bind(&CArtifactsOfHeroBase::scrollBackpack, this, _1); auto scrollHandler = std::bind(&CArtifactsOfHeroBackpack::scrollBackpack, this, _1);
leftBackpackRoll = std::make_shared<CButton>(Point(-20, 0), "hsbtns3.def", CButton::tooltip(), [scrollHandler]() { scrollHandler(-1); }, EShortcut::MOVE_LEFT); leftBackpackRoll = std::make_shared<CButton>(Point(-20, 0), "hsbtns3.def", CButton::tooltip(), [=]() { scrollHandler(-HERO_BACKPACK_WINDOW_SLOT_COLUMNS); }, EShortcut::MOVE_LEFT);
rightBackpackRoll = std::make_shared<CButton>(Point(368, 318), "hsbtns5.def", CButton::tooltip(), [scrollHandler]() { scrollHandler(+1); }, EShortcut::MOVE_RIGHT); rightBackpackRoll = std::make_shared<CButton>(Point(368, 318), "hsbtns5.def", CButton::tooltip(), [=]() { scrollHandler(HERO_BACKPACK_WINDOW_SLOT_COLUMNS); }, EShortcut::MOVE_RIGHT);
leftBackpackRoll->block(true); leftBackpackRoll->block(true);
rightBackpackRoll->block(true); rightBackpackRoll->block(true);
} }
this->destroyThisCallback = destroyThisCallback;
} }
void CArtifactsOfHeroBackpack::swapArtifacts(const ArtifactLocation & srcLoc, const ArtifactLocation & dstLoc) void CArtifactsOfHeroBackpack::swapArtifacts(const ArtifactLocation & srcLoc, const ArtifactLocation & dstLoc)
@@ -64,8 +64,28 @@ void CArtifactsOfHeroBackpack::pickUpArtifact(CHeroArtPlace & artPlace)
ArtifactLocation(curHero, ArtifactPosition::TRANSITION_POS)); ArtifactLocation(curHero, ArtifactPosition::TRANSITION_POS));
} }
void CArtifactsOfHeroBackpack::destroyThis() void CArtifactsOfHeroBackpack::scrollBackpack(int offset)
{ {
if(destroyThisCallback) if(isScrollStraight)
destroyThisCallback(); {
// 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);
}
} }

View File

@@ -20,16 +20,13 @@ VCMI_LIB_NAMESPACE_END
class CArtifactsOfHeroBackpack : public CArtifactsOfHeroBase class CArtifactsOfHeroBackpack : public CArtifactsOfHeroBase
{ {
public: public:
using DestroyHandler = std::function<void()>; CArtifactsOfHeroBackpack(const Point & position);
CArtifactsOfHeroBackpack(const Point & position, DestroyHandler destroyThisCallback);
void swapArtifacts(const ArtifactLocation & srcLoc, const ArtifactLocation & dstLoc); void swapArtifacts(const ArtifactLocation & srcLoc, const ArtifactLocation & dstLoc);
void pickUpArtifact(CHeroArtPlace & artPlace); void pickUpArtifact(CHeroArtPlace & artPlace);
void destroyThis(); void scrollBackpack(int offset);
private:
DestroyHandler destroyThisCallback;
bool isScrollStraight = false;
private:
const size_t HERO_BACKPACK_WINDOW_SLOT_COLUMNS = 8; const size_t HERO_BACKPACK_WINDOW_SLOT_COLUMNS = 8;
const size_t HERO_BACKPACK_WINDOW_SLOT_LINES = 8; const size_t HERO_BACKPACK_WINDOW_SLOT_LINES = 8;
}; };

View File

@@ -116,7 +116,7 @@ void CArtifactsOfHeroBase::setHero(const CGHeroInstance * hero)
{ {
setSlotData(slot.second, slot.first, *curHero); setSlotData(slot.second, slot.first, *curHero);
} }
scrollBackpackForArtSet(0, *curHero); scrollBackpack(0);
} }
const CGHeroInstance * CArtifactsOfHeroBase::getHero() const const CGHeroInstance * CArtifactsOfHeroBase::getHero() const

View File

@@ -43,6 +43,11 @@ void CWindowWithArtifacts::addSet(CArtifactsOfHeroPtr artSet)
}, artSet); }, artSet);
} }
void CWindowWithArtifacts::addCloseCallback(CloseCallback callback)
{
closeCallback = callback;
}
const CGHeroInstance * CWindowWithArtifacts::getHeroPickedArtifact() const CGHeroInstance * CWindowWithArtifacts::getHeroPickedArtifact()
{ {
auto res = getState(); auto res = getState();
@@ -161,7 +166,10 @@ void CWindowWithArtifacts::leftClickArtPlaceHero(CArtifactsOfHeroBase & artsInst
if constexpr(std::is_same_v<decltype(artSetWeak), std::weak_ptr<CArtifactsOfHeroBackpack>>) if constexpr(std::is_same_v<decltype(artSetWeak), std::weak_ptr<CArtifactsOfHeroBackpack>>)
{ {
if(!isTransferAllowed) if(!isTransferAllowed)
artSetPtr->destroyThis(); {
if(closeCallback)
closeCallback();
}
} }
else else
{ {

View File

@@ -25,8 +25,10 @@ public:
std::weak_ptr<CArtifactsOfHeroKingdom>, std::weak_ptr<CArtifactsOfHeroKingdom>,
std::weak_ptr<CArtifactsOfHeroMain>, std::weak_ptr<CArtifactsOfHeroMain>,
std::weak_ptr<CArtifactsOfHeroBackpack>>; std::weak_ptr<CArtifactsOfHeroBackpack>>;
using CloseCallback = std::function<void()>;
void addSet(CArtifactsOfHeroPtr artSet); void addSet(CArtifactsOfHeroPtr artSet);
void addCloseCallback(CloseCallback callback);
const CGHeroInstance * getHeroPickedArtifact(); const CGHeroInstance * getHeroPickedArtifact();
const CArtifactInstance * getPickedArtifact(); const CArtifactInstance * getPickedArtifact();
void leftClickArtPlaceHero(CArtifactsOfHeroBase & artsInst, CHeroArtPlace & artPlace); void leftClickArtPlaceHero(CArtifactsOfHeroBase & artsInst, CHeroArtPlace & artPlace);
@@ -39,6 +41,7 @@ public:
private: private:
std::vector<CArtifactsOfHeroPtr> artSets; std::vector<CArtifactsOfHeroPtr> artSets;
CloseCallback closeCallback;
void updateSlots(const ArtifactPosition & slot); void updateSlots(const ArtifactPosition & slot);
std::optional<std::tuple<const CGHeroInstance*, const CArtifactInstance*>> getState(); std::optional<std::tuple<const CGHeroInstance*, const CArtifactInstance*>> getState();

View File

@@ -17,7 +17,14 @@ CHeroBackpackWindow::CHeroBackpackWindow(const CGHeroInstance * hero)
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
arts = std::make_shared<CArtifactsOfHeroBackpack>(Point(-100, -170), std::bind(&CHeroBackpackWindow::close, this)); arts = std::make_shared<CArtifactsOfHeroBackpack>(Point(-100, -170));
arts->setHero(hero); arts->setHero(hero);
addSet(arts); addSet(arts);
}
arts_straight = std::make_shared<CArtifactsOfHeroBackpack>(Point(-500, -170));
arts_straight->setHero(hero);
arts_straight->isScrollStraight = true;
addSet(arts_straight);
addCloseCallback(std::bind(&CHeroBackpackWindow::close, this));
}

View File

@@ -19,4 +19,5 @@ public:
private: private:
std::shared_ptr<CArtifactsOfHeroBackpack> arts; std::shared_ptr<CArtifactsOfHeroBackpack> arts;
}; std::shared_ptr<CArtifactsOfHeroBackpack> arts_straight;
};