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:
@@ -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 )
|
||||
|
@@ -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();
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user