/* Drawing palette to display a drawing onto the canvas */ define([ 'sugar-web/graphics/palette', 'mustache' ], function(palette, mustache) { var drawingspalette = {}; function onDrawingSelect(event) { /* Calculation of the drawing url */ var url = window.location.href.split('/'); url.pop(); url = url.join('/') + '/' + event.detail.drawings; var ctx = PaintApp.elements.canvas.getContext('2d'); /* Http request to load the drawing */ var request = new XMLHttpRequest(); request.open('GET', url, true); request.onload = function(e) { if (request.status === 200 || request.status === 0) { var imgSRC = request.responseText; //We load the drawing inside an image element var element = document.createElement('img'); element.src = 'data:image/svg+xml;base64,' + btoa(imgSRC); element.onload = function() { //We draw the drawing to the canvas var ctx = PaintApp.elements.canvas.getContext('2d'); var imgWidth = element.width; var imgHeight = element.height; var maxWidth = PaintApp.elements.canvas.getBoundingClientRect().width; var maxHeight = PaintApp.elements.canvas.getBoundingClientRect().height; var ratio = Math.min(maxWidth / imgWidth, maxHeight / imgHeight); var newWidth = ratio * imgWidth; var newHeight = ratio * imgHeight; ctx.clearRect(0, 0, PaintApp.elements.canvas.width, PaintApp.elements.canvas.height); ctx.drawImage(element, 0, 0, newWidth, newHeight); PaintApp.saveCanvas(); /* If the activity is shared we send the element to everyone */ if (PaintApp.data.isShared) { try { PaintApp.collaboration.sendMessage({ action: 'toDataURL', data: { width: PaintApp.elements.canvas.width / window.devicePixelRatio, height: PaintApp.elements.canvas.height / window.devicePixelRatio, src: PaintApp.collaboration.compress(PaintApp.elements.canvas.toDataURL()) } }); } catch (e) {} } }; } }; request.send(null); } function initGui() { var drawingsButton = document.getElementById('drawings-button'); var drawingsPalette = new PaintApp.palettes.drawingsPalette.DrawingsPalette(drawingsButton, undefined); drawingsPalette.addEventListener('drawingsChange', onDrawingSelect); } drawingspalette.initGui = initGui; /* We setup the palette with drawings */ drawingspalette.DrawingsPalette = function(invoker, primaryText) { palette.Palette.call(this, invoker, primaryText); this.drawingsChangeEvent = document.createEvent('CustomEvent'); this.drawingsChangeEvent.initCustomEvent('drawingsChange', true, true, { 'drawings': 'icons/size-1.svg' }); this.template = '' + '{{#rows}}' + '' + '{{#.}}' + '' + '' + '' + '{{/.}}' + '' + '{{/rows}}' + ''; var drawingssElem = document.createElement('table'); drawingssElem.className = 'drawingss'; var drawingssData = { rows: [ [{ drawings: 'drawings/woodpecker.svg' }, { drawings: 'drawings/tortoise.svg' }, { drawings: 'drawings/manatee.svg' }], [{ drawings: 'drawings/dog.svg' }, { drawings: 'drawings/goldfinch.svg' }, { drawings: 'drawings/mammoth.svg' }] ] }; drawingssElem.innerHTML = mustache.render(this.template, drawingssData); this.setContent([drawingssElem]); // Pop-down the palette when a item in the menu is clicked. this.buttons = drawingssElem.querySelectorAll('button'); var that = this; function popDownOnButtonClick(event) { that.drawingsChangeEvent.detail.drawings = event.target.value; that.getPalette().dispatchEvent(that.drawingsChangeEvent); that.popDown(); } for (var i = 0; i < this.buttons.length; i++) { this.buttons[i].addEventListener('click', popDownOnButtonClick); } }; var setdrawings = function(index) { // Click the nth button var event = document.createEvent('MouseEvents'); event.initEvent('click', true, true); this.buttons[index].dispatchEvent(event); }; var addEventListener = function(type, listener, useCapture) { return this.getPalette().addEventListener(type, listener, useCapture); }; drawingspalette.DrawingsPalette.prototype = Object.create(palette.Palette.prototype, { setdrawings: { value: setdrawings, enumerable: true, configurable: true, writable: true }, addEventListener: { value: addEventListener, enumerable: true, configurable: true, writable: true } }); return drawingspalette; });