the return of the paperdoll

pull/67/head 0.6.1
macniel 2025-11-16 23:32:44 +01:00
parent f5b4633f76
commit 3f8794e181
6 changed files with 136 additions and 62 deletions

View File

@ -1,5 +1,3 @@
import {PlayerCharacterDataModel} from "../../data/character.mjs";
export default {
_prepareContext: (context, actor, thisObject) => {
@ -52,9 +50,11 @@ export default {
for (let setIndex = 0; setIndex < maxSets; setIndex++) {
context.sets.push({
tab: "set" + (setIndex + 1),
tab: "pane" + (setIndex + 1),
label: romanNumerals[setIndex],
index: setIndex,
actorId: actorData.id,
setEquipped: actorData.system.setEquipped === setIndex,
slots: [
{
target: "links",
@ -131,6 +131,8 @@ export default {
]
})
}
context.selectedTab = thisObject.selectedTab ?? context.sets[0].tab
context.setEquipped = actorData.system.setEquipped
return context
},
@ -150,9 +152,51 @@ export default {
}
}).bind(thisObject.element);
const tabs = new foundry.applications.ux.Tabs({
navSelector: ".set .tabs.sets",
contentSelector: ".set .tab",
initial: thisObject.actor.system.setEquipped ? "pane" + (thisObject.actor.system.setEquipped + 1) : "pane1",
group: "set-tabs",
callback: (event, tab, tabName) => {
console.log(event, tab, tabName)
thisObject.selectedTab = tabName
thisObject.element.querySelectorAll(tab._contentSelector).forEach(
(tab) => {
if (tab.dataset["tab"] === tabName) {
tab.classList.add("active")
} else {
tab.classList.remove("active")
}
}
)
}
})
tabs.bind(thisObject.element)
new ContextMenu(
thisObject.element,
".equipment",
".paperdoll .equipped",
[
{
name: "Abrüsten",
icon: '<i class="fa-solid fa-suitcase"></i>',
callback: (targetElement) => {
const {setId, target} = targetElement.dataset
const updateObject = thisObject.document.getEquipmentSetUpdateObject()
delete updateObject[`system.heldenausruestung.${setId}.${target}`]
thisObject.document.update(updateObject)
},
condition: (target) => {
const {itemId} = target.dataset
return thisObject.document.isWorn(itemId)
}
},
], {jQuery: false})
new ContextMenu(
thisObject.element,
".inventory-table .equipment",
[
{
name: "Abrüsten",

View File

@ -70,6 +70,7 @@ class CharacterSheet extends HandlebarsApplicationMixin(ActorSheetV2) {
openStandaloneLiturgies: CharacterSheet.#openStandaloneLiturgies,
openStandaloneHealth: CharacterSheet.#openStandaloneHealth,
setWounds: CharacterSheet.#setWounds,
switchSet: CharacterSheet.#switchSet
}
}
@ -115,15 +116,6 @@ class CharacterSheet extends HandlebarsApplicationMixin(ActorSheetV2) {
effects: {
template: Effects.template
},
set1: {
template: "systems/DSA_4-1/templates/actor/character/tab-set.hbs"
},
set2: {
template: "systems/DSA_4-1/templates/actor/character/tab-set.hbs"
},
set3: {
template: "systems/DSA_4-1/templates/actor/character/tab-set.hbs"
},
}
@ -329,6 +321,12 @@ class CharacterSheet extends HandlebarsApplicationMixin(ActorSheetV2) {
this.render(true)
}
static async #switchSet(event, target) {
const {id} = target.dataset
this.document.update({"system.setEquipped": id})
this.render(true)
}
_configureRenderOptions(options) {
super._configureRenderOptions(options)
@ -719,11 +717,24 @@ class CharacterSheet extends HandlebarsApplicationMixin(ActorSheetV2) {
return true
}
async _onDrop(event) {
const data = TextEditor.implementation.getDragEventData(event)
const targetDocument = this.actor.itemTypes["Equipment"].find(p => p._id === event.target.dataset['itemId'])
if (event.target.dataset["target"] && event.target.dataset["setId"]) {
const documentClass = foundry.utils.getDocumentClass(data.type)
if (documentClass) {
const document = await documentClass.fromDropData(data)
const {setId, target} = event.target.dataset
const updateObject = this.actor.getEquipmentSetUpdateObject()
updateObject[`system.heldenausruestung.${setId}.${target}`] = document.id
await this.actor.update(updateObject)
}
return
}
// Dropped Documents
const documentClass = foundry.utils.getDocumentClass(data.type)
if (documentClass) {

View File

@ -1,35 +1,4 @@
.dsa41.sheet.actor.character .window-content {
.sheet-tabs.paperdoll-tabs.tabs {
position: absolute;
top: 30px;
left: 0;
right: 0;
height: 26px;
.item.active[data-tab] {
padding-left: 12px;
padding-right: 12px;
padding-top: 8px;
padding-bottom: 3px;
}
}
.sheet-body.paperdoll-sets {
left: 0;
top: 55px;
bottom: 0;
right: 0;
overflow: hidden;
div.tab {
overflow: hidden;
}
}
.paperdoll {
.paperdoll {
grid-area: equipment;
position: relative;
@ -110,5 +79,3 @@
}
}
}

View File

@ -73,6 +73,57 @@
}
}
nav.tabs:not(.sheet-tabs) {
border: unset;
border-bottom: 1px solid black;
gap: 0;
height: 24px;
a.item {
flex: 1;
position: relative;
height: 24px;
line-height: 24px;
span {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
line-height: 24px;
vertical-align: middle;
text-align: center;
}
}
a.item:not(.active) {
border: unset;
}
a.item.active {
border: 1px solid black;
border-bottom: none;
span {
left: -2px;
top: -2px;
height: 28px;
&:after {
content: '';
position: absolute;
left: 2px;
right: 0;
bottom: 3px;
height: 2px;
background: assets.$tab-background;
}
}
}
}
}
// darkmode

View File

@ -29,18 +29,20 @@
<h3 class="equipment-header">Ausrüstung</h3>
<div class="set">
<nav class="tabs" data-group="setTabs">
<nav class="tabs sets" data-group="set-tabs">
{{#each sets}}
<a class="item" data-tab="{{tab}}">{{label}}</a>
<a class="item" data-tab="{{this.tab}}" data-group="set-tabs"><span>{{this.label}}</span></a>
{{/each}}
</nav>
<section class="tab-content">
<section class="panes sets">
{{#each sets}}
<div class="tab {{this.tab}} {{#if (eq ../selectedTab this.tab)}}active{{/if}}" data-tab="{{this.tab}}"
data-group="set-tabs">
{{> "systems/DSA_4-1/templates/actor/character/tab-set.hbs" this}}
</div>
{{/each}}
</section>
</div>
</div>
</section>

View File

@ -1,25 +1,24 @@
<div class="paperdoll">
<!--<svg
<svg
width="280"
height="530"
viewBox="0 0 70 140"
xmlns="http://www.w3.org/2000/svg">
<path class="paperdoll-image"
d="m 22.868053,0.6591628 0.658626,-0.52687462 6.270125,4.42573652 3.97809,0.5795595 0.605938,-4.58379633 11.828915,2.02846193 0.07905,2.3182421 3.556578,-0.9220267 6.691636,3.7671414 2.292014,3.7671454 -4.030787,0.05268 0.89573,3.951549 -1.106491,2.23921 -3.345818,-0.632247 0.869387,4.241332 v 2.476303 l 1.422627,-0.02634 0.500563,1.343527 h 3.29312 l 1.975878,3.424677 0.05267,2.818774 2.371046,6.243447 6.665292,14.72611 1.949534,0.658592 0.34249,4.794545 -0.289802,1.606966 0.922074,1.765023 -0.395167,2.897805 2.002222,6.743979 1.027449,1.949433 -0.737657,5.031644 -3.925413,4.399394 -0.922074,-0.553222 0.579595,-1.844054 -1.896847,1.264499 -0.526897,-0.790314 1.475315,-1.369869 -1.36994,-5.690236 -0.974762,4.083275 -1.053803,-0.342473 -0.790345,-3.108552 0.579584,-2.370933 0.526907,-0.658592 -0.263459,-0.500527 0.289803,-1.554277 0.948418,-2.739737 -0.447865,-2.212876 -1.106492,-0.974715 -1.554356,-1.501588 -2.423744,-4.030581 0.711314,-1.264496 -3.793683,-5.532171 -0.02638,-1.554275 -1.475326,-1.554276 -1.185522,-3.213929 -0.869387,-0.763967 -3.029682,4.820892 -1.159179,0.447843 0.447865,0.974716 -0.790345,0.974716 -0.21076,2.002118 0.368823,1.343527 -0.289792,1.923087 1.71243,2.397274 0.02638,1.791371 1.23821,1.975774 2.950651,13.013779 -0.421522,0.684934 2.713536,14.278264 7.113157,18.150786 1.132835,0.0791 3.767339,9.19394 -2.344701,0.73762 1.92318,7.42891 -1.738774,3.87253 1.001116,3.79348 2.687192,4.10961 -0.68497,2.44996 -10.643392,0.079 -0.684969,-8.42997 1.106491,-1.42257 -1.659742,-1.47524 0.07905,-2.00211 -1.949535,-2.18653 -0.55325,-3.84617 -1.422628,0.15805 -0.500553,-7.71869 1.02745,-1.05374 -2.133941,-4.21499 0.421521,-2.42362 -4.32059,-6.322483 -1.317252,-4.056921 -9.247098,-17.702946 -0.395178,0.210749 -3.609266,18.783038 -1.975878,3.635422 -0.289802,10.721871 0.764011,-0.0264 2.397389,7.71869 -4.663069,0.97472 -0.737658,6.74398 -2.212983,1.92309 1.422638,6.74397 -1.896847,3.10855 -4.504997,0.34248 -0.105385,-0.86934 -3.714641,1.2118 -8.140618,0.21075 -0.131729,-2.00212 8.483107,-5.47948 0.711314,-1.89674 -0.316146,-2.18653 0.869386,-0.71128 -1.027449,-1.36986 1.659732,-6.55958 -2.502775,-0.76396 1.317252,-3.42469 -0.289792,-1.2645 2.397389,-3.05585 2.107608,-12.592278 -0.948419,-7.349881 0.316136,-13.90946 -1.554356,-1.159119 4.504996,-21.153968 0.316147,-4.557454 0.948418,-3.345646 -2.160295,2.924147 -4.847487,4.135956 1.264565,1.080091 -3.42485,2.397275 -3.29313,2.766082 -0.68497,1.923087 -1.791461,-0.57956 -1.001116,1.633307 0.07905,4.87358 L 9.168636,68.889233 4.2948053,70.180074 1.5812697,67.466679 0.13228831,66.070468 2.9775532,60.801731 6.5868297,58.825953 6.692205,57.245334 8.0884885,56.059869 v -1.923064 l 2.9769935,-7.824067 2.897953,0.553216 7.323918,-8.166536 v -0.500531 l 3.872714,-4.689172 -0.263448,-2.028463 2.766234,-5.1897 5.163622,-1.448903 0.158063,-1.844055 -0.922074,-2.291899 0.948428,-5.95367 -0.658626,-4.294017 -4.926518,-3.9515498 z"/>
</svg>-->
</svg>
{{#each this.slots}}
<div class="equipped {{this.target}}" data-set-id="{{../index}}"
data-target="{{this.target}}" data-actor="{{../../actor.id}}"><img
<div class="equipped {{this.target}}" data-item-id="{{this.id}}" data-set-id="{{../index}}"
data-target="{{this.target}}" data-actor="{{this.actorId}}"><img
src="{{this.icon}}"/></div>
{{/each}}
{{!--
{{#if (eq ../actor.system.setEquipped @index)}}
{{#if setEquipped}}
<button disabled="disabled">Ausgerüstet</button>
{{else}}
<button data-action="switchSet" data-id="{{@index}}">Wechseln</button>
{{/if}}
--}}
</div>