Refactored piskel controller to extract the event creation

This commit is contained in:
juliandescottes 2014-04-19 16:01:51 +02:00
parent b7e4deae00
commit d45ea00ca5
13 changed files with 234 additions and 117 deletions

View File

@ -30,7 +30,10 @@
piskel.addLayer(layer); piskel.addLayer(layer);
this.piskelController = new pskl.controller.PiskelController(piskel); this.corePiskelController = new pskl.controller.piskel.PiskelController(piskel);
this.corePiskelController.init();
this.piskelController = new pskl.controller.piskel.PublicPiskelController(this.corePiskelController);
this.piskelController.init(); this.piskelController.init();
this.paletteController = new pskl.controller.PaletteController(); this.paletteController = new pskl.controller.PaletteController();
@ -69,7 +72,7 @@
this.selectionManager = new pskl.selection.SelectionManager(this.piskelController); this.selectionManager = new pskl.selection.SelectionManager(this.piskelController);
this.selectionManager.init(); this.selectionManager.init();
this.historyService = new pskl.service.HistoryService(this.piskelController); this.historyService = new pskl.service.HistoryService(this.corePiskelController);
this.historyService.init(); this.historyService.init();
this.notificationController = new pskl.controller.NotificationController(); this.notificationController = new pskl.controller.NotificationController();

View File

