1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-08-15 20:03:15 +02:00

Cursor type can now be set in settings.json

This commit is contained in:
Ivan Savenko
2023-01-05 22:38:52 +02:00
parent 26a1c5801b
commit 6985f2e050
3 changed files with 47 additions and 21 deletions

View File

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

View File

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

View File

@@ -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