/
Mativ
/
solo-master
Обзор
Документация
Войти
/
Mativ
/
solo-master
Код
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/main/services/FileService.ts
67 строк
3 KB
mativ
control
14 май 2026, 08:41
14 май 2026, 08:41
a3c5022
Код
Авторство
О чём код?
import { dialog } from 'electron'; import * as fs from 'fs'; import { ModelData } from '../../shared/Model'; import { WindowsService } from './WindowsService'; class FileServiceImpl { save(data: ModelData, path: string | null): string | null { if (!path) { const file = dialog.showSaveDialogSync(WindowsService.getMain(), { filters: [{ name: 'Solo Project', extensions: ['solo'] }], defaultPath: `${data.name}.solo`, }); if (!file) return null; path = file; } fs.writeFileSync(path, JSON.stringify(data, undefined, 2), 'utf-8'); return path; } load(): { data: ModelData, path: string } | null { const files = dialog.showOpenDialogSync(WindowsService.getMain(), { properties: ['openFile'], filters: [{ name: 'Solo Project', extensions: ['solo'] }], }); if (!files) return null; const path = files[0]; const raw = fs.readFileSync(path, 'utf-8'); try { const data = JSON.parse(raw); if (data?.workspace?.map?.opasity !== undefined) { data.workspace.map.opacity = data.workspace.map.opasity; delete data.workspace.map.opasity; } if (!data?.service?.settings?.viewTransform) { data.service.settings.viewTransform = { fit: 'contain', rotation: 0, flipH: false, flipV: false }; } if (data?.workspace?.instances && !Array.isArray(data.workspace.instances.sounds)) { data.workspace.instances.sounds = []; } if (data?.tracker && !('currentInstanceUid' in data.tracker)) { data.tracker.currentInstanceUid = undefined; } if (data?.tracker && !Array.isArray(data.tracker.instanceUidList)) { const trackedEntityUids = new Set<string>( Array.isArray(data.tracker.groups) ? data.tracker.groups.map((g: any) => g.entityUid) : [] ); const tokens = data?.workspace?.instances?.tokens; data.tracker.instanceUidList = Array.isArray(tokens) ? tokens.filter((t: any) => trackedEntityUids.has(t.entityUid)).map((t: any) => t.instanceUid) : []; } if (Array.isArray(data?.entities)) { for (const e of data.entities) { if (e?.type === 'sound' && e.valume !== undefined && e.volume === undefined) { e.volume = e.valume; delete e.valume; } } } return { data: data as ModelData, path }; } catch { throw new Error("Файл повреждён или не является проектом Solo"); } } } export const FileService = new FileServiceImpl();