diff --git a/Canvas.cpp b/Canvas.cpp index d3e9b89..ddb260c 100644 --- a/Canvas.cpp +++ b/Canvas.cpp @@ -76,11 +76,11 @@ void Canvas::changeMode(Mode _mode) // Методы поиска и проверки // =================================================================== -Line* Canvas::findAt(QPointF& pos) +Line* Canvas::findAt(QPointF& pos, qreal tolerance) { // TODO: реализовать проверку, находится ли точка на линии for (Line* line : lines) { - if (line->contains(pos)) { + if (line->contains(pos, tolerance)) { return line; } } @@ -186,7 +186,7 @@ void Canvas::remove_constraints() void Canvas::mousePressEvent(QMouseEvent* event) { - QPointF scene = event->pos(); + QPointF scene = UCS_POSITION; #ifdef _DEBUG qDebug() << "Scene point in" << scene.x() << scene.y(); @@ -373,9 +373,9 @@ void Canvas::mousePressEvent(QMouseEvent* event) } else { // Линии уже параллельны - сообщаем об ошибке -#ifdef _DEBUG + #ifdef _DEBUG qDebug() << "Line" << current_line << "and" << found << "are parallel. Abort!"; -#endif + #endif QMessageBox::warning(this, QString("Wrong"), @@ -449,7 +449,7 @@ void Canvas::mouseMoveEvent(QMouseEvent* event) { // ====================== Перемещение точки ====================== if (draggedPoint) { - QPointF pos = event->pos() - dragOffset; + QPointF pos = UCS_POSITION - dragOffset; // Обновляем все связанные точки (совпадающие, горизонтальные, вертикальные) for (Point* pair : points) { @@ -472,7 +472,7 @@ void Canvas::mouseMoveEvent(QMouseEvent* event) // ====================== Перемещение линии ====================== else if (draggedLine) { - QPointF newCenter = event->pos() - dragOffset; + QPointF newCenter = UCS_POSITION - dragOffset; QPointF oldCenter( (*draggedLine->p1.x + *draggedLine->p2.x) / 2.0, (*draggedLine->p1.y + *draggedLine->p2.y) / 2.0 @@ -499,9 +499,12 @@ void Canvas::mouseMoveEvent(QMouseEvent* event) } } } - update(); } + #ifdef _DEBUG + else + showObjectTag(WIDGET_POSITION); + #endif } void Canvas::mouseReleaseEvent(QMouseEvent* event) @@ -529,6 +532,12 @@ void Canvas::paintEvent(QPaintEvent* event) QPainter p(this); p.setRenderHint(QPainter::Antialiasing, true); + p.translate(width() / 2.0, height() / 2.0); + + p.setPen(Qt::red); + p.drawLine(-5, 0, 5, 0); + p.drawLine(0, -5, 0, 5); + // ====================== Решение системы уравнений ====================== if (!params.empty()) { @@ -587,4 +596,25 @@ void Canvas::paintEvent(QPaintEvent* event) p.setPen(Qt::NoPen); p.drawEllipse(QPointF(*current_line->p1.x, *current_line->p1.y), 6, 6); } -} \ No newline at end of file +} + +#ifdef _DEBUG +void Canvas::showObjectTag(QPointF pos) +{ + QPointF l = screenToLogical(pos); + Line* lineUnderCursor = findAt(l, 2.0); + if (lineUnderCursor && lineUnderCursor != draggedLine) { + QString Text = QString("Tag Line: %1").arg(lineUnderCursor->get_tag()); + QToolTip::showText(mapToGlobal(pos.toPoint()), Text, this); + } +} +#endif + +QPointF Canvas::screenToLogical(const QPointF& screenPos) const +{ + QPointF logical = screenPos; + logical.rx() -= width() / 2.0; + logical.ry() -= height() / 2.0; + + return logical; +} diff --git a/Canvas.h b/Canvas.h index d39d906..e01429c 100644 --- a/Canvas.h +++ b/Canvas.h @@ -1,9 +1,13 @@ #pragma once +#define WIDGET_POSITION event->pos() +#define UCS_POSITION screenToLogical(WIDGET_POSITION) + #include #include #include #include +#include #ifdef _DEBUG #include @@ -58,10 +62,16 @@ protected: void paintEvent(QPaintEvent* event) override; private: + +#ifdef _DEBUG + void showObjectTag(QPointF pos); +#endif + + QPointF screenToLogical(const QPointF& screenPos) const; // ====================== Методы поиска и выбора ====================== /// Найти линию под указанной позицией - Line* findAt(QPointF& position); + Line* findAt(QPointF& pos, qreal tolerance = 5.0); /// Найти точку в указанной позиции с заданной точностью Point* findPointAt(QPointF position, qreal tolerance = 5.0); diff --git a/GCS/Geo.h b/GCS/Geo.h index 7c513b0..42e183d 100644 --- a/GCS/Geo.h +++ b/GCS/Geo.h @@ -239,7 +239,7 @@ public: void set_tag(int); int get_tag(); - bool contains(QPointF, qreal tol = 5.0) const; + bool contains(QPointF, qreal tol) const; };