general fixes

fixed some minor issues

Signed-off-by: Yuhang Zhao <2546789017@qq.com>
This commit is contained in:
Yuhang Zhao 2022-12-19 11:35:05 +08:00
parent c3fa2f6920
commit 840cf3060d
16 changed files with 136 additions and 84 deletions

View File

@ -16,11 +16,18 @@
#include <private/framelesswidgetshelper_p.h> #include <private/framelesswidgetshelper_p.h>
#include "../shared/settings.h" #include "../shared/settings.h"
extern template void Settings::set<QRect>(const QString &, const QString &, const QRect &);
extern template void Settings::set<qreal>(const QString &, const QString &, const qreal &);
extern template QRect Settings::get<QRect>(const QString &, const QString &);
extern template qreal Settings::get<qreal>(const QString &, const QString &);
FRAMELESSHELPER_USE_NAMESPACE FRAMELESSHELPER_USE_NAMESPACE
using namespace Global; using namespace Global;
FRAMELESSHELPER_STRING_CONSTANT(Geometry) FRAMELESSHELPER_STRING_CONSTANT(Geometry)
FRAMELESSHELPER_STRING_CONSTANT(DevicePixelRatio)
Dialog::Dialog(QWidget *parent) : FramelessDialog(parent) Dialog::Dialog(QWidget *parent) : FramelessDialog(parent)
{ {
@ -31,7 +38,10 @@ Dialog::~Dialog() = default;
void Dialog::closeEvent(QCloseEvent *event) void Dialog::closeEvent(QCloseEvent *event)
{ {
Settings::set({}, kGeometry, saveGeometry()); if (!parent()) {
Settings::set({}, kGeometry, geometry());
Settings::set({}, kDevicePixelRatio, devicePixelRatioF());
}
FramelessDialog::closeEvent(event); FramelessDialog::closeEvent(event);
} }
@ -123,11 +133,15 @@ void Dialog::setupUi()
// So apparently we can't use QWidget::setFixedWidth/Height/Size() here. // So apparently we can't use QWidget::setFixedWidth/Height/Size() here.
FramelessWidgetsHelperPrivate::get(helper)->setProperty(kDontOverrideCursorVar, true); FramelessWidgetsHelperPrivate::get(helper)->setProperty(kDontOverrideCursorVar, true);
connect(helper, &FramelessWidgetsHelper::ready, this, [this, helper](){ connect(helper, &FramelessWidgetsHelper::ready, this, [this, helper](){
const QByteArray data = Settings::get({}, kGeometry); const auto savedGeometry = Settings::get<QRect>({}, kGeometry);
if (data.isEmpty()) { if (savedGeometry.isValid() && !parent()) {
helper->moveWindowToDesktopCenter(); const auto savedDpr = Settings::get<qreal>({}, 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 { } else {
restoreGeometry(data); helper->moveWindowToDesktopCenter();
} }
}); });
} }

View File

@ -53,10 +53,5 @@ int main(int argc, char *argv[])
const auto dialog = std::make_unique<Dialog>(); const auto dialog = std::make_unique<Dialog>();
dialog->show(); dialog->show();
const int exec = QCoreApplication::exec(); return QCoreApplication::exec();
// Not necessary, but if you don't call it, there will be some small memory leaks.
FramelessHelper::Widgets::uninitialize();
return exec;
} }

View File

@ -53,10 +53,5 @@ int main(int argc, char *argv[])
const auto mainWindow = std::make_unique<MainWindow>(); const auto mainWindow = std::make_unique<MainWindow>();
mainWindow->show(); mainWindow->show();
const int exec = QCoreApplication::exec(); return QCoreApplication::exec();
// Not necessary, but if you don't call it, there will be some small memory leaks.
FramelessHelper::Widgets::uninitialize();
return exec;
} }

View File

