diff --git a/qml/main.qml b/qml/main.qml index b333a21..61453ea 100644 --- a/qml/main.qml +++ b/qml/main.qml @@ -26,7 +26,6 @@ Item { clip: true property int animationDuration: menuSetting.get("animationDuration") - property var normalGeometry: mainWindow.normalScreenSize() property double transparency: mainWindow.transparency property bool onComlpeted: false @@ -41,7 +40,7 @@ Item { if (mainWindow.isFullScreen) { normalHide.start(); fullShow.start(); - backgroundMask.state = "fullScreen"; + enterFullScreenAnimation.start(); if (root.transparency <= 0.6) { maskHide.start(); } @@ -51,7 +50,7 @@ Item { function exitFullScreen() { normalShow.start(); fullHide.start(); - backgroundMask.state = "normalScreen"; + exitFullScreenAnimation.start(); if (root.transparency <= 0.6) { maskShow.start(); } @@ -69,16 +68,67 @@ Item { } } + QtObject { + id: normalScreenGeometry + property var normalGeometry: mainWindow.normalScreenSize() + property int normalScreenX: normalScreenMargin + property int normalScreenY: root.height - normalGeometry.height - normalScreenMargin + property int normalScreenMargin: 8 + property bool isFullScreen: mainWindow.isFullScreen + + onIsFullScreenChanged: { + switch (mainWindow.panelPos) { + case 0 : + normalScreenX = normalScreenMargin; + normalScreenY = root.height - normalGeometry.height - normalScreenMargin; + break; + case 1 : + normalScreenX = normalScreenMargin; + normalScreenY = normalScreenMargin; + break; + case 2 : + normalScreenX = normalScreenMargin; + normalScreenY = normalScreenMargin; + break; + case 3 : + normalScreenX = root.width - normalGeometry.width - normalScreenMargin; + normalScreenY = normalScreenMargin; + break; + default : + normalScreenX = normalScreenMargin; + normalScreenY = root.height - normalGeometry.height - normalScreenMargin; + break; + } + } + } + AppControls2.StyleBackground { id: backgroundMask - anchors.left: parent.left - anchors.bottom: parent.bottom + // 初始状态默认为normalScreen + x: 0; y: 0 + height: normalScreenGeometry.normalGeometry.height + width: normalScreenGeometry.normalGeometry.width radius: 12 - state: mainWindow.isFullScreen ? "fullScreen" : "normalScreen" - onHeightChanged: { + onHeightChanged: { if (root.transparency <= 0.6 && root.onComlpeted) { - mainWindow.changeWindowBlurRegion(0, root.height - height, width, height) + switch (mainWindow.panelPos) { + case 0 : + mainWindow.changeWindowBlurRegion(0, root.height - height, width, height); + break; + case 1 : + mainWindow.changeWindowBlurRegion(0, 0, width, height); + break; + case 2: + mainWindow.changeWindowBlurRegion(0, 0, width, height); + break; + case 3 : + mainWindow.changeWindowBlurRegion(root.width - width, 0, width, height); + break; + default : + mainWindow.changeWindowBlurRegion(0, root.height - height, width, height); + break; + } } } @@ -96,66 +146,82 @@ Item { duration: root.animationDuration * 2; easing.type: Easing.InOutExpo } - states: [ - State { - name: "normalScreen" - PropertyChanges { target: backgroundMask; height: root.normalGeometry.height; width: root.normalGeometry.width } - }, - State { - name: "fullScreen" - PropertyChanges { target: backgroundMask; height: root.height; width: root.width } - PropertyChanges { target: normalScreenLoader; anchors.margins: 8 } - AnchorChanges { target: normalScreenLoader; anchors.bottom: root.bottom; anchors.left: root.left } + ParallelAnimation { + id: enterFullScreenAnimation + PropertyAnimation { + target: backgroundMask; property: "x" + from: normalScreenGeometry.normalScreenX; to: 0 + duration: root.animationDuration; easing.type: Easing.InOutQuad + } + PropertyAnimation { + target: backgroundMask; property: "y" + from: normalScreenGeometry.normalScreenY; to: 0 + duration: root.animationDuration; easing.type: Easing.InOutQuad + } + PropertyAnimation { + target: backgroundMask; property: "height" + from: normalScreenGeometry.normalGeometry.height; to: root.height + duration: root.animationDuration; easing.type: Easing.InOutQuad + } + PropertyAnimation { + target: backgroundMask; property: "width" + from: normalScreenGeometry.normalGeometry.width; to: root.width + duration: root.animationDuration; easing.type: Easing.InOutQuad } - ] - transitions: [ - Transition { - to: "fullScreen" - SequentialAnimation { - ScriptAction { - script: { - normalScreenLoader.anchors.left = root.left; - normalScreenLoader.anchors.bottom = root.bottom; - normalScreenLoader.anchors.margins = 8; - fullScreenLoader.active = true; - } - } - NumberAnimation { properties: "height,width"; duration: root.animationDuration; easing.type: Easing.InOutQuad } - ScriptAction { - script: { - normalScreenLoader.active = false; - mainWindow.enableWindowBlur(true); - } - } - } - }, - Transition { - to: "normalScreen" - SequentialAnimation { - ScriptAction { - script: { - normalScreenLoader.active = true; - mainWindow.enableWindowBlur(false); - } - } - NumberAnimation { properties: "height,width"; duration: root.animationDuration; easing.type: Easing.InOutQuad } - ScriptAction { - script: { - fullScreenLoader.active = false; - mainWindow.isFullScreen = false; - } - } - } + onStarted: { + fullScreenLoader.active = true; + normalScreenLoader.x = normalScreenGeometry.normalScreenX; + normalScreenLoader.y = normalScreenGeometry.normalScreenY; } - ] + onFinished: { + normalScreenLoader.active = false; + mainWindow.enableWindowBlur(true); + } + } + + ParallelAnimation { + id: exitFullScreenAnimation + PropertyAnimation { + target: backgroundMask; property: "x" + from: 0; to: normalScreenGeometry.normalScreenX + duration: root.animationDuration; easing.type: Easing.InOutQuad + } + PropertyAnimation { + target: backgroundMask; property: "y" + from: 0; to: normalScreenGeometry.normalScreenY + duration: root.animationDuration; easing.type: Easing.InOutQuad + } + PropertyAnimation { + target: backgroundMask; property: "height" + from: root.height; to: normalScreenGeometry.normalGeometry.height + duration: root.animationDuration; easing.type: Easing.InOutQuad + } + PropertyAnimation { + target: backgroundMask; property: "width" + from: root.width; to: normalScreenGeometry.normalGeometry.width + duration: root.animationDuration; easing.type: Easing.InOutQuad + } + + onStarted: { + normalScreenLoader.active = true; + mainWindow.enableWindowBlur(false); + + } + onFinished: { + normalScreenLoader.x = 0; + normalScreenLoader.y = 0; + backgroundMask.x = 0; + backgroundMask.y = 0; + fullScreenLoader.active = false; + mainWindow.isFullScreen = false; + } + } } Loader { id: normalScreenLoader - height: root.normalGeometry.height; width: root.normalGeometry.width - anchors.bottom: root.bottom - anchors.left: root.left + height: normalScreenGeometry.normalGeometry.height; width: normalScreenGeometry.normalGeometry.width sourceComponent: normalComponent NumberAnimation { id: normalShow; target: normalScreenLoader; properties: "opacity"; from: 0; to: 1; duration: root.animationDuration; easing.type: Easing.InQuint } NumberAnimation { id: normalHide; target: normalScreenLoader; properties: "opacity"; from: 1; to: 0; duration: root.animationDuration; easing.type: Easing.OutQuint } diff --git a/src/windows/menu-main-window.cpp b/src/windows/menu-main-window.cpp index 5157407..ce362ef 100644 --- a/src/windows/menu-main-window.cpp +++ b/src/windows/menu-main-window.cpp @@ -364,6 +364,11 @@ const QRect &WindowGeometryHelper::normalGeometry() return m_normalGeometry; } +const int WindowGeometryHelper::getPanelPos() +{ + return m_panelPos; +} + //======MenuWindow======// MenuWindow::MenuWindow(QWindow *parent) : QQuickView(parent), m_geometryHelper(new WindowGeometryHelper(this)) { @@ -394,6 +399,7 @@ void MenuWindow::init() connect(m_geometryHelper, &WindowGeometryHelper::geometryChanged, this, [this] { QEvent event(QEvent::Move); QCoreApplication::sendEvent(this, &event); + Q_EMIT panelPosChanged(); }); connect(GlobalSetting::instance(), &GlobalSetting::styleChanged, this , [this] (const GlobalSetting::Key& key) { @@ -510,4 +516,9 @@ double MenuWindow::transparency() const return GlobalSetting::instance()->get(GlobalSetting::Transparency).toDouble(); } +int MenuWindow::panelPos() const +{ + return m_geometryHelper->getPanelPos(); +} + } // UkuiMenu diff --git a/src/windows/menu-main-window.h b/src/windows/menu-main-window.h index 2e93c60..22b62db 100644 --- a/src/windows/menu-main-window.h +++ b/src/windows/menu-main-window.h @@ -50,6 +50,7 @@ public: const QRect &normalGeometry(); const QRect &fullScreenGeometry(); + const int getPanelPos(); Q_SIGNALS: void geometryChanged(); @@ -107,6 +108,7 @@ class MenuWindow : public QQuickView Q_PROPERTY(bool isFullScreen READ isFullScreen WRITE setFullScreen NOTIFY fullScreenChanged) Q_PROPERTY(bool effectEnabled READ effectEnabled NOTIFY effectEnabledChanged) Q_PROPERTY(double transparency READ transparency NOTIFY transparencyChanged) + Q_PROPERTY(int panelPos READ panelPos NOTIFY panelPosChanged) public: explicit MenuWindow(QWindow *parent = nullptr); @@ -116,6 +118,7 @@ public: bool isFullScreen() const; double transparency() const; void setFullScreen(bool isFullScreen); + int panelPos() const; Q_INVOKABLE void changeWindowBlurRegion(int x, int y, int width, int height); Q_INVOKABLE QRect normalScreenSize(); @@ -128,6 +131,7 @@ Q_SIGNALS: void fullScreenChanged(); void beforeFullScreenChanged(); void beforeFullScreenExited(); + void panelPosChanged(); private Q_SLOTS: void onActiveFocusItemChanged();