diff --git a/markdown/bitburner.userinterface.md b/markdown/bitburner.userinterface.md index 3241407f3..93975662f 100644 --- a/markdown/bitburner.userinterface.md +++ b/markdown/bitburner.userinterface.md @@ -17,4 +17,6 @@ interface UserInterface | Method | Description | | --- | --- | | [getTheme()](./bitburner.userinterface.gettheme.md) | Get the current theme | +| [resetTheme()](./bitburner.userinterface.resettheme.md) | Resets the player's theme to the default values | +| [setTheme(newTheme)](./bitburner.userinterface.settheme.md) | Sets the current theme | diff --git a/markdown/bitburner.userinterface.resettheme.md b/markdown/bitburner.userinterface.resettheme.md new file mode 100644 index 000000000..8c1ebe9bb --- /dev/null +++ b/markdown/bitburner.userinterface.resettheme.md @@ -0,0 +1,21 @@ + + +[Home](./index.md) > [bitburner](./bitburner.md) > [UserInterface](./bitburner.userinterface.md) > [resetTheme](./bitburner.userinterface.resettheme.md) + +## UserInterface.resetTheme() method + +Resets the player's theme to the default values + +Signature: + +```typescript +resetTheme(): void; +``` +Returns: + +void + +## Remarks + +RAM cost: cost: 0 GB + diff --git a/markdown/bitburner.userinterface.settheme.md b/markdown/bitburner.userinterface.settheme.md new file mode 100644 index 000000000..ed9660c72 --- /dev/null +++ b/markdown/bitburner.userinterface.settheme.md @@ -0,0 +1,38 @@ + + +[Home](./index.md) > [bitburner](./bitburner.md) > [UserInterface](./bitburner.userinterface.md) > [setTheme](./bitburner.userinterface.settheme.md) + +## UserInterface.setTheme() method + +Sets the current theme + +Signature: + +```typescript +setTheme(newTheme: UserInterfaceTheme): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| newTheme | UserInterfaceTheme | | + +Returns: + +void + +## Remarks + +RAM cost: cost: 0 GB + +## Example + +Usage example (NS2) + +```ts +const theme = ns.ui.getTheme(); +theme.primary = '#ff5500'; +ns.ui.setTheme(theme); +``` + diff --git a/src/Netscript/RamCostGenerator.ts b/src/Netscript/RamCostGenerator.ts index a1ca4245c..bf80a0f71 100644 --- a/src/Netscript/RamCostGenerator.ts +++ b/src/Netscript/RamCostGenerator.ts @@ -362,6 +362,8 @@ export const RamCosts: IMap = { ui: { getTheme: 0, + setTheme: 0, + resetTheme: 0, }, heart: { diff --git a/src/NetscriptFunctions/UserInterface.ts b/src/NetscriptFunctions/UserInterface.ts index 89c3aeaa0..466479277 100644 --- a/src/NetscriptFunctions/UserInterface.ts +++ b/src/NetscriptFunctions/UserInterface.ts @@ -4,6 +4,8 @@ import { IPlayer } from "../PersonObjects/IPlayer"; import { getRamCost } from "../Netscript/RamCostGenerator"; import { UserInterface as IUserInterface, UserInterfaceTheme } from "../ScriptEditor/NetscriptDefinitions"; import { Settings } from "../Settings/Settings"; +import { ThemeEvents } from "../ui/React/Theme"; +import { defaultTheme } from "../Settings/Themes"; export function NetscriptUserInterface( player: IPlayer, @@ -15,5 +17,37 @@ export function NetscriptUserInterface( helper.updateDynamicRam("getTheme", getRamCost(player, "ui", "getTheme")); return { ...Settings.theme }; }, - }; + + setTheme: function (newTheme: UserInterfaceTheme): void { + helper.updateDynamicRam("setTheme", getRamCost(player, "ui", "setTheme")); + const hex = /^(#)((?:[A-Fa-f0-9]{3}){1,2})$/; + const currentTheme = {...Settings.theme} + const errors: string[] = []; + for (const key of Object.keys(newTheme)) { + if (!currentTheme[key]) { + // Invalid key + errors.push(`Invalid key "${key}"`); + } else if (!hex.test(newTheme[key] ?? '')) { + errors.push(`Invalid color "${key}": ${newTheme[key]}`); + } else { + currentTheme[key] = newTheme[key]; + } + } + + if (errors.length === 0) { + Object.assign(Settings.theme, currentTheme); + ThemeEvents.emit(); + workerScript.log("ui.setTheme", () => `Successfully set theme`); + } else { + workerScript.log("ui.setTheme", () => `Failed to set theme. Errors: ${errors.join(', ')}`); + } + }, + + resetTheme: function (): void { + helper.updateDynamicRam("resetTheme", getRamCost(player, "ui", "resetTheme")); + Settings.theme = defaultTheme; + ThemeEvents.emit(); + workerScript.log("ui.resetTheme", () => `Reinitialized theme to default`); + }, + } } diff --git a/src/ScriptEditor/NetscriptDefinitions.d.ts b/src/ScriptEditor/NetscriptDefinitions.d.ts index 706861804..ae87d5ef7 100644 --- a/src/ScriptEditor/NetscriptDefinitions.d.ts +++ b/src/ScriptEditor/NetscriptDefinitions.d.ts @@ -1321,10 +1321,10 @@ export interface Singularity { /** * SF4.1 - Workout at the gym. - * + * * @remarks * RAM cost: 2 GB - * + * * This function will automatically set you to start working out at a gym to train * a particular stat. If you are already in the middle of some “working” action @@ -3833,6 +3833,27 @@ interface UserInterface { * @returns An object containing the theme's colors */ getTheme(): UserInterfaceTheme; + + /** + * Sets the current theme + * @remarks + * RAM cost: cost: 0 GB + * @example + * Usage example (NS2) + * ```ts + * const theme = ns.ui.getTheme(); + * theme.primary = '#ff5500'; + * ns.ui.setTheme(theme); + * ``` + */ + setTheme(newTheme: UserInterfaceTheme): void; + + /** + * Resets the player's theme to the default values + * @remarks + * RAM cost: cost: 0 GB + */ + resetTheme(): void; } /**