diff --git a/LVGLCore.cpp b/LVGLCore.cpp index 9843d7f..3df7de0 100644 --- a/LVGLCore.cpp +++ b/LVGLCore.cpp @@ -15,7 +15,7 @@ QLVGL lvgl(nullptr); #include "LVGLObject.h" -static void lvgl_core_flush_cb(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p) +void lvgl_core_flush_cb(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p) { QLVGL *self = reinterpret_cast(disp->user_data); self->dispFlush(disp, area, color_p); @@ -133,9 +133,9 @@ void QLVGL::init(int width, int height) //lv_log_register_print_cb(lvgl_print_cb); } -bool QLVGL::changeResolution(lv_coord_t width, lv_coord_t height) +bool QLVGL::changeResolution(QSize size) { - const uint32_t n = static_cast(width * height); + const uint32_t n = static_cast(size.width() * size.height()); if (n != m_disp_buf.size) { m_disp_framebuffer.resize(n); m_buf1.resize(n); @@ -143,8 +143,8 @@ bool QLVGL::changeResolution(lv_coord_t width, lv_coord_t height) lv_disp_buf_init(&m_disp_buf, m_buf1.data(), m_buf2.data(), n); } - m_disp_drv.hor_res = static_cast(width); - m_disp_drv.ver_res = static_cast(height); + m_disp_drv.hor_res = static_cast(size.width()); + m_disp_drv.ver_res = static_cast(size.height()); lv_disp_drv_update(lv_disp_get_default(), &m_disp_drv); return false; @@ -170,7 +170,7 @@ QPixmap QLVGL::grab(const QRect ®ion) const QImage img(region.width(), region.height(), QImage::Format_ARGB32); for (auto y = 0; y < region.height(); ++y) memcpy(img.scanLine(y + region.y()), - &m_disp_framebuffer[y * stride + region.x()], + &m_disp_framebuffer[static_cast(y * stride + region.x())], static_cast(stride) * 4 ); return QPixmap::fromImage(img); diff --git a/LVGLCore.h b/LVGLCore.h index ae45a60..09c9215 100644 --- a/LVGLCore.h +++ b/LVGLCore.h @@ -25,7 +25,7 @@ public: void init(int width, int height); - bool changeResolution(lv_coord_t width, lv_coord_t height); + bool changeResolution(QSize size); QPixmap framebuffer() const; QPixmap grab(const QRect ®ion) const; @@ -117,9 +117,9 @@ private: lv_style_t m_screen_style; const LVGLFontData *m_defaultFont; - QVector m_disp_framebuffer; - QVector m_buf1; - QVector m_buf2; + std::vector m_disp_framebuffer; + std::vector m_buf1; + std::vector m_buf2; lv_disp_buf_t m_disp_buf; lv_disp_drv_t m_disp_drv; diff --git a/LVGLNewDialog.cpp b/LVGLNewDialog.cpp index b7d5483..e75cc1a 100644 --- a/LVGLNewDialog.cpp +++ b/LVGLNewDialog.cpp @@ -43,14 +43,14 @@ QString LVGLNewDialog::selectedName() const return m_ui->edit_name->text(); } -QPair LVGLNewDialog::selectedResolution() const +QSize LVGLNewDialog::selectedResolution() const { - lv_coord_t w = static_cast(m_ui->spin_width->value()); - lv_coord_t h = static_cast(m_ui->spin_height->value()); + int w = m_ui->spin_width->value(); + int h = m_ui->spin_height->value(); if (m_ui->radio_portrait->isChecked()) qSwap(w, h); - return qMakePair(w, h); + return QSize(w, h); } void LVGLNewDialog::accept() diff --git a/LVGLNewDialog.h b/LVGLNewDialog.h index 6ad6f60..f9fa15e 100644 --- a/LVGLNewDialog.h +++ b/LVGLNewDialog.h @@ -18,7 +18,7 @@ public: virtual ~LVGLNewDialog() override; QString selectedName() const; - QPair selectedResolution() const; + QSize selectedResolution() const; public slots: virtual void accept() override; diff --git a/LVGLProject.cpp b/LVGLProject.cpp index b2ba85c..372afcb 100644 --- a/LVGLProject.cpp +++ b/LVGLProject.cpp @@ -15,11 +15,13 @@ LVGLProject::LVGLProject() : m_name("App") + , m_resolution(LV_HOR_RES_MAX, LV_VER_RES_MAX) { } -LVGLProject::LVGLProject(const QString &name) +LVGLProject::LVGLProject(const QString &name, QSize resolution) : m_name(name) + , m_resolution(resolution) { } @@ -28,6 +30,11 @@ QString LVGLProject::name() const return m_name; } +QSize LVGLProject::resolution() const +{ + return m_resolution; +} + LVGLProject *LVGLProject::load(const QString &fileName) { QFile file(fileName); @@ -42,6 +49,14 @@ LVGLProject *LVGLProject::load(const QString &fileName) if (!lvglObj.contains("widgets")) return nullptr; + QSize resolution; + if (lvglObj.contains("resolution")) { + QJsonObject res = lvglObj["resolution"].toObject(); + resolution = QSize(res["width"].toInt(), res["height"].toInt()); + } else { + resolution = QSize(LV_HOR_RES_MAX, LV_VER_RES_MAX); + } + QJsonArray imageArr = doc["images"].toArray(); for (int i = 0; i < imageArr.size(); ++i) { LVGLImageData *img = new LVGLImageData(imageArr[i].toObject()); @@ -62,7 +77,7 @@ LVGLProject *LVGLProject::load(const QString &fileName) LVGLObject::parse(object, nullptr); } - return new LVGLProject(lvglObj["name"].toString()); + return new LVGLProject(lvglObj["name"].toString(), resolution); } bool LVGLProject::save(const QString &fileName) const @@ -90,8 +105,12 @@ bool LVGLProject::save(const QString &fileName) const for (const LVGLFontData *f:lvgl.customFonts()) fontArr.append(f->toJson()); + QJsonObject resolution({{"width", m_resolution.width()}, + {"height", m_resolution.height()} + }); QJsonObject screen({{"widgets", widgetArr}, - {"name", m_name} + {"name", m_name}, + {"resolution", resolution} }); if (lvgl.screenColorChanged()) screen.insert("screen color", QVariant(lvgl.screenColor()).toString()); diff --git a/LVGLProject.h b/LVGLProject.h index c3a404b..a1e90b2 100644 --- a/LVGLProject.h +++ b/LVGLProject.h @@ -2,14 +2,16 @@ #define LVGLPROJECT_H #include +#include class LVGLProject { public: LVGLProject(); - LVGLProject(const QString &name); + LVGLProject(const QString &name, QSize resolution); QString name() const; + QSize resolution() const; static LVGLProject *load(const QString &fileName); bool save(const QString &fileName) const; @@ -17,6 +19,7 @@ public: private: QString m_name; + QSize m_resolution; }; diff --git a/LVGLSimulator.cpp b/LVGLSimulator.cpp index c7090a9..3db853f 100644 --- a/LVGLSimulator.cpp +++ b/LVGLSimulator.cpp @@ -146,9 +146,9 @@ void LVGLSimulator::setMouseEnable(bool enable) m_mouseEnabled = enable; } -void LVGLSimulator::changeResolution(lv_coord_t width, lv_coord_t height) +void LVGLSimulator::changeResolution(QSize size) { - m_scene->setSceneRect(0, 0, width, height); + m_scene->setSceneRect(0, 0, size.width(), size.height()); } void LVGLSimulator::mousePressEvent(QMouseEvent *event) diff --git a/LVGLSimulator.h b/LVGLSimulator.h index 7a32321..0ac9ee7 100644 --- a/LVGLSimulator.h +++ b/LVGLSimulator.h @@ -50,7 +50,7 @@ public slots: void setZoomLevel(int level); void clear(); void setMouseEnable(bool enable); - void changeResolution(lv_coord_t width, lv_coord_t height); + void changeResolution(QSize size); signals: void objectSelected(LVGLObject *obj); diff --git a/MainWindow.cpp b/MainWindow.cpp index f4d6485..f592b8f 100644 --- a/MainWindow.cpp +++ b/MainWindow.cpp @@ -168,7 +168,7 @@ void MainWindow::loadRecent() { QAction *action = qobject_cast(QObject::sender()); if (action == nullptr) return; - loadUI(action->data().toString()); + loadProject(action->data().toString()); } void MainWindow::openNewProject() @@ -176,14 +176,14 @@ void MainWindow::openNewProject() LVGLNewDialog dialog(this); if (dialog.exec() == QDialog::Accepted) { delete m_project; - m_project = new LVGLProject(dialog.selectedName()); + m_project = new LVGLProject(dialog.selectedName(), dialog.selectedResolution()); m_ui->simulation->clear(); setEnableBuilder(true); setWindowTitle("LVGL Builder - [" + m_project->name() + "]"); const auto res = dialog.selectedResolution(); - lvgl.changeResolution(res.first, res.second); - m_ui->simulation->changeResolution(res.first, res.second); - } else { + lvgl.changeResolution(res); + m_ui->simulation->changeResolution(res); + } else if (m_project == nullptr) { setEnableBuilder(false); setWindowTitle("LVGL Builder"); } @@ -265,7 +265,7 @@ void MainWindow::adjustForCurrentFile(const QString &fileName) updateRecentActionList(); } -void MainWindow::loadUI(const QString &fileName) +void MainWindow::loadProject(const QString &fileName) { delete m_project; m_ui->simulation->clear(); @@ -277,6 +277,8 @@ void MainWindow::loadUI(const QString &fileName) } else { adjustForCurrentFile(fileName); setWindowTitle("LVGL Builder - [" + m_project->name() + "]"); + lvgl.changeResolution(m_project->resolution()); + m_ui->simulation->changeResolution(m_project->resolution()); setEnableBuilder(true); } updateImages(); @@ -299,7 +301,7 @@ void MainWindow::on_action_load_triggered() QString fileName = QFileDialog::getOpenFileName(this, "Load lvgl", "", "LVGL (*.lvgl)"); if (fileName.isEmpty()) return; - loadUI(fileName); + loadProject(fileName); } void MainWindow::on_action_save_triggered() diff --git a/MainWindow.h b/MainWindow.h index fdf4be6..58dec80 100644 --- a/MainWindow.h +++ b/MainWindow.h @@ -58,7 +58,7 @@ private: void updateRecentActionList(); void adjustForCurrentFile(const QString &fileName); - void loadUI(const QString &fileName); + void loadProject(const QString &fileName); void setEnableBuilder(bool enable); Ui::MainWindow *m_ui;