2022-06-11 01:02:05 +01:00
import {
2022-09-01 01:18:15 +01:00
ButtonItem ,
2022-06-11 01:02:05 +01:00
definePlugin ,
2024-01-22 01:03:04 +00:00
DialogButton ,
2022-06-11 01:02:05 +01:00
PanelSection ,
PanelSectionRow ,
ServerAPI ,
staticClasses ,
2022-07-04 22:12:13 +01:00
ToggleField ,
2022-11-14 02:18:48 +00:00
Field ,
2024-01-22 01:03:04 +00:00
Dropdown ,
SingleDropdownOption ,
2024-01-27 20:05:41 +00:00
Navigation ,
2024-01-30 02:32:18 +00:00
Focusable ,
Spinner ,
2024-02-07 03:48:29 +00:00
showModal ,
QuickAccessTab ,
ShowModalResult ,
2022-06-11 01:02:05 +01:00
} from "decky-frontend-lib" ;
import { VFC , useState } from "react" ;
2024-02-02 00:39:29 +00:00
import { GiDrill , GiFireExtinguisher , GiFireBomb , GiMineExplosion } from "react-icons/gi" ;
2024-01-22 01:03:04 +00:00
import { HiRefresh , HiTrash , HiPlus , HiUpload } from "react-icons/hi" ;
2024-01-27 20:05:41 +00:00
import { TbWorldPlus } from "react-icons/tb" ;
2022-06-11 01:02:05 +01:00
2022-09-01 01:18:15 +01:00
//import * as python from "./python";
import * as backend from "./backend" ;
2023-01-11 01:54:33 +00:00
import { tr } from "usdpl-front" ;
2023-01-07 23:45:12 +00:00
import {
BACKEND_INFO ,
DRIVER_INFO ,
LIMITS_INFO ,
CURRENT_BATT ,
CHARGE_RATE_BATT ,
CHARGE_MODE_BATT ,
2023-03-26 15:49:17 +01:00
CHARGE_LIMIT_BATT ,
2023-01-07 23:45:12 +00:00
CHARGE_NOW_BATT ,
CHARGE_FULL_BATT ,
CHARGE_DESIGN_BATT ,
2023-06-17 03:00:57 +01:00
CHARGE_POWER_BATT ,
2023-01-07 23:45:12 +00:00
ONLINE_CPUS ,
ONLINE_STATUS_CPUS ,
SMT_CPU ,
CLOCK_MIN_CPU ,
CLOCK_MAX_CPU ,
CLOCK_MIN_MAX_CPU ,
GOVERNOR_CPU ,
FAST_PPT_GPU ,
SLOW_PPT_GPU ,
CLOCK_MIN_GPU ,
CLOCK_MAX_GPU ,
SLOW_MEMORY_GPU ,
PERSISTENT_GEN ,
NAME_GEN ,
2023-03-25 17:46:58 +00:00
PATH_GEN ,
2024-01-13 17:32:12 +00:00
VARIANTS_GEN ,
CURRENT_VARIANT_GEN ,
2023-07-04 03:00:18 +01:00
MESSAGE_LIST ,
2023-08-07 21:21:30 +01:00
2024-01-27 20:05:41 +00:00
INTERNAL_STEAM_ID ,
INTERNAL_STEAM_USERNAME ,
STORE_RESULTS ,
STORE_RESULTS_URI ,
2024-03-17 21:14:44 +00:00
STORE_MAIN_APP_ID ,
2024-01-27 20:05:41 +00:00
2023-08-07 21:21:30 +01:00
PERIODICAL_BACKEND_PERIOD ,
AUTOMATIC_REAPPLY_WAIT ,
2023-01-07 23:45:12 +00:00
} from "./consts" ;
2023-01-08 01:07:26 +00:00
import { set_value , get_value } from "usdpl-front" ;
import { Debug } from "./components/debug" ;
import { Gpu } from "./components/gpu" ;
import { Battery } from "./components/battery" ;
import { Cpus } from "./components/cpus" ;
2023-07-04 03:00:18 +01:00
import { DevMessages } from "./components/message" ;
2022-06-11 01:02:05 +01:00
2024-02-07 03:48:29 +00:00
import { TextFieldModal } from "./components/text_field_modal" ;
2024-01-27 20:05:41 +00:00
import { StoreResultsPage } from "./store/page" ;
2024-01-22 01:03:04 +00:00
var periodicHook : NodeJS.Timeout | null = null ;
2022-06-11 01:02:05 +01:00
var lifetimeHook : any = null ;
var startHook : any = null ;
2023-06-10 21:26:21 +01:00
var endHook : any = null ;
2024-01-27 20:05:41 +00:00
var userHook : any = null ;
2022-09-01 01:18:15 +01:00
var usdplReady = false ;
2024-01-30 02:32:18 +00:00
var isVariantLoading = false ;
2022-06-11 01:02:05 +01:00
2023-12-17 22:12:34 +00:00
var tryNotifyProfileChange = function ( ) { } ;
2022-11-14 02:18:48 +00:00
type MinMax = {
min : number | null ;
max : number | null ;
}
2022-09-06 02:36:01 +01:00
function countCpus ( statii : boolean [ ] ) : number {
let count = 0 ;
for ( let i = 0 ; i < statii . length ; i ++ ) {
if ( statii [ i ] ) {
count += 1 ;
}
}
return count ;
}
2022-11-14 02:18:48 +00:00
function syncPlebClockToAdvanced() {
2022-11-19 20:21:09 +00:00
const cpuCount = ( get_value ( LIMITS_INFO ) as backend . SettingsLimits ) . cpu . count ;
2022-11-14 02:18:48 +00:00
const minClock = get_value ( CLOCK_MIN_CPU ) ;
const maxClock = get_value ( CLOCK_MAX_CPU ) ;
let clockArr = [ ] ;
for ( let i = 0 ; i < cpuCount ; i ++ ) {
clockArr . push ( {
min : minClock ,
max : maxClock ,
} as MinMax ) ;
}
set_value ( CLOCK_MIN_MAX_CPU , clockArr ) ;
}
2022-09-01 01:18:15 +01:00
const reload = function ( ) {
if ( ! usdplReady ) { return ; }
2022-07-10 19:04:50 +01:00
2022-11-19 20:21:09 +00:00
backend . resolve ( backend . getLimits ( ) , ( limits ) = > {
set_value ( LIMITS_INFO , limits ) ;
2023-01-05 00:42:59 +00:00
console . debug ( "POWERTOOLS: got limits " , limits ) ;
2022-11-19 20:21:09 +00:00
} ) ;
2024-01-27 20:05:41 +00:00
if ( ! get_value ( STORE_RESULTS ) ) {
2024-03-17 21:14:44 +00:00
backend . resolve ( backend . searchStoreByAppId ( STORE_MAIN_APP_ID ) , ( results ) = > set_value ( STORE_RESULTS , results ) ) ;
2024-01-27 20:05:41 +00:00
}
2022-09-01 01:18:15 +01:00
backend . resolve ( backend . getBatteryCurrent ( ) , ( rate : number ) = > { set_value ( CURRENT_BATT , rate ) } ) ;
2023-01-21 23:15:26 +00:00
backend . resolve_nullable ( backend . getBatteryChargeRate ( ) , ( rate : number | null ) = > { set_value ( CHARGE_RATE_BATT , rate ) } ) ;
backend . resolve_nullable ( backend . getBatteryChargeMode ( ) , ( mode : string | null ) = > { set_value ( CHARGE_MODE_BATT , mode ) } ) ;
2023-03-26 15:49:17 +01:00
backend . resolve_nullable ( backend . getBatteryChargeLimit ( ) , ( limit : number | null ) = > { set_value ( CHARGE_LIMIT_BATT , limit ) } ) ;
2022-09-05 22:02:02 +01:00
backend . resolve ( backend . getBatteryChargeNow ( ) , ( rate : number ) = > { set_value ( CHARGE_NOW_BATT , rate ) } ) ;
backend . resolve ( backend . getBatteryChargeFull ( ) , ( rate : number ) = > { set_value ( CHARGE_FULL_BATT , rate ) } ) ;
backend . resolve ( backend . getBatteryChargeDesign ( ) , ( rate : number ) = > { set_value ( CHARGE_DESIGN_BATT , rate ) } ) ;
2023-06-17 03:00:57 +01:00
backend . resolve ( backend . getBatteryChargePower ( ) , ( rate : number ) = > { set_value ( CHARGE_POWER_BATT , rate ) } ) ;
2022-06-11 01:02:05 +01:00
2022-11-19 20:21:09 +00:00
//backend.resolve(backend.getCpuCount(), (count: number) => { set_value(TOTAL_CPUS, count)});
2022-09-01 01:18:15 +01:00
backend . resolve ( backend . getCpusOnline ( ) , ( statii : boolean [ ] ) = > {
2022-11-14 02:18:48 +00:00
set_value ( ONLINE_STATUS_CPUS , statii ) ;
2022-09-06 02:36:01 +01:00
const count = countCpus ( statii ) ;
2022-09-01 01:18:15 +01:00
set_value ( ONLINE_CPUS , count ) ;
2023-02-04 21:19:00 +00:00
//set_value(SMT_CPU, statii.length > 3 && statii[0] == statii[1] && statii[2] == statii[3]);
2022-09-01 01:18:15 +01:00
} ) ;
2023-01-19 02:05:04 +00:00
backend . resolve ( backend . getCpuSmt ( ) , ( smt : boolean ) = > {
set_value ( SMT_CPU , smt ) ;
} ) ;
2022-09-01 01:18:15 +01:00
backend . resolve ( backend . getCpuClockLimits ( 0 ) , ( limits : number [ ] ) = > {
set_value ( CLOCK_MIN_CPU , limits [ 0 ] ) ;
set_value ( CLOCK_MAX_CPU , limits [ 1 ] ) ;
2022-11-14 02:18:48 +00:00
syncPlebClockToAdvanced ( ) ;
} ) ;
backend . resolve ( backend . getCpusGovernor ( ) , ( governors : string [ ] ) = > {
set_value ( GOVERNOR_CPU , governors ) ;
2023-01-05 00:42:59 +00:00
backend . log ( backend . LogLevel . Info , "POWERTOOLS: Governors from backend " + governors . toString ( ) ) ;
2022-09-01 01:18:15 +01:00
} ) ;
2022-06-11 01:02:05 +01:00
2022-09-01 01:18:15 +01:00
backend . resolve ( backend . getGpuPpt ( ) , ( ppts : number [ ] ) = > {
set_value ( FAST_PPT_GPU , ppts [ 0 ] ) ;
set_value ( SLOW_PPT_GPU , ppts [ 1 ] ) ;
} ) ;
backend . resolve ( backend . getGpuClockLimits ( ) , ( limits : number [ ] ) = > {
set_value ( CLOCK_MIN_GPU , limits [ 0 ] ) ;
set_value ( CLOCK_MAX_GPU , limits [ 1 ] ) ;
} ) ;
2024-03-17 20:16:04 +00:00
backend . resolve_nullable ( backend . getGpuSlowMemory ( ) , ( status : number | null ) = > { set_value ( SLOW_MEMORY_GPU , status ) } ) ;
2022-06-11 01:02:05 +01:00
2022-09-01 01:18:15 +01:00
backend . resolve ( backend . getGeneralPersistent ( ) , ( value : boolean ) = > { set_value ( PERSISTENT_GEN , value ) } ) ;
backend . resolve ( backend . getGeneralSettingsName ( ) , ( name : string ) = > { set_value ( NAME_GEN , name ) } ) ;
2023-03-25 17:46:58 +00:00
backend . resolve ( backend . getGeneralSettingsPath ( ) , ( path : string ) = > { set_value ( PATH_GEN , path ) } ) ;
2024-01-13 17:32:12 +00:00
backend . resolve ( backend . getAllSettingVariants ( ) , ( variants : backend.VariantInfo [ ] ) = > { set_value ( VARIANTS_GEN , variants ) } ) ;
backend . resolve ( backend . getCurrentSettingVariant ( ) , ( variant : backend.VariantInfo ) = > { set_value ( CURRENT_VARIANT_GEN , variant ) } ) ;
2022-06-11 01:02:05 +01:00
2022-09-01 01:18:15 +01:00
backend . resolve ( backend . getInfo ( ) , ( info : string ) = > { set_value ( BACKEND_INFO , info ) } ) ;
2023-01-03 02:22:53 +00:00
backend . resolve ( backend . getDriverProviderName ( "gpu" ) , ( driver : string ) = > { set_value ( DRIVER_INFO , driver ) } ) ;
2023-07-04 03:00:18 +01:00
backend . resolve ( backend . getMessages ( null ) , ( messages : backend.Message [ ] ) = > { set_value ( MESSAGE_LIST , messages ) } ) ;
2022-09-01 01:18:15 +01:00
} ;
2022-06-11 01:02:05 +01:00
2023-12-17 21:13:59 +00:00
const clearHooks = function ( ) {
clearInterval ( periodicHook ! ) ;
periodicHook = null ;
lifetimeHook ? . unregister ( ) ;
startHook ? . unregister ( ) ;
endHook ? . unregister ( ) ;
2024-01-27 20:05:41 +00:00
userHook ? . unregister ( ) ;
2023-12-17 21:13:59 +00:00
2023-12-17 22:12:34 +00:00
backend . log ( backend . LogLevel . Info , "Unregistered PowerTools callbacks, so long and thanks for all the fish." ) ;
2023-12-17 21:13:59 +00:00
} ;
2022-07-05 23:14:50 +01:00
2023-12-17 21:13:59 +00:00
const registerCallbacks = function ( autoclear : boolean ) {
if ( autoclear ) {
clearHooks ( ) ;
}
2022-09-01 01:18:15 +01:00
// register Steam callbacks
//@ts-ignore
lifetimeHook = SteamClient . GameSessions . RegisterForAppLifetimeNotifications ( ( update ) = > {
2023-03-27 02:16:13 +01:00
backend . log ( backend . LogLevel . Info , "RegisterForAppLifetimeNotifications callback(" + JSON . stringify ( update , null , 2 ) + ")" ) ;
2022-09-01 01:18:15 +01:00
if ( update . bRunning ) {
2023-01-05 00:42:59 +00:00
//backend.log(backend.LogLevel.Debug, "AppID " + update.unAppID.toString() + " is now running");
2022-09-01 01:18:15 +01:00
} else {
2023-01-05 00:42:59 +00:00
//backend.log(backend.LogLevel.Debug, "AppID " + update.unAppID.toString() + " is no longer running");
2023-12-17 22:12:34 +00:00
backend . resolve ( backend . loadGeneralDefaultSettings ( ) , ( ok : boolean ) = > {
backend . log ( backend . LogLevel . Debug , "Loading default settings ok? " + ok ) ;
reload ( ) ;
backend . resolve ( backend . waitForComplete ( ) , ( _ ) = > {
backend . log ( backend . LogLevel . Debug , "Trying to tell UI to re-render due to game exit" ) ;
tryNotifyProfileChange ( ) ;
} ) ;
}
2022-09-01 01:18:15 +01:00
) ;
2024-03-17 21:14:44 +00:00
backend . resolve (
backend . searchStoreByAppId ( STORE_MAIN_APP_ID ) ,
( results : backend.StoreMetadata [ ] ) = > {
set_value ( STORE_RESULTS , results ) ;
}
) ;
2022-09-01 01:18:15 +01:00
}
} ) ;
//@ts-ignore
2023-04-06 03:10:40 +01:00
startHook = SteamClient . Apps . RegisterForGameActionStart ( ( actionType , id ) = > {
2022-09-01 01:18:15 +01:00
//@ts-ignore
let gameInfo : any = appStore . GetAppOverviewByGameID ( id ) ;
2024-03-17 21:14:44 +00:00
let appId : string = gameInfo . appid . toString ( ) ;
2023-03-27 02:16:13 +01:00
backend . log ( backend . LogLevel . Info , "RegisterForGameActionStart callback(" + actionType + ", " + id + ")" ) ;
2022-09-01 01:18:15 +01:00
backend . resolve (
2024-01-22 01:03:04 +00:00
backend . loadGeneralSettings ( appId , gameInfo . display_name , "0" , undefined ) ,
2023-12-17 22:12:34 +00:00
( ok : boolean ) = > {
backend . log ( backend . LogLevel . Debug , "Loading settings ok? " + ok ) ;
reload ( ) ;
backend . resolve ( backend . waitForComplete ( ) , ( _ ) = > {
backend . log ( backend . LogLevel . Debug , "Trying to tell UI to re-render due to new game launch" ) ;
tryNotifyProfileChange ( ) ;
} ) ;
}
2022-09-01 01:18:15 +01:00
) ;
2024-01-27 20:05:41 +00:00
backend . resolve (
backend . searchStoreByAppId ( appId ) ,
( results : backend.StoreMetadata [ ] ) = > {
set_value ( STORE_RESULTS , results ) ;
}
) ;
2022-09-01 01:18:15 +01:00
} ) ;
2022-06-11 01:02:05 +01:00
2023-12-17 22:12:34 +00:00
// this fires immediately, so let's ignore that callback
let hasFiredImmediately = false ;
2023-06-10 21:26:21 +01:00
//@ts-ignore
endHook = SteamClient . Apps . RegisterForGameActionEnd ( ( actionType ) = > {
2023-12-17 22:12:34 +00:00
if ( ! hasFiredImmediately ) {
hasFiredImmediately = true ;
backend . log ( backend . LogLevel . Debug , "RegisterForGameActionEnd immediately fired callback(" + actionType + ")" ) ;
return ;
}
2023-06-10 21:26:21 +01:00
backend . log ( backend . LogLevel . Info , "RegisterForGameActionEnd callback(" + actionType + ")" ) ;
2023-08-07 21:21:30 +01:00
setTimeout ( ( ) = > backend . forceApplySettings ( ) , AUTOMATIC_REAPPLY_WAIT ) ;
2023-06-10 21:26:21 +01:00
} ) ;
2024-01-27 20:05:41 +00:00
//@ts-ignore
userHook = SteamClient . User . RegisterForCurrentUserChanges ( ( data ) = > {
const accountName = data . strAccountName ;
const steamId = data . strSteamID ;
SteamClient . User . GetLoginUsers ( ) . then ( ( users : any ) = > {
users . forEach ( ( user : any ) = > {
if ( user && user . accountName == accountName ) {
set_value ( INTERNAL_STEAM_ID , steamId ) ;
set_value ( INTERNAL_STEAM_USERNAME , user . personaName ? user.personaName : accountName ) ;
}
} ) ;
} ) ;
} ) ;
2023-01-05 00:42:59 +00:00
backend . log ( backend . LogLevel . Debug , "Registered PowerTools callbacks, hello!" ) ;
2023-12-17 21:13:59 +00:00
} ;
// init USDPL WASM and connection to back-end
( async function ( ) {
await backend . initBackend ( ) ;
usdplReady = true ;
reload ( ) ; // technically this is only a load
registerCallbacks ( true ) ;
2022-09-01 01:18:15 +01:00
} ) ( ) ;
2022-06-11 01:02:05 +01:00
2022-09-01 01:18:15 +01:00
const periodicals = function ( ) {
2023-08-07 22:08:24 +01:00
backend . resolve ( backend . getPeriodicals ( ) , ( periodicals ) = > {
set_value ( CURRENT_BATT , periodicals . battery_current ) ;
set_value ( CHARGE_NOW_BATT , periodicals . battery_charge_now ) ;
set_value ( CHARGE_FULL_BATT , periodicals . battery_charge_full ) ;
set_value ( CHARGE_POWER_BATT , periodicals . battery_charge_power ) ;
2022-06-11 01:02:05 +01:00
2023-08-07 22:08:24 +01:00
const path = periodicals . settings_path ;
2023-03-25 17:46:58 +00:00
const oldValue = get_value ( PATH_GEN ) ;
set_value ( PATH_GEN , path ) ;
if ( path != oldValue ) {
2023-12-17 22:12:34 +00:00
backend . log ( backend . LogLevel . Debug , "Frontend values reload triggered by path change: " + oldValue + " -> " + path ) ;
2022-09-01 01:18:15 +01:00
reload ( ) ;
}
2023-08-07 22:08:24 +01:00
} )
2022-09-01 01:18:15 +01:00
} ;
2022-06-11 01:02:05 +01:00
2023-12-17 22:12:34 +00:00
const periodicalsSetup = function ( reloadGUI : ( s : string ) = > void ) {
2022-07-10 19:04:50 +01:00
if ( periodicHook != null ) {
clearInterval ( periodicHook ) ;
periodicHook = null ;
}
periodicHook = setInterval ( function ( ) {
2022-09-01 01:18:15 +01:00
periodicals ( ) ;
reloadGUI ( "periodic" + ( new Date ( ) ) . getTime ( ) . toString ( ) ) ;
2023-08-07 21:21:30 +01:00
} , PERIODICAL_BACKEND_PERIOD ) ;
2023-12-17 22:12:34 +00:00
} ;
const Content : VFC < { serverAPI : ServerAPI } > = ( { } ) = > {
const [ idc , reloadGUI ] = useState < any > ( "/shrug" ) ;
tryNotifyProfileChange = function ( ) { reloadGUI ( "ProfileChangeByNotification" ) } ;
periodicalsSetup ( reloadGUI ) ;
2022-07-10 19:04:50 +01:00
2023-02-12 00:59:27 +00:00
if ( ! usdplReady || ! get_value ( LIMITS_INFO ) ) {
// Not translated on purpose (to avoid USDPL issues)
return (
< PanelSection >
USDPL or PowerTools ' s backend did not start correctly !
< ButtonItem
layout = "below"
onClick = { ( _ : MouseEvent ) = > {
console . log ( "POWERTOOLS: manual reload after startup failure" ) ;
reload ( ) ;
2023-12-17 22:12:34 +00:00
// try to reload GUI too
backend . resolve ( backend . waitForComplete ( ) , ( _ ) = > { reloadGUI ( "LoadSystemDefaults" ) } ) ;
2023-02-12 00:59:27 +00:00
} }
>
Reload
< / ButtonItem >
< / PanelSection >
)
}
2024-01-22 01:03:04 +00:00
const variantOptions : SingleDropdownOption [ ] = ( get_value ( VARIANTS_GEN ) as backend . VariantInfo [ ] ) . map ( ( elem ) = > { return {
data : elem ,
label : < span > { elem . name } < / span > ,
} ; } ) ;
2024-02-07 03:48:29 +00:00
var modalResult : ShowModalResult | undefined = undefined ;
const onNewVariantModelClosed = ( name : string ) = > {
if ( modalResult ) {
modalResult . Close ( ) ;
}
console . log ( "POWERTOOLS: variant name" , name ) ;
isVariantLoading = true ;
backend . resolve (
backend . loadGeneralSettingsVariant ( "please give me a new ID k thx bye" /* anything that cannot be parsed as a u64 will be set to u64::MAX, which will cause the back-end to auto-generate an ID */ , name ) ,
( ok : boolean ) = > {
backend . log ( backend . LogLevel . Debug , "New settings variant ok? " + ok ) ;
reload ( ) ;
2024-04-26 02:33:14 +01:00
isVariantLoading = false ;
2024-02-07 03:48:29 +00:00
backend . resolve ( backend . waitForComplete ( ) , ( _ ) = > {
backend . log ( backend . LogLevel . Debug , "Trying to tell UI to re-render due to new settings variant" ) ;
tryNotifyProfileChange ( ) ;
} ) ;
}
) ;
Navigation . OpenQuickAccessMenu ( QuickAccessTab . Decky ) ;
} ;
2024-01-22 01:03:04 +00:00
2022-06-11 01:02:05 +01:00
return (
< PanelSection >
2023-07-04 03:00:18 +01:00
< DevMessages idc = { idc } / >
2023-02-04 21:19:00 +00:00
< Cpus idc = { idc } / >
2022-11-19 20:21:09 +00:00
2023-02-04 21:19:00 +00:00
< Gpu idc = { idc } / >
2023-01-07 23:45:12 +00:00
2023-02-04 21:19:00 +00:00
< Battery idc = { idc } / >
2023-01-08 01:07:26 +00:00
2022-06-11 01:02:05 +01:00
{ /* Persistence */ }
2022-09-01 01:18:15 +01:00
< div className = { staticClasses . PanelSectionTitle } >
2023-01-11 01:54:33 +00:00
{ tr ( "Miscellaneous" ) }
2022-09-01 01:18:15 +01:00
< / div >
2022-06-11 01:02:05 +01:00
< PanelSectionRow >
2022-07-04 22:12:13 +01:00
< ToggleField
2022-09-01 01:18:15 +01:00
checked = { get_value ( PERSISTENT_GEN ) }
2023-02-03 22:03:50 +00:00
label = { tr ( "Persistent Profile" ) }
2023-01-11 01:54:33 +00:00
description = { tr ( "Save profile and load it next time" ) }
2022-06-11 01:02:05 +01:00
onChange = { ( persist : boolean ) = > {
2023-01-05 00:42:59 +00:00
backend . log ( backend . LogLevel . Debug , "Persist is now " + persist . toString ( ) ) ;
2022-09-01 01:18:15 +01:00
backend . resolve (
backend . setGeneralPersistent ( persist ) ,
( val : boolean ) = > { set_value ( PERSISTENT_GEN , val ) }
) ;
2022-06-11 01:02:05 +01:00
} }
/ >
< / PanelSectionRow >
< PanelSectionRow >
2022-11-19 20:21:09 +00:00
< Field
2023-01-11 01:54:33 +00:00
label = { tr ( "Profile" ) } >
2022-11-19 20:21:09 +00:00
{ get_value ( NAME_GEN ) }
< / Field >
2022-06-11 01:02:05 +01:00
< / PanelSectionRow >
2024-01-22 01:03:04 +00:00
< PanelSectionRow >
< Field
2024-03-31 02:29:11 +01:00
label = { tr ( "Profile Variant" ) }
2024-01-22 01:03:04 +00:00
>
2024-01-30 02:32:18 +00:00
{ ( ! isVariantLoading && < Dropdown
2024-01-22 01:03:04 +00:00
menuLabel = { tr ( "Profile Variant" ) }
rgOptions = { variantOptions }
selectedOption = { variantOptions . find ( ( val : SingleDropdownOption , _index , _arr ) = > {
2024-01-30 02:32:18 +00:00
backend . log ( backend . LogLevel . Debug , "POWERTOOLS: looking for variant data.id " + ( get_value ( CURRENT_VARIANT_GEN ) as backend . VariantInfo ) . id . toString ( ) ) ;
2024-01-22 01:03:04 +00:00
return ( val . data as backend . VariantInfo ) . id == ( get_value ( CURRENT_VARIANT_GEN ) as backend . VariantInfo ) . id ;
} ) }
2024-01-30 02:32:18 +00:00
strDefaultLabel = { ( get_value ( CURRENT_VARIANT_GEN ) as backend . VariantInfo | undefined ) ? . name ? ? ( get_value ( VARIANTS_GEN ) as backend . VariantInfo [ ] ) [ 0 ] . name }
2024-01-22 01:03:04 +00:00
onChange = { ( elem : SingleDropdownOption ) = > {
2024-01-30 02:32:18 +00:00
if ( elem . data . id != ( get_value ( CURRENT_VARIANT_GEN ) as backend . VariantInfo ) . id ) {
isVariantLoading = true ;
let data = elem . data as backend . VariantInfo ;
backend . log ( backend . LogLevel . Debug , "Profile variant dropdown selected " + elem . data . id . toString ( ) ) ;
//set_value(CURRENT_VARIANT_GEN, elem.data as backend.VariantInfo);
backend . resolve (
backend . loadGeneralSettingsVariant ( data . id , data . name ) ,
( ok : boolean ) = > {
backend . log ( backend . LogLevel . Debug , "Loaded settings variant ok? " + ok ) ;
reload ( ) ;
isVariantLoading = false ;
backend . resolve ( backend . waitForComplete ( ) , ( _ ) = > {
backend . log ( backend . LogLevel . Debug , "Trying to tell UI to re-render due to newly-selected settings variant" ) ;
tryNotifyProfileChange ( ) ;
//reloadGUI("ProfileVariantSelected");
} ) ;
}
) ;
}
2024-01-22 01:03:04 +00:00
} }
2024-01-30 02:32:18 +00:00
/ > ) }
{ ( isVariantLoading && < Spinner / > ) }
2024-01-22 01:03:04 +00:00
< / Field >
< / PanelSectionRow >
2024-01-30 02:32:18 +00:00
< PanelSectionRow >
< Focusable style = { {
alignItems : "center" ,
display : "flex" ,
justifyContent : "space-around" ,
} }
flow - children = "horizontal"
2024-01-27 20:05:41 +00:00
>
2024-01-30 02:32:18 +00:00
< DialogButton
style = { {
maxWidth : "30%" ,
minWidth : "auto" ,
} }
//layout="below"
onClick = { ( _ : MouseEvent ) = > {
backend . log ( backend . LogLevel . Debug , "Creating new PowerTools settings variant" ) ;
2024-03-31 02:29:11 +01:00
modalResult = showModal ( < TextFieldModal label = { tr ( "Profile Variant" ) } placeholder = { tr ( "Variant name" ) } onClosed = { onNewVariantModelClosed } closeModal = { ( ) = > { modalResult ? . Close ( ) ; Navigation . OpenQuickAccessMenu ( QuickAccessTab . Decky ) } } / > , window ) ;
2024-01-30 02:32:18 +00:00
} }
>
< HiPlus / >
< / DialogButton >
< DialogButton
style = { {
maxWidth : "30%" ,
minWidth : "auto" ,
} }
//layout="below"
onClick = { ( _ : MouseEvent ) = > {
const steamId = get_value ( INTERNAL_STEAM_ID ) ;
const steamName = get_value ( INTERNAL_STEAM_USERNAME ) ;
if ( steamId && steamName ) {
backend . storeUpload ( steamId , steamName ) ;
} else {
backend . log ( backend . LogLevel . Warn , "Cannot upload with null steamID (is null: " + ! steamId + ") and/or username (is null: " + ! steamName + ")" ) ;
}
} }
>
< HiUpload / >
< / DialogButton >
< DialogButton
style = { {
maxWidth : "30%" ,
minWidth : "auto" ,
} }
//layout="below"
onClick = { ( _ : MouseEvent ) = > {
Navigation . Navigate ( STORE_RESULTS_URI ) ;
Navigation . CloseSideMenus ( ) ;
} }
>
< TbWorldPlus / >
< / DialogButton >
< / Focusable >
2024-01-22 01:03:04 +00:00
< / PanelSectionRow >
2023-01-07 23:45:12 +00:00
2023-02-04 21:19:00 +00:00
< Debug idc = { idc } / >
2023-01-07 23:45:12 +00:00
2023-03-23 02:15:36 +00:00
< PanelSectionRow >
< ButtonItem
layout = "below"
onClick = { ( _ : MouseEvent ) = > {
backend . log ( backend . LogLevel . Debug , "Reapplying PowerTools settings" ) ;
backend . forceApplySettings ( ) ;
} }
>
2023-03-25 17:46:58 +00:00
< HiRefresh / > { tr ( "Reapply settings" ) }
2023-03-23 02:15:36 +00:00
< / ButtonItem >
< / PanelSectionRow >
2022-09-01 01:18:15 +01:00
< PanelSectionRow >
< ButtonItem
layout = "below"
onClick = { ( _ : MouseEvent ) = > {
2023-01-05 00:42:59 +00:00
backend . log ( backend . LogLevel . Debug , "Loading default PowerTools settings" ) ;
2022-09-01 01:18:15 +01:00
backend . resolve (
backend . setGeneralPersistent ( false ) ,
( val : boolean ) = > {
set_value ( PERSISTENT_GEN , val ) ;
2022-11-13 17:41:45 +00:00
backend . resolve ( backend . loadGeneralSystemSettings ( ) , ( _ ) = > {
2022-09-01 01:18:15 +01:00
reload ( ) ;
2022-11-13 17:41:45 +00:00
backend . resolve ( backend . waitForComplete ( ) , ( _ ) = > { reloadGUI ( "LoadSystemDefaults" ) } ) ;
2022-09-01 01:18:15 +01:00
} ) ;
}
) ;
} }
>
2023-03-25 17:46:58 +00:00
< HiTrash / > { tr ( "Defaults" ) }
2022-09-01 01:18:15 +01:00
< / ButtonItem >
< / PanelSectionRow >
2022-06-11 01:02:05 +01:00
< / PanelSection >
) ;
} ;
export default definePlugin ( ( serverApi : ServerAPI ) = > {
2023-03-04 15:32:58 +00:00
let ico = < GiDrill / > ;
let now = new Date ( ) ;
if ( now . getDate ( ) == 1 && now . getMonth ( ) == 3 ) {
2024-02-02 00:39:29 +00:00
ico = < span > < GiFireExtinguisher / > < GiFireBomb / > < GiMineExplosion / > < / span > ;
2023-03-04 15:32:58 +00:00
}
2023-12-17 22:12:34 +00:00
//registerCallbacks(false);
2024-02-25 03:00:09 +00:00
serverApi . routerHook . addRoute ( STORE_RESULTS_URI , ( ) = > < StoreResultsPage onNewVariant = { tryNotifyProfileChange } / > ) ;
2022-06-11 01:02:05 +01:00
return {
2023-08-25 00:26:36 +01:00
title : < div className = { staticClasses . Title } > PowerTools < / div > ,
2022-06-11 01:02:05 +01:00
content : < Content serverAPI = { serverApi } / > ,
2023-03-04 15:32:58 +00:00
icon : ico ,
2022-06-11 01:02:05 +01:00
onDismount() {
2024-01-22 01:03:04 +00:00
tryNotifyProfileChange = function ( ) { } ;
2023-01-05 00:42:59 +00:00
backend . log ( backend . LogLevel . Debug , "PowerTools shutting down" ) ;
2023-12-17 21:13:59 +00:00
clearHooks ( ) ;
2024-02-25 03:00:09 +00:00
serverApi . routerHook . removeRoute ( STORE_RESULTS_URI ) ;
2022-06-11 01:02:05 +01:00
} ,
} ;
} ) ;