define([ 'js/events', 'js/generator', 'js/renderer', 'js/input', 'ui/factory', 'js/client', 'js/constants' ], function ( events, generator, renderer, input, uiFactory, client, constants ) { return { init: function () { if (constants.standAlone) this.events.onConnected.call(this); else client.init(this.events.onConnected.bind(this)); }, render: function () { if (renderer.dirty) renderer.render(generator.nodes, generator.links); window.requestAnimationFrame(this.render.bind(this)); }, events: { onConnected: function () { uiFactory.init(); generator.init(); renderer.init(); input.init(); events.on('onMouseDown', this.events.onMouseDown.bind(this, true)); events.on('onMouseUp', this.events.onMouseDown.bind(this, false)); events.on('onMouseMove', this.events.onMouseMove.bind(this)); events.on('onMouseWheel', this.events.onMouseWheel.bind(this)); events.on('onKeyDown', this.events.onKeyDown.bind(this)); $(window).on('focus', this.events.onFocus.bind(this)); uiFactory.build('mode'); uiFactory.build('menu'); uiFactory.build('groups'); uiFactory.build('nodeInfo'); uiFactory.build('tooltip'); renderer.center(generator.nodes[0]); this.render(); }, onMouseDown: function (isDown, e) { var success = false; if ((input.isKeyDown('shift')) && (e.button == 2)) { success = true; if (e.down) events.emit('onStartAreaSelect', e); else events.emit('onEndAreaSelect', e); } else if (isDown) { if (generator.mode != 'none') { e.button = ([ 'place', 'link', 'select' ]).indexOf(generator.mode); } var action = ([ 'addNode', 'connectNode', 'selectNode' ])[e.button]; success = generator.callAction(action, { x: e.x, y: e.y, shiftDown: input.isKeyDown('shift') }); } else if ((!isDown) && (e.button != 1) && (generator.getSelected().length <= 1)) generator.callAction('selectNode', {}); if ((!isDown) || (!success)) renderer.pan(e.raw, isDown ? 'down' : 'up'); renderer.makeDirty(); }, onMouseMove: function (e) { if ((!e.down) || (e.button != 2) || (input.isKeyDown('shift'))) return; if (generator.callAction('moveNode', { x: e.x, y: e.y })) return; renderer.pan(e.raw, 'move'); }, onMouseWheel: function (e) { var delta = (e.delta > 0) ? 1 : 0; var action = ([ 'resizeNode', 'recolorNode' ])[delta]; if (!action) return; if (!generator.callAction(action, {})) renderer.zoom(delta); renderer.makeDirty(); }, onKeyDown: function (key) { if (key == 'z') { renderer.zoom(0, 1); renderer.makeDirty(); return; } var action = ({ d: 'deleteNode', c: 'recolorNode', r: 'resizeNode' })[key]; if (!action) return; generator.callAction(action, {}); renderer.makeDirty(); }, onFocus: function () { renderer.makeDirty(); } } }; });