2
0
Эх сурвалжийг харах

Merge pull request #3779 from SoundSSGood/backpackWindow-art-transfer-fix

Backpack window cursor fix
Ivan Savenko 1 жил өмнө
parent
commit
0824f50367

+ 1 - 9
client/widgets/CArtifactsOfHeroBase.cpp

@@ -25,8 +25,7 @@
 #include "../../lib/networkPacks/ArtifactLocation.h"
 
 CArtifactsOfHeroBase::CArtifactsOfHeroBase()
-	: curHero(nullptr),
-	putBackPickedArtCallback(nullptr)
+	: curHero(nullptr)
 {
 }
 
@@ -45,13 +44,6 @@ void CArtifactsOfHeroBase::putBackPickedArtifact()
 			LOCPLINT->cb->swapArtifacts(ArtifactLocation(curHero->id, ArtifactPosition::TRANSITION_POS), ArtifactLocation(curHero->id, slot));
 		}
 	}
-	if(putBackPickedArtCallback)
-		putBackPickedArtCallback();
-}
-
-void CArtifactsOfHeroBase::setPutBackPickedArtifactCallback(PutBackPickedArtCallback callback)
-{
-	putBackPickedArtCallback = callback;
 }
 
 void CArtifactsOfHeroBase::init(

+ 0 - 3
client/widgets/CArtifactsOfHeroBase.h

@@ -22,7 +22,6 @@ protected:
 public:
 	using ArtPlaceMap = std::map<ArtifactPosition, ArtPlacePtr>;
 	using ClickFunctor = std::function<void(CArtifactsOfHeroBase&, CArtPlace&, const Point&)>;
-	using PutBackPickedArtCallback = std::function<void()>;
 
 	ClickFunctor clickPressedCallback;
 	ClickFunctor showPopupCallback;
@@ -30,7 +29,6 @@ public:
 	
 	CArtifactsOfHeroBase();
 	virtual void putBackPickedArtifact();
-	virtual void setPutBackPickedArtifactCallback(PutBackPickedArtCallback callback);
 	virtual void clickPrassedArtPlace(CArtPlace & artPlace, const Point & cursorPosition);
 	virtual void showPopupArtPlace(CArtPlace & artPlace, const Point & cursorPosition);
 	virtual void gestureArtPlace(CArtPlace & artPlace, const Point & cursorPosition);
@@ -52,7 +50,6 @@ protected:
 	std::vector<ArtPlacePtr> backpack;
 	std::shared_ptr<CButton> leftBackpackRoll;
 	std::shared_ptr<CButton> rightBackpackRoll;
-	PutBackPickedArtCallback putBackPickedArtCallback;
 
 	const std::vector<Point> slotPos =
 	{

+ 2 - 3
client/widgets/CArtifactsOfHeroMain.cpp

@@ -26,8 +26,7 @@ CArtifactsOfHeroMain::CArtifactsOfHeroMain(const Point & position)
 	addGestureCallback(std::bind(&CArtifactsOfHeroBase::gestureArtPlace, this, _1, _2));
 }
 
-void CArtifactsOfHeroMain::deactivate()
+CArtifactsOfHeroMain::~CArtifactsOfHeroMain()
 {
-	putBackPickedArtifact();
-	CArtifactsOfHeroBase::deactivate();
+	CArtifactsOfHeroBase::putBackPickedArtifact();
 }

+ 1 - 1
client/widgets/CArtifactsOfHeroMain.h

@@ -21,5 +21,5 @@ class CArtifactsOfHeroMain : public CArtifactsOfHeroBase
 {
 public:
 	CArtifactsOfHeroMain(const Point & position);
-	void deactivate() override;
+	~CArtifactsOfHeroMain() override;
 };

+ 25 - 19
client/widgets/CWindowWithArtifacts.cpp

@@ -35,6 +35,12 @@
 
 #include "../../CCallback.h"
 
+CWindowWithArtifacts::CWindowWithArtifacts(const std::vector<CArtifactsOfHeroPtr> * artSets)
+{
+	if(artSets)
+		this->artSets.insert(this->artSets.end(), artSets->begin(), artSets->end());
+}
+
 void CWindowWithArtifacts::addSet(CArtifactsOfHeroPtr artSet)
 {
 	artSets.emplace_back(artSet);
@@ -42,19 +48,13 @@ void CWindowWithArtifacts::addSet(CArtifactsOfHeroPtr artSet)
 
 void CWindowWithArtifacts::addSetAndCallbacks(CArtifactsOfHeroPtr artSet)
 {
-	CArtifactsOfHeroBase::PutBackPickedArtCallback artPutBackFunctor = []() -> void
-	{
-		CCS->curh->dragAndDropCursor(nullptr);
-	};
-
 	addSet(artSet);
-	std::visit([this, artPutBackFunctor](auto artSetWeak)
+	std::visit([this](auto artSetWeak)
 		{
 			auto artSet = artSetWeak.lock();
 			artSet->clickPressedCallback = std::bind(&CWindowWithArtifacts::clickPressedArtPlaceHero, this, _1, _2, _3);
 			artSet->showPopupCallback = std::bind(&CWindowWithArtifacts::showPopupArtPlaceHero, this, _1, _2, _3);
 			artSet->gestureCallback = std::bind(&CWindowWithArtifacts::gestureArtPlaceHero, this, _1, _2, _3);
-			artSet->setPutBackPickedArtifactCallback(artPutBackFunctor);
 		}, artSet);
 }
 
@@ -146,7 +146,7 @@ void CWindowWithArtifacts::clickPressedArtPlaceHero(CArtifactsOfHeroBase & artsI
 					{
 						if(checkSpecialArts(*art, hero, std::is_same_v<decltype(artSetWeak), std::weak_ptr<CArtifactsOfHeroAltar>> ? true : false))
 						{
-							assert(artSetPtr->getHero()->getSlotByInstance(art));
+							assert(artSetPtr->getHero()->getSlotByInstance(art) != ArtifactPosition::PRE_FIRST);
 							LOCPLINT->cb->swapArtifacts(ArtifactLocation(artSetPtr->getHero()->id, artSetPtr->getHero()->getSlotByInstance(art)),
 								ArtifactLocation(artSetPtr->getHero()->id, ArtifactPosition::TRANSITION_POS));
 						}
@@ -296,17 +296,7 @@ void CWindowWithArtifacts::artifactMoved(const ArtifactLocation & srcLoc, const
 			const auto hero = artSetPtr->getHero();
 			if(pickedArtInst)
 			{
-				markPossibleSlots();
-				
-				if(pickedArtInst->getTypeId() == ArtifactID::SPELL_SCROLL && pickedArtInst->getScrollSpellID().num >= 0 && settings["general"]["enableUiEnhancements"].Bool())
-				{
-					auto anim = GH.renderHandler().loadAnimation(AnimationPath::builtin("spellscr"));
-					anim->load(pickedArtInst->getScrollSpellID().num);
-					std::shared_ptr<IImage> img = anim->getImage(pickedArtInst->getScrollSpellID().num);
-					CCS->curh->dragAndDropCursor(img->scaleFast(Point(44, 34)));
-				}
-				else
-					CCS->curh->dragAndDropCursor(AnimationPath::builtin("artifact"), pickedArtInst->artType->getIconIndex());
+				setCursorAnimation(*pickedArtInst);
 			}
 			else
 			{
@@ -476,3 +466,19 @@ bool CWindowWithArtifacts::checkSpecialArts(const CArtifactInstance & artInst, c
 	}
 	return true;
 }
+
+void CWindowWithArtifacts::setCursorAnimation(const CArtifactInstance & artInst)
+{
+	markPossibleSlots();
+	if(artInst.isScroll() && settings["general"]["enableUiEnhancements"].Bool())
+	{
+		assert(artInst.getScrollSpellID().num >= 0);
+		const auto animation = GH.renderHandler().loadAnimation(AnimationPath::builtin("spellscr"));
+		animation->load(artInst.getScrollSpellID().num);
+		CCS->curh->dragAndDropCursor(animation->getImage(artInst.getScrollSpellID().num)->scaleFast(Point(44, 34)));
+	}
+	else
+	{
+		CCS->curh->dragAndDropCursor(AnimationPath::builtin("artifact"), artInst.artType->getIconIndex());
+	}
+}

+ 2 - 0
client/widgets/CWindowWithArtifacts.h

@@ -28,6 +28,7 @@ public:
 		std::weak_ptr<CArtifactsOfHeroQuickBackpack>>;
 	using CloseCallback = std::function<void()>;
 
+	explicit CWindowWithArtifacts(const std::vector<CArtifactsOfHeroPtr> * artSets = nullptr);
 	void addSet(CArtifactsOfHeroPtr artSet);
 	void addSetAndCallbacks(CArtifactsOfHeroPtr artSet);
 	void addCloseCallback(CloseCallback callback);
@@ -51,4 +52,5 @@ protected:
 	std::optional<CArtifactsOfHeroPtr> findAOHbyRef(CArtifactsOfHeroBase & artsInst);
 	void markPossibleSlots();
 	bool checkSpecialArts(const CArtifactInstance & artInst, const CGHeroInstance * hero, bool isTrade);
+	void setCursorAnimation(const CArtifactInstance & artInst);
 };

+ 9 - 1
client/windows/CHeroBackpackWindow.cpp

@@ -20,8 +20,9 @@
 #include "render/Canvas.h"
 #include "CPlayerInterface.h"
 
-CHeroBackpackWindow::CHeroBackpackWindow(const CGHeroInstance * hero)
+CHeroBackpackWindow::CHeroBackpackWindow(const CGHeroInstance * hero, const std::vector<CArtifactsOfHeroPtr> & artsSets)
 	: CStatusbarWindow(0)
+	, CWindowWithArtifacts(&artsSets)
 {
 	OBJECT_CONSTRUCTION_CAPTURING(255 - DISPOSE);
 
@@ -48,6 +49,13 @@ void CHeroBackpackWindow::showAll(Canvas & to)
 	CMessage::drawBorder(PlayerColor(LOCPLINT->playerID), to, pos.w+28, pos.h+29, pos.x-14, pos.y-15);
 }
 
+void CHeroBackpackWindow::activate()
+{
+	if(const auto art = getPickedArtifact())
+		setCursorAnimation(*art);
+	CIntObject::activate();
+}
+
 CHeroQuickBackpackWindow::CHeroQuickBackpackWindow(const CGHeroInstance * hero, ArtifactPosition targetSlot)
 	: CWindowObject(0)
 {

+ 2 - 1
client/windows/CHeroBackpackWindow.h

@@ -17,7 +17,7 @@ class CFilledTexture;
 class CHeroBackpackWindow : public CStatusbarWindow, public CWindowWithArtifacts
 {
 public:
-	CHeroBackpackWindow(const CGHeroInstance * hero);
+	CHeroBackpackWindow(const CGHeroInstance * hero, const std::vector<CArtifactsOfHeroPtr> & artsSets);
 	
 protected:
 	std::shared_ptr<CArtifactsOfHeroBackpack> arts;
@@ -26,6 +26,7 @@ protected:
 	const int windowMargin = 5;
 
 	void showAll(Canvas & to) override;
+	void activate() override;
 };
 
 class CHeroQuickBackpackWindow : public CWindowObject, public CWindowWithArtifacts

+ 8 - 1
client/windows/CHeroWindow.cpp

@@ -19,6 +19,7 @@
 #include "../CPlayerInterface.h"
 
 #include "../gui/CGuiHandler.h"
+#include "../gui/CursorHandler.h"
 #include "../gui/TextAlignment.h"
 #include "../gui/Shortcut.h"
 #include "../gui/WindowHandler.h"
@@ -325,7 +326,7 @@ void CHeroWindow::dismissCurrent()
 
 void CHeroWindow::createBackpackWindow()
 {
-	GH.windows().createAndPushWindow<CHeroBackpackWindow>(curHero);
+	GH.windows().createAndPushWindow<CHeroBackpackWindow>(curHero, artSets);
 }
 
 void CHeroWindow::commanderWindow()
@@ -359,3 +360,9 @@ bool CHeroWindow::holdsGarrison(const CArmedInstance * army)
 {
 	return army == curHero;
 }
+
+void CHeroWindow::deactivate()
+{
+	CCS->curh->dragAndDropCursor(nullptr);
+	CIntObject::deactivate();
+}

+ 1 - 0
client/windows/CHeroWindow.h

@@ -108,6 +108,7 @@ public:
 	void switchHero(); //changes displayed hero
 	void updateGarrisons() override;
 	bool holdsGarrison(const CArmedInstance * army) override;
+	void deactivate() override;
 	void createBackpackWindow();
 
 	//friends

+ 7 - 0
client/windows/CKingdomInterface.cpp

@@ -19,6 +19,7 @@
 #include "../PlayerLocalState.h"
 #include "../adventureMap/CResDataBar.h"
 #include "../gui/CGuiHandler.h"
+#include "../gui/CursorHandler.h"
 #include "../gui/Shortcut.h"
 #include "../gui/WindowHandler.h"
 #include "../widgets/CComponent.h"
@@ -729,6 +730,12 @@ bool CKingdHeroList::holdsGarrison(const CArmedInstance * army)
 	return false;
 }
 
+void CKingdHeroList::deactivate()
+{
+	CCS->curh->dragAndDropCursor(nullptr);
+	CIntObject::deactivate();
+}
+
 std::shared_ptr<CIntObject> CKingdHeroList::createHeroItem(size_t index)
 {
 	ui32 picCount = 4; // OVSLOT contains 4 images

+ 1 - 0
client/windows/CKingdomInterface.h

@@ -344,6 +344,7 @@ public:
 
 	void updateGarrisons() override;
 	bool holdsGarrison(const CArmedInstance * army) override;
+	void deactivate() override;
 };
 
 /// Tab with all town-specific data

+ 7 - 0
client/windows/CMarketWindow.cpp

@@ -12,6 +12,7 @@
 #include "CMarketWindow.h"
 
 #include "../gui/CGuiHandler.h"
+#include "../gui/CursorHandler.h"
 #include "../gui/Shortcut.h"
 
 #include "../widgets/Buttons.h"
@@ -261,3 +262,9 @@ void CMarketWindow::createAltarCreatures(const IMarket * market, const CGHeroIns
 	initWidgetInternals(EMarketMode::CREATURE_EXP, CGI->generaltexth->zelp[568]);
 	updateHero();
 }
+
+void CMarketWindow::deactivate()
+{
+	CCS->curh->dragAndDropCursor(nullptr);
+	CIntObject::deactivate();
+}

+ 1 - 0
client/windows/CMarketWindow.h

@@ -25,6 +25,7 @@ public:
 	bool holdsGarrison(const CArmedInstance * army) override;
 	void artifactRemoved(const ArtifactLocation & artLoc) override;
 	void artifactMoved(const ArtifactLocation & srcLoc, const ArtifactLocation & destLoc, bool withRedraw) override;
+	void deactivate() override;
 
 private:
 	void createChangeModeButtons(EMarketMode currentMode, const IMarket * market, const CGHeroInstance * hero);

+ 7 - 3
client/windows/GUIClasses.cpp

@@ -861,9 +861,7 @@ CExchangeWindow::CExchangeWindow(ObjectInstanceID hero1, ObjectInstanceID hero2,
 
 		auto openBackpack = [this](const CGHeroInstance * hero) -> void
 		{
-			GH.windows().createAndPushWindow<CHeroBackpackWindow>(hero);
-			for(auto artSet : artSets)
-				GH.windows().topWindow<CHeroBackpackWindow>()->addSet(artSet);
+			GH.windows().createAndPushWindow<CHeroBackpackWindow>(hero, artSets);
 		};
 
 		moveAllGarrButtonLeft    = std::make_shared<CButton>(Point(325, 118), AnimationPath::builtin(QUICK_EXCHANGE_MOD_PREFIX + "/armRight.DEF"), CButton::tooltip(CGI->generaltexth->qeModCommands[1]),
@@ -936,6 +934,12 @@ bool CExchangeWindow::holdsGarrison(const CArmedInstance * army)
 	return garr->upperArmy() == army || garr->lowerArmy() == army;
 }
 
+void CExchangeWindow::deactivate()
+{
+	CCS->curh->dragAndDropCursor(nullptr);
+	CIntObject::deactivate();
+}
+
 void CExchangeWindow::questlog(int whichHero)
 {
 	CCS->curh->dragAndDropCursor(nullptr);

+ 1 - 0
client/windows/GUIClasses.h

@@ -325,6 +325,7 @@ public:
 
 	void updateGarrisons() override;
 	bool holdsGarrison(const CArmedInstance * army) override;
+	void deactivate() override;
 
 	void questlog(int whichHero); //questlog button callback; whichHero: 0 - left, 1 - right