Mouse detection

This commit is contained in:
Alexey 2025-06-27 18:08:53 +03:00
commit bcd01a95b3
5 changed files with 163 additions and 16 deletions

View file

@ -12,19 +12,67 @@ void GridPreview::setSize(int newWidth, int newHeight)
{ {
width = newWidth; width = newWidth;
height = newHeight; height = newHeight;
update();
emit updatedContents();
} }
void GridPreview::addLine(Line &line) void GridPreview::addLine(Line &line)
{ {
lines.push_back(line); lines.push_back(line);
update();
emit updatedContents();
} }
void GridPreview::removeLine(int index) void GridPreview::removeLine(int index)
{ {
lines.removeAt(index); lines.removeAt(index);
update();
emit updatedContents();
} }
QString GridPreview::toLuaTable() 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 output(tableTemplate.arg(width).arg(height));
QString linesSubTable = ""; QString linesSubTable = "";
@ -37,13 +85,15 @@ QString GridPreview::toLuaTable()
return output.arg(linesSubTable); return output.arg(linesSubTable);
} }
void GridPreview::paintEvent(QPaintEvent *event) void GridPreview::paintEvent(QPaintEvent *)
{ {
QPainter painter(this); QPainter painter(this);
QPen pen(Qt::black, 2); QPen pen(Qt::black, 2);
painter.setPen(pen); painter.setPen(pen);
QBrush brush(Qt::black); QBrush brush(Qt::black);
bool widthBased = rect().width() > rect().height(); double aspectRatio = (double) rect().width() / rect().height();
double cellAspectRatio = (double) width / height;
bool widthBased = aspectRatio > cellAspectRatio;
int cellSize = widthBased ? int cellSize = widthBased ?
rect().height() / height : rect().height() / height :
rect().width() / width; rect().width() / width;
@ -101,9 +151,54 @@ void GridPreview::paintEvent(QPaintEvent *event)
} }
} }
QColor GridPreview::colorFromString(QString color) const QColor GridPreview::colorFromString(const QString color)
{ {
if (!colorMap.contains(color)) if (!colorMap.contains(color))
return colorMap[QString("red")]; return colorMap[QString("red")];
return colorMap[color]; 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);
}

View file

@ -3,25 +3,46 @@
#include <QWidget> #include <QWidget>
#include <QPainter> #include <QPainter>
#include <QMouseEvent>
#include <iostream>
#include "line.h" #include "line.h"
class GridPreview : public QWidget class GridPreview : public QWidget
{ {
Q_OBJECT Q_OBJECT
public:
explicit GridPreview(QWidget *parent = nullptr);
void setSize(int newWidth, int newHeight);
void addLine(Line &line);
void removeLine(int index);
QString toLuaTable();
void paintEvent(QPaintEvent* event);
QColor colorFromString(QString color);
private:
int width = 5, height = 5; int width = 5, height = 5;
QVector<Line> lines {}; QVector<Line> lines {};
QMap<QString, QColor> colorMap; QMap<QString, QColor> colorMap;
const QString tableTemplate = "return {\n width = %1,\n height = %2,\n lines = {\n%3\n }\n}"; const QString tableTemplate = "return {\n width = %1,\n height = %2,\n lines = {\n%3\n }\n}";
bool mouseCaptured = false;
public:
explicit GridPreview(QWidget *parent = nullptr);
void setSize(int newWidth, int newHeight);
void addLine(Line &line);
void removeLine(int index);
void setLineColor(int index, QString color);
void setLineStartPoint(int index, int x, int y);
void setLineEndPoint(int index, int x, int y);
int getWidth();
int getHeight();
const Line& getLine(int index);
const QString toLuaTable();
void paintEvent(QPaintEvent* event);
const QColor colorFromString(const QString color);
void mouseMoveEvent(QMouseEvent* event);
void mousePressEvent(QMouseEvent* event);
void mouseReleaseEvent(QMouseEvent* event);
const QPoint localMousePosition(QMouseEvent* event);
const QPoint snapToGrid(int x, int y);
signals: signals:
void updatedContents();
}; };
#endif // GRIDPREVIEW_H #endif // GRIDPREVIEW_H

6
line.h
View file

@ -5,6 +5,9 @@
class Line class Line
{ {
private:
int startX, startY, endX, endY;
QString color;
public: public:
Line(); Line();
void setStartPoint(int x, int y); void setStartPoint(int x, int y);
@ -16,9 +19,6 @@ public:
int getEndY(); int getEndY();
QString getColor(); QString getColor();
QString toLuaTable(); QString toLuaTable();
private:
int startX, startY, endX, endY;
QString color;
}; };
#endif // LINE_H #endif // LINE_H

View file

@ -6,9 +6,32 @@ MainWindow::MainWindow(QWidget *parent)
, ui(new Ui::MainWindow) , ui(new Ui::MainWindow)
{ {
ui->setupUi(this); ui->setupUi(this);
QObject::connect(ui->gridPreview, &GridPreview::updatedContents,
this, &MainWindow::onGridUpdated);
ui->gridPreview->updatedContents();
} }
MainWindow::~MainWindow() MainWindow::~MainWindow()
{ {
delete ui; delete ui;
} }
void MainWindow::onGridUpdated()
{
ui->textPreview->setPlainText(ui->gridPreview->toLuaTable());
ui->spinGridWidth->setValue(ui->gridPreview->getWidth());
ui->spinGridHeight->setValue(ui->gridPreview->getHeight());
}
void MainWindow::on_spinGridWidth_valueChanged(int arg1)
{
ui->gridPreview->setSize(arg1, ui->gridPreview->getHeight());
}
void MainWindow::on_spinGridHeight_valueChanged(int arg1)
{
ui->gridPreview->setSize(ui->gridPreview->getWidth(), arg1);
}

View file

@ -17,6 +17,14 @@ public:
MainWindow(QWidget *parent = nullptr); MainWindow(QWidget *parent = nullptr);
~MainWindow(); ~MainWindow();
public slots:
void onGridUpdated();
private slots:
void on_spinGridWidth_valueChanged(int arg1);
void on_spinGridHeight_valueChanged(int arg1);
private: private:
Ui::MainWindow *ui; Ui::MainWindow *ui;
}; };