From 1a8fabd2d89cec837a350e63a6d5f0792eeb2d41 Mon Sep 17 00:00:00 2001 From: Casper Jeukendrup <48658420+cbjeukendrup@users.noreply.github.com> Date: Sat, 15 Nov 2025 23:44:22 +0100 Subject: [PATCH 1/4] Fix assert on Windows with Qt 6.10, caused by DockTabBar It's not clear what the exact cause is, because it happens to deep inside Qt to tell. But this fixes it. --- .../dockwindow/qml/Muse/Dock/DockTabBar.qml | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/framework/dockwindow/qml/Muse/Dock/DockTabBar.qml b/src/framework/dockwindow/qml/Muse/Dock/DockTabBar.qml index 418aebdd1d992..5c377defb564c 100644 --- a/src/framework/dockwindow/qml/Muse/Dock/DockTabBar.qml +++ b/src/framework/dockwindow/qml/Muse/Dock/DockTabBar.qml @@ -90,19 +90,27 @@ Rectangle { spacing: 0 readonly property real availableWidth: root.width + 1 // + 1, because we don't need to see the rightmost separator - readonly property real implicitWidthOfActiveTab: currentItem ? currentItem.implicitWidth : 0 - readonly property real implicitWidthOfAllTabsTogether: { - let result = 0 - let items = tabs.contentItem.children - - for (let i in items) { - let item = items[i] - if (item && item.implicitWidth) { - result += item.implicitWidth - } + + onAvailableWidthChanged: { layoutTabs() } + + function layoutTabs() { + let implicitWidthOfActiveTab = currentItem?.implicitWidth ?? 0 + let implicitWidthOfAllTabsTogether = 0 + + for (let tab of contentItem.children) { + implicitWidthOfAllTabsTogether += tab?.implicitWidth ?? 0 } - return result + const enoughSpace = implicitWidthOfAllTabsTogether <= availableWidth; + for (let tab of contentItem.children) { + if (tab.isCurrent || enoughSpace) { + tab.width = tab.implicitWidth + } else { + tab.width = (availableWidth - implicitWidthOfActiveTab) + / (implicitWidthOfAllTabsTogether - implicitWidthOfActiveTab) + * tab.implicitWidth + } + } } delegate: DockPanelTab { @@ -110,22 +118,14 @@ Rectangle { isCurrent: root.currentIndex === model.index contextMenuModel: model.contextMenu - width: { - var w - if (isCurrent || tabs.implicitWidthOfAllTabsTogether <= tabs.availableWidth) { - w = implicitWidth - } else { - w = (tabs.availableWidth - tabs.implicitWidthOfActiveTab) - / (tabs.implicitWidthOfAllTabsTogether - tabs.implicitWidthOfActiveTab) - * implicitWidth - } - return w - } - navigation.name: text navigation.panel: root.navigationPanel navigation.order: model.index * 2 // NOTE '...' button will have +1 order + Component.onCompleted: { tabs.layoutTabs() } + + onImplicitWidthChanged: { tabs.layoutTabs() } + onNavigationTriggered: { root.tabClicked(model.index) } From 5c27894d4cca3e0745beb959710f9d306db208c4 Mon Sep 17 00:00:00 2001 From: Casper Jeukendrup <48658420+cbjeukendrup@users.noreply.github.com> Date: Sun, 16 Nov 2025 00:08:09 +0100 Subject: [PATCH 2/4] Fix/hide(?) binding loop in DockPanelTab at the `visible` property of the gradient Rectangle --- src/framework/dockwindow/qml/Muse/Dock/DockPanelTab.qml | 4 +++- src/framework/dockwindow/qml/Muse/Dock/DockTabBar.qml | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/framework/dockwindow/qml/Muse/Dock/DockPanelTab.qml b/src/framework/dockwindow/qml/Muse/Dock/DockPanelTab.qml index d20fb74ff8963..33f157ebbd17e 100644 --- a/src/framework/dockwindow/qml/Muse/Dock/DockPanelTab.qml +++ b/src/framework/dockwindow/qml/Muse/Dock/DockPanelTab.qml @@ -31,6 +31,8 @@ StyledTabButton { property alias contextMenuModel: contextMenuButton.menuModel + property bool isCutOff: false + signal handleContextMenuItemRequested(string itemId) readonly property real actualHeight: 34 @@ -109,7 +111,7 @@ StyledTabButton { } Rectangle { - visible: root.width < root.implicitWidth + visible: root.isCutOff anchors.top: root.top anchors.right: root.right diff --git a/src/framework/dockwindow/qml/Muse/Dock/DockTabBar.qml b/src/framework/dockwindow/qml/Muse/Dock/DockTabBar.qml index 5c377defb564c..f1a2ffc3c267c 100644 --- a/src/framework/dockwindow/qml/Muse/Dock/DockTabBar.qml +++ b/src/framework/dockwindow/qml/Muse/Dock/DockTabBar.qml @@ -105,10 +105,12 @@ Rectangle { for (let tab of contentItem.children) { if (tab.isCurrent || enoughSpace) { tab.width = tab.implicitWidth + tab.isCutOff = false } else { tab.width = (availableWidth - implicitWidthOfActiveTab) / (implicitWidthOfAllTabsTogether - implicitWidthOfActiveTab) * tab.implicitWidth + tab.isCutOff = true } } } From d7609647708e31a46ce631a66788e4848ac0018e Mon Sep 17 00:00:00 2001 From: Casper Jeukendrup <48658420+cbjeukendrup@users.noreply.github.com> Date: Sun, 16 Nov 2025 00:11:07 +0100 Subject: [PATCH 3/4] Debounce DockTabBar tabs layout --- src/framework/dockwindow/qml/Muse/Dock/DockTabBar.qml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/framework/dockwindow/qml/Muse/Dock/DockTabBar.qml b/src/framework/dockwindow/qml/Muse/Dock/DockTabBar.qml index f1a2ffc3c267c..55374931ad491 100644 --- a/src/framework/dockwindow/qml/Muse/Dock/DockTabBar.qml +++ b/src/framework/dockwindow/qml/Muse/Dock/DockTabBar.qml @@ -93,7 +93,18 @@ Rectangle { onAvailableWidthChanged: { layoutTabs() } + property bool layoutTabsScheduled: false + function layoutTabs() { + if (!layoutTabsScheduled) { + Qt.callLater(doLayoutTabs) + layoutTabsScheduled = true + } + } + + function doLayoutTabs() { + layoutTabsScheduled = false + let implicitWidthOfActiveTab = currentItem?.implicitWidth ?? 0 let implicitWidthOfAllTabsTogether = 0 From 6859aa2b2defab43698149c3446d7fdd3c7dafd3 Mon Sep 17 00:00:00 2001 From: Casper Jeukendrup <48658420+cbjeukendrup@users.noreply.github.com> Date: Sun, 16 Nov 2025 00:12:19 +0100 Subject: [PATCH 4/4] Opacity gradient potential micro-optimisation --- src/framework/dockwindow/qml/Muse/Dock/DockPanelTab.qml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/framework/dockwindow/qml/Muse/Dock/DockPanelTab.qml b/src/framework/dockwindow/qml/Muse/Dock/DockPanelTab.qml index 33f157ebbd17e..606e2c3dd9e44 100644 --- a/src/framework/dockwindow/qml/Muse/Dock/DockPanelTab.qml +++ b/src/framework/dockwindow/qml/Muse/Dock/DockPanelTab.qml @@ -121,7 +121,6 @@ StyledTabButton { width: 20 - opacity: 0.7 gradient: Gradient { orientation: Qt.Horizontal @@ -131,7 +130,7 @@ StyledTabButton { } GradientStop { position: 1.0 - color: backgroundRect.color + color: Utils.colorWithAlpha(backgroundRect.color, 0.7) } } }