From a366c07128fd5f041010cacefd761a94de98ba9c Mon Sep 17 00:00:00 2001 From: MathieuG-P <40181755+Zagrios@users.noreply.github.com> Date: Mon, 8 May 2023 21:12:35 +0200 Subject: [PATCH] [feature-136] Add model types icons + export models + init delete models + init searchbar --- src/main/ipcs/bs-model-ipcs.ts | 8 +++ .../local-models-manager.service.ts | 22 ++++++- .../model-item.component.tsx | 29 ++++++--- .../models-grid.component.tsx | 35 +++++++--- .../models-panel.component.tsx | 39 +++++++++-- .../models-tabs-navbar.component.tsx | 13 ++-- .../components/svgs/bsm-icon.component.tsx | 13 +++- .../model-type-avatar-icon.component.tsx | 12 ++++ .../icons/model-type-bloq-icon.component.tsx | 9 +++ .../model-type-platform-icon.component.tsx | 9 +++ .../icons/model-type-saber-icon.component.tsx | 9 +++ .../title-bar/title-bar.component.tsx | 2 +- .../slides/launch/launch-slide.component.tsx | 6 ++ .../hooks/use-behavior-subject.hook.ts | 4 +- .../pages/version-viewer.component.tsx | 3 - src/renderer/services/maps-manager.service.ts | 3 +- .../models-manager.service.ts | 64 ++++++++++++++++++- src/shared/models/models/constants.ts | 4 +- 18 files changed, 238 insertions(+), 46 deletions(-) create mode 100644 src/renderer/components/svgs/icons/model-type-avatar-icon.component.tsx create mode 100644 src/renderer/components/svgs/icons/model-type-bloq-icon.component.tsx create mode 100644 src/renderer/components/svgs/icons/model-type-platform-icon.component.tsx create mode 100644 src/renderer/components/svgs/icons/model-type-saber-icon.component.tsx diff --git a/src/main/ipcs/bs-model-ipcs.ts b/src/main/ipcs/bs-model-ipcs.ts index 8fa746d8..1e4d3914 100644 --- a/src/main/ipcs/bs-model-ipcs.ts +++ b/src/main/ipcs/bs-model-ipcs.ts @@ -5,6 +5,9 @@ import { MSModel, MSModelType } from "shared/models/models/model-saber.model"; import { LocalModelsManagerService } from "../services/additional-content/local-models-manager.service"; import { IpcService } from "../services/ipc.service"; import { BSVersion } from "shared/bs-version.interface"; +import { BsmLocalMap } from "shared/models/maps/bsm-local-map.interface"; +import { from } from "rxjs"; +import { BsmLocalModel } from "shared/models/models/bsm-local-model.interface"; const ipc = IpcService.getInstance(); @@ -68,4 +71,9 @@ ipc.on<{version: BSVersion, type: MSModelType}>("get-version-models", async (req const models = LocalModelsManagerService.getInstance(); const res = await models.getModels(req.args.type, req.args.version); reply(res); +}); + +ipc.on<{version: BSVersion, models: BsmLocalModel[], outPath: string}>("export-models", async (req, reply) => { + const models = LocalModelsManagerService.getInstance(); + reply(await models.exportModels(req.args.outPath, req.args.version, req.args.models)); }); \ No newline at end of file diff --git a/src/main/services/additional-content/local-models-manager.service.ts b/src/main/services/additional-content/local-models-manager.service.ts index ff35e956..e41174dd 100644 --- a/src/main/services/additional-content/local-models-manager.service.ts +++ b/src/main/services/additional-content/local-models-manager.service.ts @@ -12,14 +12,16 @@ import { RequestService } from "../request.service"; import { copyFileSync } from "fs-extra"; import sanitize from "sanitize-filename"; import { Progression, ensureFolderExist } from "../../helpers/fs.helpers"; -import { MODEL_FILE_EXTENSIONS, MODEL_TYPE_FOLDERS } from "../../../shared/models/models/constants"; +import { MODEL_FILE_EXTENSIONS, MODEL_TYPES, MODEL_TYPE_FOLDERS } from "../../../shared/models/models/constants"; import { InstallationLocationService } from "../installation-location.service"; -import { Observable } from "rxjs"; +import { Observable, lastValueFrom } from "rxjs"; import { readdir } from "fs/promises"; import md5File from "md5-file"; import { allSettled } from "../../../shared/helpers/promise.helpers"; import { ModelSaberService } from "../thrid-party/model-saber/model-saber.service"; import { BsmLocalModel } from "shared/models/models/bsm-local-model.interface"; +import { ArchiveProgress } from "shared/models/archive.interface"; +import { Archive } from "../../models/archive.class"; export class LocalModelsManagerService { @@ -145,7 +147,7 @@ export class LocalModelsManagerService { const localModel: BsmLocalModel = { path: modelPath, - fileName: path.basename(modelPath), + fileName: path.basename(modelPath, MODEL_FILE_EXTENSIONS[type]), model: await this.modelSaber.getModelByHash(hash), type, hash } @@ -165,6 +167,20 @@ export class LocalModelsManagerService { } + public async exportModels(output: string, version?: BSVersion, models?: BsmLocalModel[]): Promise>{ + const archive = new Archive(output); + if(models?.length){ + models.forEach(model => archive.addFile(model.path)); + } + else{ + for(const type of MODEL_TYPES){ + archive.addDirectory(await this.getModelFolderPath(type, version)); + } + } + + return archive.finalize(); + } + public enableDeepLinks(): boolean{ diff --git a/src/renderer/components/models-management/model-item.component.tsx b/src/renderer/components/models-management/model-item.component.tsx index be4dea3f..9d8aa97a 100644 --- a/src/renderer/components/models-management/model-item.component.tsx +++ b/src/renderer/components/models-management/model-item.component.tsx @@ -1,6 +1,6 @@ import equal from "fast-deep-equal"; import { memo, useState } from "react"; -import { MSModel } from "shared/models/models/model-saber.model"; +import { MSModel, MSModelType } from "shared/models/models/model-saber.model"; import { BsmImage } from "../shared/bsm-image.component"; import { motion } from "framer-motion"; import { GlowEffect } from "../shared/glow-effect.component"; @@ -10,17 +10,19 @@ import { useThemeColor } from "renderer/hooks/use-theme-color.hook"; import Tippy from "@tippyjs/react"; import { followCursor } from "tippy.js" import defaultImage from '../../../../assets/images/default-version-img.jpg' +import { BsmLocalModel } from "shared/models/models/bsm-local-model.interface"; type Props = { className?: string, selected?: boolean, hash: string, onClick?: React.ComponentProps<"li">["onClick"], -} & Partial +} & Partial & Partial export const ModelItem = memo(({ className, selected, + path, hash, id, type, @@ -60,10 +62,10 @@ export const ModelItem = memo(({ return ( // TODO TRANSLATE ALL TEXT - setHovered(() => true)} onHoverEnd={() => setHovered(() => false)} onClick={onClick}> + setHovered(() => true)} onHoverEnd={() => setHovered(() => false)} onClick={onClick}>
- + {e.stopPropagation(); e.preventDefault()}}> {name} {author ?? ''} @@ -73,13 +75,20 @@ export const ModelItem = memo(({ ))} - copyContent(`${hash}`, 'hash')}>{hash} + copyContent(`${hash}`, 'hash')}>{hash} - {id && ( - - copyContent(`${id}`, 'id')}>{id} - - )} +
+ {id && ( + + copyContent(`${id}`, 'id')}>{id} + + )} + {path && ( + + copyContent(`${path}`, 'path')}>{path} + + )} +
diff --git a/src/renderer/components/models-management/models-grid.component.tsx b/src/renderer/components/models-management/models-grid.component.tsx index b1c223f9..3e00d5f6 100644 --- a/src/renderer/components/models-management/models-grid.component.tsx +++ b/src/renderer/components/models-management/models-grid.component.tsx @@ -1,6 +1,6 @@ import { useInView } from "framer-motion"; import { BSVersion } from "shared/bs-version.interface"; -import { MutableRefObject, useRef, useState } from "react"; +import { useRef, forwardRef, useImperativeHandle } from "react"; import { MSModelType } from "shared/models/models/model-saber.model"; import { useOnUpdate } from "renderer/hooks/use-on-update.hook"; import { useConstant } from "renderer/hooks/use-constant.hook"; @@ -9,6 +9,7 @@ import { useSwitchableObservable } from "renderer/hooks/use-switchable-observabl import { Progression } from "main/helpers/fs.helpers"; import { BsmLocalModel } from "shared/models/models/bsm-local-model.interface"; import { ModelItem } from "./model-item.component"; +import { useBehaviorSubject } from "renderer/hooks/use-behavior-subject.hook"; type Props = { className?: string, @@ -16,7 +17,7 @@ type Props = { type: MSModelType } -export function ModelsGrid({className, version, type}: Props) { +export const ModelsGrid = forwardRef(({className, version, type}: Props, forwardRef) => { const modelsManager = useConstant(() => ModelsManagerService.getInstance()); @@ -24,26 +25,38 @@ export function ModelsGrid({className, version, type}: Props) { const isVisible = useInView(ref, {once: true, amount: .1}); const [models, setModelsLoadObservable] = useSwitchableObservable>(); - + const [modelsSelected, modelsSelected$] = useBehaviorSubject>(new Set()); const isLoading = !models || !models?.extra; const hasModels = !isLoading && models?.extra.length; - console.log(models); + useImperativeHandle(forwardRef, () => ({ + getSelectedModels: () => { + return Array.from(modelsSelected) + }, + }), [modelsSelected]); useOnUpdate(() => { - if(!isVisible){ return; } - setModelsLoadObservable(() => modelsManager.$getModels(type, version)); - }, [version, isVisible, type]); + const handleModelClick = (model: BsmLocalModel) => { + const newSet = new Set(modelsSelected); + if(newSet.has(model)){ + newSet.delete(model); + } + else { + newSet.add(model); + } + modelsSelected$.next(newSet); + } + return (
{isLoading && <>loading} {!hasModels && <>no models} {hasModels && !isLoading && ( -
    +
      {models.extra.map(localModel => ( handleModelClick(localModel)} /> ))}
    )}
) -} +}) diff --git a/src/renderer/components/models-management/models-panel.component.tsx b/src/renderer/components/models-management/models-panel.component.tsx index 21e68386..7a29736f 100644 --- a/src/renderer/components/models-management/models-panel.component.tsx +++ b/src/renderer/components/models-management/models-panel.component.tsx @@ -1,25 +1,50 @@ import { BSVersion } from "shared/bs-version.interface"; -import { useState, useRef } from "react"; +import { useRef, useState } from "react"; import { ModelsTabsNavbar } from "./models-tabs-navbar.component"; import { ModelsGrid } from "./models-grid.component"; import { MSModelType } from "shared/models/models/model-saber.model"; +import { BsmDropdownButton, DropDownItem } from "../shared/bsm-dropdown-button.component"; +import { useConstant } from "renderer/hooks/use-constant.hook"; +import { ModelsManagerService } from "renderer/services/models-management/models-manager.service"; +import { BsmLocalModel } from "shared/models/models/bsm-local-model.interface"; export function ModelsPanel({version}: {version?: BSVersion}) { + const modelsManager = useConstant(() => ModelsManagerService.getInstance()); + const [avatarsRef, sabersRef, platformsRef, bloqsRef] = [useRef(null), useRef(null), useRef(null), useRef(null)]; const [modelTypeTab, setModelTypeTab] = useState(ModelTabType.Avatars); + const getSelectedModels = () => [avatarsRef, sabersRef, platformsRef, bloqsRef].map(ref =>(ref.current?.getSelectedModels() as BsmLocalModel[])).flat() + + const exportModels = () => { + modelsManager.exportModels(getSelectedModels(), version); + } + + const deleteModels = () => { + modelsManager.deleteModels(getSelectedModels(), version); + } + + const threeDotsItems = useConstant(() => [ + {text: "TODO TRANSLATE EXPORT", onClick: exportModels, icon: "export"}, + {text: "TODO TRANSLATE DELETE", onClick: deleteModels, icon: "trash"}, + ]); + return (
-
- +
+
+ +
+
+
- - - - + + + +
diff --git a/src/renderer/components/models-management/models-tabs-navbar.component.tsx b/src/renderer/components/models-management/models-tabs-navbar.component.tsx index da8e9a71..af88a984 100644 --- a/src/renderer/components/models-management/models-tabs-navbar.component.tsx +++ b/src/renderer/components/models-management/models-tabs-navbar.component.tsx @@ -7,6 +7,7 @@ import { ModelsManagerService } from "renderer/services/models-management/models import { BsContentNavBar, BsContentNavBarTab } from "../shared/bs-content-nav-bar.component" import { useConstant } from "renderer/hooks/use-constant.hook" import { BsmIcon } from "../svgs/bsm-icon.component" +import { MODEL_TYPES } from "../../../shared/models/models/constants"; type Props = { className?: string, @@ -18,7 +19,7 @@ type Props = { export function ModelsTabsNavbar({className, version, tabIndex, onTabChange}: Props) { const tabs = useConstant[]>(() => { - return Array.from(Object.values(MSModelType)).map(type => ({ + return MODEL_TYPES.map(type => ({ text: type, // <= TODO: Translate extra: type })) @@ -71,12 +72,12 @@ function ModelTab({version, modelType, active, onClick, onLink, onUnlink}: TabPr } return ( -
  • -
    - +
  • +
    + {modelType}
    -
    +
    {!!version && ( { + // TODO : Very ugly very messy, need to find a better way to do this + const renderIcon = () => { if(icon === "settings"){ return } if(icon === "trash"){ return } @@ -115,6 +122,10 @@ export const BsmIcon = memo(({className, icon, style}: {className?: string, icon if(icon === "volume-up"){ return } if(icon === "volume-down"){ return } if(icon === "volume-off"){ return } + if(icon === MSModelType.Avatar){ return } + if(icon === MSModelType.Saber){ return } + if(icon === MSModelType.Platfrom){ return } + if(icon === MSModelType.Bloq){ return } return } diff --git a/src/renderer/components/svgs/icons/model-type-avatar-icon.component.tsx b/src/renderer/components/svgs/icons/model-type-avatar-icon.component.tsx new file mode 100644 index 00000000..7d5502b9 --- /dev/null +++ b/src/renderer/components/svgs/icons/model-type-avatar-icon.component.tsx @@ -0,0 +1,12 @@ +import { CSSProperties } from "react"; + +export function ModelTypeAvatarIcon(props: {className?: string, style?: CSSProperties}) { + + + + return ( + + + + ) +} diff --git a/src/renderer/components/svgs/icons/model-type-bloq-icon.component.tsx b/src/renderer/components/svgs/icons/model-type-bloq-icon.component.tsx new file mode 100644 index 00000000..983c1a68 --- /dev/null +++ b/src/renderer/components/svgs/icons/model-type-bloq-icon.component.tsx @@ -0,0 +1,9 @@ +import { CSSProperties } from "react"; + +export function ModelTypeBloqIcon(props: {className?: string, style?: CSSProperties}) { + return ( + + + + ) +} diff --git a/src/renderer/components/svgs/icons/model-type-platform-icon.component.tsx b/src/renderer/components/svgs/icons/model-type-platform-icon.component.tsx new file mode 100644 index 00000000..fd8b59e3 --- /dev/null +++ b/src/renderer/components/svgs/icons/model-type-platform-icon.component.tsx @@ -0,0 +1,9 @@ +import { CSSProperties } from "react"; + +export function ModelTypePlatformIcon(props: {className?: string, style?: CSSProperties}) { + return ( + + + + ) +} diff --git a/src/renderer/components/svgs/icons/model-type-saber-icon.component.tsx b/src/renderer/components/svgs/icons/model-type-saber-icon.component.tsx new file mode 100644 index 00000000..62b4b990 --- /dev/null +++ b/src/renderer/components/svgs/icons/model-type-saber-icon.component.tsx @@ -0,0 +1,9 @@ +import { CSSProperties } from "react"; + +export function ModelTypeSaberIcon(props: {className?: string, style?: CSSProperties}) { + return ( + + + + ) +} diff --git a/src/renderer/components/title-bar/title-bar.component.tsx b/src/renderer/components/title-bar/title-bar.component.tsx index 5913dc28..7ca9ef9f 100644 --- a/src/renderer/components/title-bar/title-bar.component.tsx +++ b/src/renderer/components/title-bar/title-bar.component.tsx @@ -61,7 +61,7 @@ export default function TitleBar({template = "index.html"} : {template: AppWindo if(template === "index.html"){ return ( -
    +
    BSManager diff --git a/src/renderer/components/version-viewer/slides/launch/launch-slide.component.tsx b/src/renderer/components/version-viewer/slides/launch/launch-slide.component.tsx index c497101c..18cbb5ab 100644 --- a/src/renderer/components/version-viewer/slides/launch/launch-slide.component.tsx +++ b/src/renderer/components/version-viewer/slides/launch/launch-slide.component.tsx @@ -7,6 +7,8 @@ import { BSLauncherService, LaunchMods } from "renderer/services/bs-launcher.ser import { ConfigurationService } from "renderer/services/configuration.service"; import { BSVersion } from "shared/bs-version.interface" import { LaunchModToogle } from "./launch-mod-toogle.component"; +import BSLogo from '../../../../../../assets/images/apngs/bs-logo.png'; +import { BsmImage } from "renderer/components/shared/bsm-image.component"; type Props = {version: BSVersion}; @@ -51,6 +53,10 @@ export function LaunchSlide({version}: Props) { return (
    +
    + +

    {version.name ? `${version.BSVersion} - ${version.name}` : version.BSVersion}

    +
    {!version.oculus && setMode(LaunchMods.OCULUS_MOD, !oculusMode)} active={oculusMode} text="pages.version-viewer.launch-mods.oculus"/>} setMode(LaunchMods.DESKTOP_MOD, !desktopMode)} active={desktopMode} text="pages.version-viewer.launch-mods.desktop"/> diff --git a/src/renderer/hooks/use-behavior-subject.hook.ts b/src/renderer/hooks/use-behavior-subject.hook.ts index a079844a..2a782fd3 100644 --- a/src/renderer/hooks/use-behavior-subject.hook.ts +++ b/src/renderer/hooks/use-behavior-subject.hook.ts @@ -1,9 +1,9 @@ -import { useState } from "react"; import { BehaviorSubject } from "rxjs"; import { useObservable } from "./use-observable.hook"; +import { useConstant } from "./use-constant.hook"; export function useBehaviorSubject(value: T): [T, BehaviorSubject]{ - const [subject] = useState(new BehaviorSubject(value)); + const subject = useConstant(() => new BehaviorSubject(value)); const subjectValue = useObservable(subject); return [subjectValue, subject]; diff --git a/src/renderer/pages/version-viewer.component.tsx b/src/renderer/pages/version-viewer.component.tsx index 41925830..b2126f7b 100644 --- a/src/renderer/pages/version-viewer.component.tsx +++ b/src/renderer/pages/version-viewer.component.tsx @@ -1,7 +1,6 @@ import { BSVersion } from 'shared/bs-version.interface'; import { useState } from 'react'; import { useLocation, useNavigate } from 'react-router-dom'; -import BSLogo from '../../../assets/images/apngs/bs-logo.png'; import { TabNavBar } from 'renderer/components/shared/tab-nav-bar.component'; import { BsmDropdownButton } from 'renderer/components/shared/bsm-dropdown-button.component'; import { BsmImage } from 'renderer/components/shared/bsm-image.component'; @@ -77,8 +76,6 @@ export function VersionViewer() { <>
    - -

    {state.name ? `${state.BSVersion} - ${state.name}` : state.BSVersion}

    setCurrentTabIndex(i)}/>
    diff --git a/src/renderer/services/maps-manager.service.ts b/src/renderer/services/maps-manager.service.ts index f49c9cde..97cc00fe 100644 --- a/src/renderer/services/maps-manager.service.ts +++ b/src/renderer/services/maps-manager.service.ts @@ -117,7 +117,7 @@ export class MapsManagerService { if(!resFile.success){ return; } - const exportProgress$: Observable = await this.ipcService.sendV2("export-maps", {args: {version, maps, outPath: resFile.data}}).pipe( + const exportProgress$: Observable = this.ipcService.sendV2("export-maps", {args: {version, maps, outPath: resFile.data}}).pipe( map(p => { return { progression: (p.prossesedFiles / p.totalFiles) * 100, label: `${p.prossesedFiles} / ${p.totalFiles}` } as ProgressionInterface }) @@ -128,6 +128,7 @@ export class MapsManagerService { await exportProgress$.toPromise().catch(e => { this.notifications.notifyError({title: "notifications.types.error", desc: e.message}); }).then(() => { + // TODO TRANSLATE this.notifications.notifySuccess({title: "Export terminé 🎉", duration: 3000}); this.progressBar.complete(); this.progressBar.hide(true); diff --git a/src/renderer/services/models-management/models-manager.service.ts b/src/renderer/services/models-management/models-manager.service.ts index 56745278..395ee6e9 100644 --- a/src/renderer/services/models-management/models-manager.service.ts +++ b/src/renderer/services/models-management/models-manager.service.ts @@ -2,18 +2,26 @@ import { MSModelType } from "shared/models/models/model-saber.model"; import { IpcService } from "../ipc.service"; import { VersionFolderLinkerService, VersionLinkerActionType } from "../version-folder-linker.service"; import { MODEL_TYPE_FOLDERS } from "shared/models/models/constants"; -import { Observable, distinctUntilChanged, lastValueFrom, mergeMap, share } from "rxjs"; +import { Observable, distinctUntilChanged, lastValueFrom, map, mergeMap, share } from "rxjs"; import { BSVersion } from "shared/bs-version.interface"; import { ModalExitCode, ModalService } from "../modale.service"; import { LinkModelsModal } from "renderer/components/modal/modal-types/models/link-models-modal.component"; import { UnlinkModelsModal } from "renderer/components/modal/modal-types/models/unlink-models-modal.component"; import { Progression } from "main/helpers/fs.helpers"; import { BsmLocalModel } from "shared/models/models/bsm-local-model.interface"; +import { ProgressBarService } from "../progress-bar.service"; +import { OpenSaveDialogOption } from "shared/models/os/dialog.model"; +import { ProgressionInterface } from "shared/models/progress-bar"; +import { ArchiveProgress } from "shared/models/archive.interface"; +import { NotificationService } from "../notification.service"; +import { ConfigurationService } from "../configuration.service"; export class ModelsManagerService { private static instance: ModelsManagerService; + private static readonly REMEMBER_CHOICE_DELETE_MODEL_KEY = "not-confirm-delete-model" + public static getInstance(): ModelsManagerService{ if(!ModelsManagerService.instance){ ModelsManagerService.instance = new ModelsManagerService(); } return ModelsManagerService.instance; @@ -22,11 +30,17 @@ export class ModelsManagerService { private readonly ipc: IpcService; private readonly versionFolderLinked: VersionFolderLinkerService; private readonly modalService: ModalService; + private readonly progressBar: ProgressBarService; + private readonly notifications: NotificationService; + private readonly config: ConfigurationService; private constructor(){ this.ipc = IpcService.getInstance(); this.versionFolderLinked = VersionFolderLinkerService.getInstance(); this.modalService = ModalService.getInsance(); + this.progressBar = ProgressBarService.getInstance(); + this.notifications = NotificationService.getInstance(); + this.config = ConfigurationService.getInstance(); } public isModelsLinked(version: BSVersion, type: MSModelType): Promise{ @@ -69,6 +83,54 @@ export class ModelsManagerService { return this.ipc.sendV2>("get-version-models", { args: { version, type } }); } + public async exportModels(models: BsmLocalModel[], version?: BSVersion){ + if(!this.progressBar.require()){ return; } + + const resFile = await this.ipc.send("save-file", {args: { + filename: version ? `${version.name ?? version.BSVersion} Models` : "Models", + filters: [{name: "zip", extensions: ["zip"]}] + }}); + + if(!resFile.success){ return; } + + const exportProgress$: Observable = this.ipc.sendV2("export-models", {args: {version, models, outPath: resFile.data}}).pipe( + map(p => { + return { progression: (p.prossesedFiles / p.totalFiles) * 100, label: `${p.prossesedFiles} / ${p.totalFiles}` } as ProgressionInterface + }) + ); + + this.progressBar.show(exportProgress$, true); + + lastValueFrom(exportProgress$).catch(e => { + this.notifications.notifyError({title: "notifications.types.error"}); + }).then(() => { + // TODO TRANSLATE + this.notifications.notifySuccess({title: "TODO TRANSLATE SUCCESS", duration: 3000}); + this.progressBar.complete(); + this.progressBar.hide(true); + }) + + } + + public async deleteModels(models: BsmLocalModel[], version?: BSVersion){ + + const types = Array.from(new Set(models.map(m => m.type))); + + const modelsLinked = await (async () => { + for(const type of types){ + if(!(await this.isModelsLinked(version, type))){ continue; } + return true; + } + return false; + })(); + + + const askModal = models.length > 1 || !this.config.get(ModelsManagerService.REMEMBER_CHOICE_DELETE_MODEL_KEY); + + console.log(modelsLinked, askModal); + + } + public isDeepLinksEnabled(): Promise{ return this.ipc.send("is-models-deep-links-enabled").then(res => ( res.success ? res.data : false diff --git a/src/shared/models/models/constants.ts b/src/shared/models/models/constants.ts index 0aa20cdf..ce161cb7 100644 --- a/src/shared/models/models/constants.ts +++ b/src/shared/models/models/constants.ts @@ -21,4 +21,6 @@ export const MODEL_FILE_EXTENSIONS = { [MSModelType.Bloq]: ".bloq", [MSModelType.Platfrom]: ".plat", [MSModelType.Saber]: ".saber" -} \ No newline at end of file +} + +export const MODEL_TYPES = Array.from(Object.values(MSModelType)); \ No newline at end of file