diff --git a/module/applications/sheets/actors/character.mjs b/module/applications/sheets/actors/character.mjs index 9ba52000..c9a6047b 100644 --- a/module/applications/sheets/actors/character.mjs +++ b/module/applications/sheets/actors/character.mjs @@ -34,7 +34,8 @@ export default class CharacterSheet extends DHBaseActorSheet { advanceResourceDie: CharacterSheet.#advanceResourceDie, cancelBeastform: CharacterSheet.#cancelBeastform, useDowntime: this.useDowntime, - viewParty: CharacterSheet.#viewParty + viewParty: CharacterSheet.#viewParty, + toggleArmorMangement: CharacterSheet.#toggleArmorManagement }, window: { resizable: true, @@ -945,6 +946,77 @@ export default class CharacterSheet extends DHBaseActorSheet { }); } + static async #toggleArmorManagement(_event, target) { + const existingTooltip = document.body.querySelector('.locked-tooltip .armor-management-container'); + if (existingTooltip) { + game.tooltip.dismissLockedTooltips(); + return; + } + + const armorSources = []; + for (var effect of Array.from(this.document.allApplicableEffects())) { + const origin = effect.origin ? await foundry.utils.fromUuid(effect.origin) : effect.parent; + if (effect.type !== 'armor' || effect.disabled || effect.isSuppressed) continue; + armorSources.push({ + uuid: effect.uuid, + name: origin.name, + ...effect.system.armorData + }); + } + + if (armorSources.length <= 1) return; + + const html = document.createElement('div'); + html.innerHTML = await foundry.applications.handlebars.renderTemplate( + `systems/daggerheart/templates/ui/tooltip/armorManagement.hbs`, + { + sources: armorSources + } + ); + + game.tooltip.dismissLockedTooltips(); + game.tooltip.activate(target, { + html, + locked: true, + cssClass: 'bordered-tooltip', + direction: 'DOWN' + }); + + html.querySelectorAll('.armor-marks-input').forEach(element => { + element.addEventListener('blur', CharacterSheet.armorSourceUpdate); + element.addEventListener('input', CharacterSheet.armorSourceInput); + }); + } + + static async armorSourceInput(event) { + const effect = await foundry.utils.fromUuid(event.target.dataset.uuid); + const value = Math.max(Math.min(Number.parseInt(event.target.value), effect.system.armorData.max), 0); + event.target.value = value; + const progressBar = event.target.closest('.status-bar.armor-slots').querySelector('progress'); + progressBar.value = value; + } + + /** Update specific armor source */ + static async armorSourceUpdate(event) { + const effect = await foundry.utils.fromUuid(event.target.dataset.uuid); + if (effect.system.changes.length !== 1) return; + const armorEffect = effect.system.changes[0]; + const value = Math.max(Math.min(Number.parseInt(event.target.value), effect.system.armorData.max), 0); + + const newChanges = [ + { + ...armorEffect, + value + } + ]; + + event.target.value = value; + const progressBar = event.target.closest('.status-bar.armor-slots').querySelector('progress'); + progressBar.value = value; + + await effect.update({ 'system.changes': newChanges }); + } + /** * Open the downtime application. * @type {ApplicationClickAction} diff --git a/styles/less/sheets/actors/character/sidebar.less b/styles/less/sheets/actors/character/sidebar.less index 04baf2b9..42e40386 100644 --- a/styles/less/sheets/actors/character/sidebar.less +++ b/styles/less/sheets/actors/character/sidebar.less @@ -298,6 +298,10 @@ border-radius: 3px; background: light-dark(@dark-blue, @golden); clip-path: none; + cursor: pointer; + display: flex; + align-items: center; + gap: 4px; h4 { font-weight: bold; @@ -306,6 +310,11 @@ color: light-dark(@beige, @dark-blue); font-size: var(--font-size-12); } + + i { + font-size: 12px; + color: light-dark(@beige, @dark-blue); + } } .slot-value { position: absolute; diff --git a/styles/less/ux/index.less b/styles/less/ux/index.less index 0bd1b71e..abdb9bc6 100644 --- a/styles/less/ux/index.less +++ b/styles/less/ux/index.less @@ -1,4 +1,5 @@ @import './tooltip/tooltip.less'; +@import './tooltip/armorManagement.less'; @import './tooltip/battlepoints.less'; @import './tooltip/bordered-tooltip.less'; @import './tooltip/domain-cards.less'; diff --git a/templates/sheets/actors/character/sidebar.hbs b/templates/sheets/actors/character/sidebar.hbs index 523c3974..10017343 100644 --- a/templates/sheets/actors/character/sidebar.hbs +++ b/templates/sheets/actors/character/sidebar.hbs @@ -61,8 +61,9 @@ value='{{document.system.armorScore.value}}' max='{{document.system.armorScore.max}}' > -