porymap/ui/selectablepixmapitem.cpp
2018-09-23 16:32:07 -05:00

104 lines
3.8 KiB
C++

#include "selectablepixmapitem.h"
#include <QPainter>
QPoint SelectablePixmapItem::getSelectionDimensions()
{
return QPoint(abs(this->selectionOffsetX) + 1, abs(this->selectionOffsetY) + 1);
}
QPoint SelectablePixmapItem::getSelectionStart()
{
int x = this->selectionInitialX;
int y = this->selectionInitialY;
if (this->selectionOffsetX < 0) x += this->selectionOffsetX;
if (this->selectionOffsetY < 0) y += this->selectionOffsetY;
return QPoint(x, y);
}
void SelectablePixmapItem::select(int x, int y, int width, int height)
{
this->selectionInitialX = x;
this->selectionInitialY = y;
this->selectionOffsetX = qMax(0, qMin(width, this->maxSelectionWidth));
this->selectionOffsetY = qMax(0, qMin(height, this->maxSelectionHeight));
this->draw();
}
void SelectablePixmapItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
QPoint pos = this->getCellPos(event->pos());
this->selectionInitialX = pos.x();
this->selectionInitialY = pos.y();
this->selectionOffsetX = 0;
this->selectionOffsetY = 0;
this->updateSelection(pos.x(), pos.y());
}
void SelectablePixmapItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
QPoint pos = this->getCellPos(event->pos());
this->updateSelection(pos.x(), pos.y());
}
void SelectablePixmapItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
QPoint pos = this->getCellPos(event->pos());
this->updateSelection(pos.x(), pos.y());
}
void SelectablePixmapItem::updateSelection(int x, int y)
{
// Snap to a valid position inside the selection area.
int width = pixmap().width() / this->cellWidth;
int height = pixmap().height() / this->cellHeight;
if (x < 0) x = 0;
if (x >= width) x = width - 1;
if (y < 0) y = 0;
if (y >= height) y = height - 1;
this->selectionOffsetX = x - this->selectionInitialX;
this->selectionOffsetY = y - this->selectionInitialY;
// Respect max selection dimensions by moving the selection's origin.
if (this->selectionOffsetX >= this->maxSelectionWidth) {
this->selectionInitialX += this->selectionOffsetX - this->maxSelectionWidth + 1;
this->selectionOffsetX = this->maxSelectionWidth - 1;
} else if (this->selectionOffsetX <= -this->maxSelectionWidth) {
this->selectionInitialX += this->selectionOffsetX + this->maxSelectionWidth - 1;
this->selectionOffsetX = -this->maxSelectionWidth + 1;
}
if (this->selectionOffsetY >= this->maxSelectionHeight) {
this->selectionInitialY += this->selectionOffsetY - this->maxSelectionHeight + 1;
this->selectionOffsetY = this->maxSelectionHeight - 1;
} else if (this->selectionOffsetY <= -this->maxSelectionHeight) {
this->selectionInitialY += this->selectionOffsetY + this->maxSelectionHeight - 1;
this->selectionOffsetY = -this->maxSelectionHeight + 1;
}
this->draw();
}
QPoint SelectablePixmapItem::getCellPos(QPointF pos)
{
return QPoint(static_cast<int>(pos.x()) / this->cellWidth,
static_cast<int>(pos.y()) / this->cellHeight);
}
void SelectablePixmapItem::drawSelection()
{
QPixmap pixmap = this->pixmap();
QPainter painter(&pixmap);
QPoint origin = this->getSelectionStart();
QPoint dimensions = this->getSelectionDimensions();
int rectWidth = dimensions.x() * this->cellWidth;
int rectHeight = dimensions.y() * this->cellHeight;
painter.setPen(QColor(0xff, 0xff, 0xff));
painter.drawRect(origin.x() * this->cellWidth, origin.y() * this->cellHeight, rectWidth - 1, rectHeight -1);
painter.setPen(QColor(0, 0, 0));
painter.drawRect(origin.x() * this->cellWidth - 1, origin.y() * this->cellHeight - 1, rectWidth + 1, rectHeight + 1);
painter.drawRect(origin.x() * this->cellWidth + 1, origin.y() * this->cellHeight + 1, rectWidth - 3, rectHeight - 3);
this->setPixmap(pixmap);
}