Преглед изворни кода

Cursor type can now be set in settings.json

Ivan Savenko пре 2 година
родитељ
комит
6985f2e050
3 измењених фајлова са 47 додато и 21 уклоњено
  1. 21 9
      client/gui/CursorHandler.cpp
  2. 21 11
      client/gui/CursorHandler.h
  3. 5 1
      config/schemas/settings.json

+ 21 - 9
client/gui/CursorHandler.cpp

@@ -12,15 +12,23 @@
 
 #include <SDL.h>
 
-
 #include "SDL_Extensions.h"
 #include "CGuiHandler.h"
 #include "CAnimation.h"
+#include "../../lib/CConfigHandler.h"
 
-#include "../CMT.h"
+//#include "../CMT.h"
+
+std::unique_ptr<ICursor> CursorHandler::createCursor()
+{
+	if (settings["video"]["softwareCursor"].Bool())
+		return std::make_unique<CursorSoftware>();
+	else
+		return std::make_unique<CursorHardware>();
+}
 
 CursorHandler::CursorHandler()
-	: cursorSW(new CursorHardware())
+	: cursor(createCursor())
 	, frameTime(0.f)
 	, showing(false)
 	, pos(0,0)
@@ -58,7 +66,7 @@ void CursorHandler::changeGraphic(Cursor::Type type, size_t index)
 	this->type = type;
 	this->frame = index;
 
-	cursorSW->setImage(getCurrentImage(), getPivotOffset());
+	cursor->setImage(getCurrentImage(), getPivotOffset());
 }
 
 void CursorHandler::set(Cursor::Default index)
@@ -85,7 +93,7 @@ void CursorHandler::set(Cursor::Spellcast index)
 void CursorHandler::dragAndDropCursor(std::shared_ptr<IImage> image)
 {
 	dndObject = image;
-	cursorSW->setImage(getCurrentImage(), getPivotOffset());
+	cursor->setImage(getCurrentImage(), getPivotOffset());
 }
 
 void CursorHandler::dragAndDropCursor (std::string path, size_t index)
@@ -100,7 +108,7 @@ void CursorHandler::cursorMove(const int & x, const int & y)
 	pos.x = x;
 	pos.y = y;
 
-	cursorSW->setCursorPosition(pos);
+	cursor->setCursorPosition(pos);
 }
 
 Point CursorHandler::getPivotOffsetDefault(size_t index)
@@ -206,7 +214,7 @@ Point CursorHandler::getPivotOffsetSpellcast()
 Point CursorHandler::getPivotOffset()
 {
 	if (dndObject)
-		return dndObject->dimensions();
+		return dndObject->dimensions() / 2;
 
 	switch (type) {
 	case Cursor::Type::ADVENTURE: return getPivotOffsetMap(frame);
@@ -236,7 +244,7 @@ void CursorHandler::centerCursor()
 	SDL_WarpMouse(pos.x, pos.y);
 	SDL_EventState(SDL_MOUSEMOTION, SDL_ENABLE);
 
-	cursorSW->setCursorPosition(pos);
+	cursor->setCursorPosition(pos);
 }
 
 void CursorHandler::updateSpellcastCursor()
@@ -268,7 +276,7 @@ void CursorHandler::render()
 	if (type == Cursor::Type::SPELLBOOK)
 		updateSpellcastCursor();
 
-	cursorSW->render();
+	cursor->render();
 }
 
 void CursorSoftware::render()
@@ -367,6 +375,7 @@ void CursorHardware::setImage(std::shared_ptr<IImage> image, const Point & pivot
 
 	image->draw(cursorSurface);
 
+	auto oldCursor = cursor;
 	cursor = SDL_CreateColorCursor(cursorSurface, pivotOffset.x, pivotOffset.y);
 
 	if (!cursor)
@@ -374,6 +383,9 @@ void CursorHardware::setImage(std::shared_ptr<IImage> image, const Point & pivot
 
 	SDL_FreeSurface(cursorSurface);
 	SDL_SetCursor(cursor);
+
+	if (oldCursor)
+		SDL_FreeCursor(oldCursor);
 }
 
 void CursorHardware::setCursorPosition( const Point & newPos )

+ 21 - 11
client/gui/CursorHandler.h

@@ -112,7 +112,17 @@ namespace Cursor
 	};
 }
 
-class CursorHardware
+class ICursor
+{
+public:
+	virtual ~ICursor() = default;
+
+	virtual void setImage(std::shared_ptr<IImage> image, const Point & pivotOffset) = 0;
+	virtual void setCursorPosition( const Point & newPos ) = 0;
+	virtual void render() = 0;
+};
+
+class CursorHardware : public ICursor
 {
 	std::shared_ptr<IImage> cursorImage;
 
@@ -122,13 +132,12 @@ public:
 	CursorHardware();
 	~CursorHardware();
 
-	void setImage(std::shared_ptr<IImage> image, const Point & pivotOffset);
-	void setCursorPosition( const Point & newPos );
-
-	void render();
+	void setImage(std::shared_ptr<IImage> image, const Point & pivotOffset) override;
+	void setCursorPosition( const Point & newPos ) override;
+	void render() override;
 };
 
-class CursorSoftware
+class CursorSoftware : public ICursor
 {
 	std::shared_ptr<IImage> cursorImage;
 
@@ -145,10 +154,9 @@ public:
 	CursorSoftware();
 	~CursorSoftware();
 
-	void setImage(std::shared_ptr<IImage> image, const Point & pivotOffset);
-	void setCursorPosition( const Point & newPos );
-
-	void render();
+	void setImage(std::shared_ptr<IImage> image, const Point & pivotOffset) override;
+	void setCursorPosition( const Point & newPos ) override;
+	void render() override;
 };
 
 /// handles mouse cursor
@@ -178,7 +186,9 @@ class CursorHandler final
 
 	std::shared_ptr<IImage> getCurrentImage();
 
-	std::unique_ptr<CursorHardware> cursorSW;
+	std::unique_ptr<ICursor> cursor;
+
+	static std::unique_ptr<ICursor> createCursor();
 public:
 	CursorHandler();
 	~CursorHandler();

+ 5 - 1
config/schemas/settings.json

@@ -81,7 +81,7 @@
 			"type" : "object",
 			"additionalProperties" : false,
 			"default": {},
-			"required" : [ "screenRes", "bitsPerPixel", "fullscreen", "realFullscreen", "spellbookAnimation","driver", "showIntro", "displayIndex" ],
+			"required" : [ "screenRes", "bitsPerPixel", "fullscreen", "realFullscreen", "softwareCursor", "spellbookAnimation", "driver", "showIntro", "displayIndex" ],
 			"properties" : {
 				"screenRes" : {
 					"type" : "object",
@@ -105,6 +105,10 @@
 					"type" : "boolean",
 					"default" : false
 				},
+				"softwareCursor" :  {
+					"type" : "boolean",
+					"default" : false
+				},
 				"showIntro" : {
 					"type" : "boolean",
 					"default" : true