@ -34,12 +34,21 @@
#include "../widget/widget.h" #include "../widget/widget.h"
#include "../dialog/dialog.h" #include "../dialog/dialog.h"
extern template void Settings::set<QRect>(const QString &, const QString &, const QRect &);
extern template void Settings::set<qreal>(const QString &, const QString &, const qreal &);
extern template void Settings::set<QByteArray>(const QString &, const QString &, const QByteArray &);
extern template QRect Settings::get<QRect>(const QString &, const QString &);
extern template qreal Settings::get<qreal>(const QString &, const QString &);
extern template QByteArray Settings::get<QByteArray>(const QString &, const QString &);
FRAMELESSHELPER_USE_NAMESPACE FRAMELESSHELPER_USE_NAMESPACE
using namespace Global; using namespace Global;
FRAMELESSHELPER_STRING_CONSTANT(Geometry) FRAMELESSHELPER_STRING_CONSTANT(Geometry)
FRAMELESSHELPER_STRING_CONSTANT(State) FRAMELESSHELPER_STRING_CONSTANT(State)
FRAMELESSHELPER_STRING_CONSTANT(DevicePixelRatio)
MainWindow::MainWindow(QWidget *parent, const Qt::WindowFlags flags) : FramelessMainWindow(parent, flags) MainWindow::MainWindow(QWidget *parent, const Qt::WindowFlags flags) : FramelessMainWindow(parent, flags)
{ {
@ -50,8 +59,11 @@ MainWindow::~MainWindow() = default;
void MainWindow::closeEvent(QCloseEvent *event) void MainWindow::closeEvent(QCloseEvent *event)
{ {
Settings::set({}, kGeometry, saveGeometry()); if (!parent()) {
Settings::set({}, kGeometry, geometry());
Settings::set({}, kState, saveState()); Settings::set({}, kState, saveState());
Settings::set({}, kDevicePixelRatio, devicePixelRatioF());
}
FramelessMainWindow::closeEvent(event); FramelessMainWindow::closeEvent(event);
} }
@ -94,15 +106,19 @@ QMenuBar::item:pressed {
helper->setSystemButton(m_titleBar->closeButton(), SystemButtonType::Close); helper->setSystemButton(m_titleBar->closeButton(), SystemButtonType::Close);
helper->setHitTestVisible(mb); // IMPORTANT! helper->setHitTestVisible(mb); // IMPORTANT!
connect(helper, &FramelessWidgetsHelper::ready, this, [this, helper](){ connect(helper, &FramelessWidgetsHelper::ready, this, [this, helper](){
const QByteArray geoData = Settings::get({}, kGeometry); const auto savedGeometry = Settings::get<QRect>({}, kGeometry);
const QByteArray stateData = Settings::get({}, kState); if (savedGeometry.isValid() && !parent()) {
if (geoData.isEmpty()) { const auto savedDpr = Settings::get<qreal>({}, kDevicePixelRatio);
helper->moveWindowToDesktopCenter(); // 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 { } else {
restoreGeometry(geoData); helper->moveWindowToDesktopCenter();
} }
if (!stateData.isEmpty()) { const QByteArray savedState = Settings::get<QByteArray>({}, kState);
restoreState(stateData); if (!savedState.isEmpty() && !parent()) {
restoreState(savedState);
} }
}); });

View File

@ -105,10 +105,5 @@ int main(int argc, char *argv[])
const auto mainWindow = std::make_unique<MainWindow>(); const auto mainWindow = std::make_unique<MainWindow>();
mainWindow->show(); mainWindow->show();
const int exec = QCoreApplication::exec(); return QCoreApplication::exec();
// Not necessary, but if you don't call it, there will be some small memory leaks.
FramelessHelper::Widgets::uninitialize();
return exec;
} }

View File

@ -31,11 +31,18 @@
#include <StandardSystemButton> #include <StandardSystemButton>
#include "../shared/settings.h" #include "../shared/settings.h"
extern template void Settings::set<QRect>(const QString &, const QString &, const QRect &);
extern template void Settings::set<qreal>(const QString &, const QString &, const qreal &);
extern template QRect Settings::get<QRect>(const QString &, const QString &);
extern template qreal Settings::get<qreal>(const QString &, const QString &);
FRAMELESSHELPER_USE_NAMESPACE FRAMELESSHELPER_USE_NAMESPACE
using namespace Global; using namespace Global;
FRAMELESSHELPER_STRING_CONSTANT(Geometry) FRAMELESSHELPER_STRING_CONSTANT(Geometry)
FRAMELESSHELPER_STRING_CONSTANT(DevicePixelRatio)
MainWindow::MainWindow(QWidget *parent) : FramelessWidget(parent) MainWindow::MainWindow(QWidget *parent) : FramelessWidget(parent)
{ {
@ -46,7 +53,10 @@ MainWindow::~MainWindow() = default;
void MainWindow::closeEvent(QCloseEvent *event) void MainWindow::closeEvent(QCloseEvent *event)
{ {
Settings::set({}, kGeometry, saveGeometry()); if (!parent()) {
Settings::set({}, kGeometry, geometry());
Settings::set({}, kDevicePixelRatio, devicePixelRatioF());
}
FramelessWidget::closeEvent(event); FramelessWidget::closeEvent(event);
} }
@ -71,11 +81,15 @@ void MainWindow::initialize()
helper->setSystemButton(m_titleBar->maximizeButton(), SystemButtonType::Maximize); helper->setSystemButton(m_titleBar->maximizeButton(), SystemButtonType::Maximize);
helper->setSystemButton(m_titleBar->closeButton(), SystemButtonType::Close); helper->setSystemButton(m_titleBar->closeButton(), SystemButtonType::Close);
connect(helper, &FramelessWidgetsHelper::ready, this, [this, helper](){ connect(helper, &FramelessWidgetsHelper::ready, this, [this, helper](){
const QByteArray data = Settings::get({}, kGeometry); const auto savedGeometry = Settings::get<QRect>({}, kGeometry);
if (data.isEmpty()) { if (savedGeometry.isValid() && !parent()) {
helper->moveWindowToDesktopCenter(); const auto savedDpr = Settings::get<qreal>({}, 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 { } else {
restoreGeometry(data); helper->moveWindowToDesktopCenter();
} }
}); });
} }

View File

@ -145,9 +145,5 @@ int main(int argc, char *argv[])
homePage->show(); homePage->show();
#endif #endif
const int exec = QCoreApplication::exec(); return QCoreApplication::exec();
FramelessHelper::Quick::uninitialize();
return exec;
} }

View File

@ -23,10 +23,16 @@
*/ */
#include "quicksettings.h" #include "quicksettings.h"
#include <QtCore/qdatastream.h>
#include "../shared/settings.h" #include "../shared/settings.h"
FRAMELESSHELPER_STRING_CONSTANT(Geometry) FRAMELESSHELPER_STRING_CONSTANT(Geometry)
FRAMELESSHELPER_STRING_CONSTANT(DevicePixelRatio)
extern template void Settings::set<QRect>(const QString &, const QString &, const QRect &);
extern template void Settings::set<qreal>(const QString &, const QString &, const qreal &);
extern template QRect Settings::get<QRect>(const QString &, const QString &);
extern template qreal Settings::get<qreal>(const QString &, const QString &);
QuickSettings::QuickSettings(QObject *parent) : QObject(parent) QuickSettings::QuickSettings(QObject *parent) : QObject(parent)
{ {
@ -40,11 +46,9 @@ void QuickSettings::saveGeometry(QWindow *window)
if (!window) { if (!window) {
return; return;
} }
QByteArray data = {}; const QString objName = window->objectName();
QDataStream stream(&data, QDataStream::WriteOnly); Settings::set(objName, kGeometry, window->geometry());
stream.setVersion(QDataStream::Qt_5_6); Settings::set(objName, kDevicePixelRatio, window->devicePixelRatio());
stream << window->geometry();
Settings::set(window->objectName(), kGeometry, data);
} }
bool QuickSettings::restoreGeometry(QWindow *window) bool QuickSettings::restoreGeometry(QWindow *window)
@ -53,17 +57,15 @@ bool QuickSettings::restoreGeometry(QWindow *window)
if (!window) { if (!window) {
return false; return false;
} }
const QByteArray data = Settings::get(window->objectName(), kGeometry); const QString objName = window->objectName();
if (data.isEmpty()) { const auto savedGeometry = Settings::get<QRect>(objName, kGeometry);
if (!savedGeometry.isValid()) {
return false; return false;
} }
QRect geometry = {}; const auto savedDpr = Settings::get<qreal>(objName, kDevicePixelRatio);
QDataStream stream(data); // Qt doesn't support dpi < 1.
stream.setVersion(QDataStream::Qt_5_6); const qreal oldDpr = std::max(savedDpr, qreal(1));
stream >> geometry; const qreal scale = (window->devicePixelRatio() / oldDpr);
if (!geometry.isValid()) { window->setGeometry({savedGeometry.topLeft() * scale, savedGeometry.size() * scale});
return false;
}
window->setGeometry(geometry);
return true; return true;
} }

