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