mirror of
				https://github.com/vcmi/vcmi.git
				synced 2025-10-31 00:07:39 +02:00 
			
		
		
		
	two scrolling modes demo
This commit is contained in:
		| @@ -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); | ||||
| 	} | ||||
| } | ||||
|   | ||||
| @@ -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(); | ||||
| 	void scrollBackpack(int offset); | ||||
|  | ||||
| 	bool isScrollStraight = false; | ||||
| private: | ||||
| 	DestroyHandler destroyThisCallback; | ||||
|  | ||||
| 	const size_t HERO_BACKPACK_WINDOW_SLOT_COLUMNS = 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); | ||||
| 	} | ||||
| 	scrollBackpackForArtSet(0, *curHero); | ||||
| 	scrollBackpack(0); | ||||
| } | ||||
|  | ||||
| const CGHeroInstance * CArtifactsOfHeroBase::getHero() const | ||||
|   | ||||
| @@ -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 | ||||
| 				{ | ||||
|   | ||||
| @@ -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(); | ||||
|   | ||||
| @@ -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)); | ||||
| } | ||||
| @@ -19,4 +19,5 @@ public: | ||||
| 	 | ||||
| private: | ||||
| 	std::shared_ptr<CArtifactsOfHeroBackpack> arts; | ||||
| 	std::shared_ptr<CArtifactsOfHeroBackpack> arts_straight; | ||||
| }; | ||||
		Reference in New Issue
	
	Block a user