View File

@ -26,6 +26,7 @@
#include <QtCore/qsettings.h> #include <QtCore/qsettings.h>
#include <QtCore/qcoreapplication.h> #include <QtCore/qcoreapplication.h>
#include <QtCore/qfileinfo.h> #include <QtCore/qfileinfo.h>
#include <QtCore/qrect.h>
#include <framelesshelpercore_global.h> #include <framelesshelpercore_global.h>
static std::unique_ptr<QSettings> g_settings = nullptr; static std::unique_ptr<QSettings> g_settings = nullptr;
@ -47,11 +48,11 @@ static std::unique_ptr<QSettings> g_settings = nullptr;
return (id.isEmpty() ? key : (id + u'/' + key)); return (id.isEmpty() ? key : (id + u'/' + key));
} }
void Settings::set(const QString &id, const QString &key, const QByteArray &data) template<typename T>
void Settings::set(const QString &id, const QString &key, const T &data)
{ {
Q_ASSERT(!key.isEmpty()); Q_ASSERT(!key.isEmpty());
Q_ASSERT(!data.isEmpty()); if (key.isEmpty()) {
if (key.isEmpty() || data.isEmpty()) {
return; return;
} }
if (!g_settings) { 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); g_settings->setValue(appKey(id, key), data);
} }
QByteArray Settings::get(const QString &id, const QString &key) template<typename T>
T Settings::get(const QString &id, const QString &key)
{ {
Q_ASSERT(!key.isEmpty()); Q_ASSERT(!key.isEmpty());
if (key.isEmpty()) { if (key.isEmpty()) {
return {}; return T{};
} }
if (!g_settings) { if (!g_settings) {
g_settings.reset(appConfigFile()); g_settings.reset(appConfigFile());
} }
return g_settings->value(appKey(id, key)).toByteArray(); return qvariant_cast<T>(g_settings->value(appKey(id, key)));
} }
template void Settings::set<QRect>(const QString &, const QString &, const QRect &);
template void Settings::set<qreal>(const QString &, const QString &, const qreal &);
template void Settings::set<QByteArray>(const QString &, const QString &, const QByteArray &);
template QRect Settings::get<QRect>(const QString &, const QString &);
template qreal Settings::get<qreal>(const QString &, const QString &);
template QByteArray Settings::get<QByteArray>(const QString &, const QString &);

