* Navigate Elsewhen from the keyboard and summon it with Super+Ctrl+Alt+E Up and down walk home and the cities, lighting the picked row and turning the globe to it. Left and right move the clocks an hour, held until Escape or close. Escape now clears a shifted time before leaving the globe. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Reach Add a city from the keyboard and shift time past a day Down past the last city selects Add a city, where Return or Space opens the search. The arrow keys no longer stop at twelve hours, and shifts past a day read in days. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Delete the picked Elsewhen city from the keyboard Delete (or x) removes the picked city and moves the cursor to the one that takes its place. The picked row shows its × so the target is plain. Delete now reaches every panel's deleteRequested, as it already does in the clipboard and the menu. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Center bar glyphs on the open-panel underline The 16px icon canvas in the 27px slot was snapped from 5.5 to 6, and the glyph's fractional centering correction was snapped too, so glyphs sat up to 0.9px right of the underline, which centers on the slot. Both are now placed exactly, and the geometry test measures against the slot to within 0.05px. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
59 lines
1.7 KiB
QML
59 lines
1.7 KiB
QML
import QtQuick
|
|
import qs.Commons
|
|
|
|
Item {
|
|
id: root
|
|
|
|
property string text: ""
|
|
property string fontFamily: Style.font.family
|
|
property real fontSize: Style.font.body
|
|
property color color: Color.foreground
|
|
property bool debugBounds: false
|
|
|
|
readonly property int renderedFontSize: Math.max(1, Math.round(fontSize))
|
|
readonly property real tightWidth: Math.max(1, glyphMetrics.tightBoundingRect.width)
|
|
readonly property real horizontalCorrection: glyph.implicitWidth / 2 - (glyphMetrics.tightBoundingRect.x + tightWidth / 2)
|
|
readonly property real paintedCenterX: glyph.x + glyphMetrics.tightBoundingRect.x + tightWidth / 2
|
|
readonly property real baselineY: glyph.y + glyph.baselineOffset
|
|
|
|
TextMetrics {
|
|
id: glyphMetrics
|
|
font.family: root.fontFamily
|
|
font.pixelSize: root.renderedFontSize
|
|
text: root.text
|
|
}
|
|
|
|
Text {
|
|
id: glyph
|
|
textFormat: Text.PlainText
|
|
// Keep the shared line box and baseline intact. Correcting only the
|
|
// horizontal painted bounds avoids per-glyph vertical drift.
|
|
// The correction is fractional, so x is set exactly: centerIn would snap it
|
|
// to a whole pixel and undo it. y still snaps, keeping the baseline crisp.
|
|
x: (root.width - width) / 2 + root.horizontalCorrection
|
|
y: Math.round((root.height - height) / 2)
|
|
text: root.text
|
|
color: root.color
|
|
font.family: root.fontFamily
|
|
font.pixelSize: root.renderedFontSize
|
|
renderType: Text.NativeRendering
|
|
}
|
|
|
|
Rectangle {
|
|
visible: root.debugBounds
|
|
anchors.fill: parent
|
|
color: "transparent"
|
|
border.width: 1
|
|
border.color: "#4488ff"
|
|
}
|
|
|
|
Rectangle {
|
|
visible: root.debugBounds
|
|
x: 0
|
|
y: Math.round(root.baselineY)
|
|
width: parent.width
|
|
height: 1
|
|
color: "#44ff88"
|
|
}
|
|
}
|