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 "../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<CButton>(Point(-20, 0), "hsbtns3.def", CButton::tooltip(), [scrollHandler]() { scrollHandler(-1); }, EShortcut::MOVE_LEFT);
rightBackpackRoll = std::make_shared<CButton>(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<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(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);
}
}

View File

@@ -20,16 +20,13 @@ VCMI_LIB_NAMESPACE_END
class CArtifactsOfHeroBackpack : public CArtifactsOfHeroBase
{
public:
using DestroyHandler = std::function<void()>;
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;
};
};

View File

@@ -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

View File

@@ -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<decltype(artSetWeak), std::weak_ptr<CArtifactsOfHeroBackpack>>)
{
if(!isTransferAllowed)
artSetPtr->destroyThis();
{
if(closeCallback)
closeCallback();
}
}
else
{

View File

@@ -25,8 +25,10 @@ public:
std::weak_ptr<CArtifactsOfHeroKingdom>,
std::weak_ptr<CArtifactsOfHeroMain>,
std::weak_ptr<CArtifactsOfHeroBackpack>>;
using CloseCallback = std::function<void()>;
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<CArtifactsOfHeroPtr> artSets;
CloseCallback closeCallback;
void updateSlots(const ArtifactPosition & slot);
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);
arts = std::make_shared<CArtifactsOfHeroBackpack>(Point(-100, -170), std::bind(&CHeroBackpackWindow::close, this));
arts = std::make_shared<CArtifactsOfHeroBackpack>(Point(-100, -170));
arts->setHero(hero);
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:
std::shared_ptr<CArtifactsOfHeroBackpack> arts;
};
std::shared_ptr<CArtifactsOfHeroBackpack> arts_straight;
};