View File

@ -28,6 +28,9 @@
namespace Settings namespace Settings
{ {
void set(const QString &id, const QString &key, const QByteArray &data); template<typename T>
[[nodiscard]] QByteArray get(const QString &id, const QString &key); void set(const QString &id, const QString &key, const T &data);
template<typename T>
[[nodiscard]] T get(const QString &id, const QString &key);
} // namespace Settings } // namespace Settings

View File

@ -58,10 +58,5 @@ int main(int argc, char *argv[])
window2->setObjectName(FRAMELESSHELPER_STRING_LITERAL("window2")); window2->setObjectName(FRAMELESSHELPER_STRING_LITERAL("window2"));
window2->show(); window2->show();
const int exec = QCoreApplication::exec(); return QCoreApplication::exec();
// Not necessary, but if you don't call it, there will be some small memory leaks.
FramelessHelper::Widgets::uninitialize();
return exec;
} }

View File

@ -39,11 +39,18 @@
#include <StandardSystemButton> #include <StandardSystemButton>
#include "../shared/settings.h" #include "../shared/settings.h"
extern template void Settings::set<QRect>(const QString &, const QString &, const QRect &);
extern template void Settings::set<qreal>(const QString &, const QString &, const qreal &);
extern template QRect Settings::get<QRect>(const QString &, const QString &);
extern template qreal Settings::get<qreal>(const QString &, const QString &);
FRAMELESSHELPER_USE_NAMESPACE FRAMELESSHELPER_USE_NAMESPACE
using namespace Global; using namespace Global;
FRAMELESSHELPER_STRING_CONSTANT(Geometry) FRAMELESSHELPER_STRING_CONSTANT(Geometry)
FRAMELESSHELPER_STRING_CONSTANT(DevicePixelRatio)
Widget::Widget(QWidget *parent) : FramelessWidget(parent) Widget::Widget(QWidget *parent) : FramelessWidget(parent)
{ {
@ -64,7 +71,11 @@ void Widget::timerEvent(QTimerEvent *event)
void Widget::closeEvent(QCloseEvent *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); FramelessWidget::closeEvent(event);
} }
@ -121,11 +132,16 @@ void Widget::initialize()
helper->setSystemButton(m_titleBar->maximizeButton(), SystemButtonType::Maximize); helper->setSystemButton(m_titleBar->maximizeButton(), SystemButtonType::Maximize);
helper->setSystemButton(m_titleBar->closeButton(), SystemButtonType::Close); helper->setSystemButton(m_titleBar->closeButton(), SystemButtonType::Close);
connect(helper, &FramelessWidgetsHelper::ready, this, [this, helper](){ connect(helper, &FramelessWidgetsHelper::ready, this, [this, helper](){
const QByteArray data = Settings::get(objectName(), kGeometry); const QString objName = objectName();
if (data.isEmpty()) { const auto savedGeometry = Settings::get<QRect>(objName, kGeometry);
helper->moveWindowToDesktopCenter(); if (savedGeometry.isValid() && !parent()) {
const auto savedDpr = Settings::get<qreal>(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 { } else {
restoreGeometry(data); helper->moveWindowToDesktopCenter();
} }
}); });
} }

