106 lines
2.7 KiB
C++
106 lines
2.7 KiB
C++
#include "cursortilerect.h"
|
|
#include "log.h"
|
|
|
|
CursorTileRect::CursorTileRect(bool *enabled, QRgb color)
|
|
{
|
|
this->enabled = enabled;
|
|
this->visible = true;
|
|
this->color = color;
|
|
this->width = 16;
|
|
this->height = 16;
|
|
this->smartPathMode = false;
|
|
this->singleTileMode = false;
|
|
this->anchored = false;
|
|
this->rightClickSelectionAnchored = false;
|
|
this->anchorCoordX = 0;
|
|
this->anchorCoordY = 0;
|
|
this->selectionWidth = 1;
|
|
this->selectionHeight = 1;
|
|
}
|
|
|
|
void CursorTileRect::setVisibility(bool visible)
|
|
{
|
|
this->visible = visible;
|
|
}
|
|
|
|
void CursorTileRect::initAnchor(int coordX, int coordY)
|
|
{
|
|
this->anchorCoordX = coordX;
|
|
this->anchorCoordY = coordY;
|
|
this->anchored = true;
|
|
}
|
|
|
|
void CursorTileRect::stopAnchor()
|
|
{
|
|
this->anchored = false;
|
|
}
|
|
|
|
void CursorTileRect::initRightClickSelectionAnchor(int coordX, int coordY)
|
|
{
|
|
this->anchorCoordX = coordX;
|
|
this->anchorCoordY = coordY;
|
|
this->rightClickSelectionAnchored = true;
|
|
}
|
|
|
|
void CursorTileRect::stopRightClickSelectionAnchor()
|
|
{
|
|
this->rightClickSelectionAnchored = false;
|
|
}
|
|
|
|
void CursorTileRect::updateSelectionSize(int width, int height)
|
|
{
|
|
this->selectionWidth = width;
|
|
this->selectionHeight = height;
|
|
this->width = width * 16;
|
|
this->height = height * 16;
|
|
this->prepareGeometryChange();
|
|
this->update();
|
|
}
|
|
|
|
void CursorTileRect::setSmartPathMode()
|
|
{
|
|
this->smartPathMode = true;
|
|
}
|
|
|
|
void CursorTileRect::setSingleTileMode()
|
|
{
|
|
this->singleTileMode = true;
|
|
}
|
|
|
|
void CursorTileRect::stopSingleTileMode()
|
|
{
|
|
this->singleTileMode = false;
|
|
}
|
|
|
|
void CursorTileRect::setNormalPathMode()
|
|
{
|
|
this->smartPathMode = false;
|
|
}
|
|
|
|
bool CursorTileRect::smartPathInEffect()
|
|
{
|
|
return !this->rightClickSelectionAnchored && this->smartPathMode && this->selectionHeight == 3 && this->selectionWidth == 3;
|
|
}
|
|
|
|
void CursorTileRect::updateLocation(int coordX, int coordY)
|
|
{
|
|
if (!this->singleTileMode) {
|
|
if (this->rightClickSelectionAnchored) {
|
|
coordX = qMin(coordX, this->anchorCoordX);
|
|
coordY = qMin(coordY, this->anchorCoordY);
|
|
}
|
|
else if (this->anchored && !this->smartPathInEffect()) {
|
|
int xDiff = coordX - this->anchorCoordX;
|
|
int yDiff = coordY - this->anchorCoordY;
|
|
if (xDiff < 0 && xDiff % this->selectionWidth != 0) xDiff -= this->selectionWidth;
|
|
if (yDiff < 0 && yDiff % this->selectionHeight != 0) yDiff -= this->selectionHeight;
|
|
|
|
coordX = this->anchorCoordX + (xDiff / this->selectionWidth) * this->selectionWidth;
|
|
coordY = this->anchorCoordY + (yDiff / this->selectionHeight) * this->selectionHeight;
|
|
}
|
|
}
|
|
|
|
this->setX(coordX * 16);
|
|
this->setY(coordY * 16);
|
|
this->setVisible(*this->enabled && this->visible);
|
|
}
|