/*global define, $, TimelineLite, TweenLite, require, tmpl, console */
/**
* Tools module. Contains tools accessible through Advanced Toolbar.
*
* Contains the advanced tools as a popup.
*
* @module Tools
* @main Tools
*/
/**
* AdvancedToolbar class.
*
* @class AdvancedToolbar
* @static
* @uses dojo/_base/lang
* @uses dojo/_base/array
* @uses dojo/topic
* @uses dojo/Deferred
* @uses ramp/eventManager
* @uses ramp/map
* @uses ramp/globalStorage
* @uses PopupManager
*/
define([
// Dojo
"dojo/_base/lang", "dojo/_base/array", "dojo/topic", "dojo/Deferred",
// Ramp
"ramp/eventManager", "ramp/map", "ramp/globalStorage",
// Util
"utils/util", "utils/dictionary", "utils/popupManager",
"utils/tmplHelper",
// Text
"dojo/text!./templates/advanced_toolbar_template.json"
],
function (
// Dojo
dojoLang, dojoArray, topic, Deferred,
// Ramp
EventManager, RampMap, globalStorage,
// Util
UtilMisc, UtilDict, PopupManager, TmplHelper,
// Text
advanced_toolbar_template_json) {
"use strict";
var advancedToggle,
advancedSectionContainer,
advancedToolbarList,
cssButtonPressedClass = "button-pressed",
transitionDuration = 0.4,
map,
tools = [
// name,
// selector,
// enabled,
// module
],
ui = {
/**
* Initiates additional UI components of the widget, setting listeners and other stuff.
*
* @method ui.init
* @private
*/
init: function () {
var viewport = $(".viewport"),
subPanelContainer,
panelToggle = viewport.find("#panel-toggle"),
advancedToolbarTimeLine = new TimelineLite({
paused: true,
onComplete: function () { },
onReverseComplete: function () { }
});
advancedToggle = viewport.find("#advanced-toggle");
advancedSectionContainer = viewport.find("#advanced-toolbar");
// create html code for advancedToolbar
tmpl.cache = {};
tmpl.templates = JSON.parse(TmplHelper.stringifyTemplate(advanced_toolbar_template_json));
advancedSectionContainer.append(tmpl("at_main"));
advancedToolbarList = advancedSectionContainer.find("#advanced-toolbar-list");
advancedToolbarTimeLine
.set(advancedSectionContainer, { display: "block" }, 0)
.set(viewport, { className: "+=advanced-toolbar-mode" }, 0)
.fromTo(advancedToolbarList, transitionDuration, { top: -32 }, { top: 0, ease: "easeOutCirc" }, 0)
.to(panelToggle, transitionDuration, { top: "+=32", ease: "easeOutCirc" }, 0);
// register the popup for the advanced toolbar
PopupManager.registerPopup(advancedToggle, "click",
function (d) {
topic.publish(EventManager.GUI.TOOLBAR_SECTION_OPEN, { id: "advanced-toolbar" });
// close this panel if any other panel is opened
UtilMisc.subscribeOnce(EventManager.GUI.TOOLBAR_SECTION_OPEN, dojoLang.hitch(this,
function (evt) {
if (evt.id !== "advanced-toolbar" && this.isOpen()) {
this.close();
}
})
);
// perform transitions
subPanelContainer = viewport.find(".sub-panel-container");
TweenLite.fromTo(subPanelContainer, transitionDuration,
{ "margin-top": 0 },
{ "margin-top": 32, ease: "easeOutCirc" });
advancedToolbarTimeLine.eventCallback("onComplete", d.resolve, [], this);
advancedToolbarTimeLine.play();
},
{
activeClass: cssButtonPressedClass,
setClassBefore: true,
target: advancedSectionContainer,
closeHandler: function (d) {
topic.publish(EventManager.GUI.TOOLBAR_SECTION_CLOSE, { id: "advanced-toolbar" });
// deactivate all the tools
deactivateAll();
// perform transitions
subPanelContainer = viewport.find(".sub-panel-container");
TweenLite.fromTo(subPanelContainer, transitionDuration,
{ "margin-top": 32 },
{ "margin-top": 0, ease: "easeInCirc" });
advancedToolbarTimeLine.eventCallback("onReverseComplete", d.resolve, [], this);
advancedToolbarTimeLine.reverse();
}
}
);
map = RampMap.getMap();
},
addTool: function (tool) {
advancedToolbarList.append(tool.module.node);
}
};
/**
* Deactivates all the tools. Used when closing the Advanced toolbar or when another tool is being activated.
*
* @method deactivateAll
* @param {Tool} except A tool module that should not be deactivated.
* @private
*/
function deactivateAll(except) {
// deactivate all the tools except "except" tool
tools.forEach(function (tool) {
if ((!except || except.name !== tool.name) && tool.module) {
tool.module.deactivate();
}
});
}
return {
init: function () {
var toolsRequire;
ui.init();
tools = globalStorage.config.advancedToolbar.tools;
toolsRequire = tools
.filter(function (tool) { return tool.enabled; })
.map(function (tool) {
return "tools/" + tool.name;
});
// load all the tools in one go
console.log("toolbar : loading tools", toolsRequire);
require(toolsRequire, function () {
var deferredList = [],
deferred,
args = Array.prototype.slice.call(arguments);
args.forEach(function () {
deferredList.push(new Deferred());
});
UtilMisc.afterAll(deferredList, function () {
// insert tool buttons into the toolbar
tools.forEach(ui.addTool);
});
args.forEach(function (arg, index) {
deferred = new Deferred();
deferred.then(function (module) {
tools[index].module = module;
deferredList[index].resolve();
});
arg
.init(tools[index].selector, deferred)
.on(arg.event.ACTIVATE, function () {
console.log(arg.name, ": is activated");
deactivateAll(arg);
});
});
console.log(args);
});
}
};
});