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:
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
|
|
||||||
|
bool isScrollStraight = false;
|
||||||
private:
|
private:
|
||||||
DestroyHandler destroyThisCallback;
|
|
||||||
|
|
||||||
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;
|
||||||
};
|
};
|
@@ -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
|
||||||
|
@@ -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
|
||||||
{
|
{
|
||||||
|
@@ -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();
|
||||||
|
@@ -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));
|
||||||
}
|
}
|
@@ -19,4 +19,5 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<CArtifactsOfHeroBackpack> arts;
|
std::shared_ptr<CArtifactsOfHeroBackpack> arts;
|
||||||
|
std::shared_ptr<CArtifactsOfHeroBackpack> arts_straight;
|
||||||
};
|
};
|
Reference in New Issue
Block a user