diff --git a/panels/dock/package/main.qml b/panels/dock/package/main.qml index 94d4534bc..ce1c9ed11 100644 --- a/panels/dock/package/main.qml +++ b/panels/dock/package/main.qml @@ -19,13 +19,33 @@ 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 otherCenterAppletsCount: 0 + function updateOtherCenterAppletsCount() { + let count = 0; + for (let i = 0; i < Applet.appletItems.rowCount(); i++) { + let itemData = Applet.appletItems.data(Applet.appletItems.index(i, 0), Qt.UserRole + 1); + if (itemData) { + let isVisible = (itemData.shouldVisible === undefined || itemData.shouldVisible); + // 属于 center 区域(10 <= dockOrder < 20),且不是 16(TaskManager) + if (isVisible && itemData.dockOrder >= 10 && itemData.dockOrder < 20 && itemData.dockOrder !== 16) { + count++; + } + } + } + otherCenterAppletsCount = count; + } + + property int dockRemainingSpaceForCenter: { + let otherCount = otherCenterAppletsCount; + + let otherHeight = otherCount > 0 ? (otherCount * (useColumnLayout ? dockItemMaxSize : dock.dockSize) + otherCount * gridLayout.rowSpacing) : 0; + let otherWidth = otherCount > 0 ? (otherCount * (useColumnLayout ? dock.dockSize : dockItemMaxSize) + otherCount * gridLayout.columnSpacing) : 0; + + return useColumnLayout ? + (Screen.height - dockLeftPart.implicitHeight - dockRightPart.implicitHeight - otherHeight) : + (Screen.width - dockLeftPart.implicitWidth - dockRightPart.implicitWidth - otherWidth) + } + property int dockPartSpacing: gridLayout.columnSpacing // TODO signal dockCenterPartPosChanged() @@ -289,6 +309,7 @@ Window { function updateAppItems() { + updateOtherCenterAppletsCount() dockLeftPartModel.update() dockCenterPartModel.update() dockRightPartModel.update() @@ -460,6 +481,9 @@ Window { // TODO missing property binding to update ProxyModel's filter and sort opearation. Repeater { model: Applet.appletItems + onCountChanged: { + updateAppItems() + } delegate: Item { property var order: model.data.dockOrder property bool itemVisible: model.data.shouldVisible === undefined || model.data.shouldVisible @@ -527,18 +551,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) }) } }