From c2601ba69ced71d908d0ace2244b5c06b3ef0fed Mon Sep 17 00:00:00 2001 From: Oliver Date: Sat, 13 Dec 2025 21:31:56 -0700 Subject: [PATCH] Add better status indicators, and a setting to prevent movement history recording --- dev/hooks/ready.mjs | 2 +- langs/en-ca.json | 6 ++- module/hooks/init.mjs | 17 ++++++ module/hooks/setup.mjs | 58 ++++++++++++++++++++ module/oft.mjs | 61 +--------------------- module/settings/addGlobalDocReferrer.mjs | 4 +- module/settings/autoUnpauseOnLoad.mjs | 7 ++- module/settings/chatImageLinks.mjs | 7 ++- module/settings/chatSidebarBackground.mjs | 4 +- module/settings/hotbarButtonGap.mjs | 7 ++- module/settings/hotbarButtonSize.mjs | 7 ++- module/settings/preventMovementHistory.mjs | 42 +++++++++++++++ module/settings/preventTokenRotation.mjs | 7 ++- module/settings/preventUserConfigOpen.mjs | 7 ++- module/settings/repositionHotbar.mjs | 7 ++- module/settings/startSidebarExpanded.mjs | 4 +- module/settings/startingSidebarTab.mjs | 4 +- module/utils/SettingStatus.mjs | 11 ++++ 18 files changed, 183 insertions(+), 79 deletions(-) create mode 100644 module/hooks/init.mjs create mode 100644 module/hooks/setup.mjs create mode 100644 module/settings/preventMovementHistory.mjs create mode 100644 module/utils/SettingStatus.mjs diff --git a/dev/hooks/ready.mjs b/dev/hooks/ready.mjs index ce55a53..d7bea64 100644 --- a/dev/hooks/ready.mjs +++ b/dev/hooks/ready.mjs @@ -1,5 +1,5 @@ import { __ID__ } from "../../module/consts.mjs"; Hooks.on(`ready`, () => { - console.table(game.modules.get(__ID__).api.registered); + console.table(game.modules.get(__ID__).api.settings); }); diff --git a/langs/en-ca.json b/langs/en-ca.json index 8d607b0..02cd095 100644 --- a/langs/en-ca.json +++ b/langs/en-ca.json @@ -11,7 +11,7 @@ }, "chatImageLinks": { "name": "Image Shortcuts", - "hint": "When attempting to send an image/gif in chat, this allows you to easily embed the actual image in the text by changing \"http\"/\"https\" into \"image\", automatically displaying the image after sending the message." + "hint": "(v13+) When attempting to send an image/gif in chat, this allows you to easily embed the actual image in the text by changing \"http\"/\"https\" into \"image\", automatically displaying the image after sending the message." }, "chatSidebarBackground": { "name": "Chat Background", @@ -25,6 +25,10 @@ "name": "Hotbar Button Size", "hint": "(v13+) Changes the size of the hotbar buttons to a size you prefer." }, + "preventMovementHistory": { + "name": "Prevent Movement History", + "hint": "(v13+, GM-Only) This prevents Foundry from recording movement history of a token, but not disabling the movement ruler." + }, "preventTokenRotation": { "name": "Prevent Token Auto-Rotation", "hint": "(v13+, GM-Only) This prevents tokens from rotating while you are moving them allowing you to more easily use POG-style tokens without them being rotated automatically by Foundry." diff --git a/module/hooks/init.mjs b/module/hooks/init.mjs new file mode 100644 index 0000000..60cde1b --- /dev/null +++ b/module/hooks/init.mjs @@ -0,0 +1,17 @@ +// Settings +import { preventMovementHistory } from "../settings/preventMovementHistory.mjs"; + +// Utils +import { Logger } from "../utils/Logger.mjs"; + +/* +This is only here for setting that **require** being registered during +initialization due to documentClass changes. If there is any way that +these settings can be implemented to work during the setup hook, that is +where they ideally should be implemented. +*/ +Hooks.on(`init`, () => { + Logger.log(`Initializing`); + + preventMovementHistory(); +}); diff --git a/module/hooks/setup.mjs b/module/hooks/setup.mjs new file mode 100644 index 0000000..ae63ec6 --- /dev/null +++ b/module/hooks/setup.mjs @@ -0,0 +1,58 @@ +// Settings +import { addGlobalDocReferrer } from "../settings/addGlobalDocReferrer.mjs"; +import { autoUnpauseOnLoad } from "../settings/autoUnpauseOnLoad.mjs"; +import { chatImageLinks } from "../settings/chatImageLinks.mjs"; +import { chatSidebarBackground } from "../settings/chatSidebarBackground.mjs"; +import { hotbarButtonGap } from "../settings/hotbarButtonGap.mjs"; +import { hotbarButtonSize } from "../settings/hotbarButtonSize.mjs"; +import { preventTokenRotation } from "../settings/preventTokenRotation.mjs"; +import { preventUserConfigOpen } from "../settings/preventUserConfigOpen.mjs"; +import { repositionHotbar } from "../settings/repositionHotbar.mjs"; +import { startingSidebarTab } from "../settings/startingSidebarTab.mjs"; +import { startSidebarExpanded } from "../settings/startSidebarExpanded.mjs"; + +// Apps +import { DevSettingsMenu } from "../apps/DevSettingsMenu.mjs"; +import { HotbarSettingsMenu } from "../apps/HotbarSettingsMenu.mjs"; + +// Misc +import { __ID__ } from "../consts.mjs"; +import { status } from "../utils/SettingStatus.mjs"; + +const { deepFreeze } = foundry.utils; + +Hooks.on(`setup`, () => { + + game.settings.registerMenu(__ID__, `devSettings`, { + name: `OFT.menu.devSettings.name`, + hint: `OFT.menu.devSettings.hint`, + label: `OFT.menu.devSettings.label`, + restricted: false, + type: DevSettingsMenu, + }); + addGlobalDocReferrer(); + autoUnpauseOnLoad(); + + game.settings.registerMenu(__ID__, `hotbarSettings`, { + name: `OFT.menu.hotbarSettings.name`, + hint: `OFT.menu.hotbarSettings.hint`, + label: `OFT.menu.hotbarSettings.label`, + restricted: false, + type: HotbarSettingsMenu, + }); + hotbarButtonSize(); + hotbarButtonGap(); + repositionHotbar(); + + chatImageLinks(); + chatSidebarBackground(); + startSidebarExpanded(); + startingSidebarTab(); + preventTokenRotation(); + preventUserConfigOpen(); + + Hooks.callAll(`oft.settingStatuses`, deepFreeze(status)); + game.modules.get(__ID__).api = deepFreeze({ + settings: status, + }); +}); diff --git a/module/oft.mjs b/module/oft.mjs index a3b5d5a..8740d00 100644 --- a/module/oft.mjs +++ b/module/oft.mjs @@ -1,61 +1,4 @@ // Hooks +import "./hooks/init.mjs"; +import "./hooks/setup.mjs"; import "./hooks/renderSettingsConfig.mjs"; - -// Settings -import { addGlobalDocReferrer } from "./settings/addGlobalDocReferrer.mjs"; -import { autoUnpauseOnLoad } from "./settings/autoUnpauseOnLoad.mjs"; -import { chatSidebarBackground } from "./settings/chatSidebarBackground.mjs"; -import { hotbarButtonGap } from "./settings/hotbarButtonGap.mjs"; -import { hotbarButtonSize } from "./settings/hotbarButtonSize.mjs"; -import { preventTokenRotation } from "./settings/preventTokenRotation.mjs"; -import { preventUserConfigOpen } from "./settings/preventUserConfigOpen.mjs"; -import { repositionHotbar } from "./settings/repositionHotbar.mjs"; -import { startingSidebarTab } from "./settings/startingSidebarTab.mjs"; -import { startSidebarExpanded } from "./settings/startSidebarExpanded.mjs"; - -// Apps -import { DevSettingsMenu } from "./apps/DevSettingsMenu.mjs"; -import { HotbarSettingsMenu } from "./apps/HotbarSettingsMenu.mjs"; - -// Misc -import { __ID__ } from "./consts.mjs"; -import { chatImageLinks } from "./settings/chatImageLinks.mjs"; - -const { deepFreeze } = foundry.utils; -const status = {}; - -Hooks.on(`setup`, () => { - - game.settings.registerMenu(__ID__, `devSettings`, { - name: `OFT.menu.devSettings.name`, - hint: `OFT.menu.devSettings.hint`, - label: `OFT.menu.devSettings.label`, - restricted: false, - type: DevSettingsMenu, - }); - status.addGlobalDocReferrer = addGlobalDocReferrer(); - status.autoUnpauseOnLoad = autoUnpauseOnLoad(); - - game.settings.registerMenu(__ID__, `hotbarSettings`, { - name: `OFT.menu.hotbarSettings.name`, - hint: `OFT.menu.hotbarSettings.hint`, - label: `OFT.menu.hotbarSettings.label`, - restricted: false, - type: HotbarSettingsMenu, - }); - status.hotbarButtonSize = hotbarButtonSize(); - status.hotbarButtonGap = hotbarButtonGap(); - status.repositionHotbar = repositionHotbar(); - - status.chatImageLinks = chatImageLinks(); - status.chatSidebarBackground = chatSidebarBackground(); - status.startSidebarExpanded = startSidebarExpanded(); - status.startingSidebarTab = startingSidebarTab(); - status.preventTokenRotation = preventTokenRotation(); - status.preventUserConfigOpen = preventUserConfigOpen(); - - Hooks.callAll(`oft.settingStatuses`, deepFreeze(status)); - game.modules.get(__ID__).api = deepFreeze({ - registered: status, - }); -}); diff --git a/module/settings/addGlobalDocReferrer.mjs b/module/settings/addGlobalDocReferrer.mjs index 735eebc..d955d40 100644 --- a/module/settings/addGlobalDocReferrer.mjs +++ b/module/settings/addGlobalDocReferrer.mjs @@ -1,3 +1,4 @@ +import { SettingStatusEnum, status } from "../utils/SettingStatus.mjs"; import { __ID__ } from "../consts.mjs"; import { Logger } from "../utils/Logger.mjs"; import { registerDevSetting } from "../utils/SubMenuSettings.mjs"; @@ -5,6 +6,7 @@ import { registerDevSetting } from "../utils/SubMenuSettings.mjs"; const key = `addGlobalDocReferrer`; export function addGlobalDocReferrer() { + status[key] = SettingStatusEnum.Unknown; // #region Registration Logger.log(`Registering setting: ${key}`); @@ -33,5 +35,5 @@ export function addGlobalDocReferrer() { }); // #endregion Implementation - return true; + status[key] = SettingStatusEnum.Registered; }; diff --git a/module/settings/autoUnpauseOnLoad.mjs b/module/settings/autoUnpauseOnLoad.mjs index de8e2c7..de15fa4 100644 --- a/module/settings/autoUnpauseOnLoad.mjs +++ b/module/settings/autoUnpauseOnLoad.mjs @@ -1,3 +1,4 @@ +import { SettingStatusEnum, status } from "../utils/SettingStatus.mjs"; import { __ID__ } from "../consts.mjs"; import { Logger } from "../utils/Logger.mjs"; import { registerDevSetting } from "../utils/SubMenuSettings.mjs"; @@ -5,11 +6,13 @@ import { registerDevSetting } from "../utils/SubMenuSettings.mjs"; const key = `autoUnpauseOnLoad`; export function autoUnpauseOnLoad() { + status[key] = SettingStatusEnum.Unknown; const prevented = Hooks.call(`${__ID__}.preventSetting`, key); if (!prevented) { Logger.log(`Preventing setting "${key}" from being registered`); - return false; + status[key] = SettingStatusEnum.Blocked; + return; }; // #region Registration @@ -35,5 +38,5 @@ export function autoUnpauseOnLoad() { }); // #endregion Implementation - return true; + status[key] = SettingStatusEnum.Registered; }; diff --git a/module/settings/chatImageLinks.mjs b/module/settings/chatImageLinks.mjs index 1c7e3e6..c25d56f 100644 --- a/module/settings/chatImageLinks.mjs +++ b/module/settings/chatImageLinks.mjs @@ -1,3 +1,4 @@ +import { SettingStatusEnum, status } from "../utils/SettingStatus.mjs"; import { __ID__ } from "../consts.mjs"; import { Logger } from "../utils/Logger.mjs"; @@ -13,11 +14,13 @@ const IMAGE_TYPES = [ ]; export function chatImageLinks() { + status[key] = SettingStatusEnum.Unknown; const prevented = Hooks.call(`${__ID__}.preventSetting`, key); if (!prevented) { Logger.log(`Preventing setting "${key}" from being registered`); - return false; + status[key] = SettingStatusEnum.Blocked; + return; }; // #region Registration @@ -103,7 +106,7 @@ export function chatImageLinks() { } // #endregion Implementation - return true; + status[key] = SettingStatusEnum.Registered; }; // #region Helpers diff --git a/module/settings/chatSidebarBackground.mjs b/module/settings/chatSidebarBackground.mjs index c9728e2..5fce77a 100644 --- a/module/settings/chatSidebarBackground.mjs +++ b/module/settings/chatSidebarBackground.mjs @@ -1,9 +1,11 @@ +import { SettingStatusEnum, status } from "../utils/SettingStatus.mjs"; import { __ID__ } from "../consts.mjs"; import { Logger } from "../utils/Logger.mjs"; const key = `chatSidebarBackground`; export function chatSidebarBackground() { + status[key] = SettingStatusEnum.Unknown; // #region Registration Logger.log(`Registering setting: ${key}`); @@ -29,5 +31,5 @@ export function chatSidebarBackground() { }; // #endregion Implementation - return true; + status[key] = SettingStatusEnum.Registered; }; diff --git a/module/settings/hotbarButtonGap.mjs b/module/settings/hotbarButtonGap.mjs index 35edd13..98c7cbf 100644 --- a/module/settings/hotbarButtonGap.mjs +++ b/module/settings/hotbarButtonGap.mjs @@ -1,3 +1,4 @@ +import { SettingStatusEnum, status } from "../utils/SettingStatus.mjs"; import { __ID__ } from "../consts.mjs"; import { Logger } from "../utils/Logger.mjs"; import { registerCategorySetting } from "../utils/SubMenuSettings.mjs"; @@ -5,11 +6,13 @@ import { registerCategorySetting } from "../utils/SubMenuSettings.mjs"; const key = `hotbarButtonGap`; export function hotbarButtonGap() { + status[key] = SettingStatusEnum.Unknown; const prevented = Hooks.call(`${__ID__}.preventSetting`, key); if (!prevented) { Logger.log(`Preventing setting "${key}" from being registered`); - return false; + status[key] = SettingStatusEnum.Blocked; + return; }; // #region Registration @@ -38,5 +41,5 @@ export function hotbarButtonGap() { document.body.style.setProperty(`--hotbar-button-gap`, `${buttonGap}px`); // #endregion Implementation - return true; + status[key] = SettingStatusEnum.Registered; }; diff --git a/module/settings/hotbarButtonSize.mjs b/module/settings/hotbarButtonSize.mjs index 53d61d5..7b4797b 100644 --- a/module/settings/hotbarButtonSize.mjs +++ b/module/settings/hotbarButtonSize.mjs @@ -1,3 +1,4 @@ +import { SettingStatusEnum, status } from "../utils/SettingStatus.mjs"; import { __ID__ } from "../consts.mjs"; import { Logger } from "../utils/Logger.mjs"; import { registerCategorySetting } from "../utils/SubMenuSettings.mjs"; @@ -5,11 +6,13 @@ import { registerCategorySetting } from "../utils/SubMenuSettings.mjs"; const key = `hotbarButtonSize`; export function hotbarButtonSize() { + status[key] = SettingStatusEnum.Unknown; const prevented = Hooks.call(`${__ID__}.preventSetting`, key); if (!prevented) { Logger.log(`Preventing setting "${key}" from being registered`); - return false; + status[key] = SettingStatusEnum.Blocked; + return; }; // #region Registration @@ -38,5 +41,5 @@ export function hotbarButtonSize() { document.body.style.setProperty(`--hotbar-size`, `${hotbarSize}px`); // #endregion Implementation - return true; + status[key] = SettingStatusEnum.Registered; }; diff --git a/module/settings/preventMovementHistory.mjs b/module/settings/preventMovementHistory.mjs new file mode 100644 index 0000000..8f4d18c --- /dev/null +++ b/module/settings/preventMovementHistory.mjs @@ -0,0 +1,42 @@ +import { SettingStatusEnum, status } from "../utils/SettingStatus.mjs"; +import { __ID__ } from "../consts.mjs"; +import { Logger } from "../utils/Logger.mjs"; + +const key = `preventMovementHistory`; + +export function preventMovementHistory() { + status[key] = SettingStatusEnum.Unknown; + + const prevented = Hooks.call(`${__ID__}.preventSetting`, key); + if (!prevented) { + Logger.log(`Preventing setting "${key}" from being registered`); + status[key] = SettingStatusEnum.Blocked; + return; + }; + + // #region Registration + Logger.log(`Registering setting: ${key}`); + game.settings.register(__ID__, key, { + name: `OFT.setting.${key}.name`, + hint: `OFT.setting.${key}.hint`, + scope: `world`, + type: Boolean, + default: false, + config: true, + reloadRequired: true, + }); + // #endregion Registration + + // #region Implementation + if (game.settings.get(__ID__, key)) { + class OFTTokenDocument extends CONFIG.Token.documentClass { + _shouldRecordMovementHistory() { + return false; + }; + }; + CONFIG.Token.documentClass = OFTTokenDocument; + }; + // #endregion Implementation + + status[key] = SettingStatusEnum.Registered; +}; diff --git a/module/settings/preventTokenRotation.mjs b/module/settings/preventTokenRotation.mjs index 8224b9f..258920c 100644 --- a/module/settings/preventTokenRotation.mjs +++ b/module/settings/preventTokenRotation.mjs @@ -1,14 +1,17 @@ +import { SettingStatusEnum, status } from "../utils/SettingStatus.mjs"; import { __ID__ } from "../consts.mjs"; import { Logger } from "../utils/Logger.mjs"; const key = `preventTokenRotation`; export function preventTokenRotation() { + status[key] = SettingStatusEnum.Unknown; const prevented = Hooks.call(`${__ID__}.preventSetting`, key); if (!prevented) { Logger.log(`Preventing setting "${key}" from being registered`); - return false; + status[key] = SettingStatusEnum.Blocked; + return; }; /** @type {number|null} */ @@ -40,7 +43,7 @@ export function preventTokenRotation() { }; // #endregion Implementation - return true; + status[key] = SettingStatusEnum.Registered; }; // #region Helpers diff --git a/module/settings/preventUserConfigOpen.mjs b/module/settings/preventUserConfigOpen.mjs index 9069b7e..3b7646d 100644 --- a/module/settings/preventUserConfigOpen.mjs +++ b/module/settings/preventUserConfigOpen.mjs @@ -1,14 +1,17 @@ +import { SettingStatusEnum, status } from "../utils/SettingStatus.mjs"; import { __ID__ } from "../consts.mjs"; import { Logger } from "../utils/Logger.mjs"; const key = `preventUserConfigOpen`; export function preventUserConfigOpen() { + status[key] = SettingStatusEnum.Unknown; const prevented = Hooks.call(`${__ID__}.preventSetting`, key); if (!prevented) { Logger.log(`Preventing setting "${key}" from being registered`); - return false; + status[key] = SettingStatusEnum.Blocked; + return; }; // #region Registration @@ -33,5 +36,5 @@ export function preventUserConfigOpen() { }); // #endregion Implementation - return true; + status[key] = SettingStatusEnum.Registered; }; diff --git a/module/settings/repositionHotbar.mjs b/module/settings/repositionHotbar.mjs index 6da7621..cce0c5f 100644 --- a/module/settings/repositionHotbar.mjs +++ b/module/settings/repositionHotbar.mjs @@ -1,3 +1,4 @@ +import { SettingStatusEnum, status } from "../utils/SettingStatus.mjs"; import { __ID__ } from "../consts.mjs"; import { Logger } from "../utils/Logger.mjs"; import { registerCategorySetting } from "../utils/SubMenuSettings.mjs"; @@ -5,11 +6,13 @@ import { registerCategorySetting } from "../utils/SubMenuSettings.mjs"; const key = `repositionHotbar`; export function repositionHotbar() { + status[key] = SettingStatusEnum.Unknown; const prevented = Hooks.call(`${__ID__}.preventSetting`, key); if (!prevented) { Logger.log(`Preventing setting "${key}" from being registered`); - return false; + status[key] = SettingStatusEnum.Blocked; + return; }; // #region Registration @@ -44,5 +47,5 @@ export function repositionHotbar() { }; // #endregion Implementation - return true; + status[key] = SettingStatusEnum.Registered; }; diff --git a/module/settings/startSidebarExpanded.mjs b/module/settings/startSidebarExpanded.mjs index 455dbcc..4cf9f2d 100644 --- a/module/settings/startSidebarExpanded.mjs +++ b/module/settings/startSidebarExpanded.mjs @@ -1,9 +1,11 @@ +import { SettingStatusEnum, status } from "../utils/SettingStatus.mjs"; import { __ID__ } from "../consts.mjs"; import { Logger } from "../utils/Logger.mjs"; const key = `startSidebarExpanded`; export function startSidebarExpanded() { + status[key] = SettingStatusEnum.Unknown; // #region Registration Logger.log(`Registering setting: ${key}`); @@ -27,5 +29,5 @@ export function startSidebarExpanded() { }); // #endregion Implementation - return true; + status[key] = SettingStatusEnum.Registered; }; diff --git a/module/settings/startingSidebarTab.mjs b/module/settings/startingSidebarTab.mjs index 27d71d6..02fab17 100644 --- a/module/settings/startingSidebarTab.mjs +++ b/module/settings/startingSidebarTab.mjs @@ -1,9 +1,11 @@ +import { SettingStatusEnum, status } from "../utils/SettingStatus.mjs"; import { __ID__ } from "../consts.mjs"; import { Logger } from "../utils/Logger.mjs"; const key = `startingSidebarTab`; export function startingSidebarTab() { + status[key] = SettingStatusEnum.Unknown; // #region Registration Logger.log(`Registering setting: ${key}`); @@ -56,5 +58,5 @@ export function startingSidebarTab() { }); // #endregion Implementation - return true; + status[key] = SettingStatusEnum.Registered; }; diff --git a/module/utils/SettingStatus.mjs b/module/utils/SettingStatus.mjs new file mode 100644 index 0000000..d3f1dd5 --- /dev/null +++ b/module/utils/SettingStatus.mjs @@ -0,0 +1,11 @@ +/** @typedef {typeof SettingStatusEnum[keyof typeof SettingStatusEnum]} SettingStatus */ + +export const SettingStatusEnum = foundry.utils.deepFreeze({ + Registered: `registered`, + Blocked: `blocked`, + Incompatible: `incompatible`, + Unknown: `unknown`, +}); + +/** @type {Record} */ +export const status = {};