diff --git a/quickshell/DMSShell.qml b/quickshell/DMSShell.qml index 861a5798..40ab91c9 100644 --- a/quickshell/DMSShell.qml +++ b/quickshell/DMSShell.qml @@ -1096,6 +1096,11 @@ Item { edgeGap: SettingsData.notepadEffectiveEdgeGap slideEdge: SettingsData.notepadSlideoutSide + onIsVisibleChanged: { + if (isVisible) + PopoutService.notepadPopout?.hide(); + } + content: Component { Notepad { slideout: notepadSlideout diff --git a/quickshell/DMSShellIPC.qml b/quickshell/DMSShellIPC.qml index a02a9d71..2c5715d5 100644 --- a/quickshell/DMSShellIPC.qml +++ b/quickshell/DMSShellIPC.qml @@ -386,6 +386,10 @@ Item { } function close(): string { + if (SettingsData.notepadDefaultMode === "popout") { + PopoutService.notepadPopout?.hide(); + return "NOTEPAD_CLOSE_SUCCESS"; + } var instance = getActiveNotepadInstance(); if (instance) { instance.hide(); diff --git a/quickshell/Modules/Notepad/Notepad.qml b/quickshell/Modules/Notepad/Notepad.qml index 46fd11ed..092ac2dd 100644 --- a/quickshell/Modules/Notepad/Notepad.qml +++ b/quickshell/Modules/Notepad/Notepad.qml @@ -317,63 +317,67 @@ Item { } } - RowLayout { - id: bannerActions + Item { Layout.fillWidth: true - Layout.alignment: Qt.AlignRight - spacing: Theme.spacingS + Layout.preferredHeight: 32 - StyledRect { - readonly property real actionWidth: Math.min(keepText.implicitWidth + Theme.spacingM * 2, Math.max(104, (bannerActions.width - bannerActions.spacing) / 2)) - Layout.preferredWidth: actionWidth - Layout.preferredHeight: 32 - radius: Theme.cornerRadius - color: "transparent" - border.color: Theme.outlineMedium - border.width: 1 + Row { + id: bannerActions + anchors.right: parent.right + spacing: Theme.spacingS - StateLayer { - anchors.fill: parent - cornerRadius: parent.radius - stateColor: Theme.surfaceText - onClicked: root.resolveConflictKeepEdits() + readonly property real available: parent.width + + StyledRect { + width: Math.min(keepText.implicitWidth + Theme.spacingM * 2, Math.max(104, (bannerActions.available - bannerActions.spacing) / 2)) + height: 32 + radius: Theme.cornerRadius + color: "transparent" + border.color: Theme.outlineMedium + border.width: 1 + + StateLayer { + anchors.fill: parent + cornerRadius: parent.radius + stateColor: Theme.surfaceText + onClicked: root.resolveConflictKeepEdits() + } + + StyledText { + id: keepText + anchors.centerIn: parent + width: parent.width - Theme.spacingM + text: I18n.tr("Keep My Edits") + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceText + horizontalAlignment: Text.AlignHCenter + elide: Text.ElideRight + } } - StyledText { - id: keepText - anchors.centerIn: parent - width: parent.width - Theme.spacingM - text: I18n.tr("Keep My Edits") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceText - horizontalAlignment: Text.AlignHCenter - elide: Text.ElideRight - } - } + StyledRect { + width: Math.min(reloadText.implicitWidth + Theme.spacingM * 2, Math.max(116, (bannerActions.available - bannerActions.spacing) / 2)) + height: 32 + radius: Theme.cornerRadius + color: Theme.primary - StyledRect { - readonly property real actionWidth: Math.min(reloadText.implicitWidth + Theme.spacingM * 2, Math.max(116, (bannerActions.width - bannerActions.spacing) / 2)) - Layout.preferredWidth: actionWidth - Layout.preferredHeight: 32 - radius: Theme.cornerRadius - color: Theme.primary + StateLayer { + anchors.fill: parent + cornerRadius: parent.radius + stateColor: Theme.background + onClicked: root.resolveConflictReload() + } - StateLayer { - anchors.fill: parent - cornerRadius: parent.radius - stateColor: Theme.background - onClicked: root.resolveConflictReload() - } - - StyledText { - id: reloadText - anchors.centerIn: parent - width: parent.width - Theme.spacingM - text: I18n.tr("Reload From Disk") - font.pixelSize: Theme.fontSizeSmall - color: Theme.background - horizontalAlignment: Text.AlignHCenter - elide: Text.ElideRight + StyledText { + id: reloadText + anchors.centerIn: parent + width: parent.width - Theme.spacingM + text: I18n.tr("Reload From Disk") + font.pixelSize: Theme.fontSizeSmall + color: Theme.background + horizontalAlignment: Text.AlignHCenter + elide: Text.ElideRight + } } } } diff --git a/quickshell/Modules/Notepad/NotepadPopoutWindow.qml b/quickshell/Modules/Notepad/NotepadPopoutWindow.qml index 5f6659b7..3c20f7aa 100644 --- a/quickshell/Modules/Notepad/NotepadPopoutWindow.qml +++ b/quickshell/Modules/Notepad/NotepadPopoutWindow.qml @@ -37,6 +37,9 @@ FloatingWindow { } } + // A compositor close (e.g. niri close-window) + onClosed: win.visible = false + Item { anchors.fill: parent diff --git a/quickshell/Services/PopoutService.qml b/quickshell/Services/PopoutService.qml index 9cc9a048..90cb2bd2 100644 --- a/quickshell/Services/PopoutService.qml +++ b/quickshell/Services/PopoutService.qml @@ -789,12 +789,41 @@ Singleton { networkInfoModal?.close(); } + function closeNotepadSlideouts() { + for (var i = 0; i < notepadSlideouts.length; i++) { + if (notepadSlideouts[i] && notepadSlideouts[i].isVisible) + notepadSlideouts[i].hide(); + } + } + function openNotepadSlideout() { + notepadPopout?.hide(); if (notepadSlideouts.length > 0) { notepadSlideouts[0]?.show(); } } + // Keep the notepad in a single presentation for default modes + Connections { + target: SettingsData + function onNotepadDefaultModeChanged() { + if (SettingsData.notepadDefaultMode === "popout") { + var hadSlideout = false; + for (var i = 0; i < root.notepadSlideouts.length; i++) { + if (root.notepadSlideouts[i] && root.notepadSlideouts[i].isVisible) { + hadSlideout = true; + root.notepadSlideouts[i].hide(); + } + } + if (hadSlideout) + root.openNotepadPopout(); + } else if (root.notepadPopout && root.notepadPopout.visible) { + root.notepadPopout.hide(); + root.openNotepadSlideout(); + } + } + } + function openNotepad() { if (SettingsData.notepadDefaultMode === "popout") { openNotepadPopout(); @@ -828,6 +857,7 @@ Singleton { property bool _notepadPopoutWantsOpen: false function openNotepadPopout() { + closeNotepadSlideouts(); if (notepadPopout) { notepadPopout.show(); } else if (notepadPopoutLoader) { @@ -845,6 +875,8 @@ Singleton { function toggleNotepadPopout() { if (notepadPopout) { + if (!notepadPopout.visible) + closeNotepadSlideouts(); notepadPopout.toggle(); } else { openNotepadPopout();