jsketch/jquery.sketchable.memento.m...

2 lines
2.4 KiB
JavaScript

(function($){var MementoCanvas=function($canvas){var stack=[];var stpos=-1;var self=this;function prev(){if(stpos>0){stpos--;var snapshot=new Image;snapshot.src=stack[stpos].image;snapshot.onload=function(){restore(this)}}}function next(){if(stpos<stack.length-1){stpos++;var snapshot=new Image;snapshot.src=stack[stpos].image;snapshot.onload=function(){restore(this)}}}function restore(snapshot){$canvas.sketchable("handler",function(elem,data){data.sketch.clear();data.sketch.graphics.drawImage(snapshot,0,0)})}function keyManager(e){if(e.ctrlKey){switch(e.which){case 26:if(e.shiftKey)self.redo();else self.undo();break;case 25:self.redo();break;default:break}}}this.undo=function(){prev();$canvas.sketchable("handler",function(elem,data){if(stack[stpos])data.strokes=stack[stpos].strokes.slice()})};this.redo=function(){next();$canvas.sketchable("handler",function(elem,data){if(stack[stpos])data.strokes=stack[stpos].strokes.slice()})};this.reset=function(){stack=[];stpos=-1};this.save=function(){stpos++;if(stpos<stack.length)stack.length=stpos;$canvas.sketchable("handler",function(elem,data){stack.push({image:elem[0].toDataURL(),strokes:data.strokes.slice()})})};this.init=function(){$(document).off("keypress",keyManager);$(document).on("keypress",keyManager)};this.destroy=function(){$(document).off("keypress",keyManager);this.reset()}};var plugin=$.fn.sketchable;var availMethods=plugin("methods");function configure(elem,opts){var self=elem,options=$.extend(true,plugin.defaults,opts);if(!options.interactive)return opts;var mc=new MementoCanvas(elem);var callbacks={init:function(elem,data){data.memento=mc;data.memento.save();data.memento.init()},clear:function(elem,data){data.memento.save()},mouseup:function(elem,data,e){data.memento.save()},destroy:function(elem,data){data.memento.destroy()}};function override(ev){if(options&&options.events&&typeof options.events[ev]==="function"){var fn=options.events[ev];options.events[ev]=function(){var args=Array.prototype.slice.call(arguments,0);fn.apply(self,args);callbacks[ev].apply(self,args)}}else{plugin.defaults.events[ev]=callbacks[ev]}}if(!plugin.isMementoReady){var events="init mouseup clear destroy".split(" ");for(var i=0;i<events.length;i++){override(events[i])}plugin.isMementoReady=true}$.extend(availMethods,{undo:function(){mc.undo()},redo:function(){mc.redo()}});return plugin.defaults}var initfn=availMethods.init;availMethods.init=function(opts){var conf=configure(this,opts);return initfn.call(this,conf)}})(jQuery);