@ -1,10 +1,9 @@
(function () { (function () {
var ns = $.namespace('pskl.controller'); var ns = $.namespace('pskl.controller.piskel');
ns.PiskelController = function (piskel) { ns.PiskelController = function (piskel) {
if (piskel) { if (piskel) {
this.setPiskel(piskel); this.setPiskel(piskel);
this.silenced = false;
} else { } else {
throw 'A piskel instance is mandatory for instanciating PiskelController'; throw 'A piskel instance is mandatory for instanciating PiskelController';
} }
@ -16,21 +15,9 @@
this.currentFrameIndex = 0; this.currentFrameIndex = 0;
this.layerIdCounter = 1; this.layerIdCounter = 1;
if (!this.silenced) {
$.publish(Events.FRAME_SIZE_CHANGED);
$.publish(Events.PISKEL_RESET);
$.publish(Events.PISKEL_SAVE_STATE, {
type : 'FULL'
});
}
}; };
ns.PiskelController.prototype.init = function () { ns.PiskelController.prototype.init = function () {
pskl.app.shortcutService.addShortcut('up', this.selectPreviousFrame.bind(this));
pskl.app.shortcutService.addShortcut('down', this.selectNextFrame.bind(this));
pskl.app.shortcutService.addShortcut('n', this.addFrameAtCurrentIndex.bind(this));
pskl.app.shortcutService.addShortcut('shift+n', this.duplicateCurrentFrame.bind(this));
}; };
ns.PiskelController.prototype.getHeight = function () { ns.PiskelController.prototype.getHeight = function () {
@ -92,15 +79,6 @@
this.getLayers().forEach(function (l) { this.getLayers().forEach(function (l) {
l.addFrameAt(this.createEmptyFrame_(), index); l.addFrameAt(this.createEmptyFrame_(), index);
}.bind(this)); }.bind(this));
if (!this.silenced) {
$.publish(Events.PISKEL_SAVE_STATE, {
type : 'ADD_FRAME',
index : index
});
$.publish(Events.PISKEL_RESET);
}
}; };
ns.PiskelController.prototype.createEmptyFrame_ = function () { ns.PiskelController.prototype.createEmptyFrame_ = function () {
@ -116,14 +94,6 @@
if (this.currentFrameIndex >= index && this.currentFrameIndex > 0) { if (this.currentFrameIndex >= index && this.currentFrameIndex > 0) {
this.setCurrentFrameIndex(this.currentFrameIndex - 1); this.setCurrentFrameIndex(this.currentFrameIndex - 1);
} }
if (!this.silenced) {
$.publish(Events.PISKEL_SAVE_STATE, {
type : 'DELETE_FRAME',
index : index
});
$.publish(Events.PISKEL_RESET);
}
}; };
ns.PiskelController.prototype.duplicateCurrentFrame = function () { ns.PiskelController.prototype.duplicateCurrentFrame = function () {
@ -134,31 +104,12 @@
this.getLayers().forEach(function (l) { this.getLayers().forEach(function (l) {
l.duplicateFrameAt(index); l.duplicateFrameAt(index);
}); });
if (!this.silenced) {
$.publish(Events.PISKEL_SAVE_STATE, {
type : 'DUPLICATE_FRAME',
index : index
});
$.publish(Events.PISKEL_RESET);
}
}; };
ns.PiskelController.prototype.moveFrame = function (fromIndex, toIndex) { ns.PiskelController.prototype.moveFrame = function (fromIndex, toIndex) {
this.getLayers().forEach(function (l) { this.getLayers().forEach(function (l) {
l.moveFrame(fromIndex, toIndex); l.moveFrame(fromIndex, toIndex);
}); });
if (!this.silenced) {
$.publish(Events.PISKEL_SAVE_STATE, {
type : 'MOVE_FRAME',
from : fromIndex,
to : toIndex
});
$.publish(Events.PISKEL_RESET);
}
}; };
ns.PiskelController.prototype.getFrameCount = function () { ns.PiskelController.prototype.getFrameCount = function () {
@ -168,9 +119,6 @@
ns.PiskelController.prototype.setCurrentFrameIndex = function (index) { ns.PiskelController.prototype.setCurrentFrameIndex = function (index) {
this.currentFrameIndex = index; this.currentFrameIndex = index;
if (!this.silenced) {
$.publish(Events.PISKEL_RESET);
}
}; };
ns.PiskelController.prototype.selectNextFrame = function () { ns.PiskelController.prototype.selectNextFrame = function () {
@ -189,9 +137,6 @@
ns.PiskelController.prototype.setCurrentLayerIndex = function (index) { ns.PiskelController.prototype.setCurrentLayerIndex = function (index) {
this.currentLayerIndex = index; this.currentLayerIndex = index;
if (!this.silenced) {
$.publish(Events.PISKEL_RESET);
}
}; };
ns.PiskelController.prototype.selectLayer = function (layer) { ns.PiskelController.prototype.selectLayer = function (layer) {
@ -205,13 +150,6 @@
var layer = this.getLayerByIndex(index); var layer = this.getLayerByIndex(index);
if (layer) { if (layer) {
layer.setName(name); layer.setName(name);
if (!this.silenced) {
$.publish(Events.PISKEL_SAVE_STATE, {
type : 'RENAME_LAYER',
index : index,
name : name
});
}
} }
}; };
@ -245,12 +183,6 @@
this.piskel.addLayer(layer); this.piskel.addLayer(layer);
this.setCurrentLayerIndex(this.piskel.getLayers().length - 1); this.setCurrentLayerIndex(this.piskel.getLayers().length - 1);
if (!this.silenced) {
$.publish(Events.PISKEL_SAVE_STATE, {
type : 'CREATE_LAYER',
name : name
});
}
} else { } else {
throw 'Layer name should be unique'; throw 'Layer name should be unique';
} }
@ -264,22 +196,12 @@
var layer = this.getCurrentLayer(); var layer = this.getCurrentLayer();
this.piskel.moveLayerUp(layer); this.piskel.moveLayerUp(layer);
this.selectLayer(layer); this.selectLayer(layer);
if (!this.silenced) {
$.publish(Events.PISKEL_SAVE_STATE, {
type : 'LAYER_UP'
});
}
}; };
ns.PiskelController.prototype.moveLayerDown = function () { ns.PiskelController.prototype.moveLayerDown = function () {
var layer = this.getCurrentLayer(); var layer = this.getCurrentLayer();
this.piskel.moveLayerDown(layer); this.piskel.moveLayerDown(layer);
this.selectLayer(layer); this.selectLayer(layer);
if (!this.silenced) {
$.publish(Events.PISKEL_SAVE_STATE, {
type : 'LAYER_DOWN'
});
}
}; };
ns.PiskelController.prototype.removeCurrentLayer = function () { ns.PiskelController.prototype.removeCurrentLayer = function () {
@ -287,28 +209,10 @@
var layer = this.getCurrentLayer(); var layer = this.getCurrentLayer();
this.piskel.removeLayer(layer); this.piskel.removeLayer(layer);
this.setCurrentLayerIndex(0); this.setCurrentLayerIndex(0);
if (!this.silenced) {
$.publish(Events.PISKEL_SAVE_STATE, {
type : 'REMOVE_LAYER'
});
}
} }
}; };
ns.PiskelController.prototype.serialize = function (compressed) { ns.PiskelController.prototype.serialize = function (compressed) {
return pskl.utils.Serializer.serializePiskel(this.piskel, compressed); return pskl.utils.Serializer.serializePiskel(this.piskel, compressed);
}; };
ns.PiskelController.prototype.load = function (data) {
this.deserialize(JSON.stringify(data));
};
ns.PiskelController.prototype.silence = function () {
this.silenced = true;
};
ns.PiskelController.prototype.voice = function () {
this.silenced = false;
};
})(); })();

