diff --git a/src/pretix/static/pretixcontrol/js/ui/editor.js b/src/pretix/static/pretixcontrol/js/ui/editor.js
index a22d448ef3..443c7c6807 100644
--- a/src/pretix/static/pretixcontrol/js/ui/editor.js
+++ b/src/pretix/static/pretixcontrol/js/ui/editor.js
@@ -117,11 +117,15 @@ var editor = {
}
if (o.type === "textarea") {
var col = (new fabric.Color(o.getFill()))._source;
+ var bottom = editor.pdf_viewport.height - o.height - top;
+ if (o.downward) {
+ bottom = editor.pdf_viewport.height - top;
+ }
d.push({
type: "textarea",
locale: $("#pdf-info-locale").val(),
left: editor._px2mm(left).toFixed(2),
- bottom: editor._px2mm(editor.pdf_viewport.height - o.height - top).toFixed(2),
+ bottom: editor._px2mm(bottom).toFixed(2),
fontsize: editor._px2pt(o.getFontSize()).toFixed(1),
color: col,
//lineheight: o.lineHeight,
@@ -129,8 +133,10 @@ var editor = {
bold: o.fontWeight === 'bold',
italic: o.fontStyle === 'italic',
width: editor._px2mm(o.width).toFixed(2),
+ downward: o.downward || false,
content: o.content,
text: o.text,
+ rotation: o.angle,
align: o.textAlign,
});
} else if (o.type === "barcodearea") {
@@ -172,8 +178,10 @@ var editor = {
o.setFontWeight(d.bold ? 'bold' : 'normal');
o.setFontStyle(d.italic ? 'italic' : 'normal');
o.setWidth(editor._mm2px(d.width));
+ o.downward = d.downward || false;
o.content = d.content;
o.setTextAlign(d.align);
+ o.rotate(d.rotation);
if (d.content === "other") {
o.setText(d.text);
} else {
@@ -186,6 +194,9 @@ var editor = {
}
var new_top = editor.pdf_viewport.height - editor._mm2px(d.bottom) - (o.height * o.scaleY);
+ if (o.downward) {
+ new_top = editor.pdf_viewport.height - editor._mm2px(d.bottom);
+ }
o.set('left', editor._mm2px(d.left));
o.set('top', new_top);
o.setCoords();
@@ -268,6 +279,7 @@ var editor = {
editor.fabric.on('object:selected', editor._update_toolbox);
editor.fabric.on('object:moving', editor._update_toolbox_values);
editor.fabric.on('object:modified', editor._update_toolbox_values);
+ editor.fabric.on('object:rotating', editor._update_toolbox_values);
editor.fabric.on('object:scaling', editor._update_toolbox_values);
editor._update_toolbox();
@@ -322,8 +334,12 @@ var editor = {
return;
}
}
+ var bottom = editor.pdf_viewport.height - o.height * o.scaleY - o.top;
+ if (o.downward) {
+ bottom = editor.pdf_viewport.height - o.top;
+ }
$("#toolbox-position-x").val(editor._px2mm(o.left).toFixed(2));
- $("#toolbox-position-y").val(editor._px2mm(editor.pdf_viewport.height - o.height * o.scaleY - o.top).toFixed(2));
+ $("#toolbox-position-y").val(editor._px2mm(bottom).toFixed(2));
if (o.type === "barcodearea") {
$("#toolbox-squaresize").val(editor._px2mm(o.height * o.scaleY).toFixed(2));
@@ -338,10 +354,12 @@ var editor = {
$("#toolbox-fontfamily").val(o.fontFamily);
$("#toolbox").find("button[data-action=bold]").toggleClass('active', o.fontWeight === 'bold');
$("#toolbox").find("button[data-action=italic]").toggleClass('active', o.fontStyle === 'italic');
+ $("#toolbox").find("button[data-action=downward]").toggleClass('active', o.downward || false);
$("#toolbox").find("button[data-action=left]").toggleClass('active', o.textAlign === 'left');
$("#toolbox").find("button[data-action=center]").toggleClass('active', o.textAlign === 'center');
$("#toolbox").find("button[data-action=right]").toggleClass('active', o.textAlign === 'right');
$("#toolbox-textwidth").val(editor._px2mm(o.width).toFixed(2));
+ $("#toolbox-textrotation").val((o.angle || 0.0).toFixed(1));
if (o.type === "textarea") {
$("#toolbox-content").val(o.content);
$("#toolbox-content-other").toggle($("#toolbox-content").val() === "other");
@@ -364,6 +382,11 @@ var editor = {
}
var new_top = editor.pdf_viewport.height - editor._mm2px($("#toolbox-position-y").val()) - o.height * o.scaleY;
+ if (o.type === "textarea" || o.type === "text") {
+ if ($("#toolbox").find("button[data-action=downward]").is('.active')) {
+ new_top = editor.pdf_viewport.height - editor._mm2px($("#toolbox-position-y").val());
+ }
+ }
o.set('left', editor._mm2px($("#toolbox-position-x").val()));
o.set('top', new_top);
@@ -404,6 +427,8 @@ var editor = {
o.setTextAlign(align);
}
o.setWidth(editor._mm2px($("#toolbox-textwidth").val()));
+ o.downward = $("#toolbox").find("button[data-action=downward]").is('.active');
+ o.rotate(parseFloat($("#toolbox-textrotation").val()));
$("#toolbox-content-other").toggle($("#toolbox-content").val() === "other");
o.content = $("#toolbox-content").val();
if ($("#toolbox-content").val() === "other") {
@@ -452,13 +477,14 @@ var editor = {
left: 100,
top: 100,
width: editor._mm2px(50),
- lockRotation: true,
+ lockRotation: false,
fontFamily: 'Open Sans',
lineHeight: 1,
content: 'item',
editable: false,
fontSize: editor._pt2px(13)
});
+ text.downward = true;
text.setControlsVisibility({
'tr': false,
'tl': false,
@@ -468,7 +494,7 @@ var editor = {
'mb': false,
'mr': true,
'ml': true,
- 'mtr': false
+ 'mtr': true
});
editor.fabric.add(text);
editor._create_savepoint();
@@ -584,6 +610,9 @@ var editor = {
_on_keydown: function (e) {
var step = e.shiftKey ? editor._mm2px(10) : editor._mm2px(1);
var thing = editor.fabric.getActiveObject() ? editor.fabric.getActiveObject() : editor.fabric.getActiveGroup();
+ if ($("#source-container").is(':visible')) {
+ return true;
+ }
switch (e.keyCode) {
case 38: /* Up arrow */
thing.set('top', thing.get('top') - step);