Added basic printing functionality

This commit is contained in:
Stefan Zermatten
2017-07-03 12:25:07 +02:00
parent 0b8fabde14
commit 00a050d337
16 changed files with 505 additions and 0 deletions

View File

@@ -1,4 +1,7 @@
<template name="characterSheet">
{{#if printing}}
{{> printedCharacterSheet}}
{{/if}}
<div class="fit layout vertical character-sheet">
<app-header fixed effects="waterfall">
<app-toolbar class="medium-tall {{colorClass}}">

View File

@@ -165,6 +165,9 @@ var getTab = function(charId){
};
Template.characterSheet.helpers({
printing: function(){
return Session.get("isPrinting");
},
selectedTab: function(){
return getTab(this._id);
},

View File

@@ -0,0 +1,13 @@
<template name="printedAbility">
<div class="printedAbility layout vertical center">
<div class="paper-font-subhead title flex layout horizontal center">
{{title}}
</div>
<div class="paper-font-display1 stat">
{{characterCalculate "attributeValue" ../_id ability}}
</div>
<div class="paper-font-subhead modifier">
{{abilityMod}}
</div>
</div>
</template>

View File

@@ -0,0 +1,9 @@
Template.printedAbility.helpers({
abilityMod: function() {
return signedString(
Characters.calculate.abilityMod(
Template.parentData()._id, this.ability
)
);
}
});

View File

@@ -0,0 +1,37 @@
.printed {
background: #fff;
position: fixed;
top: 0;
bottom: 0;
left: 0;
right: 0;
z-index: 99;
}
.printed > .page {
width: 100%;
padding: 1cm;
page-break-inside: avoid;
page-break-after: always;
}
.printed .shrink-to-fit {
white-space: nowrap;
overflow: hidden;
}
@media screen {
.printed {
display: none;
}
}
@media print {
.character-sheet {
display: none;
}
app-drawer {
display: none;
}
}

View File

@@ -0,0 +1,116 @@
<template name="printedCharacterSheet">
<div class="printed">
<div class="page">
<div class="layout vertical">
<div class="layout horizontal">
<div class="characterName paper-font-title">
{{name}}
</div>
<div>
<div>
{{#each classes}}
<span style="margin-right: 16px;">
{{name}}&nbsp;{{level}}
</span>
{{/each}}
</div>
<div>
{{alignment}} {{gender}} {{race}}
</div>
</div>
</div>
<div class="layout horizontal">
<div class="col1 padded flex layout vertical">
<div class="layout horizontal">
<div class="abilities padded layout vertical justified">
{{> printedAbility ability="strength" title="Strength" color="red"}}
{{> printedAbility ability="dexterity" title="Dexterity" color="indigo"}}
{{> printedAbility ability="constitution" title="Constitution" color="green"}}
{{> printedAbility ability="intelligence" title="Intelligence" color="deep-orange"}}
{{> printedAbility ability="wisdom" title="Wisdom" color="purple"}}
{{> printedAbility ability="charisma" title="Charisma" color="pink"}}
</div>
<div class="padded flex layout vertical">
<div class="proficiencyBonus">
{{> printedLongStat stat="proficiencyBonus" name="Proficiency Bonus" prefix="+"}}
</div>
<div class="saves">
<div class="paper-font-subhead">
Saving Throws
</div>
<div>
{{> printedSkillRow name="Strength" skill="strengthSave"}}
{{> printedSkillRow name="Dexterity" skill="dexteritySave"}}
{{> printedSkillRow name="Constitution" skill="constitutionSave"}}
{{> printedSkillRow name="Intelligence" skill="intelligenceSave"}}
{{> printedSkillRow name="Wisdom" skill="wisdomSave"}}
{{> printedSkillRow name="Charisma" skill="charismaSave"}}
</div>
</div>
<div class="skills">
<div class="paper-font-subhead">
Skills
</div>
<div>
{{> printedSkillRow name="Acrobatics" skill="acrobatics"}}
{{> printedSkillRow name="Animal Handling" skill="animalHandling"}}
{{> printedSkillRow name="Arcana" skill="arcana"}}
{{> printedSkillRow name="Athletics" skill="athletics"}}
{{> printedSkillRow name="Deception" skill="deception"}}
{{> printedSkillRow name="History" skill="history"}}
{{> printedSkillRow name="Insight" skill="insight"}}
{{> printedSkillRow name="Intimidation" skill="intimidation"}}
{{> printedSkillRow name="Investigation" skill="investigation"}}
{{> printedSkillRow name="Medicine" skill="medicine"}}
{{> printedSkillRow name="Nature" skill="nature"}}
{{> printedSkillRow name="Perception" skill="perception" showPassive="true"}}
{{> printedSkillRow name="Performance" skill="performance"}}
{{> printedSkillRow name="Persuasion" skill="persuasion"}}
{{> printedSkillRow name="Religion" skill="religion"}}
{{> printedSkillRow name="Sleight of Hand" skill="sleightOfHand"}}
{{> printedSkillRow name="Stealth" skill="stealth"}}
{{> printedSkillRow name="Survival" skill="survival"}}
</div>
</div>
</div>
</div>
<div class="proficiencies">
</div>
</div>
<div class="col2 padded flex">
<div class="layout vertical">
<div class="layout horizontal justified">
<div class="armor">
{{> printedSquareStat stat="armor" name="Armor Class" color="teal"}}
</div>
<div class="inititive">
{{> printedSquareStat stat="initiative" name="Initiative" color="teal"}}
</div>
<div class="speed">
{{> printedSquareStat stat="speed" name="Speed" color="teal"}}
</div>
</div>
<div class="hitpoints padded layout vertical">
<div>Hit Points</div>
<div style="width: 3cm; height: 2cm;">
<!-- Space for writing-->
</div>
<div class="layout horizontal end-justified">
/{{characterCalculate "attributeValue" _id "hitPoints"}}
</div>
</div>
<div class="tempHitpoints"></div>
<div class="layout horizontal">
<div class="hitDice"></div>
<div class="deathSaves"></div>
</div>
</div>
<div class="attacks"></div>
<div class="persona"></div>
</div>
</div>
</div>
</div>
</div>
</template>

View File

@@ -0,0 +1,17 @@
Template.printedCharacterSheet.onRendered(function(){
// Quickfit is only called once on rendering, text will not resize reactively
this.$(".shrink-to-fit").quickfit({
min: 7,
max: 36,
truncate: true,
});
});
Template.printedCharacterSheet.helpers({
character(){
return Characters.findOne(this._id);
},
classes: function(){
return Classes.find({charId: this._id}, {sort: {createdAt: 1}});
},
});

View File

@@ -0,0 +1,14 @@
<template name="printedLongStat">
<div class="printedLongStat layout horizontal">
<div class="numbers paper-font-display1">
{{#if isSkill}}
{{prefix}}{{skillMod}}
{{else}}
{{prefix}}{{characterCalculate "attributeValue" ../_id stat}}
{{/if}}
</div>
<div class="paper-font-subhead title flex layout horizontal center">
{{name}}
</div>
</div>
</template>

View File

@@ -0,0 +1,9 @@
Template.printedLongStat.helpers({
skillMod: function() {
return signedString(
Characters.calculate.skillMod(
Template.parentData()._id, this.stat
)
);
},
});

View File

@@ -0,0 +1,21 @@
<template name="printedSkillRow">
<div class="printedSkillRow layout horizontal center">
<iron-icon icon="{{profIcon}}"></iron-icon>
{{#if failSkill}}
<div class="fail skill-mod">fail</div>
{{else}}
<div class="{{advantage}} skill-mod">
{{skillMod}}
</div>
{{/if}}
<div flex>
{{name}}
{{#if conditionalCount}}
*
{{/if}}
{{#if showPassive}}
({{characterCalculate "passiveSkill" ../_id skill}})
{{/if}}
</div>
</div>
</template>

View File

@@ -0,0 +1,41 @@
Template.printedSkillRow.helpers({
skillMod: function() {
return signedString(
Characters.calculate.skillMod(
Template.parentData()._id, this.skill
)
);
},
profIcon: function(){
var charId = Template.parentData()._id;
var prof = Characters.calculate.proficiency(charId, this.skill);
if (prof > 0 && prof < 1) return "image:brightness-2";
if (prof === 1) return "image:brightness-1";
if (prof > 1) return "av:album";
return "radio-button-unchecked";
},
failSkill: function(){
var charId = Template.parentData()._id;
return Effects.find({
charId: charId,
stat: this.skill,
enabled: true,
operation: "fail",
}).count();
},
advantage: function(){
var charId = Template.parentData()._id;
var advantage = Characters.calculate.advantage(charId, this.skill);
if (advantage > 0) return "advantage";
if (advantage < 0) return "disadvantage";
},
conditionalCount: function(){
var charId = Template.parentData()._id;
return Effects.find({
charId: charId,
stat: this.skill,
enabled: true,
operation: "conditional",
}).count();
},
});

View File

@@ -0,0 +1,14 @@
<template name="printedSquareStat">
<div class="printedSquareStat padded layout vertical center">
<div class="paper-font-subhead">
{{name}}
</div>
<div class="numbers paper-font-display1">
{{#if isSkill}}
{{prefix}}{{skillMod}}
{{else}}
{{prefix}}{{characterCalculate "attributeValue" ../_id stat}}
{{/if}}
</div>
</div>
</template>

View File

@@ -0,0 +1,9 @@
Template.printedSquareStat.helpers({
skillMod: function() {
return signedString(
Characters.calculate.skillMod(
Template.parentData()._id, this.stat
)
);
},
});