From 840cf3060d45e3f39c1bf03174c69efcb02eb311 Mon Sep 17 00:00:00 2001 From: Yuhang Zhao <2546789017@qq.com> Date: Mon, 19 Dec 2022 11:35:05 +0800 Subject: [PATCH] general fixes fixed some minor issues Signed-off-by: Yuhang Zhao <2546789017@qq.com> --- examples/dialog/dialog.cpp | 24 ++++++++++--- examples/dialog/main.cpp | 7 +--- examples/mainwindow/main.cpp | 7 +--- examples/mainwindow/mainwindow.cpp | 34 ++++++++++++++----- examples/openglwidget/main.cpp | 7 +--- examples/openglwidget/mainwindow.cpp | 24 ++++++++++--- examples/quick/main.cpp | 6 +--- examples/quick/quicksettings.cpp | 34 ++++++++++--------- examples/shared/settings.cpp | 22 ++++++++---- examples/shared/settings.h | 7 ++-- examples/widget/main.cpp | 7 +--- examples/widget/widget.cpp | 26 +++++++++++--- .../Core/framelesshelpercore_global.h | 2 ++ src/core/cmakehelper.cmake | 2 ++ src/core/framelesshelpercore_global.cpp | 2 ++ src/core/utils_win.cpp | 9 ++--- 16 files changed, 136 insertions(+), 84 deletions(-) diff --git a/examples/dialog/dialog.cpp b/examples/dialog/dialog.cpp index 6689a64..dfd3a60 100644 --- a/examples/dialog/dialog.cpp +++ b/examples/dialog/dialog.cpp @@ -16,11 +16,18 @@ #include #include "../shared/settings.h" +extern template void Settings::set(const QString &, const QString &, const QRect &); +extern template void Settings::set(const QString &, const QString &, const qreal &); + +extern template QRect Settings::get(const QString &, const QString &); +extern template qreal Settings::get(const QString &, const QString &); + FRAMELESSHELPER_USE_NAMESPACE using namespace Global; FRAMELESSHELPER_STRING_CONSTANT(Geometry) +FRAMELESSHELPER_STRING_CONSTANT(DevicePixelRatio) Dialog::Dialog(QWidget *parent) : FramelessDialog(parent) { @@ -31,7 +38,10 @@ Dialog::~Dialog() = default; void Dialog::closeEvent(QCloseEvent *event) { - Settings::set({}, kGeometry, saveGeometry()); + if (!parent()) { + Settings::set({}, kGeometry, geometry()); + Settings::set({}, kDevicePixelRatio, devicePixelRatioF()); + } FramelessDialog::closeEvent(event); } @@ -123,11 +133,15 @@ void Dialog::setupUi() // So apparently we can't use QWidget::setFixedWidth/Height/Size() here. FramelessWidgetsHelperPrivate::get(helper)->setProperty(kDontOverrideCursorVar, true); connect(helper, &FramelessWidgetsHelper::ready, this, [this, helper](){ - const QByteArray data = Settings::get({}, kGeometry); - if (data.isEmpty()) { - helper->moveWindowToDesktopCenter(); + const auto savedGeometry = Settings::get({}, kGeometry); + if (savedGeometry.isValid() && !parent()) { + const auto savedDpr = Settings::get({}, kDevicePixelRatio); + // Qt doesn't support dpi < 1. + const qreal oldDpr = std::max(savedDpr, qreal(1)); + const qreal scale = (devicePixelRatioF() / oldDpr); + setGeometry({savedGeometry.topLeft() * scale, savedGeometry.size() * scale}); } else { - restoreGeometry(data); + helper->moveWindowToDesktopCenter(); } }); } diff --git a/examples/dialog/main.cpp b/examples/dialog/main.cpp index 1d38f11..8cbacdb 100644 --- a/examples/dialog/main.cpp +++ b/examples/dialog/main.cpp @@ -53,10 +53,5 @@ int main(int argc, char *argv[]) const auto dialog = std::make_unique(); dialog->show(); - const int exec = QCoreApplication::exec(); - - // Not necessary, but if you don't call it, there will be some small memory leaks. - FramelessHelper::Widgets::uninitialize(); - - return exec; + return QCoreApplication::exec(); } diff --git a/examples/mainwindow/main.cpp b/examples/mainwindow/main.cpp index 0cb4162..e24353b 100644 --- a/examples/mainwindow/main.cpp +++ b/examples/mainwindow/main.cpp @@ -53,10 +53,5 @@ int main(int argc, char *argv[]) const auto mainWindow = std::make_unique(); mainWindow->show(); - const int exec = QCoreApplication::exec(); - - // Not necessary, but if you don't call it, there will be some small memory leaks. - FramelessHelper::Widgets::uninitialize(); - - return exec; + return QCoreApplication::exec(); } diff --git a/examples/mainwindow/mainwindow.cpp b/examples/mainwindow/mainwindow.cpp index 060e1b6..c45df6c 100644 --- a/examples/mainwindow/mainwindow.cpp +++ b/examples/mainwindow/mainwindow.cpp @@ -34,12 +34,21 @@ #include "../widget/widget.h" #include "../dialog/dialog.h" +extern template void Settings::set(const QString &, const QString &, const QRect &); +extern template void Settings::set(const QString &, const QString &, const qreal &); +extern template void Settings::set(const QString &, const QString &, const QByteArray &); + +extern template QRect Settings::get(const QString &, const QString &); +extern template qreal Settings::get(const QString &, const QString &); +extern template QByteArray Settings::get(const QString &, const QString &); + FRAMELESSHELPER_USE_NAMESPACE using namespace Global; FRAMELESSHELPER_STRING_CONSTANT(Geometry) FRAMELESSHELPER_STRING_CONSTANT(State) +FRAMELESSHELPER_STRING_CONSTANT(DevicePixelRatio) MainWindow::MainWindow(QWidget *parent, const Qt::WindowFlags flags) : FramelessMainWindow(parent, flags) { @@ -50,8 +59,11 @@ MainWindow::~MainWindow() = default; void MainWindow::closeEvent(QCloseEvent *event) { - Settings::set({}, kGeometry, saveGeometry()); - Settings::set({}, kState, saveState()); + if (!parent()) { + Settings::set({}, kGeometry, geometry()); + Settings::set({}, kState, saveState()); + Settings::set({}, kDevicePixelRatio, devicePixelRatioF()); + } FramelessMainWindow::closeEvent(event); } @@ -94,15 +106,19 @@ QMenuBar::item:pressed { helper->setSystemButton(m_titleBar->closeButton(), SystemButtonType::Close); helper->setHitTestVisible(mb); // IMPORTANT! connect(helper, &FramelessWidgetsHelper::ready, this, [this, helper](){ - const QByteArray geoData = Settings::get({}, kGeometry); - const QByteArray stateData = Settings::get({}, kState); - if (geoData.isEmpty()) { - helper->moveWindowToDesktopCenter(); + const auto savedGeometry = Settings::get({}, kGeometry); + if (savedGeometry.isValid() && !parent()) { + const auto savedDpr = Settings::get({}, kDevicePixelRatio); + // Qt doesn't support dpi < 1. + const qreal oldDpr = std::max(savedDpr, qreal(1)); + const qreal scale = (devicePixelRatioF() / oldDpr); + setGeometry({savedGeometry.topLeft() * scale, savedGeometry.size() * scale}); } else { - restoreGeometry(geoData); + helper->moveWindowToDesktopCenter(); } - if (!stateData.isEmpty()) { - restoreState(stateData); + const QByteArray savedState = Settings::get({}, kState); + if (!savedState.isEmpty() && !parent()) { + restoreState(savedState); } }); diff --git a/examples/openglwidget/main.cpp b/examples/openglwidget/main.cpp index 72ded5c..8e79b24 100644 --- a/examples/openglwidget/main.cpp +++ b/examples/openglwidget/main.cpp @@ -105,10 +105,5 @@ int main(int argc, char *argv[]) const auto mainWindow = std::make_unique(); mainWindow->show(); - const int exec = QCoreApplication::exec(); - - // Not necessary, but if you don't call it, there will be some small memory leaks. - FramelessHelper::Widgets::uninitialize(); - - return exec; + return QCoreApplication::exec(); } diff --git a/examples/openglwidget/mainwindow.cpp b/examples/openglwidget/mainwindow.cpp index fdfca8f..00eb7b9 100644 --- a/examples/openglwidget/mainwindow.cpp +++ b/examples/openglwidget/mainwindow.cpp @@ -31,11 +31,18 @@ #include #include "../shared/settings.h" +extern template void Settings::set(const QString &, const QString &, const QRect &); +extern template void Settings::set(const QString &, const QString &, const qreal &); + +extern template QRect Settings::get(const QString &, const QString &); +extern template qreal Settings::get(const QString &, const QString &); + FRAMELESSHELPER_USE_NAMESPACE using namespace Global; FRAMELESSHELPER_STRING_CONSTANT(Geometry) +FRAMELESSHELPER_STRING_CONSTANT(DevicePixelRatio) MainWindow::MainWindow(QWidget *parent) : FramelessWidget(parent) { @@ -46,7 +53,10 @@ MainWindow::~MainWindow() = default; void MainWindow::closeEvent(QCloseEvent *event) { - Settings::set({}, kGeometry, saveGeometry()); + if (!parent()) { + Settings::set({}, kGeometry, geometry()); + Settings::set({}, kDevicePixelRatio, devicePixelRatioF()); + } FramelessWidget::closeEvent(event); } @@ -71,11 +81,15 @@ void MainWindow::initialize() helper->setSystemButton(m_titleBar->maximizeButton(), SystemButtonType::Maximize); helper->setSystemButton(m_titleBar->closeButton(), SystemButtonType::Close); connect(helper, &FramelessWidgetsHelper::ready, this, [this, helper](){ - const QByteArray data = Settings::get({}, kGeometry); - if (data.isEmpty()) { - helper->moveWindowToDesktopCenter(); + const auto savedGeometry = Settings::get({}, kGeometry); + if (savedGeometry.isValid() && !parent()) { + const auto savedDpr = Settings::get({}, kDevicePixelRatio); + // Qt doesn't support dpi < 1. + const qreal oldDpr = std::max(savedDpr, qreal(1)); + const qreal scale = (devicePixelRatioF() / oldDpr); + setGeometry({savedGeometry.topLeft() * scale, savedGeometry.size() * scale}); } else { - restoreGeometry(data); + helper->moveWindowToDesktopCenter(); } }); } diff --git a/examples/quick/main.cpp b/examples/quick/main.cpp index 4d8ce64..8534a4d 100644 --- a/examples/quick/main.cpp +++ b/examples/quick/main.cpp @@ -145,9 +145,5 @@ int main(int argc, char *argv[]) homePage->show(); #endif - const int exec = QCoreApplication::exec(); - - FramelessHelper::Quick::uninitialize(); - - return exec; + return QCoreApplication::exec(); } diff --git a/examples/quick/quicksettings.cpp b/examples/quick/quicksettings.cpp index 74b813a..c58e1ea 100644 --- a/examples/quick/quicksettings.cpp +++ b/examples/quick/quicksettings.cpp @@ -23,10 +23,16 @@ */ #include "quicksettings.h" -#include #include "../shared/settings.h" FRAMELESSHELPER_STRING_CONSTANT(Geometry) +FRAMELESSHELPER_STRING_CONSTANT(DevicePixelRatio) + +extern template void Settings::set(const QString &, const QString &, const QRect &); +extern template void Settings::set(const QString &, const QString &, const qreal &); + +extern template QRect Settings::get(const QString &, const QString &); +extern template qreal Settings::get(const QString &, const QString &); QuickSettings::QuickSettings(QObject *parent) : QObject(parent) { @@ -40,11 +46,9 @@ void QuickSettings::saveGeometry(QWindow *window) if (!window) { return; } - QByteArray data = {}; - QDataStream stream(&data, QDataStream::WriteOnly); - stream.setVersion(QDataStream::Qt_5_6); - stream << window->geometry(); - Settings::set(window->objectName(), kGeometry, data); + const QString objName = window->objectName(); + Settings::set(objName, kGeometry, window->geometry()); + Settings::set(objName, kDevicePixelRatio, window->devicePixelRatio()); } bool QuickSettings::restoreGeometry(QWindow *window) @@ -53,17 +57,15 @@ bool QuickSettings::restoreGeometry(QWindow *window) if (!window) { return false; } - const QByteArray data = Settings::get(window->objectName(), kGeometry); - if (data.isEmpty()) { + const QString objName = window->objectName(); + const auto savedGeometry = Settings::get(objName, kGeometry); + if (!savedGeometry.isValid()) { return false; } - QRect geometry = {}; - QDataStream stream(data); - stream.setVersion(QDataStream::Qt_5_6); - stream >> geometry; - if (!geometry.isValid()) { - return false; - } - window->setGeometry(geometry); + const auto savedDpr = Settings::get(objName, kDevicePixelRatio); + // Qt doesn't support dpi < 1. + const qreal oldDpr = std::max(savedDpr, qreal(1)); + const qreal scale = (window->devicePixelRatio() / oldDpr); + window->setGeometry({savedGeometry.topLeft() * scale, savedGeometry.size() * scale}); return true; } diff --git a/examples/shared/settings.cpp b/examples/shared/settings.cpp index a72b04e..7b62485 100644 --- a/examples/shared/settings.cpp +++ b/examples/shared/settings.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include static std::unique_ptr g_settings = nullptr; @@ -47,11 +48,11 @@ static std::unique_ptr g_settings = nullptr; return (id.isEmpty() ? key : (id + u'/' + key)); } -void Settings::set(const QString &id, const QString &key, const QByteArray &data) +template +void Settings::set(const QString &id, const QString &key, const T &data) { Q_ASSERT(!key.isEmpty()); - Q_ASSERT(!data.isEmpty()); - if (key.isEmpty() || data.isEmpty()) { + if (key.isEmpty()) { return; } if (!g_settings) { @@ -60,14 +61,23 @@ void Settings::set(const QString &id, const QString &key, const QByteArray &data g_settings->setValue(appKey(id, key), data); } -QByteArray Settings::get(const QString &id, const QString &key) +template +T Settings::get(const QString &id, const QString &key) { Q_ASSERT(!key.isEmpty()); if (key.isEmpty()) { - return {}; + return T{}; } if (!g_settings) { g_settings.reset(appConfigFile()); } - return g_settings->value(appKey(id, key)).toByteArray(); + return qvariant_cast(g_settings->value(appKey(id, key))); } + +template void Settings::set(const QString &, const QString &, const QRect &); +template void Settings::set(const QString &, const QString &, const qreal &); +template void Settings::set(const QString &, const QString &, const QByteArray &); + +template QRect Settings::get(const QString &, const QString &); +template qreal Settings::get(const QString &, const QString &); +template QByteArray Settings::get(const QString &, const QString &); diff --git a/examples/shared/settings.h b/examples/shared/settings.h index 8d80378..ef56db0 100644 --- a/examples/shared/settings.h +++ b/examples/shared/settings.h @@ -28,6 +28,9 @@ namespace Settings { - void set(const QString &id, const QString &key, const QByteArray &data); - [[nodiscard]] QByteArray get(const QString &id, const QString &key); + template + void set(const QString &id, const QString &key, const T &data); + + template + [[nodiscard]] T get(const QString &id, const QString &key); } // namespace Settings diff --git a/examples/widget/main.cpp b/examples/widget/main.cpp index 834c274..758e5a5 100644 --- a/examples/widget/main.cpp +++ b/examples/widget/main.cpp @@ -58,10 +58,5 @@ int main(int argc, char *argv[]) window2->setObjectName(FRAMELESSHELPER_STRING_LITERAL("window2")); window2->show(); - const int exec = QCoreApplication::exec(); - - // Not necessary, but if you don't call it, there will be some small memory leaks. - FramelessHelper::Widgets::uninitialize(); - - return exec; + return QCoreApplication::exec(); } diff --git a/examples/widget/widget.cpp b/examples/widget/widget.cpp index 482c108..2d2998d 100644 --- a/examples/widget/widget.cpp +++ b/examples/widget/widget.cpp @@ -39,11 +39,18 @@ #include #include "../shared/settings.h" +extern template void Settings::set(const QString &, const QString &, const QRect &); +extern template void Settings::set(const QString &, const QString &, const qreal &); + +extern template QRect Settings::get(const QString &, const QString &); +extern template qreal Settings::get(const QString &, const QString &); + FRAMELESSHELPER_USE_NAMESPACE using namespace Global; FRAMELESSHELPER_STRING_CONSTANT(Geometry) +FRAMELESSHELPER_STRING_CONSTANT(DevicePixelRatio) Widget::Widget(QWidget *parent) : FramelessWidget(parent) { @@ -64,7 +71,11 @@ void Widget::timerEvent(QTimerEvent *event) void Widget::closeEvent(QCloseEvent *event) { - Settings::set(objectName(), kGeometry, saveGeometry()); + if (!parent()) { + const QString objName = objectName(); + Settings::set(objName, kGeometry, geometry()); + Settings::set(objName, kDevicePixelRatio, devicePixelRatioF()); + } FramelessWidget::closeEvent(event); } @@ -121,11 +132,16 @@ void Widget::initialize() helper->setSystemButton(m_titleBar->maximizeButton(), SystemButtonType::Maximize); helper->setSystemButton(m_titleBar->closeButton(), SystemButtonType::Close); connect(helper, &FramelessWidgetsHelper::ready, this, [this, helper](){ - const QByteArray data = Settings::get(objectName(), kGeometry); - if (data.isEmpty()) { - helper->moveWindowToDesktopCenter(); + const QString objName = objectName(); + const auto savedGeometry = Settings::get(objName, kGeometry); + if (savedGeometry.isValid() && !parent()) { + const auto savedDpr = Settings::get(objName, kDevicePixelRatio); + // Qt doesn't support dpi < 1. + const qreal oldDpr = std::max(savedDpr, qreal(1)); + const qreal scale = (devicePixelRatioF() / oldDpr); + setGeometry({savedGeometry.topLeft() * scale, savedGeometry.size() * scale}); } else { - restoreGeometry(data); + helper->moveWindowToDesktopCenter(); } }); } diff --git a/include/FramelessHelper/Core/framelesshelpercore_global.h b/include/FramelessHelper/Core/framelesshelpercore_global.h index 0c52260..98e78a9 100644 --- a/include/FramelessHelper/Core/framelesshelpercore_global.h +++ b/include/FramelessHelper/Core/framelesshelpercore_global.h @@ -631,7 +631,9 @@ Q_DECLARE_METATYPE(FRAMELESSHELPER_PREPEND_NAMESPACE(Global)::VersionInfo) Q_DECLARE_METATYPE(FRAMELESSHELPER_PREPEND_NAMESPACE(Global)::Dpi); #ifndef QT_NO_DEBUG_STREAM +QT_BEGIN_NAMESPACE FRAMELESSHELPER_CORE_API QDebug operator<<(QDebug, const FRAMELESSHELPER_PREPEND_NAMESPACE(Global)::VersionNumber &); FRAMELESSHELPER_CORE_API QDebug operator<<(QDebug, const FRAMELESSHELPER_PREPEND_NAMESPACE(Global)::VersionInfo &); FRAMELESSHELPER_CORE_API QDebug operator<<(QDebug, const FRAMELESSHELPER_PREPEND_NAMESPACE(Global)::Dpi &); +QT_END_NAMESPACE #endif // QT_NO_DEBUG_STREAM diff --git a/src/core/cmakehelper.cmake b/src/core/cmakehelper.cmake index d3cef71..5a967a6 100644 --- a/src/core/cmakehelper.cmake +++ b/src/core/cmakehelper.cmake @@ -254,6 +254,8 @@ function(deploy_qt_runtime arg_target) endif() add_custom_command(TARGET ${arg_target} POST_BUILD COMMAND "${QT_DEPLOY_EXECUTABLE}" + $<$:--debug> + $<$,$,$>:--release> --libdir "$" --plugindir "$/plugins" --no-translations diff --git a/src/core/framelesshelpercore_global.cpp b/src/core/framelesshelpercore_global.cpp index c2744b2..a003f2a 100644 --- a/src/core/framelesshelpercore_global.cpp +++ b/src/core/framelesshelpercore_global.cpp @@ -71,6 +71,7 @@ #endif #ifndef QT_NO_DEBUG_STREAM +QT_BEGIN_NAMESPACE QDebug operator<<(QDebug d, const FRAMELESSHELPER_PREPEND_NAMESPACE(Global)::VersionNumber &ver) { const QDebugStateSaver saver(d); @@ -108,6 +109,7 @@ QDebug operator<<(QDebug d, const FRAMELESSHELPER_PREPEND_NAMESPACE(Global)::Dpi << "scale factor: " << scaleFactor << ')'; return d; } +QT_END_NAMESPACE #endif // QT_NO_DEBUG_STREAM FRAMELESSHELPER_BEGIN_NAMESPACE diff --git a/src/core/utils_win.cpp b/src/core/utils_win.cpp index 219b5a2..b295b90 100644 --- a/src/core/utils_win.cpp +++ b/src/core/utils_win.cpp @@ -1229,15 +1229,10 @@ QColor Utils::getFrameBorderColor(const bool active) if (!WindowsVersionHelper::isWin10OrGreater()) { return (active ? kDefaultBlackColor : kDefaultDarkGrayColor); } - const bool dark = shouldAppsUseDarkMode(); if (active) { - if (isFrameBorderColorized()) { - return getDwmColorizationColor(); - } else { - return kDefaultFrameBorderActiveColor; - } + return (isFrameBorderColorized() ? getDwmColorizationColor() : kDefaultTransparentColor); } else { - return (dark ? kDefaultFrameBorderInactiveColorDark : kDefaultFrameBorderInactiveColorLight); + return (shouldAppsUseDarkMode() ? kDefaultFrameBorderInactiveColorDark : kDefaultFrameBorderInactiveColorLight); } }