From ddd4672ba362d93c7e3862296d01f56bd1967c43 Mon Sep 17 00:00:00 2001 From: WBHarry Date: Fri, 27 Jun 2025 22:20:52 +0200 Subject: [PATCH] First bit --- lang/en.json | 10 +++ module/applications/sheets/character.mjs | 78 ++++++++++++++++++- module/helpers/handlebarsHelper.mjs | 10 +++ .../global/partials/domain-card-item.hbs | 2 +- .../sheets/global/partials/inventory-item.hbs | 2 +- 5 files changed, 99 insertions(+), 3 deletions(-) diff --git a/lang/en.json b/lang/en.json index ce8f0295..6c2416f9 100755 --- a/lang/en.json +++ b/lang/en.json @@ -1099,6 +1099,16 @@ "biography": "Biography", "effects": "Effects" }, + "ContextMenu": { + "Equip": "Equip", + "Unequip": "Unequip", + "Edit": "Edit", + "Delete": "Delete", + "ToLoadout": "Send to Loadout", + "ToVault": "Send to Vault", + "Consume": "Consume Item", + "SendToChat": "Send To Chat" + }, "Armor": { "Title": "Active Armor" }, diff --git a/module/applications/sheets/character.mjs b/module/applications/sheets/character.mjs index 82679ccd..b3af6b42 100644 --- a/module/applications/sheets/character.mjs +++ b/module/applications/sheets/character.mjs @@ -6,12 +6,15 @@ import DaggerheartSheet from './daggerheart-sheet.mjs'; import { abilities } from '../../config/actorConfig.mjs'; import DhlevelUp from '../levelup.mjs'; import DhCharacterCreation from '../characterCreation.mjs'; +import DhContextMenu from '../contextMenu.mjs'; const { ActorSheetV2 } = foundry.applications.sheets; const { TextEditor } = foundry.applications.ux; export default class CharacterSheet extends DaggerheartSheet(ActorSheetV2) { constructor(options = {}) { super(options); + + this.contextMenu = null; } static DEFAULT_OPTIONS = { @@ -48,7 +51,8 @@ export default class CharacterSheet extends DaggerheartSheet(ActorSheetV2) { useAdvancementAbility: this.useAdvancementAbility, toggleEquipItem: this.toggleEquipItem, levelManagement: this.levelManagement, - editImage: this._onEditImage + editImage: this._onEditImage, + contextMenu: this.createContextMenu }, window: { resizable: true @@ -214,6 +218,78 @@ export default class CharacterSheet extends DaggerheartSheet(ActorSheetV2) { return { primary: primaryTabs, secondary: secondaryTabs }; } + static async createContextMenu(event, baseTarget) { + const target = baseTarget.closest('a'); + const selector = Array.from(target.classList) + .map(x => `.${x}`) + .join(''); + + const getMenuOptions = () => { + const allOptions = { + equip: { + name: 'DAGGERHEART.Sheets.PC.ContextMenu.Equip', + icon: '', + callback: () => this.constructor.toggleEquipItem.bind(this)(event, target) + }, + unequip: { + name: 'DAGGERHEART.Sheets.PC.ContextMenu.Unequip', + icon: '', + callback: this.constructor.toggleEquipItem.bind(this) + }, + edit: { + name: 'DAGGERHEART.Sheets.PC.ContextMenu.Edit', + icon: '', + callback: this.constructor.viewObject.bind(this) + }, + delete: { + name: 'DAGGERHEART.Sheets.PC.ContextMenu.Delete', + icon: '', + callback: this.constructor.deleteItem.bind(this) + }, + sendToLoadout: { + name: 'DAGGERHEART.Sheets.PC.ContextMenu.ToLoadout', + icon: '', + callback: () => {} + }, + sendToVault: { + name: 'DAGGERHEART.Sheets.PC.ContextMenu.ToVault', + icon: '', + callback: () => {} + }, + consumeItem: { + name: 'DAGGERHEART.Sheets.PC.ContextMenu.Consume', + icon: '', + callback: this.constructor.useItem.bind(this) + }, + sendToChat: { + name: 'DAGGERHEART.Sheets.PC.ContextMenu.SendToChat', + icon: '', + callback: () => {} + } + }; + + let menuItems = []; + switch (target.dataset.type) { + case 'weapon': + case 'armor': + menuItems = [allOptions.equip, allOptions.unequip]; + break; + case 'domainCard': + menuItems = [allOptions.sendToLoadout, allOptions.sendToVault]; + break; + case 'consumable': + menuItems = [allOptions.consumeItem]; + } + menuItems.push(...[allOptions.edit, allOptions.sendToChat, allOptions.delete]); + + return menuItems; + }; + + this._createContextMenu(getMenuOptions, selector, { fixed: true, parentClassHooks: false }).render( + this.element.querySelector(selector) + ); + } + _attachPartListeners(partId, htmlElement, options) { super._attachPartListeners(partId, htmlElement, options); diff --git a/module/helpers/handlebarsHelper.mjs b/module/helpers/handlebarsHelper.mjs index 6200b690..d105da1c 100644 --- a/module/helpers/handlebarsHelper.mjs +++ b/module/helpers/handlebarsHelper.mjs @@ -11,6 +11,8 @@ export default class RegisterHandlebarsHelpers { includes: this.includes, debug: this.debug, signedNumber: this.signedNumber, + cleanClass: this.cleanClass, + tertiary: this.tertiary, length: this.length, switch: this.switch, case: this.case, @@ -137,4 +139,12 @@ export default class RegisterHandlebarsHelpers { console.log(a); return a; } + + static cleanClass(className) { + return className.replaceAll('.', '-'); + } + + static tertiary(condition, a, b) { + return condition ? a : b; + } } diff --git a/templates/sheets/global/partials/domain-card-item.hbs b/templates/sheets/global/partials/domain-card-item.hbs index 9198c8af..dac1ee17 100644 --- a/templates/sheets/global/partials/domain-card-item.hbs +++ b/templates/sheets/global/partials/domain-card-item.hbs @@ -25,7 +25,7 @@ {{/if}} - +
{{item.name}}
diff --git a/templates/sheets/global/partials/inventory-item.hbs b/templates/sheets/global/partials/inventory-item.hbs index 093c804f..3f057de1 100644 --- a/templates/sheets/global/partials/inventory-item.hbs +++ b/templates/sheets/global/partials/inventory-item.hbs @@ -125,6 +125,6 @@ {{/if}} - + \ No newline at end of file