78 lines
2.1 KiB
TypeScript
78 lines
2.1 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; // Now mandatory from backend
|
|
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.03, // 3% of height default
|
|
manual_override: false,
|
|
manual_position: { x: 0.5, y: 0.97 } // 3% from bottom
|
|
});
|
|
|
|
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
|
|
};
|
|
});
|