diff --git a/css/style.css b/css/style.css
index 8814529f..1164c712 100644
--- a/css/style.css
+++ b/css/style.css
@@ -84,10 +84,18 @@
background-color: lightgray;
}
-#preview-list .preview-tile.selected {
+.preview-tile.selected {
background-color: lightyellow;
}
+.droppable-active {
+ background-color: pink;
+}
+
+.droppable-hover-active {
+ background-color: yellow;
+}
+
.canvas-container {
position: relative;
display: block;
diff --git a/index.html b/index.html
index ef1cf081..a86fe3d0 100644
--- a/index.html
+++ b/index.html
@@ -76,6 +76,7 @@
+
diff --git a/js/controller/PreviewFilmController.js b/js/controller/PreviewFilmController.js
index 9b5c2244..adbab71d 100644
--- a/js/controller/PreviewFilmController.js
+++ b/js/controller/PreviewFilmController.js
@@ -21,12 +21,46 @@
};
ns.PreviewFilmController.prototype.createPreviews = function () {
- this.container.innerHTML = "";
+ this.container.html("");
for (var i = 0, l = this.framesheet.getFrameCount(); i < l ; i++) {
- this.container.appendChild(this.createPreviewTile(i));
+ this.container.append(this.createPreviewTile(i));
}
+ this.initTilesBehavior();
};
+ ns.PreviewFilmController.prototype.initTilesBehavior = function () {
+ var tiles = $(".preview-tile");
+ tiles.draggable( {
+ containment: '#preview-list',
+ stack: '.preview-tile',
+ cursor: 'move',
+ revert: true
+ });
+
+ tiles.droppable( {
+ accept: ".preview-tile",
+ activeClass: "droppable-active",
+ hoverClass: "droppable-hover-active",
+ drop: $.proxy(this.onDrop_, this)
+ });
+ };
+
+ /**
+ * @private
+ */
+ ns.PreviewFilmController.prototype.onDrop_ = function( event, ui ) {
+ var frameId1 = parseInt($(event.srcElement).data("tile-number"), 10);
+ var frameId2 = parseInt($(event.target).data("tile-number"), 10);
+
+ this.framesheet.swapFrames(frameId1, frameId2);
+
+ // TODO(vincz): deprecate
+ piskel.setActiveFrameAndRedraw(frameId2);
+
+ // TODO(vincz): move localstorage request to the model layer?
+ $.publish(Events.LOCALSTORAGE_REQUEST);
+ };
+
ns.PreviewFilmController.prototype.createPreviewTile = function(tileNumber) {
var frame = this.framesheet.getFrameByIndex(tileNumber);
var width = frame.getWidth() * this.dpi,
@@ -34,6 +68,7 @@
var previewTileRoot = document.createElement("li");
var classname = "preview-tile";
+ previewTileRoot.setAttribute("data-tile-number", tileNumber);
if (piskel.getActiveFrameIndex() == tileNumber) {
classname += " selected";
diff --git a/js/model/FrameSheet.js b/js/model/FrameSheet.js
index bfdc2a6f..45a37e4f 100644
--- a/js/model/FrameSheet.js
+++ b/js/model/FrameSheet.js
@@ -95,4 +95,19 @@
var frame = this.getFrameByIndex(index);
this.frames.splice(index + 1, 0, frame.clone());
};
+
+ ns.FrameSheet.prototype.swapFrames = function(indexFrame1, indexFrame2) {
+ if(isNaN(indexFrame1) || isNaN(indexFrame1) ||
+ (!this.hasFrameAtIndex(indexFrame1) && !this.hasFrameAtIndex(indexFrame2))) {
+ throw "Bad indexes for swapFrames Framesheet function.";
+ }
+ if(indexFrame1 == indexFrame2) {
+ return;
+ }
+ else {
+ var swapFrame = this.frames[indexFrame1];
+ this.frames[indexFrame1] = this.frames[indexFrame2];
+ this.frames[indexFrame2] = swapFrame;
+ }
+ };
})();
\ No newline at end of file
diff --git a/js/piskel.js b/js/piskel.js
index b16e8382..e195c05d 100644
--- a/js/piskel.js
+++ b/js/piskel.js
@@ -73,7 +73,7 @@ $.namespace("pskl");
this.previewsController = new pskl.controller.PreviewFilmController(
frameSheet,
- $('#preview-list')[0],
+ $('#preview-list'),
previewTileCanvasDpi
);