Split the lock branding source into its own component
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
import QtQuick
|
||||
import Quickshell
|
||||
import Quickshell.Io
|
||||
|
||||
Item {
|
||||
id: root
|
||||
|
||||
readonly property string home: Quickshell.env("HOME")
|
||||
readonly property string brandingPath: home + "/.config/omarchy/branding/screensaver.txt"
|
||||
readonly property string palettePath: home + "/.local/state/omarchy/current/theme/colors.toml"
|
||||
|
||||
property string brandingText: ""
|
||||
property string paletteColor4: ""
|
||||
|
||||
function readPaletteColor4(raw) {
|
||||
var lines = String(raw || "").split("\n")
|
||||
for (var i = 0; i < lines.length; i++) {
|
||||
var match = lines[i].match(/^\s*color4\s*=\s*["']?(#[0-9A-Fa-f]{6})/)
|
||||
if (match) return match[1]
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
FileView {
|
||||
path: root.brandingPath
|
||||
watchChanges: true
|
||||
printErrors: false
|
||||
onLoaded: root.brandingText = text()
|
||||
onLoadFailed: root.brandingText = ""
|
||||
onFileChanged: reload()
|
||||
}
|
||||
|
||||
FileView {
|
||||
path: root.palettePath
|
||||
watchChanges: true
|
||||
printErrors: false
|
||||
onLoaded: root.paletteColor4 = root.readPaletteColor4(text())
|
||||
onLoadFailed: root.paletteColor4 = ""
|
||||
onFileChanged: reload()
|
||||
}
|
||||
}
|
||||
@@ -22,8 +22,6 @@ Item {
|
||||
readonly property string placeholderText: "Enter Password"
|
||||
readonly property int fieldWidth: 381
|
||||
readonly property int fieldHeight: 67
|
||||
// AGS draws every surface with a 2px border and square corners; see the
|
||||
// 2px/border-radius: 0 pairs throughout ags/style.css.
|
||||
readonly property int outlineThickness: 2
|
||||
readonly property int fieldRadius: 0
|
||||
readonly property int fieldFontSize: Math.round(Style.font.heading * 1.125)
|
||||
@@ -37,22 +35,12 @@ Item {
|
||||
readonly property real passwordDotScale: dotMetrics.advanceWidth > 0
|
||||
? Math.min(1, (passwordInput.width - 4) / dotMetrics.advanceWidth)
|
||||
: 1
|
||||
// Gap between the branding and the password field, and the share of the
|
||||
// screen the art may claim. Text.Fit needs a bounded width and height to
|
||||
// scale into, so both are given explicitly below.
|
||||
readonly property int brandingGap: Style.space(48)
|
||||
readonly property int brandingMaxWidth: 1100
|
||||
readonly property int brandingMaxFontSize: Math.round(Style.font.heading * 1.5)
|
||||
|
||||
readonly property bool showPasswordCursor: inputEnabled && !authenticatingPassword && failureMessage.length === 0
|
||||
readonly property bool errorState: failureMessage.length > 0
|
||||
// The AGS border pair: containers rest on alpha(@color4, 0.5) and go to a
|
||||
// solid @accent once in use. An empty field reads as resting and a filled
|
||||
// one as active. The spec is built here rather than read from the [lock]
|
||||
// theme tokens, since those carry the shell's own heavier look; the colors
|
||||
// themselves still come from the active theme, so this follows a theme
|
||||
// change exactly like the AGS widgets do. color4 falls back to the accent
|
||||
// for a palette that does not define one.
|
||||
readonly property bool inputActive: passwordText.length > 0 || authenticatingPassword
|
||||
readonly property color inputRestingBorder: paletteColor4.length > 0 ? paletteColor4 : Color.accent
|
||||
readonly property color inputBorderColor: errorState
|
||||
@@ -142,10 +130,6 @@ Item {
|
||||
onPositionChanged: root.wakeRequested()
|
||||
}
|
||||
|
||||
// Sits above the password field rather than replacing anything, so the
|
||||
// input keeps the position and size it has upstream. Text.Fit shrinks the
|
||||
// art to whatever room is left above the field, which keeps a tall or wide
|
||||
// screensaver.txt from running off the top of a small screen.
|
||||
Text {
|
||||
id: branding
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
|
||||
@@ -15,8 +15,6 @@ Item {
|
||||
readonly property string stateHome: home + "/.local/state"
|
||||
readonly property string userName: Quickshell.env("USER") || Quickshell.env("LOGNAME")
|
||||
readonly property string currentBackgroundLink: stateHome + "/omarchy/current/background"
|
||||
readonly property string brandingPath: home + "/.config/omarchy/branding/screensaver.txt"
|
||||
readonly property string currentThemePath: stateHome + "/omarchy/current/theme"
|
||||
|
||||
property bool lockRequested: false
|
||||
property bool pendingSessionLock: false
|
||||
@@ -31,8 +29,6 @@ Item {
|
||||
property int failedAttempts: 0
|
||||
property string backgroundPath: ""
|
||||
property int backgroundVersion: 0
|
||||
property string brandingText: ""
|
||||
property string paletteColor4: ""
|
||||
property string lastEvent: "init"
|
||||
property string lastEventAt: ""
|
||||
property bool strandedLock: false
|
||||
@@ -274,8 +270,8 @@ Item {
|
||||
anchors.fill: parent
|
||||
backgroundPath: root.backgroundPath
|
||||
backgroundVersion: root.backgroundVersion
|
||||
brandingText: root.brandingText
|
||||
paletteColor4: root.paletteColor4
|
||||
brandingText: brandingSource.brandingText
|
||||
paletteColor4: brandingSource.paletteColor4
|
||||
fingerprintConfigured: root.fingerprintConfigured
|
||||
authenticatingPassword: root.authenticatingPassword
|
||||
failureMessage: root.failureMessage
|
||||
@@ -306,8 +302,8 @@ Item {
|
||||
anchors.fill: parent
|
||||
backgroundPath: root.backgroundPath
|
||||
backgroundVersion: root.backgroundVersion
|
||||
brandingText: root.brandingText
|
||||
paletteColor4: root.paletteColor4
|
||||
brandingText: brandingSource.brandingText
|
||||
paletteColor4: brandingSource.paletteColor4
|
||||
fingerprintConfigured: root.fingerprintConfigured
|
||||
authenticatingPassword: false
|
||||
failureMessage: ""
|
||||
@@ -489,39 +485,8 @@ Item {
|
||||
else armBlankTimer()
|
||||
}
|
||||
|
||||
// The Color singleton exposes only foreground, background, accent, urgent,
|
||||
// and muted, so the raw color4 slot the AGS stylesheet borders with has to
|
||||
// be read here. Same file and same shape Color itself parses; the current
|
||||
// theme directory is a real directory rewritten in place on every theme
|
||||
// change, so watching the file is enough to follow a theme switch.
|
||||
function readPaletteColor4(raw) {
|
||||
var lines = String(raw || "").split("\n")
|
||||
for (var i = 0; i < lines.length; i++) {
|
||||
var match = lines[i].match(/^\s*color4\s*=\s*["']?(#[0-9A-Fa-f]{6})/)
|
||||
if (match) return match[1]
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
FileView {
|
||||
path: root.currentThemePath + "/colors.toml"
|
||||
watchChanges: true
|
||||
printErrors: false
|
||||
onLoaded: root.paletteColor4 = root.readPaletteColor4(text())
|
||||
onLoadFailed: root.paletteColor4 = ""
|
||||
onFileChanged: reload()
|
||||
}
|
||||
|
||||
// The same file the screensaver paints. Watched so an edit through
|
||||
// `omarchy branding screensaver text` shows up on the next lock without a
|
||||
// shell restart. A missing file simply leaves the lock screen unbranded.
|
||||
FileView {
|
||||
path: root.brandingPath
|
||||
watchChanges: true
|
||||
printErrors: false
|
||||
onLoaded: root.brandingText = text()
|
||||
onLoadFailed: root.brandingText = ""
|
||||
onFileChanged: reload()
|
||||
BrandingSource {
|
||||
id: brandingSource
|
||||
}
|
||||
|
||||
FileView {
|
||||
|
||||
Reference in New Issue
Block a user