From c41cd68a8d0ba301cd92440fab1b4593b558210c Mon Sep 17 00:00:00 2001 From: nickofolas Date: Mon, 17 Jan 2022 16:32:45 -0600 Subject: [PATCH] Add modal to editor with RAM details --- src/ScriptEditor/ui/ScriptEditorRoot.tsx | 45 +++++++++++++++++++----- 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/src/ScriptEditor/ui/ScriptEditorRoot.tsx b/src/ScriptEditor/ui/ScriptEditorRoot.tsx index 95e0657dd..f74486f94 100644 --- a/src/ScriptEditor/ui/ScriptEditorRoot.tsx +++ b/src/ScriptEditor/ui/ScriptEditorRoot.tsx @@ -34,7 +34,12 @@ import Link from "@mui/material/Link"; import Box from "@mui/material/Box"; import IconButton from "@mui/material/IconButton"; import SettingsIcon from "@mui/icons-material/Settings"; +import Table from "@mui/material/Table"; +import TableCell from "@mui/material/TableCell"; +import TableRow from "@mui/material/TableRow"; +import TableBody from "@mui/material/TableBody"; import { PromptEvent } from "../../ui/React/PromptManager"; +import { Modal } from "../../ui/React/Modal"; import libSource from "!!raw-loader!../NetscriptDefinitions.d.ts"; @@ -109,6 +114,7 @@ export function Root(props: IProps): React.ReactElement { const [editor, setEditor] = useState(null); const [ram, setRAM] = useState("RAM: ???"); + const [ramEntries, setRamEntries] = useState([["???", ""]]); const [updatingRam, setUpdatingRam] = useState(false); const [decorations, setDecorations] = useState([]); @@ -121,6 +127,8 @@ export function Root(props: IProps): React.ReactElement { vim: props.vim || Settings.MonacoVim, }); + const [ramInfoOpen, setRamInfoOpen] = useState(false); + // Prevent Crash if script is open on deleted server openScripts = openScripts.filter((script) => { return GetServer(script.hostname) !== null; @@ -222,8 +230,9 @@ export function Root(props: IProps): React.ReactElement { const debouncedSetRAM = useMemo( () => - debounce((s) => { + debounce((s, e) => { setRAM(s); + setRamEntries(e); setUpdatingRam(false); }, 300), [], @@ -231,28 +240,34 @@ export function Root(props: IProps): React.ReactElement { async function updateRAM(newCode: string): Promise { if (currentScript != null && currentScript.fileName.endsWith(".txt")) { - debouncedSetRAM(""); + debouncedSetRAM("", []); return; } setUpdatingRam(true); const codeCopy = newCode + ""; const ramUsage = await calculateRamUsage(props.player, codeCopy, props.player.getCurrentServer().scripts); if (ramUsage.cost > 0) { - debouncedSetRAM("RAM: " + numeralWrapper.formatRAM(ramUsage.cost)); + const entries = ramUsage.entries?.sort((a, b) => b.cost - a.cost) ?? []; + const entriesDisp = []; + for (const entry of entries) { + entriesDisp.push([`${entry.name} (${entry.type})`, numeralWrapper.formatRAM(entry.cost)]); + } + + debouncedSetRAM("RAM: " + numeralWrapper.formatRAM(ramUsage.cost), entriesDisp); return; } switch (ramUsage.cost) { case RamCalculationErrorCode.ImportError: { - debouncedSetRAM("RAM: Import Error"); + debouncedSetRAM("RAM: Import Error", [["Import Error", ""]]); break; } case RamCalculationErrorCode.URLImportError: { - debouncedSetRAM("RAM: HTTP Import Error"); + debouncedSetRAM("RAM: HTTP Import Error", [["HTTP Import Error", ""]]); break; } case RamCalculationErrorCode.SyntaxError: default: { - debouncedSetRAM("RAM: Syntax Error"); + debouncedSetRAM("RAM: Syntax Error", [["Syntax Error", ""]]); break; } } @@ -800,9 +815,23 @@ export function Root(props: IProps): React.ReactElement { - + + setRamInfoOpen(false)}> + + + {ramEntries.map(([n, r]) => ( + + + {n} + {r} + + + ))} + +
+