+ decentralized shortcut declaration
+ each service/controller is now responsible for declaring its shorcuts
- documentation (cheatsheet) is still to be maintained manually
- init order matters (shortcutService has to be instanciated before
everyone else) => should have a standalone KeyboardService singleton
which is ready as soon as it is loaded
+ cleanup of color management
+ colors are now stored in palette controller
+ drawing controller has a dependency on palette controller
+ UPDATE COLOR events have been removed (they were used only for
synchronizing palette and drawing controller)
+ added shortcuts for all tools in ToolController
+ modified structure of tools in Controller to Array of descriptors to
allow to declare shortcuts directly when setting up the tool controller
+ moved keycode translation to KeycodeTranslator
+ made KeycodeTranslator more generic to handle 0-9 and a-z keys
+ small refactor in KeyboardEventService
+ added explanatory comment for CanvasUtils.disableImageSmoothing
+ detect browser for chosing wheel/mousewheel event in DrawingController
+ create ABSTRACT_FUNCTION constant to be reused forabstract methods
+ moved Serializer and Deserializer to utils.serialization package
+ put all backward code in utils.serialization.backward
+ added static method on Deserializer to make its usage similar to other
utils in the package
- still not happy with the names used in Deserializer classes
(deserializer.deserialize ...)
+ ImportController is no longer relying on the deserializer to build a
piskel instance
+ Static builders have been added to Piskel and Layer to help easily
create new instances from existing elements
+ piskel deserialization is now clearly asynchronous
+ added utils.Deserializer (not a singleton though, more a builder/loader)
+ utils.Deserializer constructor expects a callback
+ when all layers are loaded and piskel is ready, the callback provided by
the client is called with piskel as the first argument
- Deserializer doesn't fit in the utils package, which should be reserved
to singletons : can move it to service as a PiskelLoaderService, and
Deserializer could remain with only the purely static methods
- ImportController is realying on the Deserializer to build a Piskel but
it shouldn't. Find a way to mutualize the code necessary to create a
Piskel from an array of pskl.model.Frame
- still cleanup to do in app.js
- comments to add as well
- Initial implementation : working but ...
- MODEL_VERSION has been bumped to 2
- The loading process is now theoretically asynchronous (loading images to
read the content of the layers), but for now, the asynchronous behaviour
is hidden behind a nasty hack, which is somehow similar to lazy loading.
When loading the piskel, a Piskel is created synchronously, with fake
empty frames, and as the images will get loaded, the fake frames will be
replaced by the actual frames.
I really don't like this, and the asynchronous nature of the loading
should be clearly expressed
- There is no backward compatible deserializer for the previous version of
the model (1)
- The Serializer utils is just badly designed. Serialization and
deserialization should be splitted into two different classes
- Saving & loading are still done in app.js and should be moved to
services
BUT : the size of the piskels is now pretty small. A piskel which was
using 890kB previously is now using only 10kB. Although it should be
noted, that after gzip there is no significant difference between this
version and the existing one. The only gains we can really expect with
this are : less disk space used on appengine, ability to reuse the
layers' pngs directly on piskel-website (but to be honest I can't see any
valid use case for this)
- fix : removed duplicated code between ImageResizer and CanvasUtils
(disabledImageSmoothing utility method)
- added pskl.utils.UserAgent, basic user agent sniffer. I need it to sniff
out IE10 for frame rendering (and it's not possible to feature detect
here). Can check isChrome, isFirefox, isIE and get the version for each
of them
- added resizeNearestNeighbour in ImageResizer. Readapted from piskel
website, this allows us to 1 - resize without AA on IE10, and 2 - add a
pixel gap to reenable the GRID
- finally : added back support for GRID !
- also extracted the 'zoomed out background color' as a constant in
Constant.js
- Minimap usability : mouseup and mousemove events are now plugged on
document.body instead of the minimap's controller. This way the user can
move his mouse outside the container to keep moving the map's frame.
Also the mouseup information is no longer lost if it occurs outside for
the minimap.
- When imported 1 picture and then importing another one, the picture
preview was not cleaned and was displaying the two images side by side.
Fixed in ImportController.js
- Switched all double-quoted strings in ImportController to single-quoted
strings. Should enforce this using jshint
- Aligned all inputs in the import picture panel
- Renamed 'Preview :' import section to 'Info :'. Mostly it's to make it
shorter, but also I'd like to display additional information to the
right of the preview in the future.
- Added MinimapController that displays a frame on the animated preview
when zoomed in
- Added bounds for the offset to make sure it doesn't go crazy
- Added new utility Math.js with a minmax function
- TODO : the minimap controller has a lot of dependencies, see if could be
cleaned up
- TODO : DrawingController knows the size of the picture it has to render
only indirectly, which makes it hard in some cases (such as boundary
checking performed during setOffset)
- Extracted layers rendering logic from DrawingController to dedicated
class
- Turned RendererManager into Composite renderer (extends
AbstractRenderer)
- AbstractRenderer no longer contains a render(frame) method, implementing
the render differs too much between my current renderers to impose a
single signature, but I should improve this later if too much time on ma
hands
- simplified Renderer(s) architecture (removed decorator,
CachedFrameRenderer simply inherits from FrameRenderer now)
- keeping AbstractRenderer to act as interface
- fixed issue with layers : forgot to clone the first frame while merging
and therefore was modifying the original frame when I just wanted to
create a tmp frame (FrameUtils.js)
- extracted the mousemove throttling delay used in DrawingController to
Constants.js and reduced it from 40ms to 10ms