Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 33 additions & 19 deletions panels/dock/package/main.qml
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

issue (bug_risk): Circular QML binding between dockRemainingSpaceForCenter and dockItemMaxSize in column layout.

Here dockRemainingSpaceForCenter depends on dockItemMaxSize (via otherHeight), but dockItemMaxSize is later bound to dockRemainingSpaceForCenter in Component.onCompleted, creating a circular binding that can cause runtime binding errors or undefined values. Please break this cycle, for example by using dock.dockSize (or a fixed estimate) here, or by computing dockItemMaxSize from a remaining-space value that does not itself depend on dockItemMaxSize.

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()
Expand Down Expand Up @@ -289,6 +309,7 @@ Window {

function updateAppItems()
{
updateOtherCenterAppletsCount()
dockLeftPartModel.update()
dockCenterPartModel.update()
dockRightPartModel.update()
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 ?
Expand Down
43 changes: 29 additions & 14 deletions panels/dock/taskmanager/package/TaskManager.qml
Original file line number Diff line number Diff line change
Expand Up @@ -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++) {
Expand Down Expand Up @@ -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)))
}
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
})
}
}
Loading