From 6ee70bc29702b5ec49e285d5418975e8c640b62e Mon Sep 17 00:00:00 2001 From: Mentalflow <312902918@qq.com> Date: Fri, 5 Apr 2024 14:27:17 +0800 Subject: [PATCH] RibbonTitleBar and RibbonWindow: Update for windows and improve window manager. --- lib_source/qml/RibbonTitleBar.qml | 2 +- lib_source/qml/RibbonWindow.qml | 59 +++++++++++++++---------------- lib_source/ribbonui.cpp | 4 +-- lib_source/ribbonui.h | 1 + 4 files changed, 33 insertions(+), 33 deletions(-) diff --git a/lib_source/qml/RibbonTitleBar.qml b/lib_source/qml/RibbonTitleBar.qml index ce67baf..ffde36a 100644 --- a/lib_source/qml/RibbonTitleBar.qml +++ b/lib_source/qml/RibbonTitleBar.qml @@ -6,7 +6,7 @@ import RibbonUI Item { id: control height: 30 - property int minimumWidth: title_text.implicitWidth + left_container.width + right_container.width + (Qt.platform.os === "osx" ? 65 : 0) + 40 + property int minimumWidth: title_text.implicitWidth + Math.max(left_container.width, right_container.width) * 2 + (Qt.platform.os === "osx" ? 65 : 0) + 20 property string title: Window.window.title property bool show_style_switch: true property bool show_darkmode_btn: true diff --git a/lib_source/qml/RibbonWindow.qml b/lib_source/qml/RibbonWindow.qml index d87d187..5a10de5 100644 --- a/lib_source/qml/RibbonWindow.qml +++ b/lib_source/qml/RibbonWindow.qml @@ -4,11 +4,13 @@ import org.wangwenx190.FramelessHelper Window { id:window + minimumWidth: title_bar.minimumWidth default property alias content: container.data property alias window_items: window_items property alias title_bar: titleBar property alias popup: pop property bool comfirmed_quit: false + property var sub_windows: ({}) visible: false color: { if (FramelessHelper.blurBehindWindowEnabled) { @@ -75,8 +77,8 @@ Window { anchors.fill: parent color: 'transparent' border.color: RibbonTheme.dark_mode ? "#7A7A7A" : "#2C59B7" - border.width: RibbonTheme.modern_style ? 1 : 0 - radius: 10 + border.width: RibbonTheme.modern_style ? Qt.platform.os === 'windows' ? 2 : 1 : 0 + radius: Qt.platform.os === 'windows' ? 8 : 10 visible: RibbonTheme.modern_style } RibbonPopup{ @@ -111,38 +113,35 @@ Window { close_dialog.open() } - Loader{ - id: window_loader - property var args - onLoaded: { - item.onClosing.connect(function(){ - window_loader.source = "" - }) - if (!window_loader.args) - return - else if(Object.keys(window_loader.args).length){ - for (let arg in window_loader.args){ - item[arg] = window_loader.args[arg] + function show_window(window_url, args){ + if (sub_windows.hasOwnProperty(window_url)) + { + if (args && Object.keys(args).length) + { + for (let arg in args){ + sub_windows[window_url][arg] = args[arg] } } - else{ - console.error("RibbonWindow: Arguments error, please check.") + if (!sub_windows[window_url].visible) + { + sub_windows[window_url].show() } - item.show() + sub_windows[window_url].raise() + sub_windows[window_url].requestActivate() + return } - } - - function show_window(window_url, args){ - if (window_url === window_loader.source && window_loader.status === Loader.Ready) - window_loader.item.raise() - else - window_loader.source = window_url - if (args !== window_loader.args && Object.keys(window_loader.args).length && window_loader.status === Loader.Ready) - { - window_loader.args = args - for (let arg in window_loader.args){ - window_loader.item[arg] = window_loader.args[arg] - } + var component = Qt.createComponent(window_url, Component.PreferSynchronous, undefined); + if (component.status === Component.Ready) { + var window = component.createObject(undefined, args); + sub_windows[window_url] = window + window.onClosing.connect(function() { + window.destroy() + delete sub_windows[window_url] + }); + window.raise() + window.requestActivate() + } else if (component.status === Component.Error) { + console.error("RibbonWindow: Error loading Window:", component.errorString()) } } diff --git a/lib_source/ribbonui.cpp b/lib_source/ribbonui.cpp index 27d3e90..8bd73c5 100644 --- a/lib_source/ribbonui.cpp +++ b/lib_source/ribbonui.cpp @@ -1,5 +1,6 @@ #include "ribbonui.h" #include +#include #define STR(x) #x #define JOIN(a,b,c) STR(a.b.c) #define VER_JOIN(x) JOIN x @@ -9,6 +10,7 @@ RibbonUI::RibbonUI(QQuickItem *parent) { _version = VER_JOIN((RIBBONUI_VERSION)); _qt_version = QString(qVersion()).replace('.',"").toInt(); + _is_win11 = QOperatingSystemVersion::current() >= QOperatingSystemVersion(QOperatingSystemVersion::Windows, 10, 0, 22000); } RibbonUI* RibbonUI::instance(){ @@ -26,9 +28,7 @@ void RibbonUI::init() { qputenv("QT_QUICK_CONTROLS_STYLE","Basic"); FramelessHelper::Quick::initialize(); -#ifdef Q_OS_WIN FramelessConfig::instance()->set(Global::Option::ForceHideWindowFrameBorder); -#endif FramelessConfig::instance()->set(Global::Option::DisableLazyInitializationForMicaMaterial); FramelessConfig::instance()->set(Global::Option::CenterWindowBeforeShow); FramelessConfig::instance()->set(Global::Option::EnableBlurBehindWindow); diff --git a/lib_source/ribbonui.h b/lib_source/ribbonui.h index 60c82e6..c3b4634 100644 --- a/lib_source/ribbonui.h +++ b/lib_source/ribbonui.h @@ -15,6 +15,7 @@ class RibbonUI : public QQuickItem QML_NAMED_ELEMENT(RibbonUI) Q_PROPERTY_R(QString, version) Q_PROPERTY_R(int, qt_version) + Q_PROPERTY_R(int, is_win11) public: static RibbonUI* instance(); static RibbonUI* create(QQmlEngine *qmlEngine, QJSEngine *jsEngine){return instance();}