Fix theme switcher preload scrim race
This commit is contained in:
@@ -110,7 +110,7 @@ Item {
|
|||||||
|
|
||||||
Process {
|
Process {
|
||||||
id: themeSwitchProc
|
id: themeSwitchProc
|
||||||
command: ["bash", "-lc", "theme=$(omarchy-theme-switcher); [[ -n $theme ]] && omarchy-theme-set \"$theme\""]
|
command: ["bash", "-lc", "theme=$(omarchy-theme-switcher); [[ -n $theme ]] && omarchy-theme-set \"$theme\" >/dev/null 2>&1 &"]
|
||||||
onExited: root.refreshBackground()
|
onExited: root.refreshBackground()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -324,6 +324,12 @@ Item {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function preloadRows(nextImageRows, nextSelectedImage, nextShowLabels, nextFilterable) {
|
function preloadRows(nextImageRows, nextSelectedImage, nextShowLabels, nextFilterable) {
|
||||||
|
// Theme/background set hooks can warm selector rows after a picker was
|
||||||
|
// dismissed. Ignore those preloads while a user-visible request is open;
|
||||||
|
// otherwise the preload resets layoutSettled without revealing again,
|
||||||
|
// leaving only the fullscreen scrim.
|
||||||
|
if (opened || requestActive) return
|
||||||
|
|
||||||
requestSerial += 1
|
requestSerial += 1
|
||||||
imageRows = nextImageRows
|
imageRows = nextImageRows
|
||||||
selectedImage = nextSelectedImage
|
selectedImage = nextSelectedImage
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
source "$(dirname "$0")/base-test.sh"
|
||||||
|
|
||||||
|
run_node_test <<'JS'
|
||||||
|
const fs = require('fs')
|
||||||
|
|
||||||
|
const backgroundQml = fs.readFileSync(path.join(root, 'shell/plugins/background/Background.qml'), 'utf8')
|
||||||
|
|
||||||
|
assert(
|
||||||
|
/theme=\$\(omarchy-theme-switcher\); \[\[ -n \$theme \]\] && omarchy-theme-set \\"\$theme\\" >\/dev\/null 2>&1 &/.test(backgroundQml),
|
||||||
|
'background theme switcher starts theme application asynchronously after selection'
|
||||||
|
)
|
||||||
|
JS
|
||||||
@@ -5,6 +5,7 @@ set -euo pipefail
|
|||||||
source "$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)/base-test.sh"
|
source "$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)/base-test.sh"
|
||||||
|
|
||||||
run_node_test <<'JS'
|
run_node_test <<'JS'
|
||||||
|
const fs = require('fs')
|
||||||
const picker = requireFromRoot('shell/plugins/image-picker/ImagePickerModel.js')
|
const picker = requireFromRoot('shell/plugins/image-picker/ImagePickerModel.js')
|
||||||
|
|
||||||
assertEqual(picker.nameForPath('/themes/nord-river.png'), 'nord-river', 'image picker strips directory and extension')
|
assertEqual(picker.nameForPath('/themes/nord-river.png'), 'nord-river', 'image picker strips directory and extension')
|
||||||
@@ -40,4 +41,10 @@ assertEqual(picker.indexForSelectedImage(images, '/missing.png'), 0, 'image pick
|
|||||||
assertEqual(picker.filteredPosition(images, 2, 'dark'), 1, 'image picker computes filtered position')
|
assertEqual(picker.filteredPosition(images, 2, 'dark'), 1, 'image picker computes filtered position')
|
||||||
assertEqual(picker.selectedFilteredPosition(images, 2, 'dark'), 0, 'image picker selected filtered position falls back when selected is hidden')
|
assertEqual(picker.selectedFilteredPosition(images, 2, 'dark'), 0, 'image picker selected filtered position falls back when selected is hidden')
|
||||||
assertEqual(picker.nextSelectedIndexForFilter(images, 0, 'dark'), 1, 'image picker moves selection to first match when filter hides current item')
|
assertEqual(picker.nextSelectedIndexForFilter(images, 0, 'dark'), 1, 'image picker moves selection to first match when filter hides current item')
|
||||||
|
|
||||||
|
const imagePickerQml = fs.readFileSync(path.join(root, 'shell/plugins/image-picker/ImagePicker.qml'), 'utf8')
|
||||||
|
assert(
|
||||||
|
/function preloadRows[\s\S]*if \(opened \|\| requestActive\) return/.test(imagePickerQml),
|
||||||
|
'image picker ignores cache preloads while a request is visible'
|
||||||
|
)
|
||||||
JS
|
JS
|
||||||
|
|||||||
Reference in New Issue
Block a user