View File

@ -0,0 +1,203 @@
(function () {
var ns = $.namespace('pskl.controller.piskel');
ns.PublicPiskelController = function (piskelController) {
this.piskelController = piskelController;
};
ns.PublicPiskelController.prototype.init = function () {
pskl.app.shortcutService.addShortcut('up', this.selectPreviousFrame.bind(this));
pskl.app.shortcutService.addShortcut('down', this.selectNextFrame.bind(this));
pskl.app.shortcutService.addShortcut('n', this.addFrameAtCurrentIndex.bind(this));
pskl.app.shortcutService.addShortcut('shift+n', this.duplicateCurrentFrame.bind(this));
};
ns.PublicPiskelController.prototype.setPiskel = function (piskel) {
this.piskelController.setPiskel(piskel);
$.publish(Events.FRAME_SIZE_CHANGED);
$.publish(Events.PISKEL_RESET);
$.publish(Events.PISKEL_SAVE_STATE, {
type : 'FULL'
});
};
ns.PublicPiskelController.prototype.getHeight = function () {
return this.piskelController.getHeight();
};
ns.PublicPiskelController.prototype.getWidth = function () {
return this.piskelController.getWidth();
};
ns.PublicPiskelController.prototype.getFPS = function () {
return this.piskelController.getFPS();
};
ns.PublicPiskelController.prototype.getLayers = function () {
return this.piskelController.getLayers();
};
ns.PublicPiskelController.prototype.getCurrentLayer = function () {
return this.piskelController.getCurrentLayer();
};
ns.PublicPiskelController.prototype.getCurrentLayerIndex = function () {
return this.piskelController.currentLayerIndex;
};
ns.PublicPiskelController.prototype.getLayerAt = function (index) {
return this.piskelController.getLayerAt(index);
};
ns.PublicPiskelController.prototype.getCurrentFrame = function () {
return this.piskelController.getCurrentFrame();
};
ns.PublicPiskelController.prototype.getCurrentFrameIndex = function () {
return this.piskelController.currentFrameIndex;
};
ns.PublicPiskelController.prototype.getPiskel = function () {
return this.piskelController.piskel;
};
ns.PublicPiskelController.prototype.getFrameAt = function (index) {
return this.piskelController.getFrameAt(index);
};
ns.PublicPiskelController.prototype.hasFrameAt = function (index) {
return this.piskelController.hasFrameAt(index);
};
ns.PublicPiskelController.prototype.addFrame = function () {
this.addFrameAt(this.piskelController.getFrameCount());
};
ns.PublicPiskelController.prototype.addFrameAtCurrentIndex = function () {
this.addFrameAt(this.getCurrentFrameIndex());
};
ns.PublicPiskelController.prototype.addFrameAt = function (index) {
this.piskelController.addFrameAt(index);
$.publish(Events.PISKEL_SAVE_STATE, {
type : 'ADD_FRAME',
index : index
});
$.publish(Events.PISKEL_RESET);
};
ns.PublicPiskelController.prototype.removeFrameAt = function (index) {
this.piskelController.removeFrameAt(index);
$.publish(Events.PISKEL_SAVE_STATE, {
type : 'DELETE_FRAME',
index : index
});
$.publish(Events.PISKEL_RESET);
};
ns.PublicPiskelController.prototype.duplicateCurrentFrame = function () {
this.piskelController.duplicateFrameAt(this.getCurrentFrameIndex());
};
ns.PublicPiskelController.prototype.duplicateFrameAt = function (index) {
this.piskelController.duplicateFrameAt(index);
$.publish(Events.PISKEL_SAVE_STATE, {
type : 'DUPLICATE_FRAME',
index : index
});
$.publish(Events.PISKEL_RESET);
};
ns.PublicPiskelController.prototype.moveFrame = function (fromIndex, toIndex) {
this.piskelController.moveFrame(fromIndex, toIndex);
$.publish(Events.PISKEL_SAVE_STATE, {
type : 'MOVE_FRAME',
from : fromIndex,
to : toIndex
});
$.publish(Events.PISKEL_RESET);
};
ns.PublicPiskelController.prototype.getFrameCount = function () {
return this.piskelController.getFrameCount();
};
ns.PublicPiskelController.prototype.setCurrentFrameIndex = function (index) {
this.piskelController.setCurrentFrameIndex(index);
$.publish(Events.PISKEL_RESET);
};
ns.PublicPiskelController.prototype.selectNextFrame = function () {
this.piskelController.selectNextFrame();
$.publish(Events.PISKEL_RESET);
};
ns.PublicPiskelController.prototype.selectPreviousFrame = function () {
this.piskelController.selectPreviousFrame();
$.publish(Events.PISKEL_RESET);
};
ns.PublicPiskelController.prototype.setCurrentLayerIndex = function (index) {
this.piskelController.setCurrentLayerIndex(index);
$.publish(Events.PISKEL_RESET);
};
ns.PublicPiskelController.prototype.selectLayer = function (layer) {
this.piskelController.selectLayer(layer);
$.publish(Events.PISKEL_RESET);
};
ns.PublicPiskelController.prototype.renameLayerAt = function (index, name) {
this.piskelController.renameLayerAt(index, name);
$.publish(Events.PISKEL_SAVE_STATE, {
type : 'RENAME_LAYER',
index : index,
name : name
});
};
ns.PublicPiskelController.prototype.getLayerByIndex = function (index) {
return this.piskelController.getLayerByIndex(index);
};
ns.PublicPiskelController.prototype.createLayer = function (name) {
this.piskelController.createLayer(name);
$.publish(Events.PISKEL_SAVE_STATE, {
type : 'CREATE_LAYER',
name : name
});
};
ns.PublicPiskelController.prototype.moveLayerUp = function () {
this.piskelController.moveLayerUp();
$.publish(Events.PISKEL_SAVE_STATE, {
type : 'LAYER_UP'
});
};
ns.PublicPiskelController.prototype.moveLayerDown = function () {
this.piskelController.removeCurrentLayer();
$.publish(Events.PISKEL_SAVE_STATE, {
type : 'LAYER_DOWN'
});
};
ns.PublicPiskelController.prototype.removeCurrentLayer = function () {
this.piskelController.moveLayerDown();
$.publish(Events.PISKEL_SAVE_STATE, {
type : 'REMOVE_LAYER'
});
};
ns.PublicPiskelController.prototype.serialize = function (compressed) {
return this.piskelController.serialize(compressed);
};
})();

