This commit is contained in:
Reaby committed 2019-07-18 17:44:22 +03:00
1 parent 7e7227316d
commit 242c5faf65
22 files changed
+92 -111

No files matched your search

+2 -1
View File
@@ -66,4 +66,5 @@ config.js
tmp/*.png
public/assets/
data/bundles/*
!data/bundles/default/
!data/bundles/default
!data/bundles/default/*
Binary file not shown.

Before

Width:  |  Height:  |  Size: 410 KiB

+1 -1
View File
@@ -7,7 +7,7 @@
"displayTime": true,
"styleHeader": {
"stroke": "",
"fill": "#f90",
"fill": "#fff",
"fontSize": 56,
"fontWeight": 900,
"fontFamily": "Arial"
Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 189 KiB

+3 -13
View File
@@ -1,7 +1,7 @@
[
{
"uuid": "f0411f05-a312-44a7-82fd-778328ba390e",
"name": "testing 123",
"name": "Welcome",
"duration": null,
"enabled": true,
"displayTime": null,
@@ -11,7 +11,7 @@
},
{
"uuid": "03191688-bb93-4376-a3ab-53ed790b2155",
"name": "2 header",
"name": "Features",
"duration": null,
"enabled": true,
"displayTime": null,
@@ -21,22 +21,12 @@
},
{
"uuid": "6a298b8c-9246-411f-b364-2d73c7e292d0",
"name": "header test 3",
"name": "Language support",
"duration": null,
"enabled": true,
"displayTime": null,
"transition": null,
"type": "slide",
"index": 2
},
{
"uuid": "39e5205f-9ace-4597-9873-f9ea5846dff0",
"name": "header",
"duration": null,
"enabled": true,
"displayTime": null,
"transition": null,
"type": "slide",
"index": 3
}
]
@@ -1 +1 @@
{"version":"2.7.0","objects":[{"type":"i-text","version":"2.7.0","left":150,"top":40,"width":267.64,"height":63.28,"fill":"#f90","stroke":"","shadow":{"color":"rgba(0,0,0,0.6)","blur":5,"offsetX":2,"offsetY":2,"affectStroke":false},"text":"2 header","fontSize":56,"fontWeight":900,"fontFamily":"Arial","id":"header","styles":{}},{"type":"i-text","version":"2.7.0","left":150,"top":113.28,"width":211.61,"height":63.28,"fill":"#f90","stroke":"","shadow":{"color":"rgba(0,0,0,0.6)","blur":5,"offsetX":2,"offsetY":2,"affectStroke":false},"text":"header","fontSize":56,"fontWeight":900,"fontFamily":"Arial","id":"header","styles":{}}]}
{"version":"2.7.0","objects":[{"type":"i-text","version":"2.7.0","left":505.15,"top":73,"width":268.71,"height":63.28,"fill":"#fff","stroke":"","shadow":{"color":"rgba(0,0,0,0.6)","blur":5,"offsetX":2,"offsetY":2,"affectStroke":false},"text":"Features","fontSize":56,"fontWeight":900,"fontFamily":"Arial","id":"header","styles":{}},{"type":"i-text","version":"2.7.0","left":227,"top":194.61,"width":825.13,"height":413.67,"fill":"#fff","stroke":"","shadow":{"color":"rgba(0,0,0,0.6)","blur":5,"offsetX":2,"offsetY":2,"affectStroke":false},"text":"Easy-to-use editor for slides supports\nadding text and images to slides.\n\n\n\nFinnish and English language support, \nautomatically set from browser language.\n\nSupports web content as slides with scaling\nis useful for timetables, tournament brackets...","fontSize":32,"fontWeight":900,"fontFamily":"Arial","textAlign":"center","id":"normal","styles":{}},{"type":"image","version":"2.7.0","left":200,"top":291.07,"width":1310,"height":141,"scaleX":0.68,"scaleY":0.68,"crossOrigin":"","src":"/images/default/toolbar.png","filters":[]}]}
@@ -1 +0,0 @@
{"version":"2.7.0","objects":[{"type":"i-text","version":"2.7.0","left":150,"top":40,"width":211.61,"height":63.28,"fill":"#f90","stroke":"","shadow":{"color":"rgba(0,0,0,0.6)","blur":5,"offsetX":2,"offsetY":2,"affectStroke":false},"text":"header","fontSize":56,"fontWeight":900,"fontFamily":"Arial","id":"header","styles":{}},{"type":"i-text","version":"2.7.0","left":247,"top":113.28,"width":261.25,"height":36.16,"fill":"#fff","stroke":"","shadow":{"color":"rgba(0,0,0,0.6)","blur":5,"offsetX":2,"offsetY":2,"affectStroke":false},"text":"paragraph text","fontSize":32,"fontWeight":900,"fontFamily":"Arial","id":"normal","styles":{}},{"type":"i-text","version":"2.7.0","left":250,"top":159.44,"width":91.61,"height":36.16,"fill":"#fff","stroke":"","shadow":{"color":"rgba(0,0,0,0.6)","blur":5,"offsetX":2,"offsetY":2,"affectStroke":false},"text":"text2","fontSize":32,"fontWeight":900,"fontFamily":"Arial","id":"normal","styles":{}}]}
@@ -1 +1 @@
{"version":"2.6.0","objects":[{"type":"i-text","version":"2.6.0","left":151,"top":40,"width":267.64,"height":63.28,"fill":"#f90","shadow":{"color":"#000","blur":3,"offsetX":0,"offsetY":0,"affectStroke":false},"text":"header 3","fontSize":56,"fontWeight":900,"fontFamily":"Arial Black","id":"header","styles":{}}]}
{"version":"2.7.0","objects":[{"type":"i-text","version":"2.7.0","left":362.25,"top":128,"width":554.5,"height":63.28,"fill":"#fff","stroke":"","shadow":{"color":"rgba(0,0,0,0.6)","blur":5,"offsetX":2,"offsetY":2,"affectStroke":false},"text":"Language support","fontSize":56,"fontWeight":900,"fontFamily":"Arial","id":"header","styles":{}},{"type":"i-text","version":"2.7.0","left":189.79,"top":280,"width":878.06,"height":78.11,"fill":"#fff","stroke":"","shadow":{"color":"rgba(0,0,0,0.6)","blur":5,"offsetX":2,"offsetY":2,"affectStroke":false},"text":"Finnish and english support by default\nCan be extended by translating to new languages","fontSize":32,"fontWeight":900,"fontFamily":"Arial","textAlign":"center","id":"normal","styles":{}}]}
@@ -1 +1 @@
{"version":"2.7.0","objects":[{"type":"i-text","version":"2.7.0","left":150,"top":40,"width":345.35,"height":63.28,"fill":"#f90","stroke":"","shadow":{"color":"rgba(0,0,0,0.6)","blur":5,"offsetX":2,"offsetY":2,"affectStroke":false},"text":"testing 123","fontSize":56,"fontWeight":900,"fontFamily":"Arial","id":"header","styles":{}},{"type":"i-text","version":"2.7.0","left":250,"top":113.28,"width":261.25,"height":36.16,"fill":"#fff","stroke":"","shadow":{"color":"rgba(0,0,0,0.6)","blur":5,"offsetX":2,"offsetY":2,"affectStroke":false},"text":"paragraph text","fontSize":32,"fontWeight":900,"fontFamily":"Arial","id":"normal","styles":{}},{"type":"i-text","version":"2.7.0","left":250,"top":159.44,"width":261.25,"height":36.16,"fill":"#fff","stroke":"","shadow":{"color":"rgba(0,0,0,0.6)","blur":5,"offsetX":2,"offsetY":2,"affectStroke":false},"text":"paragraph text","fontSize":32,"fontWeight":900,"fontFamily":"Arial","id":"normal","styles":{}}]}
{"version":"2.7.0","objects":[{"type":"i-text","version":"2.7.0","left":426.4,"top":62,"width":388.97,"height":63.28,"fill":"rgb(251, 251, 251)","stroke":"","shadow":{"color":"rgba(0,0,0,0.6)","blur":5,"offsetX":2,"offsetY":2,"affectStroke":false},"text":"InfoScreen 3","fontSize":56,"fontWeight":900,"fontFamily":"Arial","textAlign":"center","id":"header","styles":{"0":{"11":{"fill":"rgb(25, 152, 55)"}}}},{"type":"i-text","version":"2.7.0","left":579.49,"top":113,"width":235.7,"height":36.16,"fill":"rgb(250, 250, 250)","stroke":"","shadow":{"color":"rgba(0,0,0,0.6)","blur":5,"offsetX":2,"offsetY":2,"affectStroke":false},"text":"for lanparties","fontSize":32,"fontWeight":900,"fontFamily":"Arial","id":"normal","styles":{}},{"type":"i-text","version":"2.7.0","left":59,"top":200,"width":1141.39,"height":329.78,"fill":"#fff","stroke":"","shadow":{"color":"rgba(0,0,0,0.6)","blur":5,"offsetX":2,"offsetY":2,"affectStroke":false},"text":"Can display easily slides from browser\nyou just need network connection, laptop with a browser\n\nOutput resolution does not matter, all contents are automatically\n scaled from full hd or half-hd as source material\n\nSupports multiple client-displays, by default you have 3 screens:\nbigscreen, sidescreen and kiosk","fontSize":32,"fontWeight":900,"fontFamily":"Arial","textAlign":"center","id":"normal","styles":{}}]}
+18 -19
View File
@@ -130,8 +130,8 @@ class admin {
serverOptions.streamSource = "";
cli.success("stop stream");
}
view.io.emit("callbackLoad", view.getSlideData());
updateDashboard(io);
view.io.emit("callback.load", view.getSlideData());
updateDashboard(io);
});
@@ -139,7 +139,7 @@ class admin {
let view = getView();
view.clearTimers();
getServerOptions().loop = false;
updateDashboard(io);
updateDashboard(io);
});
socket.on('controls.next', function (data) {
@@ -151,7 +151,7 @@ class admin {
view.serverOptions.blackout = view.serverOptions.blackout === false;
view.io.emit("callback.blackout", {serverOptions: view.serverOptions});
updateDashboard(io);
updateDashboard(io);
});
socket.on("controls.preview", function (data) {
@@ -198,7 +198,7 @@ class admin {
bundleSettings.setSlideStatus(fileName, false);
}
updateDashboard(socket);
updateDashboard(socket);
});
// override
@@ -211,8 +211,7 @@ class admin {
dispatcher.emit("all.override", data);
} else {
let view = getView();
view.overrideSlide(data.json, data.png, data.duration);
view.displayCurrentSlide();
view.overrideSlide(data.json, data.png, data.duration, data.transition);
}
} catch (err) {
cli.error("error, admin.override", err);
@@ -232,11 +231,11 @@ class admin {
});
socket.on('admin.listSlides', function (data) {
updateDashboard(socket);
updateDashboard(socket);
});
socket.on('admin.listBundles', function (data) {
updateDashboard(socket);
updateDashboard(socket);
});
@@ -250,13 +249,12 @@ class admin {
}
// calculate next slide order for all displays which has the bundle selected
for (let display of screenView) {
if (display.serverOptions.currentBundle === data.bundleName) {
for (let slide of bundle.allSlides) {
// calculate new index for next slide;
if (slide.uuid === display.serverOptions.currentFile) {
display.serverOptions.loopIndex = slide.index + 1;
}
let display = screenView;
if (display.serverOptions.currentBundle === data.bundleName) {
for (let slide of bundle.allSlides) {
// calculate new index for next slide;
if (slide.uuid === display.serverOptions.currentFile) {
display.serverOptions.loopIndex = slide.index + 1;
}
}
}
@@ -271,6 +269,7 @@ class admin {
let bundle = bundleManager.getBundle(data.bundleName);
bundle.removeUuid(data.uuid);
updateSlides(io, bundle.name, bundle);
announce(null, "callback.removeSlide", data);
} catch (err) {
cli.error("error while removing slide", err);
}
@@ -402,7 +401,7 @@ class admin {
}
getServerOptions().transition = transition;
updateDashboard(io);
updateDashboard(io);
});
socket.on('edit.save', function (data) {
@@ -479,7 +478,7 @@ class admin {
let replace = "^data:" + data.type + ";base64,";
let re = new RegExp(replace, "g");
fs.writeFileSync(".data/bundles/" + data.bundleName + "/images/" + filename + ext, data.imageData.replace(re, ""), "base64");
fs.writeFileSync("./data/bundles/" + data.bundleName + "/images/" + filename + ext, data.imageData.replace(re, ""), "base64");
cli.success("upload of " + filename + ext);
socket.emit("callback.edit.updateFileList", {});
} catch (err) {
@@ -491,7 +490,7 @@ class admin {
socket.on('edit.deleteImage', function (data) {
try {
fs.unlinkSync(".data/bundles/" + data.bundleName + "/images/" + data.name);
fs.unlinkSync("./data/bundles/" + data.bundleName + "/images/" + data.name);
cli.success("delete " + data.name);
socket.emit("callback.edit.updateFileList", {});
} catch (err) {
+9 -4
View File
@@ -76,7 +76,8 @@ class display {
dispatcher.on("announce", function (obj) {
// if global announce, ie screens is null
if (obj.screens == null) {
if (obj.screens === null) {
console.log("announcing: " + this.displayId);
io.emit(obj.event, obj.data);
} else {
// screens is array
@@ -107,7 +108,7 @@ class display {
socket.on('sync', function () {
cli.info("request sync " + self.name);
socket.emit("callbackLoad", self.getSlideData());
socket.emit("callback.load", self.getSlideData());
});
}); // io
@@ -137,7 +138,7 @@ class display {
this.serverOptions.currentId = bundle.enabledSlides.indexOf(this.serverOptions.currentFile);
this.serverOptions.transition = bundle.getBundleData().transition;
this.serverOptions.loop = true;
this.io.emit("callbackLoad", this.getSlideData());
this.io.emit("callback.load", this.getSlideData());
this.mainLoop();
}
@@ -226,8 +227,10 @@ class display {
this.serverOptions.loopIndex += 1;
}
overrideSlide(json, pngData, duration) {
overrideSlide(json, pngData, duration, transition) {
this.clearTimers();
var _transition = this.serverOptions.transition;
this.serverOptions.transition = transition;
this.serverOptions.loop = false;
this.serverOptions.isAnnounce = true;
// save temporarily png data...
@@ -240,6 +243,8 @@ class display {
that.mainLoop();
}, duration * 1000));
}
this.displayCurrentSlide();
this.serverOptions.transition = _transition;
}
displayCurrentSlide() {
+26 -20
View File
@@ -80,7 +80,6 @@ function getLayer(offset) {
return "layer" + (layer + offset) % 2;
}
// socketio callbacks
/** when connected **/
socket.on('connect', function () {
@@ -111,18 +110,18 @@ socket.on('callback.time', function (data) {
});
/** callback Load **/
socket.on('callbackLoad', function (data) {
socket.on('callback.load', function (data) {
serverOptions = data.serverOptions;
bundleData = data.bundleData;
preloadImages(data.slides);
checkBlackout();
setBackground(data.bundleData.background);
if (checkStream(serverOptions) === false) {
if (doNext) {
doNext = false;
setTimeout(function () {
setBackground(data.bundleData.background);
if (checkStream(serverOptions) === false) {
nextSlide(data);
}
}
}, 1000);
});
@@ -136,6 +135,10 @@ socket.on('callback.update', function (data) {
}
});
socket.on('callback.removeSlide', function (data) {
window.f.clearImageById(data.uuid);
});
socket.on('callback.reload', function () {
location.reload(true);
});
@@ -202,7 +205,6 @@ function checkBlackout() {
function nextSlide(data) {
serverOptions = data.serverOptions;
bundleData = data.bundleData;
var needWait = checkImages(data.slides);
checkTimeDisplay();
if (serverOptions.isAnnounce) {
@@ -249,11 +251,8 @@ function nextSlide(data) {
clearIFrame(getWebLayer(1));
}, 2500);
$("#slider").show();
setTimeout(function () {
window.f.showImageById(serverOptions.currentFile, transition);
}, needWait ? 1000 : 50);
// $("#slider").show();
window.f.showImageById(serverOptions.currentFile, transition);
break;
}
}
@@ -362,12 +361,20 @@ function preloadImages(allSlides) {
function reloadImage(data) {
if (serverOptions.currentBundle === data.bundleName) {
window.f.clearImageById(data.uuid);
window.f.setupImages();
getDataUri("/render/" + data.bundleName + "/" + data.uuid + ".png?" + uuidv4(), data.uuid, function (imageId, imageData, image) {
image.id = imageId;
window.f.images.push(image);
window.f.imageData.push(imageData);
var found = false;
for (var i in window.f.images) {
if (window.f.images[i].id === data.uuid) {
window.f.imageData[i] = imageData;
found = true;
}
}
if (!found) {
console.log("notfound, adding!");
image.id = imageId;
window.f.images.push(image);
window.f.imageData.push(imageData);
}
});
}
}
@@ -392,7 +399,6 @@ function checkImages(allSlides) {
// new slides count is less than slides in rotation
// remove slides
if (allIds.length < fluxIds.length) {
var diffIds = symmetricDifference(fluxIds, allIds);
for (var l in diffIds) {
window.f.clearImageById(diffIds[l]);
@@ -466,7 +472,7 @@ function getDataUri(url, imageId, callback) {
canvas.height = this.naturalHeight; // or 'height' if you want a special/scaled size
canvas.getContext('2d').drawImage(this, 0, 0);
callback(imageId, canvas.toDataURL('image/png'), this);
callback(imageId, canvas.toDataURL('image/png'), {src: url});
};
image.src = url;
}
+1 -1
View File
@@ -57,7 +57,7 @@ $(function () {
/** callback Load **/
socket.on('callbackLoad', function (data) {
socket.on('callback.load', function (data) {
serverOptions = data.serverOptions;
bundleData = data.bundleData;
checkBlackout();
+13 -6
View File
@@ -34,7 +34,7 @@ $(function () {
$('html').keyup(function (e) {
if (e.keyCode === 46) {
obj = canvas.getActiveObject();
var obj = canvas.getActiveObject();
if (!obj.isEditing) {
removeSelectedObjects();
}
@@ -216,12 +216,14 @@ socket.on('callback.edit.updateFileList', function (data) {
socket.on('callback.edit', function (data) {
bundleData = data.bundleData;
canvas.clear();
console.log(data);
if (data.slideData.name != null) {
slideName = data.slideData.name;
$("#slideName").val(slideName);
}
$("#duration").val(data.slideData.duration + "");
$("#duration").val(data.slideData.duration || "");
if (data.slideData.displayTime !== null) {
$("#override").checkbox('set checked');
@@ -277,7 +279,7 @@ socket.on('callback.edit', function (data) {
});
function setBackground(background) {
background = "/background/" + bundleData.bundleName + "/" + background;
background = "/background/" + background;
var video = document.getElementById("bgvid2");
var bg = $("#bg");
@@ -541,7 +543,7 @@ function removeSelectedObjects() {
for (var i in obj) {
canvas.remove(obj[i]);
}
canvas.discardActiveObject();
canvas.discardActiveObject(null);
canvas.requestRenderAll();
}
@@ -554,11 +556,13 @@ function cueSlide(id) {
}
}
if (confirm('Force display of the current slide?') && bool) {
if (confirm('Force display of the current slide?')) {
var duration = null;
if ($.isNumeric($("#duration").val())) {
duration = parseFloat($("#duration").val());
}
var transition = $("#transitions").dropdown("get value");
if (transition === "null") transition = "";
var objects = canvas.getObjects('line');
for (let i in objects) {
@@ -569,8 +573,10 @@ function cueSlide(id) {
json: canvas.toJSON(['id']),
png: canvas.toDataURL('png'),
displayId: id,
duration: duration
duration: duration,
transition: transition
};
socket.emit("admin.override", obj);
drawGrid();
@@ -584,6 +590,7 @@ function save() {
for (let i in objects) {
canvas.remove(objects[i]);
}
slideName = $("#slideName").val();
if (slideName === "untitled") {
var texts = canvas.getObjects('i-text');
+7 -23
View File
@@ -72,7 +72,7 @@ window.flux = {
this.options.transitions = newTrans;
this.images = [];
this.imageData = [];
this["imageData"] = [];
this.imageLoadedCount = 0;
this.currentImageIndex = 0;
this.nextImageIndex = 1;
@@ -89,7 +89,7 @@ window.flux = {
window.location = $(event.target).data('href');
});
this.imageContainer = $('<div class="images loading"></div>').css({
this.imageContainer = $('<div class="images"></div>').css({
'position': 'relative',
'overflow': 'hidden',
'min-height': '100px',
@@ -105,8 +105,8 @@ window.flux = {
}
// Create the placeholders for the current and next image
this.image1 = $('<div class="image1" style="width: 100%; height: 100%;"></div>').appendTo(this.imageContainer);
this.image2 = $('<div class="image2" style="width: 100%; height: 100%;"></div>').appendTo(this.imageContainer);
this.image1 = $('<div class="image1" style="width:100%;height:100%;"></div>').appendTo(this.imageContainer);
this.image2 = $('<div class="image2" style="width:100%;height:100%;"></div>').appendTo(this.imageContainer);
$(this.image1).add(this.image2).css({
'position': 'absolute',
@@ -114,21 +114,6 @@ window.flux = {
'left': '0px'
});
// Get a list of the images to use
this.element.find('img, a img').each(function (index, found_img) {
var imgClone = found_img.cloneNode(false),
link = $(found_img).parent();
// If this img is directly inside a link then save the link for later use
if (link.is('a'))
$(imgClone).data('href', link.attr('href'));
_this.images.push(imgClone);
// Remove the images from the DOM
$(found_img).remove();
});
// Load the images afterwards as IE seems to load images synchronously
for (var i = 0; i < this.images.length; i++) {
var image = new Image();
@@ -230,8 +215,8 @@ window.flux = {
this.setNextIndex(index);
// Temporarily stop the transition interval
// clearInterval(this.interval);
// this.interval = null;
// clearInterval(this.interval);
// this.interval = null;
this.setupImages();
this.transition(trans, opts);
@@ -270,8 +255,8 @@ window.flux = {
clearImageById: function (id) {
for (var i in this.images) {
if (this.images[i].id === id) {
this.imageData.splice(i, 1);
this.images.splice(i, 1);
this.imageData.splice(i, 1);
}
}
},
@@ -463,7 +448,6 @@ window.flux = {
},
getImageData: function (index) {
index = index % this.imageData.length;
return this.imageData[index];
},
setNextIndex: function (nextIndex) {
+1 -14
View File
@@ -93,7 +93,7 @@ socket.on('callback.preview', function (data) {
function setBackground() {
background = "/background/" + bundleData.bundleName + "/" + bundleData.background;
background = "/background/" + bundleData.background;
var video = document.getElementById("bgvid");
var bg = $("#bg");
@@ -143,19 +143,6 @@ function fixCanvas() {
canvas.calcOffset();
}
function override() {
var obj = canvas.toJSON(['id']);
var video = document.getElementById("bgvid");
var bg = "";
if (video.src.indexOf(".mp4") !== -1) {
bg = video.src;
} else {
bg = video.poster;
}
socket.emit("admin.override", {json: obj, displayId: displayId, background: bg});
}
function nextSlide(data, updateOptions) {
serverOptions = data.serverOptions;
+1 -1
View File
@@ -143,7 +143,7 @@ module.exports = function (websocket, dispatcher) {
router.get('/ajax/imagelist', function (req, res, next) {
let bundle = req.query['bundle'];
let bundleRoot = path.normalize("./data/bundles" + bundle);
let bundleRoot = path.normalize("./data/bundles/" + bundle);
let bundleImages = fs.readdirSync(bundleRoot + "/images", {
dotfiles: false
});
+7 -4
View File
@@ -66,7 +66,8 @@
<div class="ui buttons">
<a href="#" onclick="save()" class="ui green button">{{ t("actions.save") }}</a>
{% if displayId != null %}
<a href="#" onclick="cueSlide(displayId)" class="ui basic teal button">{{ t("actions.announce") }}</a>
<a href="#" onclick="cueSlide({{ displayId }})"
class="ui basic teal button">{{ t("actions.announce") }}</a>
{% endif %}
<a href="#" onclick="cueSlide(null)" class="ui red button">{{ t("actions.announceAll") }}</a>
<a href="#" onclick="window.close()" class="ui button">{{ t("actions.cancel") }}</a>
@@ -155,8 +156,10 @@
</div>
</div>
<div class="item">
<div class="ui basic icon button" onclick="setCenter('h')"><i class="arrows alternate horizontal icon"></i></div>
<div class="ui basic icon button" onclick="setCenter('v')"><i class="arrows alternate vertical icon"></i></div>
<div class="ui basic icon button" onclick="setCenter('h')"><i class="arrows alternate horizontal icon"></i>
</div>
<div class="ui basic icon button" onclick="setCenter('v')"><i class="arrows alternate vertical icon"></i>
</div>
</div>
<div class="right menu">
@@ -227,7 +230,7 @@
<script>
var images = {};
$(document).ready(function () {
$(function () {
var opts = {
dragClass: "active",
on: {