diff --git a/lang/en.json b/lang/en.json index cacf7d3a..db3f2564 100755 --- a/lang/en.json +++ b/lang/en.json @@ -2426,7 +2426,13 @@ "resetConfirmationText": "Are you sure you want to reset the {settings}?" }, "Scene": { - "rangeMeasurementOverride": "Override Global Range Measurement Settings" + "FIELDS": { + "rangeMeasurement": { + "setting": { "label": "Setting" } + } + }, + "disabledText": "Daggerheart Measurements are disabled in System Settings - Variant Rules", + "rangeMeasurement": "Range Measurement" } }, "UI": { diff --git a/module/applications/scene/sceneConfigSettings.mjs b/module/applications/scene/sceneConfigSettings.mjs index 40f66ae2..be8f7b71 100644 --- a/module/applications/scene/sceneConfigSettings.mjs +++ b/module/applications/scene/sceneConfigSettings.mjs @@ -1,11 +1,17 @@ export default class DhSceneConfigSettings extends foundry.applications.sheets.SceneConfig { - constructor(options, ...args) { - super(options, ...args); - } + // static DEFAULT_OPTIONS = { + // ...super.DEFAULT_OPTIONS, + // form: { + // handler: this.updateData, + // closeOnSubmit: true + // } + // }; static buildParts() { - const { footer, ...parts } = super.PARTS; + const { footer, tabs, ...parts } = super.PARTS; const tmpParts = { + // tabs, + tabs: { template: 'systems/daggerheart/templates/scene/tabs.hbs' }, ...parts, dh: { template: 'systems/daggerheart/templates/scene/dh-config.hbs' }, footer @@ -16,9 +22,42 @@ export default class DhSceneConfigSettings extends foundry.applications.sheets.S static PARTS = DhSceneConfigSettings.buildParts(); static buildTabs() { - super.TABS.sheet.tabs.push({ id: 'dh', icon: 'fa-solid' }); + super.TABS.sheet.tabs.push({ id: 'dh', src: 'systems/daggerheart/assets/logos/FoundryBorneLogoWhite.svg' }); return super.TABS; } static TABS = DhSceneConfigSettings.buildTabs(); + + _attachPartListeners(partId, htmlElement, options) { + super._attachPartListeners(partId, htmlElement, options); + switch (partId) { + case 'dh': + htmlElement.querySelector('#rangeMeasurementSetting')?.addEventListener('change', async event => { + const flagData = foundry.utils.mergeObject(this.document.flags.daggerheart, { + rangeMeasurement: { setting: event.target.value } + }); + this.document.flags.daggerheart = flagData; + this.render(); + }); + break; + } + } + + /** @inheritDoc */ + async _preparePartContext(partId, context, options) { + context = await super._preparePartContext(partId, context, options); + switch (partId) { + case 'dh': + context.data = new game.system.api.data.scenes.DHScene(canvas.scene.flags.daggerheart); + context.variantRules = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.variantRules); + break; + } + + return context; + } + + // static async updateData(event, _, formData) { + // const data = foundry.utils.expandObject(formData.object); + // this.close(data); + // } } diff --git a/module/canvas/placeables/measuredTemplate.mjs b/module/canvas/placeables/measuredTemplate.mjs index f3691bb8..fa91fa9f 100644 --- a/module/canvas/placeables/measuredTemplate.mjs +++ b/module/canvas/placeables/measuredTemplate.mjs @@ -18,30 +18,37 @@ export default class DhMeasuredTemplate extends foundry.canvas.placeables.Measur static getRangeLabels(distanceValue, settings) { let result = { distance: distanceValue, units: '' }; - const rangeMeasurementOverride = canvas.scene.flags.daggerheart?.rangeMeasurementOverride; + const sceneRangeMeasurement = canvas.scene.flags.daggerheart?.rangeMeasurement; - if (rangeMeasurementOverride === true) { + const { disable, custom } = CONFIG.DH.GENERAL.sceneRangeMeasurementSetting; + if (sceneRangeMeasurement.setting === disable.id) { result.distance = distanceValue; result.units = canvas.scene?.grid?.units; return result; } - if (distanceValue <= settings.melee) { + + const melee = sceneRangeMeasurement.setting === custom.id ? sceneRangeMeasurement.melee : settings.melee; + const veryClose = + sceneRangeMeasurement.setting === custom.id ? sceneRangeMeasurement.veryClose : settings.veryClose; + const close = sceneRangeMeasurement.setting === custom.id ? sceneRangeMeasurement.close : settings.close; + const far = sceneRangeMeasurement.setting === custom.id ? sceneRangeMeasurement.far : settings.far; + if (distanceValue <= melee) { result.distance = game.i18n.localize('DAGGERHEART.CONFIG.Range.melee.name'); return result; } - if (distanceValue <= settings.veryClose) { + if (distanceValue <= veryClose) { result.distance = game.i18n.localize('DAGGERHEART.CONFIG.Range.veryClose.name'); return result; } - if (distanceValue <= settings.close) { + if (distanceValue <= close) { result.distance = game.i18n.localize('DAGGERHEART.CONFIG.Range.close.name'); return result; } - if (distanceValue <= settings.far) { + if (distanceValue <= far) { result.distance = game.i18n.localize('DAGGERHEART.CONFIG.Range.far.name'); return result; } - if (distanceValue > settings.far) { + if (distanceValue > far) { result.distance = game.i18n.localize('DAGGERHEART.CONFIG.Range.veryFar.name'); } diff --git a/module/config/generalConfig.mjs b/module/config/generalConfig.mjs index 1f09b748..ef0f24cb 100644 --- a/module/config/generalConfig.mjs +++ b/module/config/generalConfig.mjs @@ -685,3 +685,18 @@ export const countdownAppMode = { textIcon: 'text-icon', iconOnly: 'icon-only' }; + +export const sceneRangeMeasurementSetting = { + disable: { + id: 'disable', + label: 'Disable Daggerheart Range Measurement' + }, + default: { + id: 'default', + label: 'Default' + }, + custom: { + id: 'custom', + label: 'Custom' + } +}; diff --git a/module/data/_module.mjs b/module/data/_module.mjs index cac02a4a..2188b7bb 100644 --- a/module/data/_module.mjs +++ b/module/data/_module.mjs @@ -7,3 +7,4 @@ export * as actors from './actor/_module.mjs'; export * as chatMessages from './chat-message/_modules.mjs'; export * as fields from './fields/_module.mjs'; export * as items from './item/_module.mjs'; +export * as scenes from './scene/_module.mjs'; diff --git a/module/data/scene/_module.mjs b/module/data/scene/_module.mjs new file mode 100644 index 00000000..9994901b --- /dev/null +++ b/module/data/scene/_module.mjs @@ -0,0 +1 @@ +export { default as DHScene } from './scene.mjs'; diff --git a/module/data/scene/scene.mjs b/module/data/scene/scene.mjs new file mode 100644 index 00000000..7cf74ade --- /dev/null +++ b/module/data/scene/scene.mjs @@ -0,0 +1,19 @@ +export default class DHScene extends foundry.abstract.DataModel { + static defineSchema() { + const fields = foundry.data.fields; + + return { + rangeMeasurement: new fields.SchemaField({ + setting: new fields.StringField({ + choices: CONFIG.DH.GENERAL.sceneRangeMeasurementSetting, + initial: CONFIG.DH.GENERAL.sceneRangeMeasurementSetting.default.id, + label: 'DAGGERHEART.SETTINGS.Scene.FIELDS.rangeMeasurement.setting.label' + }), + melee: new fields.NumberField({ integer: true, label: 'DAGGERHEART.CONFIG.Range.melee.name' }), + veryClose: new fields.NumberField({ integer: true, label: 'DAGGERHEART.CONFIG.Range.veryClose.name' }), + close: new fields.NumberField({ integer: true, label: 'DAGGERHEART.CONFIG.Range.close.name' }), + far: new fields.NumberField({ integer: true, label: 'DAGGERHEART.CONFIG.Range.far.name' }) + }) + }; + } +} diff --git a/module/systemRegistration/handlebars.mjs b/module/systemRegistration/handlebars.mjs index 7bc9a8ff..b26e5fef 100644 --- a/module/systemRegistration/handlebars.mjs +++ b/module/systemRegistration/handlebars.mjs @@ -1,11 +1,13 @@ export const preloadHandlebarsTemplates = async function () { foundry.applications.handlebars.loadTemplates({ - 'daggerheart.inventory-item-compact': 'systems/daggerheart/templates/sheets/global/partials/inventory-item-compact.hbs', + 'daggerheart.inventory-item-compact': + 'systems/daggerheart/templates/sheets/global/partials/inventory-item-compact.hbs', 'daggerheart.inventory-items': 'systems/daggerheart/templates/sheets/global/partials/inventory-fieldset-items-V2.hbs', 'daggerheart.inventory-item': 'systems/daggerheart/templates/sheets/global/partials/inventory-item-V2.hbs' }); return foundry.applications.handlebars.loadTemplates([ + 'templates/generic/tab-navigation.hbs', 'systems/daggerheart/templates/sheets/global/tabs/tab-navigation.hbs', 'systems/daggerheart/templates/sheets/global/partials/action-item.hbs', 'systems/daggerheart/templates/sheets/global/partials/domain-card-item.hbs', diff --git a/styles/less/ui/index.less b/styles/less/ui/index.less index 296ef325..4b1c0c4c 100644 --- a/styles/less/ui/index.less +++ b/styles/less/ui/index.less @@ -28,3 +28,5 @@ @import './sidebar/tabs.less'; @import './sidebar/daggerheartMenu.less'; + +@import './scene-config/scene-config.less'; diff --git a/styles/less/ui/scene-config/scene-config.less b/styles/less/ui/scene-config/scene-config.less new file mode 100644 index 00000000..fb36dd33 --- /dev/null +++ b/styles/less/ui/scene-config/scene-config.less @@ -0,0 +1,40 @@ +.theme-light .application.sheet.scene-config { + .sheet-tabs.tabs a[data-tab='dh'] { + &.active img, + &:hover img { + filter: @grey-filter drop-shadow(0 0 4px var(--color-shadow-primary)); + } + + img { + filter: @grey-filter; + } + } +} + +.application.sheet.scene-config { + .sheet-tabs.tabs { + a[data-tab='dh'] { + display: flex; + align-items: center; + gap: 4px; + + &.active, + &:hover { + img { + filter: @beige-filter drop-shadow(0 0 4px var(--color-shadow-primary)); + } + } + + img { + width: 18px; + position: relative; + top: -3px; + filter: @beige-filter; + } + } + } + + .helper-text { + font-style: italic; + } +} diff --git a/styles/less/utils/colors.less b/styles/less/utils/colors.less index 9ce201a3..489bbb29 100755 --- a/styles/less/utils/colors.less +++ b/styles/less/utils/colors.less @@ -56,6 +56,8 @@ @dark-80: #22222280; @dark-filter: brightness(0) saturate(100%); +@grey-filter: brightness(15%) saturate(20%); + @deep-black: #0e0d15; @beige: #efe6d8; diff --git a/templates/scene/dh-config.hbs b/templates/scene/dh-config.hbs index 0d20c302..1f7dcd81 100644 --- a/templates/scene/dh-config.hbs +++ b/templates/scene/dh-config.hbs @@ -1,9 +1,24 @@
-
-
- - -
-
+
+ {{localize "DAGGERHEART.SETTINGS.Scene.rangeMeasurement"}} + + {{#if variantRules.rangeMeasurement.enabled}} + {{formGroup data.schema.fields.rangeMeasurement.fields.setting value=data._source.rangeMeasurement.setting name="flags.daggerheart.rangeMeasurement.setting" id="rangeMeasurementSetting" localize=true blank=false}} + + {{#if (eq data.rangeMeasurement.setting "custom")}} + {{formGroup data.schema.fields.rangeMeasurement.fields.melee value=data._source.rangeMeasurement.melee name="flags.daggerheart.rangeMeasurement.melee" localize=true}} + {{formGroup data.schema.fields.rangeMeasurement.fields.veryClose value=data._source.rangeMeasurement.veryClose name="flags.daggerheart.rangeMeasurement.veryClose" localize=true}} + {{formGroup data.schema.fields.rangeMeasurement.fields.close value=data._source.rangeMeasurement.close name="flags.daggerheart.rangeMeasurement.close" localize=true}} + {{formGroup data.schema.fields.rangeMeasurement.fields.far value=data._source.rangeMeasurement.far name="flags.daggerheart.rangeMeasurement.far" localize=true}} + {{/if}} + {{#if (eq data.rangeMeasurement.setting "default")}} + {{formGroup variantRules.schema.fields.rangeMeasurement.fields.melee value=variantRules._source.rangeMeasurement.melee localize=true disabled=true}} + {{formGroup variantRules.schema.fields.rangeMeasurement.fields.veryClose value=variantRules._source.rangeMeasurement.veryClose localize=true disabled=true}} + {{formGroup variantRules.schema.fields.rangeMeasurement.fields.close value=variantRules._source.rangeMeasurement.close localize=true disabled=true}} + {{formGroup variantRules.schema.fields.rangeMeasurement.fields.far value=variantRules._source.rangeMeasurement.far localize=true disabled=true}} + {{/if}} + {{else}} + {{localize "DAGGERHEART.SETTINGS.Scene.disabledText"}} + {{/if}} +
\ No newline at end of file diff --git a/templates/scene/tabs.hbs b/templates/scene/tabs.hbs new file mode 100644 index 00000000..f524916e --- /dev/null +++ b/templates/scene/tabs.hbs @@ -0,0 +1,12 @@ +