/** * Created by Alex on 1/22/14. */ var UIMixin = { /** * This function moves the UI if the canvas size has been changed. If the arugments * verticaAlignTop and horizontalAlignLeft are false, the correction will be made * * @private */ _relocateUI : function() { if (this.sectors !== undefined) { var xOffset = this.UIclientWidth - this.frame.canvas.clientWidth; var yOffset = this.UIclientHeight - this.frame.canvas.clientHeight; this.UIclientWidth = this.frame.canvas.clientWidth; this.UIclientHeight = this.frame.canvas.clientHeight; var node = null; for (var nodeId in this.sectors["UI"]["nodes"]) { if (this.sectors["UI"]["nodes"].hasOwnProperty(nodeId)) { node = this.sectors["UI"]["nodes"][nodeId]; if (!node.horizontalAlignLeft) { node.x -= xOffset; } if (!node.verticalAlignTop) { node.y -= yOffset; } } } } }, /** * Creation of the UI nodes. They are drawn over the rest of the nodes and are not affected by scale and translation * they have a triggerFunction which is called on click. If the position of the UI is dependent * on this.frame.canvas.clientWidth or this.frame.canvas.clientHeight, we flag horizontalAlignLeft and verticalAlignTop false. * This means that the location will be corrected by the _relocateUI function on a size change of the canvas. * * @private */ _loadUIElements : function() { var DIR = 'img/UI/'; this.UIclientWidth = this.frame.canvas.clientWidth; this.UIclientHeight = this.frame.canvas.clientHeight; if (this.UIclientWidth === undefined) { this.UIclientWidth = 0; this.UIclientHeight = 0; } var UINodes = [ {id: 'UI_up', shape: 'image', image: DIR + 'uparrow.png', triggerFunction: "_moveUp", verticalAlignTop: false, x: 52, y: this.UIclientHeight - 52}, {id: 'UI_down', shape: 'image', image: DIR + 'downarrow.png', triggerFunction: "_moveDown", verticalAlignTop: false, x: 52, y: this.UIclientHeight - 20}, {id: 'UI_left', shape: 'image', image: DIR + 'leftarrow.png', triggerFunction: "_moveLeft", verticalAlignTop: false, x: 20, y: this.UIclientHeight - 20}, {id: 'UI_right', shape: 'image', image: DIR + 'rightarrow.png',triggerFunction: "_moveRight", verticalAlignTop: false, x: 84, y: this.UIclientHeight - 20}, {id: 'UI_plus', shape: 'image', image: DIR + 'plus.png', triggerFunction: "_zoomIn", verticalAlignTop: false, horizontalAlignLeft: false, x: this.UIclientWidth - 52, y: this.UIclientHeight - 20}, {id: 'UI_min', shape: 'image', image: DIR + 'minus.png', triggerFunction: "_zoomOut", verticalAlignTop: false, horizontalAlignLeft: false, x: this.UIclientWidth - 20, y: this.UIclientHeight - 20}, {id: 'UI_zoomExtends', shape: 'image', image: DIR + 'zoomExtends.png', triggerFunction: "zoomToFit", verticalAlignTop: false, horizontalAlignLeft: false, x: this.UIclientWidth - 20, y: this.UIclientHeight - 52} ]; var nodeObj = null; for (var i = 0; i < UINodes.length; i++) { nodeObj = this.sectors["UI"]['nodes']; nodeObj[UINodes[i]['id']] = new Node(UINodes[i], this.images, this.groups, this.constants); } }, /** * By setting the clustersize to be larger than 1, we use the clustering drawing method * to illustrate the buttons are presed. We call this highlighting. * * @param {String} elementId * @private */ _highlightUIElement : function(elementId) { if (this.sectors["UI"]["nodes"].hasOwnProperty(elementId)) { this.sectors["UI"]["nodes"][elementId].clusterSize = 2; } }, /** * Reverting back to a normal button * * @param {String} elementId * @private */ _unHighlightUIElement : function(elementId) { if (this.sectors["UI"]["nodes"].hasOwnProperty(elementId)) { this.sectors["UI"]["nodes"][elementId].clusterSize = 1; } }, /** * toggle the visibility of the UI * * @private */ _toggleUI : function() { if (this.UIvisible === undefined) { this.UIvisible = false; } this.UIvisible = !this.UIvisible; this._redraw(); }, /** * un-highlight (for lack of a better term) all UI elements * @private */ _unHighlightAll : function() { for (var nodeId in this.sectors['UI']['nodes']) { this._unHighlightUIElement(nodeId); } }, /** * move the screen up * By using the increments, instead of adding a fixed number to the translation, we keep fluent and * instant movement. The onKeypress event triggers immediately, then pauses, then triggers frequently * To avoid this behaviour, we do the translation in the start loop. * * @private */ _moveUp : function() { this._highlightUIElement("UI_up"); this.yIncrement = this.constants.UI.yMovementSpeed; this.start(); // if there is no node movement, the calculation wont be done }, /** * move the screen down * @private */ _moveDown : function() { this._highlightUIElement("UI_down"); this.yIncrement = -this.constants.UI.yMovementSpeed; this.start(); // if there is no node movement, the calculation wont be done }, /** * move the screen left * @private */ _moveLeft : function() { this._highlightUIElement("UI_left"); this.xIncrement = this.constants.UI.xMovementSpeed; this.start(); // if there is no node movement, the calculation wont be done }, /** * move the screen right * @private */ _moveRight : function() { this._highlightUIElement("UI_right"); this.xIncrement = -this.constants.UI.xMovementSpeed; this.start(); // if there is no node movement, the calculation wont be done }, /** * Zoom in, using the same method as the movement. * @private */ _zoomIn : function() { this._highlightUIElement("UI_plus"); this.zoomIncrement = this.constants.UI.zoomMovementSpeed; this.start(); // if there is no node movement, the calculation wont be done }, /** * Zoom out * @private */ _zoomOut : function() { this._highlightUIElement("UI_min"); this.zoomIncrement = -this.constants.UI.zoomMovementSpeed; this.start(); // if there is no node movement, the calculation wont be done }, /** * Stop zooming and unhighlight the zoom controls * @private */ _stopZoom : function() { this._unHighlightUIElement("UI_plus"); this._unHighlightUIElement("UI_min"); }, /** * Stop moving in the Y direction and unHighlight the up and down * @private */ _yStopMoving : function() { this._unHighlightUIElement("UI_up"); this._unHighlightUIElement("UI_down"); this.yIncrement = 0; }, /** * Stop moving in the X direction and unHighlight left and right. * @private */ _xStopMoving : function() { this._unHighlightUIElement("UI_left"); this._unHighlightUIElement("UI_right"); this.xIncrement = 0; } };