diff --git a/module/dotdungeon.mjs b/module/dotdungeon.mjs index 3dd1e64..16eb6dd 100644 --- a/module/dotdungeon.mjs +++ b/module/dotdungeon.mjs @@ -15,6 +15,7 @@ import { ItemProxy } from "./documents/Item/_proxy.mjs"; // Item Sheets import { UntypedItemSheet } from "./sheets/Items/UntypedItemSheet.mjs"; +import { WeaponSheet } from "./sheets/Items/WeaponSheet.mjs"; import { AspectSheet } from "./sheets/Items/AspectSheet.mjs"; import { SpellSheet } from "./sheets/Items/SpellSheet.mjs"; import { PetSheet } from "./sheets/Items/PetSheet.mjs"; @@ -95,6 +96,11 @@ Hooks.once(`init`, async () => { types: ["aspect"], label: "dotdungeon.sheet-names.AspectSheet" }); + Items.registerSheet("dotdungeon", WeaponSheet, { + makeDefault: true, + types: ["weapon"], + label: "dotdungeon.sheet-names.WeaponSheet" + }); Items.registerSheet("dotdungeon", SpellSheet, { makeDefault: true, types: ["spell"], diff --git a/module/handlebars.mjs b/module/handlebars.mjs index cdaa1b7..76e3f44 100644 --- a/module/handlebars.mjs +++ b/module/handlebars.mjs @@ -32,11 +32,15 @@ export const partials = [ `actors/char-sheet/v2/partials/inventory/items/weapon.v2.pc.hbs`, `actors/char-sheet/v2/partials/inventory/items/pet.v2.pc.hbs`, - // The v2 Untyped sheet partials + // The partials used for Untyped v2 and other item sheets that don't have a + // unique design for the other tabs `items/untyped/v2/tabs/general.v2.untyped.hbs`, `items/untyped/v2/tabs/details.v2.untyped.hbs`, `items/untyped/v2/tabs/effects.v2.untyped.hbs`, `items/untyped/v2/tabs/settings.v2.untyped.hbs`, + + // The weapon sheet partials + `items/weapon/v1/tabs/details.v1.weapon.hbs`, ]; export const preAliasedPartials = { diff --git a/module/sheets/Items/WeaponSheet.mjs b/module/sheets/Items/WeaponSheet.mjs new file mode 100644 index 0000000..2db0f23 --- /dev/null +++ b/module/sheets/Items/WeaponSheet.mjs @@ -0,0 +1,116 @@ +import { GenericContextMenu } from "../../utils/GenericContextMenu.mjs"; +import { DialogManager } from "../../utils/DialogManager.mjs"; +import { GenericItemSheet } from "./GenericItemSheet.mjs"; +import { localizer } from "../../utils/localizer.mjs"; + +export class WeaponSheet extends GenericItemSheet { + static get defaultOptions() { + let opts = foundry.utils.mergeObject( + super.defaultOptions, + { + template: `systems/dotdungeon/templates/items/weapon/v1/index.hbs`, + width: 300, + height: 340, + tabs: [ + { + group: `page`, + navSelector: `nav.page`, + contentSelector: `.page-content`, + initial: `general`, + }, + ], + } + ); + opts.classes.push(`dotdungeon`, `style-v3`); + return opts; + }; + + activateListeners(html) { + super.activateListeners(html); + + new GenericContextMenu(html, `.photo.panel`, [ + { + name: localizer(`dotdungeon.common.view-larger`), + callback: () => { + (new ImagePopout(this.item.img)).render(true); + }, + }, + { + name: localizer(`dotdungeon.common.edit`), + condition: () => this.isEditable, + callback: () => { + const fp = new FilePicker({ + callback: (path) => { + this.item.update({"img": path}); + }, + }); + fp.render(true); + }, + }, + { + name: localizer(`dotdungeon.common.reset`), + condition: () => this.isEditable, + callback: () => { + console.log(`.dungeon | Reset Item Image`) + }, + } + ]); + + if (!this.isEditable) return; + console.debug(`.dungeon | Adding event listeners for Weapon Item: ${this.item.id}`); + + html.find(`.create-ae`).on(`click`, async () => { + await this.item.createEmbeddedDocuments( + `ActiveEffect`, + [{name: localizer(`dotdungeon.default.name`, { document: `ActiveEffect`, type: `base` })}], + { renderSheet: true } + ); + }); + + new GenericContextMenu(html, `.effect.panel`, [ + { + name: localizer(`dotdungeon.common.edit`), + callback: async (html) => { + (await fromUuid(html.closest(`.effect`)[0].dataset.embeddedId))?.sheet.render(true); + }, + }, + { + name: localizer(`dotdungeon.common.delete`), + callback: async (html) => { + const target = html.closest(`.effect`)[0]; + const data = target.dataset; + const id = data.embeddedId; + const doc = await fromUuid(id); + DialogManager.createOrFocus( + `${doc.uuid}-delete`, + { + title: localizer(`dotdungeon.delete.ActiveEffect.title`, doc), + content: localizer(`dotdungeon.delete.ActiveEffect.content`, doc), + buttons: { + yes: { + label: localizer(`Yes`), + callback() { + doc.delete(); + }, + }, + no: { + label: localizer(`No`), + } + } + } + ); + }, + } + ]); + }; + + async getData() { + const ctx = await super.getData(); + + ctx.meta.showSettingsTab = ctx.isGM || this.item.isOwned; + ctx.meta.isEmbedded = this.item.isOwned; + ctx.meta.isEditable = this.isEditable; + + return ctx; + }; +}; diff --git a/styles/v3/elements/panel.scss b/styles/v3/elements/panel.scss index de7cf9f..5780e47 100644 --- a/styles/v3/elements/panel.scss +++ b/styles/v3/elements/panel.scss @@ -6,16 +6,24 @@ border-radius: 4px; padding: var(--gap); + &.space-between { + justify-content: space-between; + } + &--row { @extend .panel; display: flex; flex-direction: row; gap: var(--gap); align-items: center; + } - &.space-between { - justify-content: space-between; - } + &--column { + @extend .panel; + display: flex; + flex-direction: column; + gap: var(--gap); + justify-content: center; } } } diff --git a/styles/v3/index.scss b/styles/v3/index.scss index 4c321c5..b71c20b 100644 --- a/styles/v3/index.scss +++ b/styles/v3/index.scss @@ -21,6 +21,7 @@ @use "./layouts/datasheet.scss"; @use "./layouts/items/common.scss"; @use "./layouts/items/untyped/v2.scss"; +@use "./layouts/items/weapon/v1.scss"; /* Sheet Options */ .dotdungeon.style-v3 { diff --git a/styles/v3/layouts/items/weapon/v1.scss b/styles/v3/layouts/items/weapon/v1.scss new file mode 100644 index 0000000..82f8aaa --- /dev/null +++ b/styles/v3/layouts/items/weapon/v1.scss @@ -0,0 +1,13 @@ +@use "../../../mixins/material"; +@use "../../../mixins/utils"; + +.dotdungeon.style-v3 .item--weapon-v1 { + @include utils.tab("details") { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + + .full-width { + grid-column: 1 / -1; + } + } +} diff --git a/templates/items/weapon/v1/index.hbs b/templates/items/weapon/v1/index.hbs new file mode 100644 index 0000000..5863564 --- /dev/null +++ b/templates/items/weapon/v1/index.hbs @@ -0,0 +1,21 @@ +
+
+ {{> dotdungeon.untyped.v2.general }} + {{> dotdungeon.weapon.v1.details }} + {{#if meta.showSettingsTab}} + {{> dotdungeon.untyped.v2.settings }} + {{/if}} + {{> dotdungeon.untyped.v2.effects }} +
+ + +
diff --git a/templates/items/weapon/v1/tabs/details.v1.weapon.hbs b/templates/items/weapon/v1/tabs/details.v1.weapon.hbs new file mode 100644 index 0000000..c60b42d --- /dev/null +++ b/templates/items/weapon/v1/tabs/details.v1.weapon.hbs @@ -0,0 +1,83 @@ +
+
+ {{#if meta.isEditable}} + + + {{else}} + Purchase Cost + {{dd-empty-state system.buy}} + {{/if}} +
+
+ {{#if meta.isEditable}} + + + {{else}} + Usage Cost + {{dd-empty-state system.usage_cost}} + {{/if}} +
+
+ Rarity + {{#if meta.isEditable}} + + {{else}} + {{dd-i18n (concat "dotdungeon.rarity." system.tier)}} + {{/if}} +
+ {{#if meta.isEmbedded}} +
+ Item Location + {{#if meta.isEditable}} + + {{else}} + {{dd-i18n (concat "dotdungeon.location." system.location)}} + {{/if}} +
+
+ {{#if meta.isEditable}} + + + {{else}} + Quantity + {{system.quantity}} + {{/if}} +
+ {{/if}} +