Keep the menu anchored to a stable top line and drop its minimum height
The menu card re-centered on every resize, so searching or moving into a submenu made it jump around. It still opens centered like before, but the first search keystroke or submenu move freezes the top line where it sits — from then on the card only grows and shrinks downward. Closing unfreezes. Also drop the 220px minimum height so the card always hugs its content instead of leaving a void under short lists. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
e99a4343bb
commit
141432639f
@@ -100,7 +100,7 @@ Item {
|
|||||||
property int visibleRowsHeight: root.dmenuActive ? dmenuRowListHeight(layoutSerial, displayModel.count, filterText) : rowListHeight(layoutSerial, displayModel.count, filterText, searchDivider)
|
property int visibleRowsHeight: root.dmenuActive ? dmenuRowListHeight(layoutSerial, displayModel.count, filterText) : rowListHeight(layoutSerial, displayModel.count, filterText, searchDivider)
|
||||||
property int cardHeight: root.dmenuActive
|
property int cardHeight: root.dmenuActive
|
||||||
? Math.min(contentMargin * 2 + headerHeight + (mode === "input" ? 0 : contentSpacing + visibleRowsHeight), panel.height - Style.gapsOut * 2)
|
? Math.min(contentMargin * 2 + headerHeight + (mode === "input" ? 0 : contentSpacing + visibleRowsHeight), panel.height - Style.gapsOut * 2)
|
||||||
: Math.min(Math.max(Style.space(220), contentMargin * 2 + headerHeight + contentSpacing + visibleRowsHeight), panel.height - Style.gapsOut * 2)
|
: Math.min(contentMargin * 2 + headerHeight + contentSpacing + visibleRowsHeight, panel.height - Style.gapsOut * 2)
|
||||||
|
|
||||||
function finishRequest(selection) {
|
function finishRequest(selection) {
|
||||||
if (!root.requestActive || !root.doneFile) {
|
if (!root.requestActive || !root.doneFile) {
|
||||||
@@ -505,6 +505,7 @@ Item {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function setFilter(nextFilter) {
|
function setFilter(nextFilter) {
|
||||||
|
panel.freezeCardTop()
|
||||||
root.filterText = nextFilter
|
root.filterText = nextFilter
|
||||||
root.selectedIndex = 0
|
root.selectedIndex = 0
|
||||||
root.cursorActive = root.mode !== "input"
|
root.cursorActive = root.mode !== "input"
|
||||||
@@ -514,6 +515,7 @@ Item {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function setActiveMenu(id, pushHistory, fromPointer) {
|
function setActiveMenu(id, pushHistory, fromPointer) {
|
||||||
|
panel.freezeCardTop()
|
||||||
if (!root.item(id)) id = "root"
|
if (!root.item(id)) id = "root"
|
||||||
if (pushHistory && id !== root.activeMenu) root.navStack = root.navStack.concat([root.activeMenu])
|
if (pushHistory && id !== root.activeMenu) root.navStack = root.navStack.concat([root.activeMenu])
|
||||||
root.activeMenu = id
|
root.activeMenu = id
|
||||||
@@ -797,6 +799,18 @@ Item {
|
|||||||
WlrLayershell.keyboardFocus: WlrKeyboardFocus.Exclusive
|
WlrLayershell.keyboardFocus: WlrKeyboardFocus.Exclusive
|
||||||
exclusionMode: ExclusionMode.Ignore
|
exclusionMode: ExclusionMode.Ignore
|
||||||
|
|
||||||
|
// The card opens centered exactly as always. The first search keystroke
|
||||||
|
// or submenu move freezes the top line where it currently sits — from
|
||||||
|
// then on the card grows and shrinks downward instead of re-centering
|
||||||
|
// on every resize, which made the menu jump around. Closing unfreezes.
|
||||||
|
property int cardTop: -1
|
||||||
|
readonly property int centeredTop: Math.max(Style.gapsOut, Math.round((height - root.cardHeight) / 2))
|
||||||
|
readonly property int effectiveCardTop: cardTop >= 0 ? cardTop : centeredTop
|
||||||
|
function freezeCardTop() {
|
||||||
|
if (visible && cardTop < 0) cardTop = effectiveCardTop
|
||||||
|
}
|
||||||
|
onVisibleChanged: if (!visible) cardTop = -1
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
color: root.scrim
|
color: root.scrim
|
||||||
@@ -810,9 +824,10 @@ Item {
|
|||||||
BorderSurface {
|
BorderSurface {
|
||||||
id: card
|
id: card
|
||||||
width: root.cardWidth
|
width: root.cardWidth
|
||||||
height: root.cardHeight
|
height: Math.min(root.cardHeight, panel.height - Style.gapsOut - panel.effectiveCardTop)
|
||||||
radius: root.cornerRadius
|
radius: root.cornerRadius
|
||||||
anchors.centerIn: parent
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
y: panel.effectiveCardTop
|
||||||
color: root.background
|
color: root.background
|
||||||
borderSpec: root.borderSpec
|
borderSpec: root.borderSpec
|
||||||
padding: root.contentMargin
|
padding: root.contentMargin
|
||||||
|
|||||||
Reference in New Issue
Block a user