diff --git a/Canvas.cpp b/Canvas.cpp index 36824ae..6d42e04 100644 --- a/Canvas.cpp +++ b/Canvas.cpp @@ -52,7 +52,15 @@ void Canvas::mousePressEvent(QMouseEvent* event) qDebug() << "Scene point in" << scene.x() << scene.y(); #endif - if (mode == Mode::DrawingLine) { + if (mode == Mode::None){ + Point* p = findPointAt(scene); + if (p) { + draggedPoint = p; + dragOffset = scene - QPointF(*p->x, *p->y); + return; + } + } + else if (mode == Mode::DrawingLine) { if (!current_line) { current_line = new Line(); current_line->set_tag(obj_count); @@ -101,6 +109,7 @@ void Canvas::mousePressEvent(QMouseEvent* event) current_line = nullptr; mode = Mode::None; obj_count++; + after_constraint = true; } update(); return; @@ -133,6 +142,7 @@ void Canvas::mousePressEvent(QMouseEvent* event) current_line = nullptr; update(); mode = Mode::None; + after_constraint = true; } else { @@ -189,11 +199,30 @@ void Canvas::mousePressEvent(QMouseEvent* event) sys.addConstraintP2PCoincident(*firstPoint, *clickedPoint, constraints_count++); firstPoint = nullptr; mode = Mode::None; + after_constraint = true; update(); return; } } +void Canvas::mouseMoveEvent(QMouseEvent* event) +{ + if (draggedPoint) { + QPointF pos = event->pos() - dragOffset; + *draggedPoint->x = pos.x(); + *draggedPoint->y = pos.y(); + update(); + } +} + +void Canvas::mouseReleaseEvent(QMouseEvent* event) +{ + if (draggedPoint) { + draggedPoint = nullptr; + update(); + } +} + void Canvas::paintEvent(QPaintEvent*) { QPainter p(this); @@ -205,10 +234,12 @@ void Canvas::paintEvent(QPaintEvent*) if (res == SolveStatus::Success || res == SolveStatus::Converged) { sys.applySolution(); } - else { + else if (res == SolveStatus::Failed && after_constraint){ + QMessageBox::warning(this, QString("Error!"), QString("Last constraint is unavailable!")); sys.removeConstraint(sys.get_last_constraint()); constraints_count--; } + after_constraint = false; } for (Line* line : lines) { diff --git a/Canvas.h b/Canvas.h index 87c2f6d..330d47f 100644 --- a/Canvas.h +++ b/Canvas.h @@ -41,6 +41,8 @@ public: protected: void mousePressEvent(QMouseEvent* event) override; + void mouseMoveEvent(QMouseEvent* event) override; + void mouseReleaseEvent(QMouseEvent* event) override; void paintEvent(QPaintEvent* event) override; private: @@ -52,6 +54,10 @@ private: LinePair makeOrderedPair(Line* l1, Line* l2); bool areAlreadyParallel(Line* l1, Line* l2); // проверка на дубликат + // ====================== Перемещение ====================== + Point* draggedPoint{ nullptr }; + QPointF dragOffset; + // ====================== Данные сцены ====================== System sys; // геометрический солвер QVector lines; // завершённые линии @@ -63,6 +69,7 @@ private: Line* current_line{ nullptr }; Point* firstPoint{ nullptr }; Mode mode{ Mode::None }; + bool after_constraint{ false }; int obj_count{ 0 }; // тег для новых объектов int constraints_count{ 0 }; // тег для новых ограничений