diff --git a/panels/notification/center/package/main.qml b/panels/notification/center/package/main.qml index c63f4790c..9a5df5a4d 100644 --- a/panels/notification/center/package/main.qml +++ b/panels/notification/center/package/main.qml @@ -9,25 +9,97 @@ import org.deepin.dtk 1.0 import org.deepin.ds 1.0 import org.deepin.ds.notification import org.deepin.ds.notificationcenter +import org.deepin.ds.dock 1.0 Window { id: root - function windowMargin(position) { + property int topMarginValue: 0 + property int rightMarginValue: 0 + property int bottomMarginValue: 0 + + function updateMargins(frontendRect) { let dockApplet = DS.applet("org.deepin.ds.dock") - if (!dockApplet) - return 0 + if (!dockApplet || !root.screen) { + topMarginValue = 0 + rightMarginValue = 0 + bottomMarginValue = 0 + return + } let dockScreen = dockApplet.screenName - let screen = root.screen.name - let dockHideState = dockApplet.hideState - let dockIsHide = dockHideState === 2 - if (dockScreen !== screen || dockIsHide) - return 0 - - let dockSize = dockApplet.dockSize - let dockPosition = dockApplet.position - return dockPosition === position ? dockSize : 0 + let screen = root.screen ? root.screen.name : "" + + if (dockScreen !== screen) { + topMarginValue = 0 + rightMarginValue = 0 + bottomMarginValue = 0 + return + } + + if (!frontendRect) { + frontendRect = dockApplet.frontendWindowRect + } + + if (!frontendRect) { + topMarginValue = 0 + rightMarginValue = 0 + bottomMarginValue = 0 + return + } + + // frontendRect is already in device pixels from dockpanel.cpp + // We need to convert it back to logical pixels + let dpr = root.screen.devicePixelRatio + let dockGeometry = Qt.rect( + frontendRect.x / dpr, + frontendRect.y / dpr, + frontendRect.width / dpr, + frontendRect.height / dpr + ) + + // Get screen geometry in logical pixels + let screenGeometry = Qt.rect( + root.screen.virtualX, + root.screen.virtualY, + root.screen.width, + root.screen.height + ) + + let newTopMargin = 0 + let newRightMargin = 0 + let newBottomMargin = 0 + + if (dockGeometry.width > 0 && dockGeometry.height > 0) { + let dockPosition = dockApplet.position + switch (dockPosition) { + case 0: { // DOCK_TOP + let visibleHeight = Math.max(0, dockGeometry.y + dockGeometry.height - screenGeometry.y) + newTopMargin = visibleHeight + break + } + case 1: { // DOCK_RIGHT + let visibleWidth = Math.max(0, screenGeometry.x + screenGeometry.width - dockGeometry.x) + newRightMargin = visibleWidth + break + } + //特殊处理:因为会上述计算会导致抖动 + case 2: { // DOCK_BOTTOM + let hideState = dockApplet.hideState + if (hideState === Dock.Hide) { + newBottomMargin = 0 + } else { + newBottomMargin = dockApplet.dockSize + } + break + } + } + } + + topMarginValue = newTopMargin + rightMarginValue = newRightMargin + bottomMarginValue = newBottomMargin + } // visible: true @@ -39,9 +111,9 @@ Window { // height: 800 DLayerShellWindow.layer: DLayerShellWindow.LayerOverlay DLayerShellWindow.anchors: DLayerShellWindow.AnchorRight | DLayerShellWindow.AnchorTop | DLayerShellWindow.AnchorBottom - DLayerShellWindow.topMargin: windowMargin(0) - DLayerShellWindow.rightMargin: windowMargin(1) - DLayerShellWindow.bottomMargin: windowMargin(2) + DLayerShellWindow.topMargin: topMarginValue + DLayerShellWindow.rightMargin: rightMarginValue + DLayerShellWindow.bottomMargin: bottomMarginValue DLayerShellWindow.exclusionZone: -1 DLayerShellWindow.keyboardInteractivity: DLayerShellWindow.KeyboardInteractivityOnDemand palette: DTK.palette @@ -78,6 +150,9 @@ Window { function onRequestClosePopup() { Panel.close() } + function onFrontendWindowRectChanged(frontendWindowRect) { + root.updateMargins(frontendWindowRect) + } } Item {