[feature-136] Add model types icons + export models + init delete models + init searchbar

This commit is contained in:
MathieuG-P
2023-05-08 21:12:35 +02:00
parent d1dc7bbca0
commit a366c07128
18 changed files with 238 additions and 46 deletions
@@ -117,7 +117,7 @@ export class MapsManagerService {
if(!resFile.success){ return; }
const exportProgress$: Observable<ProgressionInterface> = await this.ipcService.sendV2<ArchiveProgress, {version: BSVersion, maps: BsmLocalMap[], outPath: string}>("export-maps", {args: {version, maps, outPath: resFile.data}}).pipe(
const exportProgress$: Observable<ProgressionInterface> = this.ipcService.sendV2<ArchiveProgress, {version: BSVersion, maps: BsmLocalMap[], outPath: string}>("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);
@@ -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<boolean>{
@@ -69,6 +83,54 @@ export class ModelsManagerService {
return this.ipc.sendV2<Progression<BsmLocalModel[]>>("get-version-models", { args: { version, type } });
}
public async exportModels(models: BsmLocalModel[], version?: BSVersion){
if(!this.progressBar.require()){ return; }
const resFile = await this.ipc.send<string, OpenSaveDialogOption>("save-file", {args: {
filename: version ? `${version.name ?? version.BSVersion} Models` : "Models",
filters: [{name: "zip", extensions: ["zip"]}]
}});
if(!resFile.success){ return; }
const exportProgress$: Observable<ProgressionInterface> = this.ipc.sendV2<ArchiveProgress, {version: BSVersion, models: BsmLocalModel[], outPath: string}>("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<boolean>(ModelsManagerService.REMEMBER_CHOICE_DELETE_MODEL_KEY);
console.log(modelsLinked, askModal);
}
public isDeepLinksEnabled(): Promise<boolean>{
return this.ipc.send<boolean>("is-models-deep-links-enabled").then(res => (
res.success ? res.data : false