From fb3d3d4d3414394237cc9d664d65c14be179927f Mon Sep 17 00:00:00 2001 From: xXJSONDeruloXx Date: Fri, 18 Jul 2025 20:59:47 -0400 Subject: add nerd stuff modal with dll details --- src/api/lsfgApi.ts | 9 ++++ src/components/Content.tsx | 17 ++++++- src/components/NerdStuffModal.tsx | 95 +++++++++++++++++++++++++++++++++++++++ src/components/index.ts | 1 + 4 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 src/components/NerdStuffModal.tsx (limited to 'src') diff --git a/src/api/lsfgApi.ts b/src/api/lsfgApi.ts index 5770c43..5bf2dc2 100644 --- a/src/api/lsfgApi.ts +++ b/src/api/lsfgApi.ts @@ -28,6 +28,14 @@ export interface DllDetectionResult { error?: string; } +export interface DllStatsResult { + success: boolean; + dll_path?: string; + dll_sha256?: string; + dll_source?: string; + error?: string; +} + // Use centralized configuration data type export type LsfgConfig = ConfigurationData; @@ -77,6 +85,7 @@ export const installLsfgVk = callable<[], InstallationResult>("install_lsfg_vk") export const uninstallLsfgVk = callable<[], InstallationResult>("uninstall_lsfg_vk"); export const checkLsfgVkInstalled = callable<[], InstallationStatus>("check_lsfg_vk_installed"); export const checkLosslessScalingDll = callable<[], DllDetectionResult>("check_lossless_scaling_dll"); +export const getDllStats = callable<[], DllStatsResult>("get_dll_stats"); export const getLsfgConfig = callable<[], ConfigResult>("get_lsfg_config"); export const getConfigSchema = callable<[], ConfigSchemaResult>("get_config_schema"); export const getLaunchOption = callable<[], LaunchOptionResult>("get_launch_option"); diff --git a/src/components/Content.tsx b/src/components/Content.tsx index 613e722..9ce4c35 100644 --- a/src/components/Content.tsx +++ b/src/components/Content.tsx @@ -1,5 +1,5 @@ import { useEffect } from "react"; -import { PanelSection } from "@decky/ui"; +import { PanelSection, showModal, ButtonItem, PanelSectionRow } from "@decky/ui"; import { useInstallationStatus, useDllDetection, useLsfgConfig } from "../hooks/useLsfgHooks"; import { useInstallationActions } from "../hooks/useInstallationActions"; import { StatusDisplay } from "./StatusDisplay"; @@ -9,6 +9,7 @@ import { UsageInstructions } from "./UsageInstructions"; import { WikiButton } from "./WikiButton"; import { ClipboardButton } from "./ClipboardButton"; import { PluginUpdateChecker } from "./PluginUpdateChecker"; +import { NerdStuffModal } from "./NerdStuffModal"; import { ConfigurationData } from "../config/configSchema"; export function Content() { @@ -49,6 +50,10 @@ export function Content() { handleUninstall(setIsInstalled, setInstallationStatus); }; + const handleShowNerdStuff = () => { + showModal(); + }; + return ( + + {/* Nerd Stuff Button */} + + + Nerd Stuff + + ); } diff --git a/src/components/NerdStuffModal.tsx b/src/components/NerdStuffModal.tsx new file mode 100644 index 0000000..4dd53b1 --- /dev/null +++ b/src/components/NerdStuffModal.tsx @@ -0,0 +1,95 @@ +import { useState, useEffect } from "react"; +import { + ModalRoot, + Field, + Focusable +} from "@decky/ui"; +import { getDllStats, DllStatsResult } from "../api/lsfgApi"; + +interface NerdStuffModalProps { + closeModal?: () => void; +} + +export function NerdStuffModal({ closeModal }: NerdStuffModalProps) { + const [dllStats, setDllStats] = useState(null); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + + useEffect(() => { + const loadDllStats = async () => { + try { + setLoading(true); + setError(null); + const result = await getDllStats(); + setDllStats(result); + } catch (err) { + setError(err instanceof Error ? err.message : "Failed to load DLL stats"); + } finally { + setLoading(false); + } + }; + + loadDllStats(); + }, []); + + const formatSHA256 = (hash: string) => { + // Format SHA256 hash for better readability (add spaces every 8 characters) + return hash.replace(/(.{8})/g, '$1 ').trim(); + }; + + const copyToClipboard = async (text: string) => { + try { + await navigator.clipboard.writeText(text); + // Could add a toast notification here if desired + } catch (err) { + console.error("Failed to copy to clipboard:", err); + } + }; + + return ( + + {loading && ( +
Loading DLL information...
+ )} + + {error && ( +
Error: {error}
+ )} + + {!loading && !error && dllStats && ( + <> + {!dllStats.success ? ( +
{dllStats.error || "Failed to get DLL stats"}
+ ) : ( +
+ + dllStats.dll_path && copyToClipboard(dllStats.dll_path)} + onActivate={() => dllStats.dll_path && copyToClipboard(dllStats.dll_path)} + > + {dllStats.dll_path || "Not available"} + + + + + dllStats.dll_sha256 && copyToClipboard(dllStats.dll_sha256)} + onActivate={() => dllStats.dll_sha256 && copyToClipboard(dllStats.dll_sha256)} + > + {dllStats.dll_sha256 ? formatSHA256(dllStats.dll_sha256) : "Not available"} + + + + {dllStats.dll_source && ( + +
{dllStats.dll_source}
+
+ )} + +
+ )} + + )} +
+ ); +} diff --git a/src/components/index.ts b/src/components/index.ts index ed0b803..c0c4804 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -7,3 +7,4 @@ export { WikiButton } from "./WikiButton"; export { ClipboardButton } from "./ClipboardButton"; export { LaunchOptionInfo } from "./LaunchOptionInfo"; export { PluginUpdateChecker } from "./PluginUpdateChecker"; +export { NerdStuffModal } from "./NerdStuffModal"; -- cgit v1.2.3 From a96d2764f036e2ea8f8625533b2f37b8291eda31 Mon Sep 17 00:00:00 2001 From: xXJSONDeruloXx Date: Fri, 18 Jul 2025 21:04:10 -0400 Subject: fix offset notches in multiplier --- src/components/ConfigurationSection.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/components/ConfigurationSection.tsx b/src/components/ConfigurationSection.tsx index 00717bc..a55395e 100644 --- a/src/components/ConfigurationSection.tsx +++ b/src/components/ConfigurationSection.tsx @@ -56,10 +56,10 @@ export function ConfigurationSection({ step={1} notchCount={4} notchLabels={[ - { notchIndex: 1, label: "OFF" }, - { notchIndex: 2, label: "2X" }, - { notchIndex: 3, label: "3X" }, - { notchIndex: 4, label: "4X" } + { notchIndex: 0, label: "OFF" }, + { notchIndex: 1, label: "2X" }, + { notchIndex: 2, label: "3X" }, + { notchIndex: 3, label: "4X" } ]} onChange={(value) => onConfigChange('multiplier', value)} /> -- cgit v1.2.3 From 2087af2315b14e82117e643c16686e9555aa9d9b Mon Sep 17 00:00:00 2001 From: xXJSONDeruloXx Date: Fri, 18 Jul 2025 23:33:42 -0400 Subject: rm circular logic bug with legacy enable bool --- src/api/lsfgApi.ts | 4 ++-- src/components/ConfigurationSection.tsx | 8 ++++---- src/components/UsageInstructions.tsx | 6 +----- src/config/configSchema.ts | 10 +--------- 4 files changed, 8 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/api/lsfgApi.ts b/src/api/lsfgApi.ts index 5bf2dc2..4c23955 100644 --- a/src/api/lsfgApi.ts +++ b/src/api/lsfgApi.ts @@ -92,14 +92,14 @@ export const getLaunchOption = callable<[], LaunchOptionResult>("get_launch_opti // Updated config function using centralized configuration export const updateLsfgConfig = callable< - [boolean, string, number, number, boolean, boolean, string, number, boolean, boolean], + [string, number, number, boolean, boolean, string, number, boolean, boolean], ConfigUpdateResult >("update_lsfg_config"); // Helper function to create config update from configuration object export const updateLsfgConfigFromObject = async (config: ConfigurationData): Promise => { const args = ConfigurationManager.createArgsFromConfig(config); - return updateLsfgConfig(...args as [boolean, string, number, number, boolean, boolean, string, number, boolean, boolean]); + return updateLsfgConfig(...args as [string, number, number, boolean, boolean, string, number, boolean, boolean]); }; // Self-updater API functions diff --git a/src/components/ConfigurationSection.tsx b/src/components/ConfigurationSection.tsx index a55395e..00717bc 100644 --- a/src/components/ConfigurationSection.tsx +++ b/src/components/ConfigurationSection.tsx @@ -56,10 +56,10 @@ export function ConfigurationSection({ step={1} notchCount={4} notchLabels={[ - { notchIndex: 0, label: "OFF" }, - { notchIndex: 1, label: "2X" }, - { notchIndex: 2, label: "3X" }, - { notchIndex: 3, label: "4X" } + { notchIndex: 1, label: "OFF" }, + { notchIndex: 2, label: "2X" }, + { notchIndex: 3, label: "3X" }, + { notchIndex: 4, label: "4X" } ]} onChange={(value) => onConfigChange('multiplier', value)} /> diff --git a/src/components/UsageInstructions.tsx b/src/components/UsageInstructions.tsx index be48a82..5de1fcf 100644 --- a/src/components/UsageInstructions.tsx +++ b/src/components/UsageInstructions.tsx @@ -33,10 +33,7 @@ export function UsageInstructions({ config }: UsageInstructionsProps) { whiteSpace: "pre-wrap" }} > - {config.enable - ? "Add the launch option below (or use \"Launch Option Clipboard\") to Steam games to activate frame generation." - : "LSFG is disabled. Enable it above and add the launch option to activate frame generation." - } + Add the launch option below (or use "Launch Option Clipboard") to Steam games to activate frame generation. @@ -69,7 +66,6 @@ export function UsageInstructions({ config }: UsageInstructionsProps) { }} > {`Current Configuration: -• Enable: ${config.enable ? "Yes" : "No"} • DLL Path: ${config.dll} • Multiplier: ${config.multiplier}x • Flow Scale: ${Math.round(config.flow_scale * 100)}% diff --git a/src/config/configSchema.ts b/src/config/configSchema.ts index 8715057..fa54336 100644 --- a/src/config/configSchema.ts +++ b/src/config/configSchema.ts @@ -23,13 +23,6 @@ export interface ConfigField { // Configuration schema - must match Python CONFIG_SCHEMA export const CONFIG_SCHEMA: Record = { - enable: { - name: "enable", - fieldType: ConfigFieldType.BOOLEAN, - default: true, - description: "enable/disable lsfg on every game" - }, - dll: { name: "dll", fieldType: ConfigFieldType.STRING, @@ -40,7 +33,7 @@ export const CONFIG_SCHEMA: Record = { multiplier: { name: "multiplier", fieldType: ConfigFieldType.INTEGER, - default: 2, + default: 1, description: "change the fps multiplier" }, @@ -96,7 +89,6 @@ export const CONFIG_SCHEMA: Record = { // Type-safe configuration data structure export interface ConfigurationData { - enable: boolean; dll: string; multiplier: number; flow_scale: number; -- cgit v1.2.3 From 6dafc215f2728832d4ea6ef873dbfa34d58dc0e4 Mon Sep 17 00:00:00 2001 From: xXJSONDeruloXx Date: Fri, 18 Jul 2025 23:42:14 -0400 Subject: fix labels --- src/components/ConfigurationSection.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/components/ConfigurationSection.tsx b/src/components/ConfigurationSection.tsx index 00717bc..a55395e 100644 --- a/src/components/ConfigurationSection.tsx +++ b/src/components/ConfigurationSection.tsx @@ -56,10 +56,10 @@ export function ConfigurationSection({ step={1} notchCount={4} notchLabels={[ - { notchIndex: 1, label: "OFF" }, - { notchIndex: 2, label: "2X" }, - { notchIndex: 3, label: "3X" }, - { notchIndex: 4, label: "4X" } + { notchIndex: 0, label: "OFF" }, + { notchIndex: 1, label: "2X" }, + { notchIndex: 2, label: "3X" }, + { notchIndex: 3, label: "4X" } ]} onChange={(value) => onConfigChange('multiplier', value)} /> -- cgit v1.2.3 From 75a94598341899eea5260206975686c05e793956 Mon Sep 17 00:00:00 2001 From: xXJSONDeruloXx Date: Sat, 19 Jul 2025 00:48:06 -0400 Subject: fix notchindex value offset from step --- src/components/ConfigurationSection.tsx | 28 ++++++---------------------- 1 file changed, 6 insertions(+), 22 deletions(-) (limited to 'src') diff --git a/src/components/ConfigurationSection.tsx b/src/components/ConfigurationSection.tsx index a55395e..ad99c28 100644 --- a/src/components/ConfigurationSection.tsx +++ b/src/components/ConfigurationSection.tsx @@ -28,24 +28,6 @@ export function ConfigurationSection({ - {/* - onConfigChange('enable', value)} - /> - */} - - {/* - onConfigChange('dll', e.target.value)} - /> - */} - onConfigChange('multiplier', value)} /> -- cgit v1.2.3