View File

@ -56,7 +56,7 @@
}; };
ns.PngExportController.prototype.getPiskelName_ = function () { ns.PngExportController.prototype.getPiskelName_ = function () {
return this.piskelController.piskel.getDescriptor().name; return this.piskelController.getPiskel().getDescriptor().name;
}; };
ns.PngExportController.prototype.getFramesheetAsBase64Png = function () { ns.PngExportController.prototype.getFramesheetAsBase64Png = function () {

View File

@ -39,7 +39,7 @@
layers.push(layer); layers.push(layer);
} }
var piskel = pskl.model.Piskel.fromLayers(layers, this.piskelController.piskel.getDescriptor()); var piskel = pskl.model.Piskel.fromLayers(layers, this.piskelController.getPiskel().getDescriptor());
pskl.app.piskelController.setPiskel(piskel); pskl.app.piskelController.setPiskel(piskel);
$.publish(Events.CLOSE_SETTINGS_DRAWER); $.publish(Events.CLOSE_SETTINGS_DRAWER);
}; };

View File

@ -21,7 +21,7 @@
this.status = $('#save-status'); this.status = $('#save-status');
var descriptor = this.piskelController.piskel.getDescriptor(); var descriptor = this.piskelController.getPiskel().getDescriptor();
this.nameInput.val(descriptor.name); this.nameInput.val(descriptor.name);
this.descriptionInput.val(descriptor.description); this.descriptionInput.val(descriptor.description);
@ -46,7 +46,7 @@
var isPublic = !!this.isPublicCheckbox.prop('checked'); var isPublic = !!this.isPublicCheckbox.prop('checked');
var descriptor = new pskl.model.piskel.Descriptor(name, description, isPublic); var descriptor = new pskl.model.piskel.Descriptor(name, description, isPublic);
this.piskelController.piskel.setDescriptor(descriptor); this.piskelController.getPiskel().setDescriptor(descriptor);
this.beforeSaving_(); this.beforeSaving_();
pskl.app.store({ pskl.app.store({

View File

@ -60,6 +60,7 @@
*/ */
ns.Frame.prototype.setPixels = function (pixels) { ns.Frame.prototype.setPixels = function (pixels) {
this.pixels = this.clonePixels_(pixels); this.pixels = this.clonePixels_(pixels);
this.s = null;
this.version++; this.version++;
}; };
@ -81,13 +82,19 @@
}; };
ns.Frame.prototype.getHash = function () { ns.Frame.prototype.getHash = function () {
if (!this.s) this.s = JSON.stringify(this.pixels);
return this.s;
return [this.id, this.version].join('-'); return [this.id, this.version].join('-');
}; };
ns.Frame.prototype.setPixel = function (col, row, color) { ns.Frame.prototype.setPixel = function (col, row, color) {
if (this.containsPixel(col, row)) { if (this.containsPixel(col, row)) {
this.pixels[col][row] = color; var p = this.pixels[col][row];
this.version++; if (p !== color) {
this.s = null;
this.pixels[col][row] = color;
this.version++;
}
} }
}; };

View File

@ -39,6 +39,7 @@
frame.getHash() frame.getHash()
].join('-'); ].join('-');
if (this.serializedFrame != serializedFrame) { if (this.serializedFrame != serializedFrame) {
// console.log('rendering')
this.serializedFrame = serializedFrame; this.serializedFrame = serializedFrame;
this.superclass.render.call(this, frame); this.superclass.render.call(this, frame);
} }

View File

@ -22,8 +22,8 @@
var offset = this.getOffset(); var offset = this.getOffset();
var size = this.getDisplaySize(); var size = this.getDisplaySize();
var layers = this.piskelController.getLayers(); var layers = this.piskelController.getLayers();
var currentFrameIndex = this.piskelController.currentFrameIndex; var currentFrameIndex = this.piskelController.getCurrentFrameIndex();
var currentLayerIndex = this.piskelController.currentLayerIndex; var currentLayerIndex = this.piskelController.getCurrentLayerIndex();
var serializedRendering = [ var serializedRendering = [
this.getZoom(), this.getZoom(),

View File

@ -29,7 +29,7 @@
}; };
ns.AppEngineStorageService.prototype.prepareFormData_ = function () { ns.AppEngineStorageService.prototype.prepareFormData_ = function () {
var piskel = this.piskelController.piskel; var piskel = this.piskelController.getPiskel();
var descriptor = piskel.getDescriptor(); var descriptor = piskel.getDescriptor();
var formData = new FormData(); var formData = new FormData();

View File

@ -1,7 +1,7 @@
(function () { (function () {
var ns = $.namespace('pskl.service'); var ns = $.namespace('pskl.service');
var SNAPSHOT_PERIOD = 5; var SNAPSHOT_PERIOD = 50;
ns.HistoryService = function (piskelController) { ns.HistoryService = function (piskelController) {
this.piskelController = piskelController; this.piskelController = piskelController;
@ -57,7 +57,6 @@
ns.HistoryService.prototype.loadState = function (index) { ns.HistoryService.prototype.loadState = function (index) {
$.unsubscribe(Events.PISKEL_SAVE_STATE, this.saveState__b); $.unsubscribe(Events.PISKEL_SAVE_STATE, this.saveState__b);
this.piskelController.silence();
// get nearest snaphot index // get nearest snaphot index
var snapshotIndex = -1; var snapshotIndex = -1;
@ -93,7 +92,6 @@
var lastState = this.stateQueue[index]; var lastState = this.stateQueue[index];
this.setupState(lastState); this.setupState(lastState);
this.piskelController.voice();
$.subscribe(Events.PISKEL_SAVE_STATE, this.saveState__b); $.subscribe(Events.PISKEL_SAVE_STATE, this.saveState__b);
$.publish(Events.PISKEL_RESET); $.publish(Events.PISKEL_RESET);
}; };

View File

@ -2,7 +2,7 @@
var ns = $.namespace('pskl.service'); var ns = $.namespace('pskl.service');
ns.SavedStatusService = function (piskelController) { ns.SavedStatusService = function (piskelController) {
this.piskelController_ = piskelController; this.piskelController = piskelController;
}; };
ns.SavedStatusService.prototype.init = function () { ns.SavedStatusService.prototype.init = function () {
@ -15,7 +15,7 @@
}; };
ns.SavedStatusService.prototype.onPiskelReset = function () { ns.SavedStatusService.prototype.onPiskelReset = function () {
var piskel = this.piskelController_.piskel; var piskel = this.piskelController.getPiskel();
// A first PISKEL_RESET is triggered during the load of a new Piskel, it should be ignored // A first PISKEL_RESET is triggered during the load of a new Piskel, it should be ignored
// putting a firstResetDone flag as a nasty workaround for this // putting a firstResetDone flag as a nasty workaround for this
if (piskel.firstResetDone_) { if (piskel.firstResetDone_) {
@ -34,7 +34,7 @@
}; };
ns.SavedStatusService.prototype.updateDirtyStatus = function (status) { ns.SavedStatusService.prototype.updateDirtyStatus = function (status) {
var piskel = this.piskelController_.piskel; var piskel = this.piskelController.getPiskel();
if (piskel.isDirty_ !== status) { if (piskel.isDirty_ !== status) {
// Redraw piskel name only if dirty status actually changed // Redraw piskel name only if dirty status actually changed
piskel.isDirty_ = status; piskel.isDirty_ = status;
@ -43,7 +43,7 @@
}; };
ns.SavedStatusService.prototype.updatePiskelName = function () { ns.SavedStatusService.prototype.updatePiskelName = function () {
var piskel = this.piskelController_.piskel; var piskel = this.piskelController.getPiskel();
var name = piskel.getDescriptor().name; var name = piskel.getDescriptor().name;
if (piskel.isDirty_) { if (piskel.isDirty_) {
$('.piskel-name').html(name + ' *'); $('.piskel-name').html(name + ' *');
@ -53,7 +53,7 @@
}; };
ns.SavedStatusService.prototype.onBeforeUnload = function (evt) { ns.SavedStatusService.prototype.onBeforeUnload = function (evt) {
var piskel = this.piskelController_.piskel; var piskel = this.piskelController.getPiskel();
if (piskel.isDirty_) { if (piskel.isDirty_) {
var confirmationMessage = "Your Piskel seems to have unsaved changes"; var confirmationMessage = "Your Piskel seems to have unsaved changes";

View File

@ -65,7 +65,8 @@
"js/rendering/PiskelRenderer.js", "js/rendering/PiskelRenderer.js",
// Controllers // Controllers
"js/controller/PiskelController.js", "js/controller/piskel/PiskelController.js",
"js/controller/piskel/PublicPiskelController.js",
"js/controller/CursorCoordinatesController.js", "js/controller/CursorCoordinatesController.js",
"js/controller/DrawingController.js", "js/controller/DrawingController.js",
"js/controller/PreviewFilmController.js", "js/controller/PreviewFilmController.js",