import { defineStore } from "pinia"; import { ref, computed } from "vue"; import { invoke } from "@tauri-apps/api/core"; export interface ImageItem { path: string; thumbnail?: string; name: string; width?: number; height?: number; zcaSuggestion?: { x: number; y: number; zone: string }; } export interface WatermarkSettings { type: 'text'; // Fixed to text text: string; color: string; // Hex opacity: number; // 0-1 scale: number; // 0.01 - 0.5 (relative to image height) manual_override: boolean; manual_position: { x: number, y: number }; } export const useGalleryStore = defineStore("gallery", () => { const images = ref([]); const selectedIndex = ref(-1); const watermarkSettings = ref({ type: 'text', text: 'Watermark', color: '#FFFFFF', opacity: 0.8, scale: 0.05, // 5% of height default manual_override: false, manual_position: { x: 0.5, y: 0.9 } }); const selectedImage = computed(() => { if (selectedIndex.value >= 0 && selectedIndex.value < images.value.length) { return images.value[selectedIndex.value]; } return null; }); function setImages(newImages: ImageItem[]) { images.value = newImages; selectedIndex.value = -1; } function updateWatermarkSettings(settings: Partial) { watermarkSettings.value = { ...watermarkSettings.value, ...settings }; } async function selectImage(index: number) { if (index < 0 || index >= images.value.length) return; selectedIndex.value = index; const img = images.value[index]; if (!img.zcaSuggestion) { try { const suggestion = await invoke<{x: number, y: number, zone: string}>("get_zca_suggestion", { path: img.path }); img.zcaSuggestion = suggestion; } catch (e) { console.error("ZCA failed", e); } } } return { images, selectedIndex, selectedImage, watermarkSettings, setImages, selectImage, updateWatermarkSettings }; });