diff --git a/panels/dock/package/main.qml b/panels/dock/package/main.qml index 94d4534bc..5d12374f8 100644 --- a/panels/dock/package/main.qml +++ b/panels/dock/package/main.qml @@ -19,21 +19,30 @@ Window { id: dock property int positionForAnimation: Panel.position property bool useColumnLayout: positionForAnimation % 2 - // TODO: 临时溢出逻辑,待后面修改 - property int dockLeftSpaceForCenter: useColumnLayout ? - (Screen.height - dockLeftPart.implicitHeight - dockRightPart.implicitHeight) : - (Screen.width - dockLeftPart.implicitWidth - dockRightPart.implicitWidth) - property int dockRemainingSpaceForCenter: useColumnLayout ? - (Screen.height / 1.8 - dockRightPart.implicitHeight) : - (Screen.width / 1.8 - dockRightPart.implicitWidth) + property int dockCenterPartCount: dockCenterPartModel.count + + property int dockRemainingSpaceForCenter: { + const otherCount = dockCenterPartCount - 1; // not include taskmanager + const spacing = useColumnLayout ? gridLayout.rowSpacing : gridLayout.columnSpacing; + + let otherOccupied = 0; + if (otherCount > 0) { + otherOccupied = otherCount * dockItemMaxSize + otherCount * spacing; + } + + if (useColumnLayout) { + return Screen.height - dockLeftPart.implicitHeight - dockRightPart.implicitHeight - otherOccupied; + } else { + return Screen.width - dockLeftPart.implicitWidth - dockRightPart.implicitWidth - otherOccupied; + } + } + property int dockPartSpacing: gridLayout.columnSpacing // TODO signal dockCenterPartPosChanged() signal pressedAndDragging(bool isDragging) signal viewDeactivated() - property int dockCenterPartCount: dockCenterPartModel.count - property int dockSize: Applet.dockSize property int dockItemMaxSize: dockSize property int itemIconSizeBase: 0 @@ -527,18 +536,8 @@ Window { Item { id: dockCenterPart - property var taskmanagerRootObject: { - let applet = DS.applet("org.deepin.ds.dock.taskmanager") - return applet ? applet.rootObject : null - } - - readonly property real taskmanagerImplicitWidth: taskmanagerRootObject ? taskmanagerRootObject.implicitWidth : 0 - readonly property real taskmanagerImplicitHeight: taskmanagerRootObject ? taskmanagerRootObject.implicitHeight : 0 - readonly property real taskmanagerAppContainerWidth: taskmanagerRootObject ? taskmanagerRootObject.appContainerWidth : 0 - readonly property real taskmanagerAppContainerHeight: taskmanagerRootObject ? taskmanagerRootObject.appContainerHeight : 0 - - implicitWidth: centerLoader.implicitWidth - taskmanagerImplicitWidth + taskmanagerAppContainerWidth - implicitHeight: centerLoader.implicitHeight - taskmanagerImplicitHeight + taskmanagerAppContainerHeight + implicitWidth: centerLoader.implicitWidth + implicitHeight: centerLoader.implicitHeight onXChanged: dockCenterPartPosChanged() onYChanged: dockCenterPartPosChanged() Layout.leftMargin: !useColumnLayout && Panel.itemAlignment === Dock.CenterAlignment ? diff --git a/panels/dock/taskmanager/package/TaskManager.qml b/panels/dock/taskmanager/package/TaskManager.qml index 8827750bb..ce7aeafed 100644 --- a/panels/dock/taskmanager/package/TaskManager.qml +++ b/panels/dock/taskmanager/package/TaskManager.qml @@ -14,18 +14,17 @@ ContainmentItem { id: taskmanager property bool useColumnLayout: Panel.rootObject.useColumnLayout property int dockOrder: 16 - property real remainingSpacesForTaskManager: Panel.itemAlignment === Dock.LeftAlignment ? Panel.rootObject.dockLeftSpaceForCenter : Panel.rootObject.dockRemainingSpaceForCenter - + property real remainingSpacesForTaskManager: Panel.rootObject.dockRemainingSpaceForCenter readonly property int appTitleSpacing: Math.max(10, Math.round(Panel.rootObject.dockItemMaxSize * 9 / 14) / 3) - property real remainingSpacesForSplitWindow: Panel.rootObject.dockLeftSpaceForCenter - ( - (Panel.rootObject.dockCenterPartCount - 1) * (visualModel.cellWidth + appTitleSpacing) + (Panel.rootObject.dockCenterPartCount) * Panel.rootObject.dockPartSpacing) - // 用于居中计算的实际应用区域尺寸 - property int appContainerWidth: useColumnLayout ? Panel.rootObject.dockSize : appContainer.implicitWidth - property int appContainerHeight: useColumnLayout ? appContainer.implicitHeight : Panel.rootObject.dockSize - - implicitWidth: useColumnLayout ? Panel.rootObject.dockSize : Math.max(remainingSpacesForTaskManager, appContainer.implicitWidth) - implicitHeight: useColumnLayout ? Math.max(remainingSpacesForTaskManager, appContainer.implicitHeight) : Panel.rootObject.dockSize + implicitWidth: { + let maxW = Panel.itemAlignment === Dock.LeftAlignment ? Math.max(remainingSpacesForTaskManager, appContainer.implicitWidth) : Math.min(remainingSpacesForTaskManager, appContainer.implicitWidth) + return useColumnLayout ? Panel.rootObject.dockSize : maxW + } + implicitHeight: { + let maxH = Panel.itemAlignment === Dock.LeftAlignment ? Math.max(remainingSpacesForTaskManager, appContainer.implicitHeight) : Math.min(remainingSpacesForTaskManager, appContainer.implicitHeight) + return useColumnLayout ? maxH : Panel.rootObject.dockSize + } // Helper function to find the current index of an app by its appId in the visualModel function findAppIndex(appId) { for (let i = 0; i < visualModel.items.count; i++) { @@ -65,7 +64,7 @@ ContainmentItem { spacing: appContainer.spacing cellSize: visualModel.cellWidth itemPadding: taskmanager.appTitleSpacing - remainingSpace: taskmanager.remainingSpacesForSplitWindow + remainingSpace: taskmanager.remainingSpacesForTaskManager font.family: D.DTK.fontManager.t6.family font.pixelSize: Math.max(10, Math.min(20, Math.round(textCalculator.iconSize * 0.35))) } @@ -133,8 +132,24 @@ ContainmentItem { Behavior on opacity { NumberAnimation { duration: 200 } } Behavior on scale { NumberAnimation { duration: 200 } } - implicitWidth: useColumnLayout ? taskmanager.implicitWidth : appItem.implicitWidth - implicitHeight: useColumnLayout ? visualModel.cellWidth : taskmanager.implicitHeight + implicitWidth: { + let targetW = useColumnLayout ? taskmanager.implicitWidth : appItem.implicitWidth; + if (useColumnLayout || visualModel.count <= 0) return targetW; + + let totalSpacing = Math.max(0, visualModel.count - 1) * taskmanager.appTitleSpacing; + let availableW = taskmanager.remainingSpacesForTaskManager - totalSpacing; + let maxW = availableW / visualModel.count; + return Math.min(targetW, Math.max(1, maxW)); + } + implicitHeight: { + let targetH = useColumnLayout ? visualModel.cellWidth : taskmanager.implicitHeight; + if (!useColumnLayout || visualModel.count <= 0) return targetH; + + let totalSpacing = Math.max(0, visualModel.count - 1) * taskmanager.appTitleSpacing; + let availableH = taskmanager.remainingSpacesForTaskManager - totalSpacing; + let maxH = availableH / visualModel.count; + return Math.min(targetH, Math.max(1, maxH)); + } property int visualIndex: DelegateModel.itemsIndex property var modelIndex: visualModel.modelIndex(index) @@ -274,7 +289,7 @@ ContainmentItem { Component.onCompleted: { Panel.rootObject.dockItemMaxSize = Qt.binding(function(){ - return Math.min(Panel.rootObject.dockSize, Panel.rootObject.dockLeftSpaceForCenter * 1.2 / (Panel.rootObject.dockCenterPartCount - 1 + visualModel.count) - 2) + return Math.min(Panel.rootObject.dockSize, Panel.rootObject.dockRemainingSpaceForCenter * 1.2 / (Panel.rootObject.dockCenterPartCount - 1 + visualModel.count) - 2) }) } }