define(["sugar-web/activity/activity","sugar-web/datastore","sugar-web/env","textpalette","sugar-web/graphics/menupalette","sugar-web/graphics/journalchooser","lzstring","webL10n","toon"], function (activity, datastore, env, textpalette, menupalette, journalchooser, lzstring, l10n, toon) {
|
|
|
|
|
|
// initialize canvas size
|
|
var sugarCellSize = 75;
|
|
var sugarSubCellSize = 15;
|
|
|
|
env.getEnvironment(function(err, environment) {
|
|
var defaultLanguage = (typeof chrome != 'undefined' && chrome.app && chrome.app.runtime) ? chrome.i18n.getUILanguage() : navigator.language;
|
|
var language = environment.user ? environment.user.language : defaultLanguage;
|
|
l10n.language.code = language;
|
|
console.log('LANG ' + language);
|
|
});
|
|
|
|
function _(text) {
|
|
// this function add a fallback for the case of translation not found
|
|
// can be removed when we find how to read the localization.ini
|
|
// file in the case of local html file opened in the browser
|
|
translation = l10n.get(text);
|
|
if (translation == '') {
|
|
translation = text;
|
|
};
|
|
return translation;
|
|
};
|
|
|
|
// Manipulate the DOM only when it is ready.
|
|
requirejs(['domReady!'], function (doc) {
|
|
|
|
// Initialize the activity.
|
|
activity.setup();
|
|
|
|
// HERE GO YOUR CODE
|
|
|
|
var initialData = {"version": "1", "boxs": [{'globes':[]}]};
|
|
|
|
var mainCanvas = document.getElementById("mainCanvas");
|
|
var sortCanvas = document.getElementById("sortCanvas");
|
|
// remove 5 more to be sure no scrollbars are visible
|
|
mainCanvas.height = window.innerHeight - sugarCellSize - 5;
|
|
mainCanvas.width = mainCanvas.height * 4 / 3;
|
|
mainCanvas.style.left = ((window.innerWidth - mainCanvas.width) / 2) + "px";
|
|
|
|
var previousButton = document.getElementById("previous-button");
|
|
previousButton.title = _("Previous");
|
|
previousButton.addEventListener('click', function (e) {
|
|
toonModel.showPreviousBox();
|
|
});
|
|
|
|
var nextButton = document.getElementById("next-button");
|
|
nextButton.title = _("Next");
|
|
nextButton.addEventListener('click', function (e) {
|
|
toonModel.showNextBox();
|
|
});
|
|
|
|
var textButton = document.getElementById("text-button");
|
|
textButton.title = _('EditText');
|
|
var tp = new textpalette.TextPalette(textButton, toonModel,
|
|
_('SetGlobeText'));
|
|
|
|
// page counter
|
|
var pageCounter = document.getElementById("page-counter");
|
|
|
|
|
|
var toonModel = new toon.Model(initialData, mainCanvas, tp);
|
|
toonModel.init();
|
|
toonModel.attachPageCounterViewer(pageCounter);
|
|
toonModel.attachPrevNextButtons(previousButton, nextButton);
|
|
|
|
var editMode = true;
|
|
|
|
var addGlobeButton = document.getElementById("add-globe");
|
|
addGlobeButton.title = _('AddAglobe');
|
|
var menuData = [{'icon': true, 'id': toon.TYPE_GLOBE,
|
|
'label': _('Globe')},
|
|
{'icon': true, 'id': toon.TYPE_EXCLAMATION,
|
|
'label': _('Exclamation')},
|
|
{'icon': true, 'id': toon.TYPE_WHISPER,
|
|
'label': _('Whisper')},
|
|
{'icon': true, 'id': toon.TYPE_CLOUD,
|
|
'label': _('Think')},
|
|
{'icon': true, 'id': toon.TYPE_RECTANGLE,
|
|
'label': _('Box')},];
|
|
var mp = new menupalette.MenuPalette(addGlobeButton,
|
|
_("AddAglobe"), menuData);
|
|
|
|
for (var i = 0; i < mp.buttons.length; i++) {
|
|
mp.buttons[i].addEventListener('click', function(e) {
|
|
toonModel.addGlobe(this.id);
|
|
});
|
|
};
|
|
|
|
var addButton = document.getElementById("add-button");
|
|
addButton.title = _("Add");
|
|
addButton.addEventListener('click', function (e) {
|
|
journalchooser.show(function (entry) {
|
|
// No selection
|
|
if (!entry) {
|
|
return;
|
|
}
|
|
// Get object content
|
|
var dataentry = new datastore.DatastoreObject(entry.objectId);
|
|
dataentry.loadAsText(function (err, metadata, text) {
|
|
//We load the drawing inside an image element
|
|
var element = document.createElement('img');
|
|
if (entry.metadata.activity == 'org.olpcfrance.PaintActivity') {
|
|
element.src = lzstring.decompressFromUTF16(JSON.parse(text).src);
|
|
} else {
|
|
element.src = text;
|
|
}
|
|
element.onload = function () {
|
|
toonModel.addImage(element.src);
|
|
};
|
|
});
|
|
}, { mimetype: 'image/png' }, { mimetype: 'image/jpeg' }, { activity: 'org.olpcfrance.PaintActivity'});
|
|
});
|
|
|
|
// Load from datatore
|
|
env.getEnvironment(function(err, environment) {
|
|
if (environment.objectId) {
|
|
activity.getDatastoreObject().loadAsText(function(error, metadata, JSONdata) {
|
|
if (error==null && JSONdata!=null) {
|
|
var data = JSON.parse(JSONdata);
|
|
var dataWithoutImages = data.dataWithoutImages;
|
|
var images = data.dataImages;
|
|
dataWithoutImages.images = {};
|
|
for(var key in images) {
|
|
var imageName = key;
|
|
dataWithoutImages.images[imageName] = LZString.decompressFromUTF16(images[imageName]);
|
|
}
|
|
toonModel.setData(dataWithoutImages);
|
|
if (!editMode) {
|
|
toonModel.changeToEditMode();
|
|
editMode = true;
|
|
};
|
|
}
|
|
});
|
|
}
|
|
});
|
|
|
|
var stopButton = document.getElementById("stop-button");
|
|
stopButton.addEventListener('click', function (event) {
|
|
console.log("writing...");
|
|
toonModel.showWait();
|
|
|
|
if (!editMode) {
|
|
toonModel.finishSort();
|
|
toonModel.init();
|
|
editMode = true;
|
|
};
|
|
|
|
// clone the data to remove the images
|
|
var dataWithoutImages = {}
|
|
dataWithoutImages['version'] = toonModel.getData()['version'];
|
|
dataWithoutImages['boxs'] = toonModel.getData()['boxs'];
|
|
|
|
dataImages = {};
|
|
for(var key in toonModel.getData()['images']) {
|
|
var imageName = key;
|
|
console.log('saving image ' + imageName);
|
|
dataImages[imageName] = LZString.compressToUTF16(toonModel.getData()['images'][imageName]);
|
|
};
|
|
|
|
var fullData = {
|
|
dataWithoutImages: dataWithoutImages,
|
|
dataImages: dataImages
|
|
};
|
|
toonModel.hideWait();
|
|
var jsonData = JSON.stringify(fullData);
|
|
activity.getDatastoreObject().setDataAsText(jsonData);
|
|
activity.getDatastoreObject().save(function (error) {
|
|
if (error === null) {
|
|
console.log("write done.");
|
|
} else {
|
|
console.log("write failed.");
|
|
}
|
|
});
|
|
});
|
|
|
|
var saveImageButton = document.getElementById("image-save");
|
|
saveImageButton.title = _("SaveAsImage");
|
|
var saveImageMenuData = [{'id': '0', 'label': _('OneRow')},
|
|
{'id': '1', 'label': _('OneColumn')},
|
|
{'id': '2', 'label': _('TwoColumns')}];
|
|
var simp = new menupalette.MenuPalette(saveImageButton,
|
|
_("SaveAsImage"), saveImageMenuData);
|
|
|
|
for (var i = 0; i < simp.buttons.length; i++) {
|
|
simp.buttons[i].addEventListener('click', function(e) {
|
|
toonModel.saveAsImage(this.id);
|
|
});
|
|
};
|
|
|
|
var sortButton = document.getElementById("sort-button");
|
|
sortButton.title = _('Sort');
|
|
toonModel.attachSortButton(sortButton);
|
|
|
|
sortButton.addEventListener('click', function (e) {
|
|
// verify if there are at least 3 boxes
|
|
// the first box is the title and can't be moved
|
|
// then only have sense sort with more than 2 boxes
|
|
if (toonModel.getData()['boxs'].length < 3) {
|
|
return;
|
|
};
|
|
toonModel.showWait();
|
|
if (editMode) {
|
|
toonModel.initPreviews();
|
|
// resize the canvas
|
|
sortCanvas.width = window.innerWidth - sugarCellSize * 2;
|
|
var boxWidth = sortCanvas.width / toonModel.getData()['boxs'].length;
|
|
sortCanvas.height = boxWidth * 3 / 4;
|
|
sortCanvas.style.left = ((window.innerWidth - sortCanvas.width) / 2) + "px";
|
|
sortCanvas.style.top = ((window.innerHeight - sortCanvas.height) / 2) + "px";
|
|
toonModel.initSort(sortCanvas);
|
|
} else {
|
|
toonModel.finishSort();
|
|
toonModel.init();
|
|
};
|
|
toonModel.hideWait();
|
|
// switch editMode
|
|
editMode = ! editMode;
|
|
|
|
});
|
|
|
|
var cleanAllButton = document.getElementById("clean-all-button");
|
|
cleanAllButton.title = _("Clean");
|
|
|
|
cleanAllButton.addEventListener('click', function (e) {
|
|
|
|
toonModel.setData(initialData);
|
|
if (!editMode) {
|
|
toonModel.changeToEditMode();
|
|
editMode = true;
|
|
};
|
|
});
|
|
|
|
});
|
|
|
|
});
|