0.5.2: paste images, shared import helper, clipart persistence
- Clipboard paste creates an image layer: a document-level paste
listener detects image items in the clipboard (Strg+V after a
screenshot, e.g.) and imports them via the shared helper. Skipped
when focus is in a real text input / textarea / contenteditable.
- Shared importImageFile() helper in fileLoader.ts replaces the
duplicated image-import logic in AssetSidebar and CanvasStage's
clipart-drop path. Optional position argument for drop-at-point.
- Clipart folder persistence hardened for reloads:
- initialize() is now safely re-runnable (no-ops only once a handle
is actually loaded, tolerates refresh failures so the folder name
survives even if permission isn't auto-granted)
- App.vue's onMounted kicks off initialize() so it runs regardless
of whether the drawer component has mounted
- DocumentSettings re-invokes initialize() each time the modal
opens — covers app-start races and gives the user gesture needed
for FS Access permission prompts
- Opening the drawer refreshes thumbnails when handle is set but
items are empty, so the user-gesture context restores permission
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
cbc309bc8c
commit
07b0ef2659
8 files changed
+126
-65
No files matched your search
+21
-4
@@ -51,14 +51,27 @@ export const useClipartStore = defineStore('clipart', {
|
||||
}),
|
||||
actions: {
|
||||
async initialize() {
|
||||
if (this.initialized) return
|
||||
this.initialized = true
|
||||
if (!this.supported) return
|
||||
if (!this.supported) {
|
||||
this.initialized = true
|
||||
return
|
||||
}
|
||||
// Safe to call multiple times; a second call will no-op once a handle
|
||||
// has been loaded. If the previous attempt failed silently (e.g. IDB
|
||||
// race on app start), a later call from Settings/drawer can retry.
|
||||
if (this.handle) {
|
||||
this.initialized = true
|
||||
return
|
||||
}
|
||||
const handle = await loadStoredClipartFolder()
|
||||
this.initialized = true
|
||||
if (!handle) return
|
||||
this.handle = handle
|
||||
this.folderName = handle.name
|
||||
await this.refresh()
|
||||
try {
|
||||
await this.refresh()
|
||||
} catch {
|
||||
/* permission may require a user gesture; items will populate on next open */
|
||||
}
|
||||
},
|
||||
async pickFolder() {
|
||||
this.error = null
|
||||
@@ -105,6 +118,10 @@ export const useClipartStore = defineStore('clipart', {
|
||||
setOpen(v: boolean) {
|
||||
this.open = v
|
||||
writeDrawerOpen(v)
|
||||
if (v && this.handle && this.items.length === 0 && !this.loading) {
|
||||
// User gesture opens the drawer — good moment to (re-)request access
|
||||
void this.refresh()
|
||||
}
|
||||
},
|
||||
toggle() {
|
||||
this.setOpen(!this.open)
|
||||
|
||||
Reference in new issue
Block a user