瀏覽代碼

two scrolling modes demo

SoundSSGood 2 年之前
父節點
當前提交
b1351d8532

+ 28 - 8
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<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);
+	}
 }

+ 5 - 8
client/widgets/CArtifactsOfHeroBackpack.h

@@ -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;
-};
+};

+ 1 - 1
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

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

+ 3 - 0
client/widgets/CWindowWithArtifacts.h

@@ -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();

+ 9 - 2
client/windows/CHeroBackpackWindow.cpp

@@ -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));
+}

+ 2 - 1
client/windows/CHeroBackpackWindow.h

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