@@ -37,6 +37,7 @@ interface ModInfo {
3737 _deps : BackendDep [ ] ; // raw deps
3838 resolveDependencies : ( ) => DepResolveResult ;
3939 file : string ;
40+ size : number ;
4041 duplicateCount : number ;
4142 duplicateFiles : string [ ] ;
4243}
@@ -65,6 +66,7 @@ const modListContext = createContext<{
6566 reloadMods : ( ) => void ;
6667 fullTree : boolean ;
6768 showUpdate : boolean ;
69+ showDetailed : boolean ;
6870 alwaysOnMods : string [ ] ;
6971 switchAlwaysOn : ( name : string , enabled : boolean ) => void ;
7072 autoDisableNewMods : boolean ;
@@ -179,6 +181,7 @@ const ModLocal = ({
179181 version,
180182 optional = false ,
181183 file,
184+ size,
182185 duplicateCount,
183186 duplicateFiles,
184187} : ModInfo & { optional ?: boolean } ) => {
@@ -341,6 +344,10 @@ const ModLocal = ({
341344 < span
342345 className = "modName"
343346 onClick = { ( ) => setEditingComment ( true ) }
347+ onContextMenu = { ( e ) => {
348+ e . preventDefault ( ) ;
349+ callRemote ( 'open_url' , ctx ?. modFolder || '' ) ;
350+ } }
344351 > { name } </ span >
345352 { ! editingComment && ctx ?. modComments [ name ] && (
346353 < span className = "modComment" onClick = { ( ) => {
@@ -361,6 +368,11 @@ const ModLocal = ({
361368 }
362369
363370 < span className = "modVersion" > { version } </ span >
371+ { ctx ?. showDetailed && (
372+ < span className = "modDetails" >
373+ { formatSize ( size ) } · { file }
374+ </ span >
375+ ) }
364376 { ( ! optional || ctx ?. fullTree ) && expanded && (
365377 < div className = { `childTree ${ expanded && 'expanded' } ` } >
366378 { dependencies . map ( ( v ) => (
@@ -413,6 +425,12 @@ const Profile = ({ name, current }: { name: string; current: boolean }) => {
413425const alphabet =
414426 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789- _' ;
415427
428+ const formatSize = ( size : number ) => {
429+ const i = size === 0 ? 0 : Math . floor ( Math . log ( size ) / Math . log ( 1024 ) ) ;
430+ const sizes = [ 'B' , 'KB' , 'MB' , 'GB' , 'TB' , 'PB' , 'EB' , 'ZB' , 'YB' ] ;
431+ return `${ ( size / Math . pow ( 1024 , i ) ) . toFixed ( 2 ) } ${ sizes [ i ] } ` ;
432+ } ;
433+
416434let lastApplyReq = - 1 ;
417435
418436export const Manage = ( ) => {
@@ -440,6 +458,7 @@ export const Manage = () => {
440458 const [ checkOptionalDep , setCheckOptionalDep ] = useState ( false ) ;
441459 const [ fullTree , setFullTree ] = useState ( false ) ;
442460 const [ showUpdate , setShowUpdate ] = useState ( true ) ;
461+ const [ showDetailed , setShowDetailed ] = useState ( false ) ;
443462
444463 const installedModMap = useMemo ( ( ) => {
445464 const modMap = new Map < string , ModInfo > ( ) ;
@@ -453,6 +472,7 @@ export const Manage = () => {
453472 dependencies : [ ] ,
454473 dependedBy : [ ] ,
455474 file : mod . file ,
475+ size : mod . size ,
456476 _deps : mod . deps ,
457477 resolveDependencies : ( ) => {
458478 let status = 'resolved' ;
@@ -858,6 +878,7 @@ export const Manage = () => {
858878 } ,
859879 fullTree,
860880 showUpdate,
881+ showDetailed,
861882 } ) ,
862883 [
863884 currentProfile ,
@@ -866,6 +887,7 @@ export const Manage = () => {
866887 modPath ,
867888 fullTree ,
868889 showUpdate ,
890+ showDetailed ,
869891 alwaysOnMods ,
870892 modComments ,
871893 checkOptionalDep
@@ -989,6 +1011,18 @@ export const Manage = () => {
9891011
9901012 { _i18n . t ( '自动禁用新安装的Mod' ) }
9911013 </ label >
1014+ < label >
1015+ < input
1016+ type = "checkbox"
1017+ checked = { showDetailed }
1018+ onChange = { ( e ) => {
1019+ // @ts -ignore
1020+ setShowDetailed ( e . target . checked ) ;
1021+ } }
1022+ />
1023+
1024+ { _i18n . t ( '显示详细信息' ) }
1025+ </ label >
9921026 </ div >
9931027 < div
9941028 className = "opers"
0 commit comments