From b944572204b614587d868bb7ad6ff17ba9c03c79 Mon Sep 17 00:00:00 2001 From: karlis <2995621482@qq.com> Date: Mon, 20 Mar 2023 21:12:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=A1=B9=E7=9B=AE=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E7=AE=A1=E7=90=86=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ArchitectureColoredPainting.vcxproj | 2 + ...rchitectureColoredPainting.vcxproj.filters | 6 +++ .../Editor/DataManager/ProjectDataManager.cpp | 38 +++++++++++++++++++ .../Editor/DataManager/ProjectDataManager.h | 30 +++++++++++++++ .../src/Editor/EditorWidgetItem.cpp | 11 +++++- .../src/Editor/EditorWidgetItem.h | 2 +- .../src/Editor/PreviewWindow.cpp | 21 ++++++++++ .../src/Editor/PreviewWindow.h | 9 +++++ 8 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 ArchitectureColoredPainting/src/Editor/DataManager/ProjectDataManager.cpp create mode 100644 ArchitectureColoredPainting/src/Editor/DataManager/ProjectDataManager.h diff --git a/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj b/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj index 7414c08..4041213 100644 --- a/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj +++ b/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj @@ -104,6 +104,7 @@ + @@ -202,6 +203,7 @@ + diff --git a/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj.filters b/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj.filters index 835a354..b43e857 100644 --- a/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj.filters +++ b/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj.filters @@ -258,6 +258,9 @@ Source Files + + Source Files + @@ -522,6 +525,9 @@ Header Files + + Header Files + diff --git a/ArchitectureColoredPainting/src/Editor/DataManager/ProjectDataManager.cpp b/ArchitectureColoredPainting/src/Editor/DataManager/ProjectDataManager.cpp new file mode 100644 index 0000000..1bddf5a --- /dev/null +++ b/ArchitectureColoredPainting/src/Editor/DataManager/ProjectDataManager.cpp @@ -0,0 +1,38 @@ +#include "ProjectDataManager.h" + +using namespace std; + +ProjectDataManager* ProjectDataManager::instance = nullptr; + +ProjectDataManager* ProjectDataManager::Instance() +{ + if (instance == nullptr) + instance = new ProjectDataManager(); + return instance; +} + +void ProjectDataManager::addProjectData(ProjectData data) +{ + projectDataList.push_back(data); +} + +void ProjectDataManager::setZoom(double x, double y, EditorWidgetItem* item) +{ + for (auto& data : projectDataList) { + if (data.item == item) { + data.zoomX = x; + data.zoomY = y; + return; + } + } +} + +QPointF ProjectDataManager::getZoomByPainterDeivce(QPaintDevice* device) +{ + for (auto& data : projectDataList) { + if (data.item->previewWindow == device) { + return QPointF(data.zoomX, data.zoomY); + } + } + return QPointF(1, 1); +} diff --git a/ArchitectureColoredPainting/src/Editor/DataManager/ProjectDataManager.h b/ArchitectureColoredPainting/src/Editor/DataManager/ProjectDataManager.h new file mode 100644 index 0000000..8c5ffbf --- /dev/null +++ b/ArchitectureColoredPainting/src/Editor/DataManager/ProjectDataManager.h @@ -0,0 +1,30 @@ +#pragma once +#include +#include +#include +#include +#include "EditorWidgetItem.h" + +struct ProjectData +{ + int width, height; + double zoomX, zoomY; + QString fileHome; + EditorWidgetItem* item; +}; + +class ProjectDataManager +{ +private: + std::vector projectDataList; + ProjectDataManager() = default; + ~ProjectDataManager() = default; + static ProjectDataManager* instance; + +public: + static ProjectDataManager* Instance(); + void addProjectData(ProjectData data); + void setZoom(double x, double y, EditorWidgetItem* item); + QPointF getZoomByPainterDeivce(QPaintDevice* device); +}; + diff --git a/ArchitectureColoredPainting/src/Editor/EditorWidgetItem.cpp b/ArchitectureColoredPainting/src/Editor/EditorWidgetItem.cpp index 2693b45..2f5b1e6 100644 --- a/ArchitectureColoredPainting/src/Editor/EditorWidgetItem.cpp +++ b/ArchitectureColoredPainting/src/Editor/EditorWidgetItem.cpp @@ -1,6 +1,8 @@ #include "EditorWidgetItem.h" #include "EditorWidget.h" +#include "DataManager/ProjectDataManager.h" #include +#include EditorWidgetItem::EditorWidgetItem(QString filePath,QWidget *parent) : QWidget(parent) { @@ -54,6 +56,14 @@ EditorWidgetItem::EditorWidgetItem(QString filePath,QWidget *parent) : QWidget(p QJsonDocument jsonDoc(QJsonDocument::fromJson(setting, &jError)); qDebug() << jsonDoc.object().value("height").toDouble(); qDebug() << jError.errorString(); + ProjectData data; + data.fileHome = QFileInfo(filePath).absolutePath(); + data.width = jsonDoc.object().value("height").toInt(); + data.height = jsonDoc.object().value("width").toInt(); + data.zoomX = 1.0; + data.zoomY = 1.0; + data.item = this; + ProjectDataManager::Instance()->addProjectData(data); // end test QJsonObject source = jsonDoc.object(); elementManager = new ElementManager(source,Renderer::ElementRenderer::instance()); @@ -79,7 +89,6 @@ EditorWidgetItem::EditorWidgetItem(QString filePath,QWidget *parent) : QWidget(p handleProjectNameChange(this->projectName); centralRefresh(); }); - } EditorWidgetItem::~EditorWidgetItem() diff --git a/ArchitectureColoredPainting/src/Editor/EditorWidgetItem.h b/ArchitectureColoredPainting/src/Editor/EditorWidgetItem.h index 409374a..d718423 100644 --- a/ArchitectureColoredPainting/src/Editor/EditorWidgetItem.h +++ b/ArchitectureColoredPainting/src/Editor/EditorWidgetItem.h @@ -16,7 +16,7 @@ class EditorWidgetItem : public QWidget { Q_OBJECT - private: + public: // DATA PART PreviewWindow *previewWindow; ElementManager *elementManager; diff --git a/ArchitectureColoredPainting/src/Editor/PreviewWindow.cpp b/ArchitectureColoredPainting/src/Editor/PreviewWindow.cpp index 410b8af..7745de2 100644 --- a/ArchitectureColoredPainting/src/Editor/PreviewWindow.cpp +++ b/ArchitectureColoredPainting/src/Editor/PreviewWindow.cpp @@ -14,6 +14,7 @@ PreviewWindow::PreviewWindow(QWidget *parent) : QOpenGLWidget(parent) painter->setRenderHint(QPainter::HighQualityAntialiasing); layerManager = nullptr; currentLayer = nullptr; + zoomStep = 0; backgroundColor = QColor(255, 255, 255, 255); } @@ -21,6 +22,7 @@ void PreviewWindow::initialize(LayerManager *layerManager,QSize windowSize) { this->logicalSize = windowSize; this->layerManager = layerManager; + this->setFixedSize(windowSize); } void PreviewWindow::show() @@ -49,6 +51,7 @@ void PreviewWindow::paintGL() glClearColor(backgroundColor.redF(), backgroundColor.greenF(), backgroundColor.blueF(), backgroundColor.alphaF()); glClear(GL_COLOR_BUFFER_BIT); painter->begin(this); + painter->setWindow(0, 0, logicalSize.width(), logicalSize.height()); painter->setRenderHint(QPainter::Antialiasing); painter->setRenderHint(QPainter::HighQualityAntialiasing); layerManager->paint(painter,this->size(),currentLayer); @@ -129,4 +132,22 @@ void PreviewWindow::setBackgroundColor(QColor color) { this->backgroundColor = color; this->repaint(); +} + +void PreviewWindow::wheelEvent(QWheelEvent* event) +{ + if (QApplication::keyboardModifiers() == Qt::ControlModifier) + { + if (event->delta() > 0 && zoomStep < ZOOM_STEP_MAX) + { + zoomStep++; + this->setFixedSize(logicalSize * (1 + zoomStep * ZOOM_RATE)); + } + else if(event->delta() < 0 && zoomStep > ZOOM_STEP_MIN) + { + zoomStep--; + this->setFixedSize(logicalSize * (1 + zoomStep * ZOOM_RATE)); + } + this->repaint(); + } } \ No newline at end of file diff --git a/ArchitectureColoredPainting/src/Editor/PreviewWindow.h b/ArchitectureColoredPainting/src/Editor/PreviewWindow.h index 4fd002d..1d7761a 100644 --- a/ArchitectureColoredPainting/src/Editor/PreviewWindow.h +++ b/ArchitectureColoredPainting/src/Editor/PreviewWindow.h @@ -16,6 +16,14 @@ class PreviewWindow : public QOpenGLWidget, protected QOpenGLFunctions Q_OBJECT private: + constexpr static double ZOOM_RATE = 0.25; + constexpr static double ZOOM_DEFAULT = 1.0; + constexpr static int ZOOM_STEP_MIN = -2; + constexpr static int ZOOM_STEP_MAX = 4; + + + private: + int zoomStep; QPainter *painter; LayerManager *layerManager; Renderer::ElementRenderer* renderer; @@ -27,6 +35,7 @@ class PreviewWindow : public QOpenGLWidget, protected QOpenGLFunctions void mousePressEvent(QMouseEvent* event) override; void mouseMoveEvent(QMouseEvent* event) override; void mouseReleaseEvent(QMouseEvent* event) override; + void wheelEvent(QWheelEvent* event) override; public: PreviewWindow(QWidget *parent = nullptr);