Files
watermark-wizard/src/stores/gallery.ts
2026-01-18 23:22:52 -04:00

78 lines
2.0 KiB
TypeScript

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<ImageItem[]>([]);
const selectedIndex = ref<number>(-1);
const watermarkSettings = ref<WatermarkSettings>({
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>) {
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
};
});