ENH: Language support

master
U~man 2020-07-11 16:45:17 +02:00
parent 1b11568593
commit d15ae28ab4
11 changed files with 205 additions and 8 deletions

View File

@ -106,6 +106,7 @@
"OSE.Damage": "Damage",
"OSE.Spellcaster": "Spellcaster",
"OSE.Language": "Language",
"OSE.SpokenLanguages": "Spoken Languages",
"OSE.Literacy": "Literacy",
"OSE.Literate": "Literate",
@ -119,6 +120,8 @@
"OSE.category.abilities": "Abilities",
"OSE.category.spells": "Spells",
"OSE.category.notes": "Notes",
"OSE.category.languages": "Languages",
"OSE.category.description": "Description",
"OSE.panel.abilities": "Abilities",
"OSE.panel.equipment": "Equipment",

View File

@ -22,6 +22,14 @@ export class OseActorSheet extends ActorSheet {
return data;
}
_createEditor(target, editorOptions, initialContent) {
// remove some controls to the editor as the space is lacking
if (target == 'data.details.description') {
editorOptions.toolbar = 'styleselect bullist hr table removeFormat save';
}
super._createEditor(target, editorOptions, initialContent);
}
/**
* Organize and classify Owned Items for Character sheets
* @private
@ -190,10 +198,21 @@ export class OseActorSheet extends ActorSheet {
if (resizable.length == 0) {
return;
}
// Resize divs
resizable.each((_, el) => {
let heightDelta = this.position.height - this.options.height;
el.style.height = `${heightDelta + parseInt(el.dataset.baseSize)}px`;
});
// Resize editors
let editors = html.find(".editor");
editors.each((id, editor) => {
let container = editor.closest('.resizable-editor');
if (container) {
let heightDelta = this.position.height - this.options.height;
editor.style.height = `${heightDelta + parseInt(container.dataset.editorSize)}px`;
}
})
// editors.css("height", this.position.height - 340);
}
_onConfigureActor(event) {
@ -218,7 +237,7 @@ export class OseActorSheet extends ActorSheet {
{
label: "Tweaks",
class: "configure-actor",
icon: "fas fa-dice",
icon: "fas fa-code",
onclick: (ev) => this._onConfigureActor(ev),
},
].concat(buttons);

View File

@ -145,6 +145,59 @@ export class OseActorSheetCharacter extends OseActorSheet {
}
}
async _chooseLang() {
let choices = CONFIG.OSE.languages;
let templateData = { choices: choices },
dlg = await renderTemplate(
"/systems/ose/templates/actors/dialogs/lang-create.html",
templateData
);
//Create Dialog window
return new Promise((resolve) => {
new Dialog({
title: "",
content: dlg,
buttons: {
ok: {
label: game.i18n.localize("OSE.Ok"),
icon: '<i class="fas fa-check"></i>',
callback: (html) => {
resolve({
choice: html.find('select[name="choice"]').val()
});
},
},
cancel: {
icon: '<i class="fas fa-times"></i>',
label: game.i18n.localize("OSE.Cancel"),
},
},
default: "ok",
}).render(true);
});
}
_pushLang(table) {
const data = this.actor.data.data;
let update = duplicate(data[table]);
this._chooseLang().then(dialogInput => {
const name = CONFIG.OSE.languages[dialogInput.choice];
console.log(name);
if (update.value) {
update.value.push(name);
} else {
update = {value: [name]};
}
let newData = {};
newData[table] = update;
return this.actor.update({data: newData}).then(() => {
this.render(true);
});
});
}
/* -------------------------------------------- */
async _onQtChange(event) {
@ -183,6 +236,14 @@ export class OseActorSheetCharacter extends OseActorSheet {
this.actor.deleteOwnedItem(li.data("itemId"));
li.slideUp(200, () => this.render(false));
});
// Delete Inventory Item
html.find(".item-push").click((ev) => {
event.preventDefault();
const header = event.currentTarget;
const table = header.dataset.array;
this._pushLang(table);
});
html.find(".item-create").click((event) => {
event.preventDefault();

View File

@ -36,4 +36,29 @@ export const OSE = {
orange: "OSE.colors.orange",
white: "OSE.colors.white"
},
languages: [
"Common",
"Lawful",
"Chaotic",
"Neutral",
"Bugbear",
"Doppelgänger",
"Dragon",
"Dwarvish",
"Elvish",
"Gargoyle",
"Gnoll",
"Gnomish",
"Goblin",
"Halfling",
"Harpy",
"Hobgoblin",
"Kobold",
"Lizard Man",
"Medusa",
"Minotaur",
"Ogre",
"Orcish",
"Pixie"
]
};

View File

@ -10,6 +10,7 @@ export const preloadHandlebarsTemplates = async function () {
'systems/ose/templates/actors/partials/character-abilities-tab.html',
'systems/ose/templates/actors/partials/character-spells-tab.html',
'systems/ose/templates/actors/partials/character-inventory-tab.html',
'systems/ose/templates/actors/partials/character-notes-tab.html',
'systems/ose/templates/actors/partials/monster-header.html',
'systems/ose/templates/actors/partials/monster-attributes-tab.html'

View File

@ -69,6 +69,9 @@ Hooks.once("setup", function () {
return obj;
}, {});
}
for (let l of CONFIG.OSE.languages) {
CONFIG.OSE.languages[l] = game.i18n.localize(CONFIG.OSE.languages[l]);
}
});
Hooks.once("ready", async () => {

View File

@ -25,6 +25,43 @@
/* Sheet Body */
/* ----------------------------------------- */
.sheet-body {
.notes-tab {
.inventory {
.languages {
margin: 2px;
flex: 0 0 130px;
.item-titles {
.item-controls {
flex: 0 0 20px;
}
}
ol {
height: 100px;
overflow: auto;
list-style: none;
padding: 5px;
li {
margin: 0;
}
}
}
.description {
margin: 2px;
.editor {
.tox .tox-tbtn {
height: 24px;
}
height: 100px;
}
}
&.notes {
margin : 2px;
.editor {
height: 150px;
}
}
}
}
.health {
&.armor-class {
background: url('/systems/ose/assets/shield.png') no-repeat center;

View File

@ -85,10 +85,10 @@
},
"details": {
"biography": "",
"notes": "",
"class": "",
"title": "",
"alignment": "",
"literate": false,
"level": 1,
"xp": {
"next": 0,
@ -132,7 +132,7 @@
"max": 1600
},
"languages": {
"values": [],
"value": [],
"literacy": "literate",
"count": 1
}

View File

@ -42,11 +42,7 @@
{{> "systems/ose/templates/actors/partials/character-inventory-tab.html"}}
</div>
<div class="tab" data-group="primary" data-tab="notes">
<div class="inventory">
<div class="item-titles">{{localize "OSE.category.notes"}}</div>
{{editor content=data.details.biography target="data.details.biography"
button=true owner=owner editable=editable}}
</div>
{{> "systems/ose/templates/actors/partials/character-notes-tab.html"}}
</div>
</section>
</form>

View File

@ -0,0 +1,14 @@
<form class="ose dialog">
<div class="form-group">
<label>{{localize 'OSE.Language'}}</label>
<div class="form-fields">
<select name="choice">
{{#select choices}}
{{#each choices as |label mode|}}
<option value="{{mode}}">{{label}}</option>
{{/each}}
{{/select}}
</select>
</div>
</div>
</div>

View File

@ -0,0 +1,38 @@
<section class="notes-tab">
<div class="inventory">
<div class="flexrow">
<div class="languages">
<div class="item-titles flexrow">
<div class="item-name">
{{localize "OSE.category.languages"}}
</div>
<div class="item-controls">
<a class="item-control item-push" data-array="languages" title="{{localize 'OSE.Add'}}"><i
class="fa fa-plus"></i></a>
</div>
</div>
<ol>
{{#each data.languages.value as |lang|}}
<li>
{{lang}}
</li>
{{/each}}
</ol>
</div>
<div class="flex3 description">
<div class="item-titles">{{localize "OSE.category.description"}}</div>
<div>
{{editor content=data.details.description target="data.details.description"
button=true owner=owner editable=editable}}
</div>
</div>
</div>
</div>
<div class="inventory notes">
<div class="item-titles">{{localize "OSE.category.notes"}}</div>
<div class="resizable-editor" data-editor-size="140">
{{editor content=data.details.notes target="data.details.notes"
button=true owner=owner editable=editable}}
</div>
</div>
</section>