204 lines
5.1 KiB
C++
204 lines
5.1 KiB
C++
#include "gridpreview.h"
|
|
|
|
GridPreview::GridPreview(QWidget *parent)
|
|
: QWidget{parent}
|
|
{
|
|
colorMap.insert(QString("red"), Qt::red);
|
|
colorMap.insert(QString("green"), Qt::green);
|
|
colorMap.insert(QString("blue"), Qt::blue);
|
|
}
|
|
|
|
void GridPreview::setSize(int newWidth, int newHeight)
|
|
{
|
|
width = newWidth;
|
|
height = newHeight;
|
|
|
|
update();
|
|
emit updatedContents();
|
|
}
|
|
|
|
void GridPreview::addLine(Line &line)
|
|
{
|
|
lines.push_back(line);
|
|
|
|
update();
|
|
emit updatedContents();
|
|
}
|
|
|
|
void GridPreview::removeLine(int index)
|
|
{
|
|
lines.removeAt(index);
|
|
|
|
update();
|
|
emit updatedContents();
|
|
}
|
|
|
|
void GridPreview::setLineColor(int index, QString color)
|
|
{
|
|
lines[index].setColor(color);
|
|
|
|
update();
|
|
emit updatedContents();
|
|
}
|
|
|
|
void GridPreview::setLineStartPoint(int index, int x, int y)
|
|
{
|
|
lines[index].setStartPoint(x, y);
|
|
|
|
update();
|
|
emit updatedContents();
|
|
}
|
|
|
|
void GridPreview::setLineEndPoint(int index, int x, int y)
|
|
{
|
|
lines[index].setEndPoint(x, y);
|
|
|
|
update();
|
|
emit updatedContents();
|
|
}
|
|
|
|
int GridPreview::getWidth()
|
|
{
|
|
return width;
|
|
}
|
|
|
|
int GridPreview::getHeight()
|
|
{
|
|
return height;
|
|
}
|
|
|
|
const Line &GridPreview::getLine(int index)
|
|
{
|
|
return lines.at(index);
|
|
}
|
|
|
|
const QString GridPreview::toLuaTable()
|
|
{
|
|
QString output(tableTemplate.arg(width).arg(height));
|
|
QString linesSubTable = "";
|
|
for(auto iter = lines.begin(); iter != lines.end(); iter++ )
|
|
{
|
|
linesSubTable += QString(" %1,\n").arg(iter->toLuaTable());
|
|
}
|
|
linesSubTable.removeLast(); // \n
|
|
linesSubTable.removeLast(); // ,
|
|
return output.arg(linesSubTable);
|
|
}
|
|
|
|
void GridPreview::paintEvent(QPaintEvent *)
|
|
{
|
|
QPainter painter(this);
|
|
QPen pen(Qt::black, 2);
|
|
painter.setPen(pen);
|
|
QBrush brush(Qt::black);
|
|
double aspectRatio = (double) rect().width() / rect().height();
|
|
double cellAspectRatio = (double) width / height;
|
|
bool widthBased = aspectRatio > cellAspectRatio;
|
|
int cellSize = widthBased ?
|
|
rect().height() / height :
|
|
rect().width() / width;
|
|
|
|
int dotSize = cellSize * 0.5;
|
|
int filledDotSize = cellSize * 0.7;
|
|
|
|
int areaWidth = cellSize * width;
|
|
int areaHeight = cellSize * height;
|
|
|
|
int offsetX = (rect().width() - areaWidth) / 2;
|
|
int offsetY = (rect().height() - areaHeight) / 2;
|
|
|
|
QRect drawArea(offsetX, offsetY, areaWidth, areaHeight);
|
|
|
|
// Draw main grid
|
|
|
|
painter.drawRect(drawArea);
|
|
|
|
QRect cell(0, 0, cellSize, cellSize);
|
|
painter.setBrush(brush);
|
|
for (int cellX = 0; cellX < width; cellX++)
|
|
{
|
|
for (int cellY = 0; cellY < height; cellY++)
|
|
{
|
|
cell.setLeft(offsetX + (cellSize - dotSize) / 2 + cellX * cellSize);
|
|
cell.setWidth(dotSize);
|
|
cell.setTop(offsetY + (cellSize - dotSize) / 2 + cellY * cellSize);
|
|
cell.setHeight(dotSize);
|
|
painter.drawEllipse(cell);
|
|
}
|
|
}
|
|
|
|
// Draw line points
|
|
|
|
for (auto iter = lines.begin(); iter < lines.end(); iter++)
|
|
{
|
|
QColor color(colorFromString(iter->getColor()));
|
|
brush.setColor(color);
|
|
painter.setBrush(brush);
|
|
|
|
// Draw start
|
|
cell.setLeft(offsetX + (cellSize - filledDotSize) / 2 + (iter->getStartX() - 1) * cellSize);
|
|
cell.setWidth(filledDotSize);
|
|
cell.setTop(offsetY + (cellSize - filledDotSize) / 2 + (iter->getStartY() - 1) * cellSize);
|
|
cell.setHeight(filledDotSize);
|
|
painter.drawEllipse(cell);
|
|
|
|
// Draw end
|
|
cell.setLeft(offsetX + (cellSize - filledDotSize) / 2 + (iter->getEndX() - 1) * cellSize);
|
|
cell.setWidth(filledDotSize);
|
|
cell.setTop(offsetY + (cellSize - filledDotSize) / 2 + (iter->getEndY() - 1) * cellSize);
|
|
cell.setHeight(filledDotSize);
|
|
painter.drawEllipse(cell);
|
|
}
|
|
}
|
|
|
|
const QColor GridPreview::colorFromString(const QString color)
|
|
{
|
|
if (!colorMap.contains(color))
|
|
return colorMap[QString("red")];
|
|
return colorMap[color];
|
|
}
|
|
|
|
void GridPreview::mouseMoveEvent(QMouseEvent *event)
|
|
{
|
|
if (!mouseCaptured) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
void GridPreview::mousePressEvent(QMouseEvent *event)
|
|
{
|
|
mouseCaptured = true;
|
|
|
|
QPoint gridPos = localMousePosition(event);
|
|
|
|
std::cout << gridPos.x() << ',' << gridPos.y() << std::endl;
|
|
}
|
|
|
|
void GridPreview::mouseReleaseEvent(QMouseEvent *event)
|
|
{
|
|
mouseCaptured = false;
|
|
}
|
|
|
|
const QPoint GridPreview::localMousePosition(QMouseEvent *event)
|
|
{
|
|
QPoint position(event->position().toPoint());
|
|
return snapToGrid(position.x(), position.y());
|
|
}
|
|
|
|
const QPoint GridPreview::snapToGrid(int x, int y)
|
|
{
|
|
double aspectRatio = (double) rect().width() / rect().height();
|
|
double cellAspectRatio = (double) width / height;
|
|
bool widthBased = aspectRatio > cellAspectRatio;
|
|
int cellSize = widthBased ?
|
|
rect().height() / height :
|
|
rect().width() / width;
|
|
|
|
int areaWidth = cellSize * width;
|
|
int areaHeight = cellSize * height;
|
|
|
|
int offsetX = (rect().width() - areaWidth) / 2;
|
|
int offsetY = (rect().height() - areaHeight) / 2;
|
|
|
|
return QPoint(1 + (x - offsetX) / cellSize, 1 + (y - offsetY) / cellSize);
|
|
}
|