Skip to content

Commit e309e02

Browse files
committed
fix: improve dock center space calculation and taskmanager layout
1. Replaced temporary overflow logic with dynamic calculation of remaining space for center dock area 2. Added function to count center applets excluding TaskManager for accurate space allocation 3. Simplified dockCenterPart implicit dimensions by removing TaskManager-specific adjustments 4. Updated TaskManager to use consistent remaining space calculation and improved implicit dimension logic 5. Enhanced app container sizing to properly distribute available space among app items 6. Fixed dockItemMaxSize calculation to use correct remaining space reference Log: Improved dock layout calculation for better space distribution and task manager display Influence: 1. Test dock layout in different positions (left, right, top, bottom) 2. Verify center area plugins display correctly with varying numbers 3. Check TaskManager app item sizing and spacing in different configurations 4. Test with multiple center area plugins alongside TaskManager 5. Verify layout stability when adding/removing center plugins 6. Test edge cases with minimal/maximal numbers of app items fix: 改进任务栏中心区域空间计算和任务管理器布局 1. 用动态计算替换临时的溢出逻辑,准确计算中心区域剩余空间 2. 新增函数统计除任务管理器外的中心区域插件数量,实现精确空间分配 3. 简化dockCenterPart的隐式尺寸计算,移除任务管理器特定调整 4. 更新任务管理器使用一致的剩余空间计算和改进的隐式尺寸逻辑 5. 增强应用容器尺寸计算,在应用项之间合理分配可用空间 6. 修复dockItemMaxSize计算,使用正确的剩余空间引用 Log: 改进任务栏布局计算,优化空间分配和任务管理器显示 Influence: 1. 测试任务栏在不同位置(左、右、上、下)的布局 2. 验证中心区域插件在不同数量下的正确显示 3. 检查任务管理器应用项在不同配置下的尺寸和间距 4. 测试多个中心区域插件与任务管理器共存的情况 5. 验证添加/移除中心插件时的布局稳定性 6. 测试最小/最大应用项数量的边界情况 PMS: BUG-355833
1 parent f4f5262 commit e309e02

2 files changed

Lines changed: 62 additions & 33 deletions

File tree

