shell: give the subconscious event log a host
Tier 2 was written, deployed and mounted by nothing — its own header named the gap. The chat sidebar hosts it now: ticker long-press, or the psychology indicator by the input box, which works when no pass is running.
This commit is contained in:
parent
e6e3dd3b2a
commit
49635fb005
1 changed files with 110 additions and 1 deletions
|
|
@ -528,7 +528,10 @@ Inline w/ backslash and round brackets \\(e^{i\\pi} + 1 = 0\\)
|
|||
}
|
||||
}
|
||||
|
||||
SubconsciousTicker {}
|
||||
SubconsciousTicker {
|
||||
// Tier 1 declares the intent; mounting Tier 2 is the host's job.
|
||||
onRequestOpenPanel: root.subconsciousPanelOpen = true
|
||||
}
|
||||
|
||||
Rectangle { // Input area
|
||||
id: inputWrapper
|
||||
|
|
@ -823,6 +826,26 @@ Inline w/ backslash and round brackets \\(e^{i\\pi} + 1 = 0\\)
|
|||
tooltipText: Translation.tr("Current tool: %1\nSet it with %2tool TOOL").arg(Ai.currentTool ?? "").arg(root?.commandPrefix ?? "/")
|
||||
}
|
||||
|
||||
ApiInputBoxIndicator {
|
||||
// Tier-2 subconscious log. The ticker's long-press is the
|
||||
// other way in, but the ticker only exists while a pass is
|
||||
// actually running — without this the event log would be
|
||||
// reachable only during the few seconds it is already on
|
||||
// screen, which is to say not reachable.
|
||||
icon: "psychology"
|
||||
text: Ai.subconsciousEvents.length > 0 ? String(Ai.subconsciousEvents.length) : ""
|
||||
tooltipText: Translation.tr("Subconscious event log")
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
// hoverEnabled false so hover still falls through to the
|
||||
// tooltip's own MouseArea underneath; we only want clicks.
|
||||
hoverEnabled: false
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onClicked: root.subconsciousPanelOpen = !root.subconsciousPanelOpen
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
|
@ -855,4 +878,90 @@ Inline w/ backslash and round brackets \\(e^{i\\pi} + 1 = 0\\)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ── Tier-2 subconscious event log ────────────────────────────────────
|
||||
// SubconsciousEventPanel is content, not a window: by design it carries no
|
||||
// scrim, no close button and no placement — its own header says so, and
|
||||
// names the gap ("no souveraine host mounts this yet"). Somebody has to be
|
||||
// the host, and until now nobody was: the panel was written, deployed, and
|
||||
// unreachable. That is exactly the failure SHELL-SURFACES.md exists to
|
||||
// stop — a surface that reaches the tree but never the glass, silently,
|
||||
// because nothing errors when nothing instantiates.
|
||||
//
|
||||
// The AI chat is the right host: the Tier-1 ticker already lives here and
|
||||
// Tier 2 is the same stream after the fact. Chrome is ours; the panel stays
|
||||
// placeable anywhere else later, viewtop included.
|
||||
property bool subconsciousPanelOpen: false
|
||||
|
||||
Item {
|
||||
id: subconsciousPanelHost
|
||||
anchors.fill: parent
|
||||
z: 100
|
||||
visible: opacity > 0
|
||||
opacity: root.subconsciousPanelOpen ? 1 : 0
|
||||
|
||||
Behavior on opacity {
|
||||
animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this)
|
||||
}
|
||||
|
||||
Rectangle { // Scrim — tap outside the panel to dismiss
|
||||
anchors.fill: parent
|
||||
radius: Appearance.rounding.small
|
||||
color: Appearance.colors.colScrim
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
preventStealing: true
|
||||
propagateComposedEvents: false
|
||||
onClicked: root.subconsciousPanelOpen = false
|
||||
}
|
||||
}
|
||||
|
||||
// The panel ships no close affordance, so the host draws one. It sits
|
||||
// above the panel rather than over it: the panel's own header already
|
||||
// occupies its top-right with the event count.
|
||||
RowLayout {
|
||||
id: subconsciousChrome
|
||||
anchors {
|
||||
top: parent.top
|
||||
left: parent.left
|
||||
right: parent.right
|
||||
margins: 8
|
||||
}
|
||||
height: 32
|
||||
|
||||
Item { Layout.fillWidth: true }
|
||||
|
||||
Item {
|
||||
// Finger-sized hit area; the glyph alone is far too small a
|
||||
// target on the phone.
|
||||
Layout.preferredWidth: 32
|
||||
Layout.preferredHeight: 32
|
||||
|
||||
MaterialSymbol {
|
||||
anchors.centerIn: parent
|
||||
text: "close"
|
||||
iconSize: Appearance.font.pixelSize.larger
|
||||
color: Appearance.colors.colSubtext
|
||||
}
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onClicked: root.subconsciousPanelOpen = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SubconsciousEventPanel {
|
||||
anchors {
|
||||
top: subconsciousChrome.bottom
|
||||
left: parent.left
|
||||
right: parent.right
|
||||
bottom: parent.bottom
|
||||
leftMargin: 8
|
||||
rightMargin: 8
|
||||
bottomMargin: 8
|
||||
topMargin: 4
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue