shell: re-home the subconscious surface from the ii tree to souveraine
The subconscious three-tier surface (SubconsciousTicker + SubconsciousEventPanel) is Souveraine-original, not upstream ii. It lived under ii-base/modules/ii only because it had never been re-homed, so the ii -> souveraine shell migration silently stranded it: the files survived, but the running shell (qs -c souveraine) never loaded them, and the feature dropped off the device. Relocated into modules/souveraine/subconscious/, decoupled from the ii overlay system it was riveted to: - SubconsciousTicker: was clean of ii imports but opened the panel through the ii OverlayContext singleton. Now emits requestOpenPanel(); a host connects it. - SubconsciousEventPanel: was a StyledOverlayWidget (qs.modules.ii.overlay). Now plain content a host instantiates; the pin/close/drag affordances were the overlay host's job, not the content's. The model (services/Ai.qml) was already substrate-neutral and never moved; only the views were stranded. GAP NAMED: no souveraine overlay host mounts these yet, so they do not reach the glass until one exists — the ii overlay host was intentionally not ported. The dangling ii references (AiChat, OverlayContext, OverlayWidgetDelegateChooser) are removed.
This commit is contained in:
parent
0ef239515f
commit
25898a9d14
5 changed files with 41 additions and 31 deletions
|
|
@ -15,7 +15,6 @@ Singleton {
|
|||
{ identifier: "resources", materialSymbol: "browse_activity" },
|
||||
{ identifier: "notes", materialSymbol: "note_stack" },
|
||||
{ identifier: "volumeMixer", materialSymbol: "volume_up" },
|
||||
{ identifier: "subconsciousEventPanel", materialSymbol: "psychology" },
|
||||
]
|
||||
|
||||
readonly property bool hasPinnedWidgets: root.pinnedWidgetIdentifiers.length > 0
|
||||
|
|
|
|||
|
|
@ -13,7 +13,6 @@ import qs.modules.ii.overlay.fpsLimiter
|
|||
import qs.modules.ii.overlay.recorder
|
||||
import qs.modules.ii.overlay.resources
|
||||
import qs.modules.ii.overlay.notes
|
||||
import qs.modules.ii.overlay.subconsciousEventPanel
|
||||
|
||||
DelegateChooser {
|
||||
id: root
|
||||
|
|
@ -26,5 +25,4 @@ DelegateChooser {
|
|||
DelegateChoice { roleValue: "resources"; Resources {} }
|
||||
DelegateChoice { roleValue: "notes"; Notes {} }
|
||||
DelegateChoice { roleValue: "volumeMixer"; VolumeMixer {} }
|
||||
DelegateChoice { roleValue: "subconsciousEventPanel"; SubconsciousEventPanel {} }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -527,8 +527,6 @@ Inline w/ backslash and round brackets \\(e^{i\\pi} + 1 = 0\\)
|
|||
}
|
||||
}
|
||||
|
||||
SubconsciousTicker {}
|
||||
|
||||
Rectangle { // Input area
|
||||
id: inputWrapper
|
||||
property real spacing: 5
|
||||
|
|
|
|||
|
|
@ -1,13 +1,11 @@
|
|||
import QtQuick
|
||||
import QtQuick.Layouts
|
||||
import QtQuick.Controls
|
||||
import Quickshell
|
||||
import qs
|
||||
import qs.services
|
||||
import qs.modules.common
|
||||
import qs.modules.common.widgets
|
||||
import qs.modules.common.functions
|
||||
import qs.modules.ii.overlay
|
||||
|
||||
// Tier 2 of the subconscious three-tier visibility design (see
|
||||
// docs/tasks/subconscious-surfacing-threshold.md): a persistent, interactive
|
||||
|
|
@ -17,12 +15,28 @@ import qs.modules.ii.overlay
|
|||
// closing docs/bugs.md B-005 ("subconscious messages not expandable").
|
||||
// Fed by Ai.subconsciousEvents; the live Tier-1 ticker is snapshotted into
|
||||
// it on pass end.
|
||||
StyledOverlayWidget {
|
||||
//
|
||||
// Souveraine-original, relocated out of the ii tree on 2026-07-30. It was
|
||||
// previously a StyledOverlayWidget (qs.modules.ii.overlay) riveted into the
|
||||
// ii overlay system; that base is intentionally NOT ported, because we are
|
||||
// exiting ii. This is now plain content — a host (a souveraine overlay
|
||||
// surface, a sidebar, or a future viewtop scene node) instantiates and places
|
||||
// it. The pin/close/drag affordances were the overlay host's job, not the
|
||||
// content's, so they are not here. GAP NAMED: no souveraine host mounts this
|
||||
// yet, so it does not reach the glass until one exists.
|
||||
Item {
|
||||
id: root
|
||||
title: Translation.tr("Subconscious")
|
||||
showCenterButton: true
|
||||
|
||||
contentItem: Rectangle {
|
||||
// A host may read these to label/chrome the panel.
|
||||
property string title: Translation.tr("Subconscious")
|
||||
property int contentRadius: Appearance.rounding.normal
|
||||
|
||||
implicitWidth: body.implicitWidth
|
||||
implicitHeight: body.implicitHeight
|
||||
|
||||
Rectangle {
|
||||
id: body
|
||||
anchors.fill: parent
|
||||
radius: root.contentRadius
|
||||
color: Appearance.colors.colLayer1
|
||||
implicitWidth: 340
|
||||
|
|
@ -13,11 +13,20 @@ import Quickshell
|
|||
// Visible only while Ai.subconsciousActive; fed by Ai.subconsciousStream;
|
||||
// cleared (and snapshotted to the Tier-2 log) when the pass ends.
|
||||
//
|
||||
// This is Souveraine-original work, not anything inherited from the upstream
|
||||
// ii shell. It lived under the ii tree only because it had not been re-homed;
|
||||
// relocated into modules/souveraine/ on 2026-07-30 so it is no longer tangled
|
||||
// with a shell we are exiting. The model it reads (Ai.qml, in services/) is
|
||||
// already substrate-neutral and never moved.
|
||||
//
|
||||
// Interaction: the psychology icon is a real affordance, not decoration.
|
||||
// • tap → expand/collapse an inline mini-log (last few entries) in place
|
||||
// • long-press → open the Tier-2 Subconscious event panel as a draggable
|
||||
// overlay pane (and pin it), so the live stream and the persistent log
|
||||
// are one gesture apart.
|
||||
// • long-press → ask the host to open the Tier-2 event panel
|
||||
//
|
||||
// The long-press emits requestOpenPanel() rather than reaching into an overlay
|
||||
// manager. Whoever mounts the panel connects that signal; the view itself owns
|
||||
// no overlay state. That decoupling is the point: this component renders
|
||||
// wherever a host places it — sidebar, scene element, or a future viewtop node.
|
||||
Rectangle {
|
||||
id: root
|
||||
Layout.fillWidth: true
|
||||
|
|
@ -30,6 +39,11 @@ Rectangle {
|
|||
property real padding: 6
|
||||
property bool expanded: false
|
||||
|
||||
/// Ask the host to open the Tier-2 subconscious event panel. The view does
|
||||
/// not know how panels are mounted; it only declares the intent. Unconnected
|
||||
/// until a souveraine overlay host exists — see SubconsciousEventPanel.qml.
|
||||
signal requestOpenPanel()
|
||||
|
||||
Behavior on opacity {
|
||||
animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this)
|
||||
}
|
||||
|
|
@ -50,19 +64,6 @@ Rectangle {
|
|||
}
|
||||
}
|
||||
|
||||
function _openPanel() {
|
||||
// Open the Tier-2 Subconscious event panel as a draggable overlay
|
||||
// pane and pin it, so it stays after the overlay closes. Mirrors what
|
||||
// OverlayTaskbar's WidgetButton does on click.
|
||||
const id = "subconsciousEventPanel";
|
||||
const open = Persistent.states.overlay.open;
|
||||
if (!open.includes(id)) {
|
||||
Persistent.states.overlay.open.push(id);
|
||||
}
|
||||
OverlayContext.pin(id, true);
|
||||
GlobalStates.overlayOpen = true;
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
id: col
|
||||
anchors.fill: parent
|
||||
|
|
@ -74,7 +75,7 @@ Rectangle {
|
|||
spacing: root.padding
|
||||
|
||||
// The icon is the affordance: tap = expand inline, long-press =
|
||||
// open the overlay panel. Press-and-hold beats a separate button
|
||||
// open the event panel. Press-and-hold beats a separate button
|
||||
// — keeps the ticker visually quiet.
|
||||
Item {
|
||||
Layout.alignment: Qt.AlignVCenter
|
||||
|
|
@ -98,7 +99,7 @@ Rectangle {
|
|||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: root.expanded = !root.expanded
|
||||
onPressAndHold: root._openPanel()
|
||||
onPressAndHold: root.requestOpenPanel()
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
}
|
||||
}
|
||||
|
|
@ -137,7 +138,7 @@ Rectangle {
|
|||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: root.expanded = !root.expanded
|
||||
onPressAndHold: root._openPanel()
|
||||
onPressAndHold: root.requestOpenPanel()
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
}
|
||||
StyledToolTip {
|
||||
|
|
@ -148,7 +149,7 @@ Rectangle {
|
|||
|
||||
// Inline mini-log: the last several entries (newest at the bottom),
|
||||
// shown when expanded. Read-only — the full searchable log lives in
|
||||
// the Tier-2 overlay panel.
|
||||
// the Tier-2 panel.
|
||||
ColumnLayout {
|
||||
Layout.fillWidth: true
|
||||
visible: root.expanded && Ai.subconsciousStream.length > 0
|
||||
Loading…
Reference in a new issue