/
polytech_kolomna
/
aipackaging
Обзор
Документация
Войти
/
polytech_kolomna
/
aipackaging
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
FigureGenerator
src/gui/qtview.cpp
356 строк
9 KB
Olegh
lower case
28 окт 2025, 20:44
28 окт 2025, 20:44
bc1a1ea
Код
Авторство
О чём код?
#include <QMenuBar> #include <QMessageBox> #include <QFileDialog> #include <QMouseEvent> #include <QPainter> #include <QPaintDevice> #include <QWidget> #include <QKeyEvent> #include <QWheelEvent> #include <changestaterequestevent.h> #include <actionevent.h> #include <qtadapters.h> #include <event.h> #include <savefileevent.h> #include <loadfileevent.h> #include <undoevent.h> #include <redoevent.h> #include <scenewheelevent.h> #include <scenepaintevent.h> #include <scenemouseevent.h> #include <painter.h> #include <packagingwidget.h> #include <qtview.h> //------------------------------------------------------------------------------ /** \brief Конструктор \details Инициализирует виджеты, соединяет сигналы */ //--- QtView::QtView(): QMainWindow(nullptr), zoomFactor_(1) { QMenu* file = menuBar()->addMenu(tr("Файл")); QMenu* edit = menuBar()->addMenu(tr("Правка")); open_ = file->addAction(tr("Открыть")); save_ = file->addAction(tr("Сохранить")); saveAs_ = file->addAction(tr("Сохранить как")); undo_ = edit->addAction(tr("Отменить")); redo_ = edit->addAction(tr("Повторить")); open_->setShortcut(QKeySequence::Open); save_->setShortcut(QKeySequence::Save); saveAs_->setShortcut(QKeySequence::SaveAs); undo_->setShortcut(QKeySequence::Undo); redo_->setShortcut(QKeySequence::Redo); PackagingWidget* packagingWidget = new PackagingWidget(this); setCentralWidget(packagingWidget); connect(packagingWidget, &PackagingWidget::mainSceneQPainterCreated, this, &QtView::sendMainSceneQPainter); connect(packagingWidget, &PackagingWidget::generateSceneQPainterCreated, this, &QtView::sendGenerateSceneQPainter); connect(packagingWidget, &PackagingWidget::mainSceneMouseEventCreated, this, &QtView::sendMainSceneMouseEvent); connect(packagingWidget, &PackagingWidget::requestSave, this, &QtView::generateSaveFileEvent); connect(packagingWidget, &PackagingWidget::requestLoad, this, &QtView::generateLoadFileEvent); connect(open_, &QAction::triggered, this, &QtView::generateLoadFileEvent); connect(saveAs_, &QAction::triggered, this, &QtView::generateSaveFileEvent); connect(undo_, &QAction::triggered, this, &QtView::generateUndoEvent); connect(redo_, &QAction::triggered, this, &QtView::generateRedoEvent); } //------------------------------------------------------------------------------ /** Включить/Отключить кнопки в редакторе */ //--- void QtView::setActionEnabled(PackagingAction action, bool isEnabled) { switch (action) { case PackagingAction::Load: open_->setEnabled(isEnabled); break; case PackagingAction::Save: save_->setEnabled(isEnabled); break; case PackagingAction::SaveAs: saveAs_->setEnabled(isEnabled); break; case PackagingAction::Undo: undo_->setEnabled(isEnabled); break; case PackagingAction::Redo: redo_->setEnabled(isEnabled); break; } } //------------------------------------------------------------------------------ /** Узнать о том, включены/отключены ли кнопки в редакторе */ //--- bool QtView::isActionEnabled(PackagingAction action) const { switch (action) { case PackagingAction::Load: return open_->isEnabled(); case PackagingAction::Save: return save_->isEnabled(); case PackagingAction::SaveAs: return saveAs_->isEnabled(); case PackagingAction::Undo: return undo_->isEnabled(); case PackagingAction::Redo: return redo_->isEnabled(); } } //------------------------------------------------------------------------------ /** Открыть диалог сохранения текущего состояния приложения */ //--- std::string QtView::openSaveFileDialog(const std::string& title, const std::string& initPath, const std::string& filter) { return QFileDialog::getSaveFileName(this, title.c_str(), initPath.c_str(), filter.c_str()).toStdString(); } //------------------------------------------------------------------------------ /** Открыть диалог загрузки состояния приложения */ //--- std::string QtView::openLoadFileDialog(const std::string& title, const std::string& initPath, const std::string& filter) { return QFileDialog::getOpenFileName(this, title.c_str(), initPath.c_str(), filter.c_str()).toStdString(); } //------------------------------------------------------------------------------ /** Показать пользователю сообщение выбранного типа */ //--- void QtView::showMessage(const std::string& title, const std::string& message, MessageType type) { switch (type) { case MessageType::Info: QMessageBox::information(this, title.c_str(), message.c_str()); break; case MessageType::Error: QMessageBox::critical(this, title.c_str(), message.c_str()); break; case MessageType::Warning: QMessageBox::warning(this, title.c_str(), message.c_str()); break; } } //------------------------------------------------------------------------------ /** Запрос перерисовки у сцены */ //--- void QtView::requestRedraw() { update(); } //------------------------------------------------------------------------------ /** Добавить слушателя событий */ //--- void QtView::addEventListener(std::shared_ptr<EventListener> listener) { listeners_.push_back(std::move(listener)); } //------------------------------------------------------------------------------ /** Удалить слушателя событий */ //--- void QtView::removeEventListener(std::shared_ptr<EventListener> listener) { std::erase(listeners_, std::move(listener)); } // void QtView::setZoomFactor(double factor) { zoomFactor_ = factor; } // double QtView::zoomFactor() const { return zoomFactor_; } //------------------------------------------------------------------------------ /** Отправляет событие отрисовки основной сцены */ //--- void QtView::sendMainSceneQPainter(QPainter& qpainter) { Painter painter(qpainter); const Rect2D region = QtAdapters::fromQtRect(static_cast<QWidget*>(qpainter.device())->rect()); qpainter.scale(zoomFactor_, zoomFactor_); ScenePaintEvent paintEv(painter, ScenePaint::Main, region); // Отправляем ивент отрисовки sendEvent(paintEv); } //------------------------------------------------------------------------------ /** Отправляет событие отрисовки сцены генерации объектов */ //--- void QtView::sendGenerateSceneQPainter(QPainter& qpainter) { Painter painter(qpainter); const Rect2D region = QtAdapters::fromQtRect(static_cast<QWidget*>(qpainter.device())->rect()); ScenePaintEvent paintEv(painter, ScenePaint::Generate, region); // Отправляем ивент отрисовки sendEvent(paintEv); } //------------------------------------------------------------------------------ /** Отправляет событие связанное с мышью */ //--- void QtView::sendMainSceneMouseEvent(QMouseEvent* event) { Point2D localPos = QtAdapters::fromQtPoint(event->localPos()); MouseButton button = QtAdapters::fromQtMouseButton(event->buttons()); switch (event->type()) { case QEvent::MouseButtonPress: sendEvent(SceneMouseEvent(EventType::MousePress, localPos, button)); break; case QEvent::MouseMove: sendEvent(SceneMouseEvent(EventType::MouseMove, localPos, button)); break; case QEvent::MouseButtonRelease: sendEvent(SceneMouseEvent(EventType::MouseRelease, localPos, button)); break; } // Обязательно помечаем ивент как обработанный event->accept(); } //------------------------------------------------------------------------------ /** Генерирует событие сохранения */ //--- void QtView::generateSaveFileEvent() { sendEvent(SaveFileEvent()); } //------------------------------------------------------------------------------ /** Генерирует событие загрузки */ //--- void QtView::generateLoadFileEvent() { sendEvent(LoadFileEvent()); } //------------------------------------------------------------------------------ /** Генерирует событие отмены */ //--- void QtView::generateUndoEvent() { sendEvent(UndoEvent()); } //------------------------------------------------------------------------------ /** Генерирует событие повторения */ //--- void QtView::generateRedoEvent() { sendEvent(RedoEvent()); } //------------------------------------------------------------------------------ /** Генерирует событие нажатия кнопок */ //--- void QtView::keyPressEvent(QKeyEvent* event) { QMainWindow::keyPressEvent(event); switch (event->key()) { case Qt::Key_W: sendEvent(ActionEvent(Action::Up)); break; case Qt::Key_S: sendEvent(ActionEvent(Action::Down)); break; case Qt::Key_D: sendEvent(ActionEvent(Action::Right)); break; case Qt::Key_A: sendEvent(ActionEvent(Action::Left)); break; case Qt::Key_R: sendEvent(ActionEvent(Action::Rotate)); break; } } //------------------------------------------------------------------------------ /** Отправляет событие слушателям */ //--- void QtView::sendEvent(const Event& event) { for (auto& listener : listeners_) listener->onEvent(event); }