Files
gui-video-clipper/src/lib/stores/preferences.svelte.ts

125 lines
3.8 KiB
TypeScript

import { load, Store } from '@tauri-apps/plugin-store';
import type { CookieSource } from '$lib/bindings/dependencies';
export type { CookieSource };
export interface CaptionSettings {
fontFamily: string;
fontSize: number;
textColor: string;
bold: boolean;
outlineColor: string;
backgroundEnabled: boolean;
backgroundOpacity: number;
backgroundColor: string;
textOutline: boolean;
shadowEnabled: boolean;
shadowDepth: number;
shadowColor: string;
dimmedColorMode: 'auto' | 'custom';
dimmedOpacity: number;
dimmedColor: string;
position: 'bottom' | 'top';
wordHighlight: boolean;
}
export const DEFAULT_CAPTION_SETTINGS: CaptionSettings = {
fontFamily: 'Arial',
fontSize: 18,
textColor: '#ffffff',
bold: true,
outlineColor: '#000000',
backgroundEnabled: true,
backgroundOpacity: 0.75,
backgroundColor: '#000000',
textOutline: true,
shadowEnabled: false,
shadowDepth: 2,
shadowColor: '#000000',
dimmedColorMode: 'auto',
dimmedOpacity: 0.4,
dimmedColor: '#999999',
position: 'bottom',
wordHighlight: true,
};
export interface Preferences {
outputDirectory: string;
cookieSource: CookieSource;
captionSettings: CaptionSettings;
clipListPosition: 'bottom' | 'left';
clipListWidth: number;
}
const DEFAULT_PREFERENCES: Preferences = {
outputDirectory: '~/',
cookieSource: { type: 'browser', browser: 'firefox' },
captionSettings: { ...DEFAULT_CAPTION_SETTINGS },
clipListPosition: 'bottom',
clipListWidth: 220,
};
let store: Store | null = null;
let loadPromise: Promise<void> | null = null;
export const preferences = $state<Preferences>({ ...DEFAULT_PREFERENCES });
export async function loadPreferences(): Promise<void> {
if (loadPromise) {
await loadPromise;
return;
}
loadPromise = (async () => {
store = await load('preferences.json', { autoSave: true });
const savedDir = await store.get<string>('outputDirectory');
const savedCookie = await store.get<CookieSource>('cookieSource');
const savedCaptions = await store.get<CaptionSettings>('captionSettings');
if (savedDir) preferences.outputDirectory = savedDir;
if (savedCookie) preferences.cookieSource = savedCookie;
if (savedCaptions) preferences.captionSettings = { ...DEFAULT_CAPTION_SETTINGS, ...savedCaptions };
const savedClipListPosition = await store.get<'bottom' | 'left'>('clipListPosition');
const savedClipListWidth = await store.get<number>('clipListWidth');
if (savedClipListPosition) preferences.clipListPosition = savedClipListPosition;
if (savedClipListWidth != null) preferences.clipListWidth = savedClipListWidth;
})();
await loadPromise;
}
export async function savePreferences(): Promise<void> {
if (!store) {
await loadPreferences();
}
if (!store) return;
await store.set('outputDirectory', preferences.outputDirectory);
await store.set('cookieSource', preferences.cookieSource);
await store.set('captionSettings', preferences.captionSettings);
await store.set('clipListPosition', preferences.clipListPosition);
await store.set('clipListWidth', preferences.clipListWidth);
await store.save();
}
export async function setOutputDirectory(dir: string): Promise<void> {
preferences.outputDirectory = dir;
await savePreferences();
}
export async function setCookieSource(source: CookieSource): Promise<void> {
preferences.cookieSource = source;
await savePreferences();
}
export async function setCaptionSettings(settings: Partial<CaptionSettings>): Promise<void> {
Object.assign(preferences.captionSettings, settings);
await savePreferences();
}
export async function setClipListPosition(position: 'bottom' | 'left'): Promise<void> {
preferences.clipListPosition = position;
await savePreferences();
}
export async function setClipListWidth(width: number): Promise<void> {
preferences.clipListWidth = width;
await savePreferences();
}