panels/dock/package/main.qml

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,33 @@ Window {
1919
id: dock
2020
property int positionForAnimation: Panel.position
2121
property bool useColumnLayout: positionForAnimation % 2
22-
// TODO: 临时溢出逻辑,待后面修改
23-
property int dockLeftSpaceForCenter: useColumnLayout ?
24-
(Screen.height - dockLeftPart.implicitHeight - dockRightPart.implicitHeight) :
25-
(Screen.width - dockLeftPart.implicitWidth - dockRightPart.implicitWidth)
26-
property int dockRemainingSpaceForCenter: useColumnLayout ?
27-
(Screen.height / 1.8 - dockRightPart.implicitHeight) :
28-
(Screen.width / 1.8 - dockRightPart.implicitWidth)
22+
property int otherCenterAppletsCount: 0
23+
function updateOtherCenterAppletsCount() {
24+
let count = 0;
25+
for (let i = 0; i < Applet.appletItems.rowCount(); i++) {
26+
let itemData = Applet.appletItems.data(Applet.appletItems.index(i, 0), Qt.UserRole + 1);
27+
if (itemData) {
28+
let isVisible = (itemData.shouldVisible === undefined || itemData.shouldVisible);
29+
// 属于 center 区域(10 <= dockOrder < 20),且不是 16(TaskManager)
30+
if (isVisible && itemData.dockOrder >= 10 && itemData.dockOrder < 20 && itemData.dockOrder !== 16) {
31+
count++;
32+
}
33+
}
34+
}
35+
otherCenterAppletsCount = count;
36+
}
37+
38+
property int dockRemainingSpaceForCenter: {
39+
let otherCount = otherCenterAppletsCount;
40+
41+
let otherHeight = otherCount > 0 ? (otherCount * (useColumnLayout ? dockItemMaxSize : dock.dockSize) + otherCount * gridLayout.rowSpacing) : 0;
42+
let otherWidth = otherCount > 0 ? (otherCount * (useColumnLayout ? dock.dockSize : dockItemMaxSize) + otherCount * gridLayout.columnSpacing) : 0;
43+
44+
return useColumnLayout ?
45+
(Screen.height - dockLeftPart.implicitHeight - dockRightPart.implicitHeight - otherHeight) :
46+
(Screen.width - dockLeftPart.implicitWidth - dockRightPart.implicitWidth - otherWidth)
47+
}
48+
2949
property int dockPartSpacing: gridLayout.columnSpacing
3050
// TODO
3151
signal dockCenterPartPosChanged()
@@ -289,6 +309,7 @@ Window {
289309

290310
function updateAppItems()
291311
{
312+
updateOtherCenterAppletsCount()
292313
dockLeftPartModel.update()
293314
dockCenterPartModel.update()
294315
dockRightPartModel.update()
@@ -460,6 +481,9 @@ Window {
460481
// TODO missing property binding to update ProxyModel's filter and sort opearation.
461482
Repeater {
462483
model: Applet.appletItems
484+
onCountChanged: {
485+
updateAppItems()
486+
}
463487
delegate: Item {
464488
property var order: model.data.dockOrder
465489
property bool itemVisible: model.data.shouldVisible === undefined || model.data.shouldVisible
@@ -527,18 +551,8 @@ Window {
527551

528552
Item {
529553
id: dockCenterPart
530-
property var taskmanagerRootObject: {
531-
let applet = DS.applet("org.deepin.ds.dock.taskmanager")
532-
return applet ? applet.rootObject : null
533-
}
534-
535-
readonly property real taskmanagerImplicitWidth: taskmanagerRootObject ? taskmanagerRootObject.implicitWidth : 0
536-
readonly property real taskmanagerImplicitHeight: taskmanagerRootObject ? taskmanagerRootObject.implicitHeight : 0
537-
readonly property real taskmanagerAppContainerWidth: taskmanagerRootObject ? taskmanagerRootObject.appContainerWidth : 0
538-
readonly property real taskmanagerAppContainerHeight: taskmanagerRootObject ? taskmanagerRootObject.appContainerHeight : 0
539-
540-
implicitWidth: centerLoader.implicitWidth - taskmanagerImplicitWidth + taskmanagerAppContainerWidth
541-
implicitHeight: centerLoader.implicitHeight - taskmanagerImplicitHeight + taskmanagerAppContainerHeight
554+
implicitWidth: centerLoader.implicitWidth
555+
implicitHeight: centerLoader.implicitHeight
542556
onXChanged: dockCenterPartPosChanged()
543557
onYChanged: dockCenterPartPosChanged()
544558
Layout.leftMargin: !useColumnLayout && Panel.itemAlignment === Dock.CenterAlignment ?

panels/dock/taskmanager/package/TaskManager.qml

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,17 @@ ContainmentItem {
1414
id: taskmanager
1515
property bool useColumnLayout: Panel.rootObject.useColumnLayout
1616
property int dockOrder: 16
17-
property real remainingSpacesForTaskManager: Panel.itemAlignment === Dock.LeftAlignment ? Panel.rootObject.dockLeftSpaceForCenter : Panel.rootObject.dockRemainingSpaceForCenter
18-
17+
property real remainingSpacesForTaskManager: Panel.rootObject.dockRemainingSpaceForCenter
1918
readonly property int appTitleSpacing: Math.max(10, Math.round(Panel.rootObject.dockItemMaxSize * 9 / 14) / 3)
20-
property real remainingSpacesForSplitWindow: Panel.rootObject.dockLeftSpaceForCenter - (
21-
(Panel.rootObject.dockCenterPartCount - 1) * (visualModel.cellWidth + appTitleSpacing) + (Panel.rootObject.dockCenterPartCount) * Panel.rootObject.dockPartSpacing)
22-
// 用于居中计算的实际应用区域尺寸
23-
property int appContainerWidth: useColumnLayout ? Panel.rootObject.dockSize : appContainer.implicitWidth
24-
property int appContainerHeight: useColumnLayout ? appContainer.implicitHeight : Panel.rootObject.dockSize
25-
26-
implicitWidth: useColumnLayout ? Panel.rootObject.dockSize : Math.max(remainingSpacesForTaskManager, appContainer.implicitWidth)
27-
implicitHeight: useColumnLayout ? Math.max(remainingSpacesForTaskManager, appContainer.implicitHeight) : Panel.rootObject.dockSize
2819

20+
implicitWidth: {
21+
let maxW = Panel.itemAlignment === Dock.LeftAlignment ? Math.max(remainingSpacesForTaskManager, appContainer.implicitWidth) : Math.min(remainingSpacesForTaskManager, appContainer.implicitWidth)
22+
return useColumnLayout ? Panel.rootObject.dockSize : maxW
23+
}
24+
implicitHeight: {
25+
let maxH = Panel.itemAlignment === Dock.LeftAlignment ? Math.max(remainingSpacesForTaskManager, appContainer.implicitHeight) : Math.min(remainingSpacesForTaskManager, appContainer.implicitHeight)
26+
return useColumnLayout ? maxH : Panel.rootObject.dockSize
27+
}
2928
// Helper function to find the current index of an app by its appId in the visualModel
3029
function findAppIndex(appId) {
3130
for (let i = 0; i < visualModel.items.count; i++) {
@@ -65,7 +64,7 @@ ContainmentItem {
6564
spacing: appContainer.spacing
6665
cellSize: visualModel.cellWidth
6766
itemPadding: taskmanager.appTitleSpacing
68-
remainingSpace: taskmanager.remainingSpacesForSplitWindow
67+
remainingSpace: taskmanager.remainingSpacesForTaskManager
6968
font.family: D.DTK.fontManager.t6.family
7069
font.pixelSize: Math.max(10, Math.min(20, Math.round(textCalculator.iconSize * 0.35)))
7170
}
@@ -133,8 +132,24 @@ ContainmentItem {
133132
Behavior on opacity { NumberAnimation { duration: 200 } }
134133
Behavior on scale { NumberAnimation { duration: 200 } }
135134

136-
implicitWidth: useColumnLayout ? taskmanager.implicitWidth : appItem.implicitWidth
137-
implicitHeight: useColumnLayout ? visualModel.cellWidth : taskmanager.implicitHeight
135+
implicitWidth: {
136+
let targetW = useColumnLayout ? taskmanager.implicitWidth : appItem.implicitWidth;
137+
if (useColumnLayout || visualModel.count <= 0) return targetW;
138+
139+
let totalSpacing = Math.max(0, visualModel.count - 1) * taskmanager.appTitleSpacing;
140+
let availableW = taskmanager.remainingSpacesForTaskManager - totalSpacing;
141+
let maxW = availableW / visualModel.count;
142+
return Math.min(targetW, Math.max(1, maxW));
143+
}
144+
implicitHeight: {
145+
let targetH = useColumnLayout ? visualModel.cellWidth : taskmanager.implicitHeight;
146+
if (!useColumnLayout || visualModel.count <= 0) return targetH;
147+
148+
let totalSpacing = Math.max(0, visualModel.count - 1) * taskmanager.appTitleSpacing;
149+
let availableH = taskmanager.remainingSpacesForTaskManager - totalSpacing;
150+
let maxH = availableH / visualModel.count;
151+
return Math.min(targetH, Math.max(1, maxH));
152+
}
138153

139154
property int visualIndex: DelegateModel.itemsIndex
140155
property var modelIndex: visualModel.modelIndex(index)
@@ -274,7 +289,7 @@ ContainmentItem {
274289

275290
Component.onCompleted: {
276291
Panel.rootObject.dockItemMaxSize = Qt.binding(function(){
277-
return Math.min(Panel.rootObject.dockSize, Panel.rootObject.dockLeftSpaceForCenter * 1.2 / (Panel.rootObject.dockCenterPartCount - 1 + visualModel.count) - 2)
292+
return Math.min(Panel.rootObject.dockSize, Panel.rootObject.dockRemainingSpaceForCenter * 1.2 / (Panel.rootObject.dockCenterPartCount - 1 + visualModel.count) - 2)
278293
})
279294
}
280295
}

0 commit comments

Comments
 (0)