diff --git a/assets/jsons/translations/de.json b/assets/jsons/translations/de.json index cf5b5493..81676082 100644 --- a/assets/jsons/translations/de.json +++ b/assets/jsons/translations/de.json @@ -87,7 +87,8 @@ "latest": "Neueste", "description": "Beschreibung", "dropdown": { - "uninstall-all": "Alle deinstallieren" + "uninstall-all": "Alle deinstallieren", + "unselect-all": "Alle abwählen" } } } diff --git a/assets/jsons/translations/en.json b/assets/jsons/translations/en.json index 4fe502f0..63a53765 100644 --- a/assets/jsons/translations/en.json +++ b/assets/jsons/translations/en.json @@ -87,7 +87,8 @@ "latest": "Latest", "description": "Description", "dropdown": { - "uninstall-all": "Uninstall all" + "uninstall-all": "Uninstall all", + "unselect-all": "Unselect all" } } } diff --git a/assets/jsons/translations/es.json b/assets/jsons/translations/es.json index bf1af874..e862ed0a 100644 --- a/assets/jsons/translations/es.json +++ b/assets/jsons/translations/es.json @@ -87,7 +87,8 @@ "latest": "Último", "description": "Descripción", "dropdown": { - "uninstall-all": "Desinstalar todos" + "uninstall-all": "Desinstalar todos", + "unselect-all": "Deseleccionar todo" } } } diff --git a/assets/jsons/translations/fr.json b/assets/jsons/translations/fr.json index 14a6df8c..308a5b2d 100644 --- a/assets/jsons/translations/fr.json +++ b/assets/jsons/translations/fr.json @@ -87,7 +87,8 @@ "latest": "Récent", "description": "Description", "dropdown": { - "uninstall-all": "Tout désinstaller" + "uninstall-all": "Tout désinstaller", + "unselect-all": "Tout désélectionner" } } } diff --git a/assets/jsons/translations/ja.json b/assets/jsons/translations/ja.json index 68fb6b6c..bdb08e80 100644 --- a/assets/jsons/translations/ja.json +++ b/assets/jsons/translations/ja.json @@ -87,7 +87,8 @@ "latest": "最新", "description": "說明", "dropdown": { - "uninstall-all": "全てアンインストールする" + "uninstall-all": "全てアンインストールする", + "unselect-all": "すべて選択解除" } } } diff --git a/assets/jsons/translations/ru.json b/assets/jsons/translations/ru.json index 347feb67..3c04c25e 100644 --- a/assets/jsons/translations/ru.json +++ b/assets/jsons/translations/ru.json @@ -87,7 +87,8 @@ "latest": "Latest", "description": "Описание", "dropdown": { - "uninstall-all": "Удалить всё" + "uninstall-all": "Удалить всё", + "unselect-all": "Снять все выделения" } } } diff --git a/assets/jsons/translations/zh-tw.json b/assets/jsons/translations/zh-tw.json index 4026a5f4..db95eec4 100644 --- a/assets/jsons/translations/zh-tw.json +++ b/assets/jsons/translations/zh-tw.json @@ -87,7 +87,8 @@ "latest": "最新", "description": "描述", "dropdown": { - "uninstall-all": "全部移除" + "uninstall-all": "全部移除", + "unselect-all": "取消全選" } } } diff --git a/assets/jsons/translations/zh.json b/assets/jsons/translations/zh.json index f42fc925..09ffac0e 100644 --- a/assets/jsons/translations/zh.json +++ b/assets/jsons/translations/zh.json @@ -87,7 +87,8 @@ "latest": "最新", "description": "描述", "dropdown": { - "uninstall-all": "全部卸载" + "uninstall-all": "全部卸载", + "unselect-all": "取消全选" } } } diff --git a/src/main/services/mods/bs-mods-manager.service.ts b/src/main/services/mods/bs-mods-manager.service.ts index cc3b5b7c..c52787cc 100644 --- a/src/main/services/mods/bs-mods-manager.service.ts +++ b/src/main/services/mods/bs-mods-manager.service.ts @@ -271,7 +271,7 @@ export class BsModsManagerService { return Array.from( new Map( availableMods.reduce((res, mod) => { - if (this.isDependency(mod, mods, availableMods)) { + if (mod.required || this.isDependency(mod, mods, availableMods)) { res.push([mod.name, mod]); } return res; @@ -350,13 +350,13 @@ export class BsModsManagerService { } public async installMods(mods: Mod[], version: BSVersion): Promise { + const deps = await this.resolveDependencies(mods, version); + mods.push(...deps); + if (!mods?.length) { throw "no-mods"; } - const deps = await this.resolveDependencies(mods, version); - mods.push(...deps); - const bsipa = mods.find(mod => mod.name.toLowerCase() === "bsipa"); if (bsipa) { mods = mods.filter(mod => mod.name.toLowerCase() !== "bsipa"); diff --git a/src/renderer/components/svgs/bsm-icon.component.tsx b/src/renderer/components/svgs/bsm-icon.component.tsx index 2373193c..8ec8ae0c 100644 --- a/src/renderer/components/svgs/bsm-icon.component.tsx +++ b/src/renderer/components/svgs/bsm-icon.component.tsx @@ -60,8 +60,9 @@ import { ChevronTopIcon } from "./icons/chevron-top-icon.component"; import { EyeCrossIcon } from "./icons/eye-cross-icon.component"; import { ShortcutIcon } from "./icons/shortcut-icon.component"; import { BackupRestoreIcon } from "./icons/backup-restore-icon.component"; +import { CancelIcon } from "./icons/cancel-icon.component"; -export type BsmIconType = BsvMapCharacteristic | ("settings" | "trash" | "favorite" | "folder" | "bsNote" | "check" | "three-dots" | "twitch" | "eye" | "play" | "checkCircleIcon" | "discord" | "info" | "eye-cross" | "terminal" | "desktop" | "oculus" | "add" | "cross" | "task" | "github" | "close" | "thumbUpFill" | "timerFill" | "pause" | "twitter" | "sync" | "chevron-top" | "copy" | "steam" | "edit" | "export" | "patreon" | "search" | "bsMapDifficulty" | "link" | "unlink" | "download" | "filter" | "mee6" | "volume-up" | "volume-off" | "volume-down" | "shortcut" | "backup-restore" | "fr-FR-flag" | "es-ES-flag" | "en-US-flag" | "en-EN-flag" | "de-DE-flag" | "ru-RU-flag" | "zh-CN-flag" | "zh-TW-flag" | "ja-JP-flag"); +export type BsmIconType = BsvMapCharacteristic | ("settings" | "trash" | "favorite" | "folder" | "bsNote" | "check" | "three-dots" | "twitch" | "eye" | "play" | "checkCircleIcon" | "discord" | "info" | "eye-cross" | "terminal" | "desktop" | "oculus" | "add" | "cross" | "task" | "github" | "close" | "thumbUpFill" | "timerFill" | "pause" | "twitter" | "sync" | "chevron-top" | "copy" | "steam" | "edit" | "export" | "patreon" | "search" | "bsMapDifficulty" | "link" | "unlink" | "download" | "filter" | "mee6" | "volume-up" | "volume-off" | "volume-down" | "shortcut" | "backup-restore" | "cancel" | "fr-FR-flag" | "es-ES-flag" | "en-US-flag" | "en-EN-flag" | "de-DE-flag" | "ru-RU-flag" | "zh-CN-flag" | "zh-TW-flag" | "ja-JP-flag"); export const BsmIcon = memo(({ className, icon, style }: { className?: string; icon: BsmIconType; style?: CSSProperties }) => { // TODO : Very ugly very messy, need to find a better way to do this @@ -250,6 +251,11 @@ export const BsmIcon = memo(({ className, icon, style }: { className?: string; i if (icon === "backup-restore") { return ; } + + if(icon === "cancel"){ + return ; + } + return ; }; diff --git a/src/renderer/components/svgs/icons/cancel-icon.component.tsx b/src/renderer/components/svgs/icons/cancel-icon.component.tsx new file mode 100644 index 00000000..c197637c --- /dev/null +++ b/src/renderer/components/svgs/icons/cancel-icon.component.tsx @@ -0,0 +1,9 @@ +import { createSvgIcon } from "../svg-icon.type"; + +export const CancelIcon = createSvgIcon((props, ref) => { + return ( + + + + ) +}) diff --git a/src/renderer/components/version-viewer/slides/mods/mods-grid.component.tsx b/src/renderer/components/version-viewer/slides/mods/mods-grid.component.tsx index 315fb2d8..bc111753 100644 --- a/src/renderer/components/version-viewer/slides/mods/mods-grid.component.tsx +++ b/src/renderer/components/version-viewer/slides/mods/mods-grid.component.tsx @@ -9,10 +9,18 @@ import { Mod } from "shared/models/mods/mod.interface"; import { ModItem } from "./mod-item.component"; import { useService } from "renderer/hooks/use-service.hook"; -type Props = { modsMap: Map; installed: Map; modsSelected: Mod[]; onModChange: (selected: boolean, mod: Mod) => void; moreInfoMod?: Mod; onWantInfos: (mod: Mod) => void }; +type Props = { + modsMap: Map; + installed: Map; + modsSelected: Mod[]; + onModChange: (selected: boolean, mod: Mod) => void; + moreInfoMod?: Mod; + onWantInfos: (mod: Mod) => void + unselectAllMods?: () => void; +}; + +export function ModsGrid({ modsMap, installed, modsSelected, onModChange, moreInfoMod, onWantInfos, unselectAllMods }: Props) { -export function ModsGrid({ modsMap, installed, modsSelected, onModChange, moreInfoMod, onWantInfos }: Props) { - const pageState = useService(PageStateService); const modsManager = useService(BsModsManagerService); @@ -70,7 +78,10 @@ export function ModsGrid({ modsMap, installed, modsSelected, onModChange, moreIn {t("pages.version-viewer.mods.mods-grid.header-bar.latest")} {t("pages.version-viewer.mods.mods-grid.header-bar.description")} - + unselectAllMods?.() }, + { text: "pages.version-viewer.mods.mods-grid.header-bar.dropdown.uninstall-all", icon: "trash", onClick: () => handleUninstallAll?.() } + ]} /> {Array.from(modsMap.keys()).map( diff --git a/src/renderer/components/version-viewer/slides/mods/mods-slide.component.tsx b/src/renderer/components/version-viewer/slides/mods/mods-slide.component.tsx index 6fa6e284..5ab52740 100644 --- a/src/renderer/components/version-viewer/slides/mods/mods-slide.component.tsx +++ b/src/renderer/components/version-viewer/slides/mods/mods-slide.component.tsx @@ -116,6 +116,10 @@ export function ModsSlide({ version, onDisclamerDecline }: { version: BSVersion; }); }; + const unselectAllMods = () => { + setModsSelected(() => []); + }; + useEffect(() => { const subs: Subscription[] = []; @@ -181,7 +185,7 @@ export function ModsSlide({ version, onDisclamerDecline }: { version: BSVersion; return ( <>
- +