View File

@ -631,7 +631,9 @@ Q_DECLARE_METATYPE(FRAMELESSHELPER_PREPEND_NAMESPACE(Global)::VersionInfo)
Q_DECLARE_METATYPE(FRAMELESSHELPER_PREPEND_NAMESPACE(Global)::Dpi); Q_DECLARE_METATYPE(FRAMELESSHELPER_PREPEND_NAMESPACE(Global)::Dpi);
#ifndef QT_NO_DEBUG_STREAM #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)::VersionNumber &);
FRAMELESSHELPER_CORE_API QDebug operator<<(QDebug, const FRAMELESSHELPER_PREPEND_NAMESPACE(Global)::VersionInfo &); FRAMELESSHELPER_CORE_API QDebug operator<<(QDebug, const FRAMELESSHELPER_PREPEND_NAMESPACE(Global)::VersionInfo &);
FRAMELESSHELPER_CORE_API QDebug operator<<(QDebug, const FRAMELESSHELPER_PREPEND_NAMESPACE(Global)::Dpi &); FRAMELESSHELPER_CORE_API QDebug operator<<(QDebug, const FRAMELESSHELPER_PREPEND_NAMESPACE(Global)::Dpi &);
QT_END_NAMESPACE
#endif // QT_NO_DEBUG_STREAM #endif // QT_NO_DEBUG_STREAM

View File

@ -254,6 +254,8 @@ function(deploy_qt_runtime arg_target)
endif() endif()
add_custom_command(TARGET ${arg_target} POST_BUILD COMMAND add_custom_command(TARGET ${arg_target} POST_BUILD COMMAND
"${QT_DEPLOY_EXECUTABLE}" "${QT_DEPLOY_EXECUTABLE}"
$<$<CONFIG:Debug>:--debug>
$<$<OR:$<CONFIG:MinSizeRel>,$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>:--release>
--libdir "$<TARGET_FILE_DIR:${arg_target}>" --libdir "$<TARGET_FILE_DIR:${arg_target}>"
--plugindir "$<TARGET_FILE_DIR:${arg_target}>/plugins" --plugindir "$<TARGET_FILE_DIR:${arg_target}>/plugins"
--no-translations --no-translations

View File

@ -71,6 +71,7 @@
#endif #endif
#ifndef QT_NO_DEBUG_STREAM #ifndef QT_NO_DEBUG_STREAM
QT_BEGIN_NAMESPACE
QDebug operator<<(QDebug d, const FRAMELESSHELPER_PREPEND_NAMESPACE(Global)::VersionNumber &ver) QDebug operator<<(QDebug d, const FRAMELESSHELPER_PREPEND_NAMESPACE(Global)::VersionNumber &ver)
{ {
const QDebugStateSaver saver(d); const QDebugStateSaver saver(d);
@ -108,6 +109,7 @@ QDebug operator<<(QDebug d, const FRAMELESSHELPER_PREPEND_NAMESPACE(Global)::Dpi
<< "scale factor: " << scaleFactor << ')'; << "scale factor: " << scaleFactor << ')';
return d; return d;
} }
QT_END_NAMESPACE
#endif // QT_NO_DEBUG_STREAM #endif // QT_NO_DEBUG_STREAM
FRAMELESSHELPER_BEGIN_NAMESPACE FRAMELESSHELPER_BEGIN_NAMESPACE

View File

@ -1229,15 +1229,10 @@ QColor Utils::getFrameBorderColor(const bool active)
if (!WindowsVersionHelper::isWin10OrGreater()) { if (!WindowsVersionHelper::isWin10OrGreater()) {
return (active ? kDefaultBlackColor : kDefaultDarkGrayColor); return (active ? kDefaultBlackColor : kDefaultDarkGrayColor);
} }
const bool dark = shouldAppsUseDarkMode();
if (active) { if (active) {
if (isFrameBorderColorized()) { return (isFrameBorderColorized() ? getDwmColorizationColor() : kDefaultTransparentColor);
return getDwmColorizationColor();
} else { } else {
return kDefaultFrameBorderActiveColor; return (shouldAppsUseDarkMode() ? kDefaultFrameBorderInactiveColorDark : kDefaultFrameBorderInactiveColorLight);
}
} else {
return (dark ? kDefaultFrameBorderInactiveColorDark : kDefaultFrameBorderInactiveColorLight);
} }
} }