diff --git a/Canvas.cpp b/Canvas.cpp index 579c3db..b185cad 100644 --- a/Canvas.cpp +++ b/Canvas.cpp @@ -29,40 +29,13 @@ Canvas::Canvas(QWidget* parent) sys = System(); setMouseTracking(true); setBackgroundRole(QPalette::Base); + setFocusPolicy(Qt::StrongFocus); setAutoFillBackground(true); } Canvas::~Canvas() { - // Очистка динамически выделенной памяти - - for (double* param : params) { - delete param; - } - - for (Point* pt : points) { - delete pt; - } - - for (Line* line : lines) { - delete line; - } - - // Очистка контейнеров - params.clear(); - points.clear(); - lines.clear(); - - parallelPairs.clear(); - P2Ppairs.clear(); - VERT_pairs.clear(); - HORIZ_pairs.clear(); - - // Очистка временных указателей - if (current_line) - delete current_line; - if (firstPoint) - delete firstPoint; + clearCanvas(); } // =================================================================== @@ -661,6 +634,77 @@ void Canvas::paintEvent(QPaintEvent* event) } } +void Canvas::keyPressEvent(QKeyEvent* event) +{ + switch (event->key()) { + case Qt::Key_Delete: + case Qt::Key_Clear: { + QMessageBox::StandardButton reply; + reply = QMessageBox::question(this, + "Очистка canvas", + "Удалить все объекты и ограничения?", + QMessageBox::Yes | QMessageBox::No); + + if (reply == QMessageBox::Yes) { + clearCanvas(); + } + break; + } + + case Qt::Key_Escape: { + // Отмена текущего действия + if (mode == Mode::DrawingLine && current_line) { + // Отмена рисования линии + delete current_line; + current_line = nullptr; + + // Удаляем созданные точки и параметры + if (points.size() >= 2) { + delete points.back(); + points.pop_back(); + delete points.back(); + points.pop_back(); + } + if (params.size() >= 4) { + delete params.back(); + params.pop_back(); + delete params.back(); + params.pop_back(); + delete params.back(); + params.pop_back(); + delete params.back(); + params.pop_back(); + } + mode = Mode::None; + update(); + } + else if (mode != Mode::None) { + // Отмена любого другого режима + mode = Mode::None; + current_line = nullptr; + firstPoint = nullptr; + update(); + } + break; + } + + case Qt::Key_Z: { + if (event->modifiers() & Qt::ControlModifier) { + // Ctrl+Z - отмена последнего ограничения + if (constraints_count > 0) { + remove_constraint(constraints_count - 1); + constraints_count--; + solve_for_canvas(); + } + } + break; + } + + default: + QWidget::keyPressEvent(event); + } +} + void Canvas::leaveEvent(QEvent* event) { Q_UNUSED(event); @@ -735,4 +779,66 @@ void Canvas::solve_for_canvas() } after_constraint = false; update(); +} + +// =================================================================== +// Очистка всего canvas +// =================================================================== + +void Canvas::clearCanvas() +{ + // Очистка солвера + sys.clear(); + + // Очистка динамически выделенной памяти + for (double* param : params) { + delete param; + } + + for (Point* pt : points) { + delete pt; + } + + for (Line* line : lines) { + delete line; + } + + // Очистка контейнеров + params.clear(); + points.clear(); + lines.clear(); + + // Очистка контейнеров ограничений + parallelPairs.clear(); + P2Ppairs.clear(); + VERT_pairs.clear(); + HORIZ_pairs.clear(); + perpendicularPairs.clear(); + + // Очистка информации об ограничениях + C_Info.clear(); + + // Сброс счетчиков + obj_count = 0; + constraints_count = 0; + + // Очистка временных указателей + if (current_line) { + delete current_line; + current_line = nullptr; + } + + if (firstPoint) { + delete firstPoint; + firstPoint = nullptr; + } + + draggedPoint = nullptr; + draggedLine = nullptr; + + // Сброс режима + mode = Mode::None; + + // Обновление отображения + update(); } \ No newline at end of file diff --git a/Canvas.h b/Canvas.h index fc2bfb2..a6b996a 100644 --- a/Canvas.h +++ b/Canvas.h @@ -6,6 +6,7 @@ constexpr auto EPS = 1e-9; #include #include #include +#include #ifdef _DEBUG #include @@ -59,6 +60,7 @@ protected: void mouseMoveEvent(QMouseEvent* event) override; void mouseReleaseEvent(QMouseEvent* event) override; void paintEvent(QPaintEvent* event) override; + void keyPressEvent(QKeyEvent* event); void leaveEvent(QEvent* event) override; private: @@ -148,4 +150,5 @@ private: std::map C_Info; void solve_for_canvas(); + void clearCanvas(); }; \ No newline at end of file