Keep refreshed image picker selection inside the active filter
This commit is contained in:
1 parent
2ba1015ef2
commit
a8e09b9ce2
2 files changed
+39
-1
No files matched your search
@@ -210,7 +210,8 @@ Item {
|
|||||||
var newImages = ImagePickerModel.loadRows(rows)
|
var newImages = ImagePickerModel.loadRows(rows)
|
||||||
|
|
||||||
root.loadedImageRows = rows
|
root.loadedImageRows = rows
|
||||||
root.selectedIndex = root.indexForSelectedImage(newImages)
|
var nextIndex = root.indexForSelectedImage(newImages)
|
||||||
|
root.selectedIndex = ImagePickerModel.nextSelectedIndexForFilter(newImages, nextIndex, root.filterText)
|
||||||
root.neighborImagesEnabled = false
|
root.neighborImagesEnabled = false
|
||||||
root.imageArray = newImages
|
root.imageArray = newImages
|
||||||
root.imagesLoaded = true
|
root.imagesLoaded = true
|
||||||
|
|||||||
@@ -82,6 +82,43 @@ for (const radius of [1, 8, 16]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const imagePickerQml = fs.readFileSync(path.join(root, 'shell/plugins/image-picker/ImagePicker.qml'), 'utf8')
|
const imagePickerQml = fs.readFileSync(path.join(root, 'shell/plugins/image-picker/ImagePicker.qml'), 'utf8')
|
||||||
|
// Exercise the actual QML refresh handler: model-only filtering tests cannot
|
||||||
|
// catch a row refresh selecting an image outside the active filter.
|
||||||
|
const refreshHandler = imagePickerQml.match(/function loadRows\(rows, reveal\) \{[\s\S]*?\n \}/)[0]
|
||||||
|
const refreshRoot = {
|
||||||
|
filterText: 'dark',
|
||||||
|
selectedImage: '/themes/removed-dark.png',
|
||||||
|
requestSerial: 1,
|
||||||
|
indexForSelectedImage(images) { return picker.indexForSelectedImage(images, this.selectedImage) },
|
||||||
|
enableNeighborsWhenReady() {},
|
||||||
|
revealWhenSettled() {}
|
||||||
|
}
|
||||||
|
const refreshContext = {
|
||||||
|
root: refreshRoot,
|
||||||
|
ImagePickerModel: picker,
|
||||||
|
Qt: { callLater(callback) { callback() } }
|
||||||
|
}
|
||||||
|
require('vm').runInNewContext(`${refreshHandler}; loadRows`, refreshContext)
|
||||||
|
const refreshRows = '/themes/light.png\n/themes/remaining-dark.png\n/themes/other-dark.png'
|
||||||
|
refreshContext.loadRows(refreshRows, false)
|
||||||
|
assertEqual(refreshRoot.selectedIndex, 1, 'filtered refresh selects a visible row after the selected theme is removed')
|
||||||
|
assert(picker.visibleWindow(picker.matchingIndices(refreshRoot.imageArray, 'dark'), refreshRoot.selectedIndex, 8)
|
||||||
|
.some(item => item.imageIndex === refreshRoot.selectedIndex), 'filtered refresh has a selected delegate to start preview loading')
|
||||||
|
refreshRoot.selectedImage = '/themes/other-dark.png'
|
||||||
|
refreshContext.loadRows(refreshRows, false)
|
||||||
|
assertEqual(refreshRoot.selectedIndex, 2, 'filtered refresh preserves a selected theme that still matches')
|
||||||
|
refreshRoot.selectedImage = '/themes/light.png'
|
||||||
|
refreshContext.loadRows(refreshRows, false)
|
||||||
|
assertEqual(refreshRoot.selectedIndex, 1, 'filtered refresh moves a hidden selection to the first match')
|
||||||
|
refreshRoot.filterText = 'missing'
|
||||||
|
refreshContext.loadRows(refreshRows, false)
|
||||||
|
assertEqual(refreshRoot.selectedIndex, -1, 'filtered refresh leaves no selection when nothing matches')
|
||||||
|
refreshRoot.filterText = ''
|
||||||
|
refreshContext.loadRows(refreshRows, false)
|
||||||
|
assertEqual(refreshRoot.selectedIndex, 0, 'unfiltered refresh retains its first-row fallback')
|
||||||
|
refreshContext.loadRows('', false)
|
||||||
|
assertEqual(refreshRoot.selectedIndex, -1, 'empty refresh has no selected image')
|
||||||
|
|
||||||
assert(
|
assert(
|
||||||
/function preloadRows[\s\S]*if \(opened \|\| requestActive\) return/.test(imagePickerQml),
|
/function preloadRows[\s\S]*if \(opened \|\| requestActive\) return/.test(imagePickerQml),
|
||||||
'image picker ignores cache preloads while a request is visible'
|
'image picker ignores cache preloads while a request is visible'
|
||||||
|
|||||||
Reference in new issue
Block a user