From e24837649ccb7e912fd9bdc69b87c2b28a35bf06 Mon Sep 17 00:00:00 2001 From: 2ndbeam <2ndbeam@disroot.org> Date: Fri, 27 Jun 2025 16:15:39 +0300 Subject: [PATCH] Grid painting --- gridpreview.cpp | 77 ++++++++++++++++++++++++++++++++++++++++++++++++- gridpreview.h | 4 +++ mainwindow.ui | 13 ++++++++- 3 files changed, 92 insertions(+), 2 deletions(-) diff --git a/gridpreview.cpp b/gridpreview.cpp index 1227fe6..ab8a3a3 100644 --- a/gridpreview.cpp +++ b/gridpreview.cpp @@ -2,7 +2,11 @@ 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) { @@ -32,3 +36,74 @@ QString GridPreview::toLuaTable() linesSubTable.removeLast(); // , return output.arg(linesSubTable); } + +void GridPreview::paintEvent(QPaintEvent *event) +{ + QPainter painter(this); + QPen pen(Qt::black, 2); + painter.setPen(pen); + QBrush brush(Qt::black); + bool widthBased = rect().width() > rect().height(); + 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); + } +} + +QColor GridPreview::colorFromString(QString color) +{ + if (!colorMap.contains(color)) + return colorMap[QString("red")]; + return colorMap[color]; +} diff --git a/gridpreview.h b/gridpreview.h index 0a1e92f..3ae6e28 100644 --- a/gridpreview.h +++ b/gridpreview.h @@ -2,6 +2,7 @@ #define GRIDPREVIEW_H #include +#include #include "line.h" class GridPreview : public QWidget @@ -13,9 +14,12 @@ public: void addLine(Line &line); void removeLine(int index); QString toLuaTable(); + void paintEvent(QPaintEvent* event); + QColor colorFromString(QString color); private: int width = 5, height = 5; QVector lines {}; + QMap colorMap; const QString tableTemplate = "return {\n width = %1,\n height = %2,\n lines = {\n%3\n }\n}"; signals: }; diff --git a/mainwindow.ui b/mainwindow.ui index df7308c..5ae5cb7 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -96,7 +96,11 @@ 6 - + + + true + + @@ -395,6 +399,13 @@ + + + + Delete selected line + + +