From 8779a8c3d930ce4652a291d55a16798bb4cfa342 Mon Sep 17 00:00:00 2001 From: Neil Fraser Date: Tue, 24 Oct 2017 11:48:07 -0700 Subject: [PATCH] Introduce minimap to style guide. --- core/variables.js | 12 +- demos/blockfactory/block_exporter_tools.js | 6 +- demos/minimap/index.html | 55 +++-- demos/minimap/minimap.js | 262 +++++++++++---------- 4 files changed, 171 insertions(+), 164 deletions(-) diff --git a/core/variables.js b/core/variables.js index 86c39f83d..5bc8c5f3c 100644 --- a/core/variables.js +++ b/core/variables.js @@ -177,13 +177,13 @@ Blockly.Variables.flyoutCategoryBlocks = function(workspace) { }; /** -* Return a new variable name that is not yet being used. This will try to -* generate single letter variable names in the range 'i' to 'z' to start with. -* If no unique name is located it will try 'i' to 'z', 'a' to 'h', -* then 'i2' to 'z2' etc. Skip 'l'. + * Return a new variable name that is not yet being used. This will try to + * generate single letter variable names in the range 'i' to 'z' to start with. + * If no unique name is located it will try 'i' to 'z', 'a' to 'h', + * then 'i2' to 'z2' etc. Skip 'l'. * @param {!Blockly.Workspace} workspace The workspace to be unique in. -* @return {string} New variable name. -*/ + * @return {string} New variable name. + */ Blockly.Variables.generateUniqueName = function(workspace) { var variableList = workspace.getAllVariables(); var newName = ''; diff --git a/demos/blockfactory/block_exporter_tools.js b/demos/blockfactory/block_exporter_tools.js index 4d6d9bec6..2e7492bda 100644 --- a/demos/blockfactory/block_exporter_tools.js +++ b/demos/blockfactory/block_exporter_tools.js @@ -37,9 +37,9 @@ goog.require('goog.dom.xml'); /** -* Block Exporter Tools Class -* @constructor -*/ + * Block Exporter Tools Class + * @constructor + */ BlockExporterTools = function() { // Create container for hidden workspace. this.container = goog.dom.createDom('div', { diff --git a/demos/minimap/index.html b/demos/minimap/index.html index 2e495fdb1..50512d7ca 100644 --- a/demos/minimap/index.html +++ b/demos/minimap/index.html @@ -2,7 +2,7 @@ - Blockly Demo: Minimap + Blockly Demo: Minimap @@ -49,41 +49,40 @@ diff --git a/demos/minimap/minimap.js b/demos/minimap/minimap.js index 4ac687e39..6803d41f2 100644 --- a/demos/minimap/minimap.js +++ b/demos/minimap/minimap.js @@ -1,46 +1,46 @@ /** -* Blockly Demos: Code -* -* Copyright 2017 Google Inc. -* https://developers.google.com/blockly/ -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ + * Blockly Demos: Minimap + * + * Copyright 2017 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ /** -* @fileoverview JavaScript for Blockly's Minimap demo. -* @author karnpurohit@gmail.com (Karan Purohit) -*/ + * @fileoverview JavaScript for Blockly's Minimap demo. + * @author karnpurohit@gmail.com (Karan Purohit) + */ 'use strict'; /** -* Creating a seperate namespace for minimap. -*/ + * Creating a separate namespace for minimap. + */ var Minimap = {}; /** -* Initilize the workspace and minimap. -* @param {Workspace} workspace The main workspace of the user. -* @param {Workspace} minimap The workspace that will be used as a minimap. -*/ -Minimap.init = function(workspace, minimap){ + * Initialize the workspace and minimap. + * @param {!Workspace} workspace The main workspace of the user. + * @param {!Workspace} minimap The workspace that will be used as a minimap. + */ +Minimap.init = function(workspace, minimap) { this.workspace = workspace; this.minimap = minimap; - //Adding scroll callback functionlity to vScroll and hScroll just for this demo. - //IMPORTANT: This should be changed when there is proper UI event handling - // api available and should be handled by workspace's event listeners. - this.workspace.scrollbar.vScroll.setHandlePosition = function(newPosition){ + // Adding scroll callback functionality to vScroll and hScroll just for this demo. + // IMPORTANT: This should be changed when there is proper UI event handling + // API available and should be handled by workspace's event listeners. + this.workspace.scrollbar.vScroll.setHandlePosition = function(newPosition) { this.handlePosition_ = newPosition; this.svgHandle_.setAttribute(this.positionAttribute_, this.handlePosition_); @@ -55,7 +55,7 @@ Minimap.init = function(workspace, minimap){ }; // Adding call back for horizontal scroll. - this.workspace.scrollbar.hScroll.setHandlePosition = function(newPosition){ + this.workspace.scrollbar.hScroll.setHandlePosition = function(newPosition) { this.handlePosition_ = newPosition; this.svgHandle_.setAttribute(this.positionAttribute_, this.handlePosition_); @@ -71,7 +71,7 @@ Minimap.init = function(workspace, minimap){ // Required to stop a positive feedback loop when user clicks minimap - // and the scroll changes, which inturn may change minimap. + // and the scroll changes, which in turn may change minimap. this.disableScrollChange = false; // Listen to events on the main workspace. @@ -95,9 +95,9 @@ Minimap.init = function(workspace, minimap){ // Creating a rectangle in the minimap that represents current view. Blockly.utils.createSvgElement('rect', { - 'width':100, - 'height':100, - 'class':'mapDragger' + 'width': 100, + 'height': 100, + 'class': 'mapDragger' }, this.svg); // Rectangle in the minimap that represents current view. @@ -105,7 +105,7 @@ Minimap.init = function(workspace, minimap){ // Adding mouse events to the rectangle, to make it Draggable. // Using Blockly.bindEvent_ to attach mouse/touch listeners. - Blockly.bindEvent_(this.mapDragger, "mousedown", null, Minimap.mousedown); + Blockly.bindEvent_(this.mapDragger, 'mousedown', null, Minimap.mousedown); //When the window change, we need to resize the minimap window. window.addEventListener('resize', Minimap.repositionMinimap); @@ -113,20 +113,22 @@ Minimap.init = function(workspace, minimap){ // Mouse up event for the minimap. this.svg.addEventListener('mouseup', Minimap.updateMapDragger); - //Boolen to check whether I am dragging the surface or not. + //Boolean to check whether I am dragging the surface or not. this.isDragging = false; }; -Minimap.mousedown = function(e){ +Minimap.mousedown = function(e) { // Using Blockly.bindEvent_ to attach mouse/touch listeners. - Minimap.mouseMoveBindData = Blockly.bindEvent_(document,"mousemove", null, Minimap.mousemove); - Minimap.mouseUpBindData = Blockly.bindEvent_(document,"mouseup", null, Minimap.mouseup); + Minimap.mouseMoveBindData = + Blockly.bindEvent_(document, 'mousemove', null, Minimap.mousemove); + Minimap.mouseUpBindData = + Blockly.bindEvent_(document, 'mouseup', null, Minimap.mouseup); - Minimap.isDragging=true; + Minimap.isDragging = true; e.stopPropagation(); }; -Minimap.mouseup = function(e){ +Minimap.mouseup = function(e) { Minimap.isDragging = false; // Removing listeners. Blockly.unbindEvent_(Minimap.mouseUpBindData); @@ -135,18 +137,18 @@ Minimap.mouseup = function(e){ e.stopPropagation(); }; -Minimap.mousemove = function(e){ - if(Minimap.isDragging){ +Minimap.mousemove = function(e) { + if (Minimap.isDragging) { Minimap.updateMapDragger(e); e.stopPropagation(); } }; /** -* Initilize the workspace and minimap. -* @param {Event} event Event that triggered in the main workspace. -*/ -Minimap.mirrorEvent = function(event){ + * Run non-UI events from the main workspace on the minimap. + * @param {!Event} event Event that triggered in the main workspace. + */ +Minimap.mirrorEvent = function(event) { if (event.type == Blockly.Events.UI) { return; // Don't mirror UI events. } @@ -161,146 +163,152 @@ Minimap.mirrorEvent = function(event){ }; /** -* Called when window is resized. Repositions the minimap overlay. -*/ -Minimap.repositionMinimap = function(){ + * Called when window is resized. Repositions the minimap overlay. + */ +Minimap.repositionMinimap = function() { Minimap.rect = document.getElementById('mapDiv').getBoundingClientRect(); Minimap.svg.style.top = Minimap.rect.top + 'px'; Minimap.svg.style.left = Minimap.rect.left + 'px'; }; /** -* Updates the rectangle's height . -*/ -Minimap.setDraggerHeight = function(){ + * Updates the rectangle's height. + */ +Minimap.setDraggerHeight = function() { var workspaceMetrics = Minimap.workspace.getMetrics(); - var draggerHeight = (workspaceMetrics.viewHeight / Minimap.workspace.scale) * Minimap.minimap.scale; + var draggerHeight = (workspaceMetrics.viewHeight / Minimap.workspace.scale) * + Minimap.minimap.scale; // It's zero when first block is placed. - if(draggerHeight == 0){ + if (draggerHeight == 0) { return; } - Minimap.mapDragger.setAttribute("height", draggerHeight); + Minimap.mapDragger.setAttribute('height', draggerHeight); }; /** -* Updates the rectangle's width. -*/ -Minimap.setDraggerWidth = function(){ + * Updates the rectangle's width. + */ +Minimap.setDraggerWidth = function() { var workspaceMetrics = Minimap.workspace.getMetrics(); - var draggerWidth = (workspaceMetrics.viewWidth / Minimap.workspace.scale) * Minimap.minimap.scale; + var draggerWidth = (workspaceMetrics.viewWidth / Minimap.workspace.scale) * + Minimap.minimap.scale; // It's zero when first block is placed. - if(draggerWidth == 0){ + if (draggerWidth == 0) { return; } - Minimap.mapDragger.setAttribute("width", draggerWidth); + Minimap.mapDragger.setAttribute('width', draggerWidth); }; /** -* Updates the overall position of the viewport of the minimap by appropriately -* using translate functions. -*/ -Minimap.scaleMinimap = function(){ + * Updates the overall position of the viewport of the minimap by appropriately + * using translate functions. + */ +Minimap.scaleMinimap = function() { var minimapBoundingBox = Minimap.minimap.getBlocksBoundingBox(); var workspaceBoundingBox = Minimap.workspace.getBlocksBoundingBox(); var workspaceMetrics = Minimap.workspace.getMetrics(); var minimapMetrics = Minimap.minimap.getMetrics(); - //Scaling the mimimap such that all the blocks can be seen in the viewport. - //This padding is default because this is how to scrollbar(in main workspace) is implemented. - var topPadding = (workspaceMetrics.viewHeight) * Minimap.minimap.scale / (2 * Minimap.workspace.scale); - var sidePadding = (workspaceMetrics.viewWidth) * Minimap.minimap.scale / (2 * Minimap.workspace.scale); + // Scaling the mimimap such that all the blocks can be seen in the viewport. + // This padding is default because this is how to scrollbar(in main workspace) + // is implemented. + var topPadding = (workspaceMetrics.viewHeight) * Minimap.minimap.scale / + (2 * Minimap.workspace.scale); + var sidePadding = (workspaceMetrics.viewWidth) * Minimap.minimap.scale / + (2 * Minimap.workspace.scale); - // If actual padding is more than half view ports height, change it to actual padding. - if((workspaceBoundingBox.y * Minimap.workspace.scale - workspaceMetrics.contentTop) - * Minimap.minimap.scale / Minimap.workspace.scale > topPadding){ - topPadding = (workspaceBoundingBox.y * Minimap.workspace.scale - workspaceMetrics.contentTop) - * Minimap.minimap.scale / Minimap.workspace.scale; + // If actual padding is more than half view ports height, + // change it to actual padding. + if ((workspaceBoundingBox.y * Minimap.workspace.scale - + workspaceMetrics.contentTop) * + Minimap.minimap.scale / Minimap.workspace.scale > topPadding) { + topPadding = (workspaceBoundingBox.y * Minimap.workspace.scale - + workspaceMetrics.contentTop) * + Minimap.minimap.scale / Minimap.workspace.scale; } - // If actual padding is more than half view ports height, change it to actual padding. - if((workspaceBoundingBox.x * Minimap.workspace.scale - workspaceMetrics.contentLeft) - * Minimap.minimap.scale / Minimap.workspace.scale > sidePadding){ - sidePadding = (workspaceBoundingBox.x * Minimap.workspace.scale - workspaceMetrics.contentLeft) - * Minimap.minimap.scale / Minimap.workspace.scale; + // If actual padding is more than half view ports height, + // change it to actual padding. + if ((workspaceBoundingBox.x * Minimap.workspace.scale - + workspaceMetrics.contentLeft) * + Minimap.minimap.scale / Minimap.workspace.scale > sidePadding) { + sidePadding = (workspaceBoundingBox.x * Minimap.workspace.scale - + workspaceMetrics.contentLeft) * + Minimap.minimap.scale / Minimap.workspace.scale; } - var scalex = (minimapMetrics.viewWidth - 2 * sidePadding) / minimapBoundingBox.width; - var scaley = (minimapMetrics.viewHeight - 2 * topPadding) / minimapBoundingBox.height; + var scalex = (minimapMetrics.viewWidth - 2 * sidePadding) / + minimapBoundingBox.width; + var scaley = (minimapMetrics.viewHeight - 2 * topPadding) / + minimapBoundingBox.height; Minimap.minimap.setScale(Math.min(scalex, scaley)); // Translating the minimap. - Minimap.minimap.translate( - minimapMetrics.contentLeft * Minimap.minimap.scale + sidePadding, - - minimapMetrics.contentTop * Minimap.minimap.scale + topPadding); + Minimap.minimap.translate( + -minimapMetrics.contentLeft * Minimap.minimap.scale + sidePadding, + -minimapMetrics.contentTop * Minimap.minimap.scale + topPadding); }; /** -* Handles the onclick event on the minimapBoundingBox. Changes mapDraggers position. -* @param {Event} e Event from the mouse click. -*/ -Minimap.updateMapDragger = function(e){ + * Handles the onclick event on the minimapBoundingBox. + * Changes mapDraggers position. + * @param {!Event} e Event from the mouse click. + */ +Minimap.updateMapDragger = function(e) { var y = e.clientY; var x = e.clientX; - var draggerHeight = Minimap.mapDragger.getAttribute("height"); - var draggerWidth = Minimap.mapDragger.getAttribute("width"); + var draggerHeight = Minimap.mapDragger.getAttribute('height'); + var draggerWidth = Minimap.mapDragger.getAttribute('width'); var finalY = y - Minimap.rect.top - draggerHeight / 2; var finalX = x - Minimap.rect.left - draggerWidth / 2; - var maxValidY = (Minimap.workspace.getMetrics().contentHeight - Minimap.workspace.getMetrics().viewHeight) - * Minimap.minimap.scale; - var maxValidX = (Minimap.workspace.getMetrics().contentWidth - Minimap.workspace.getMetrics().viewWidth) - * Minimap.minimap.scale; + var maxValidY = (Minimap.workspace.getMetrics().contentHeight - + Minimap.workspace.getMetrics().viewHeight) * Minimap.minimap.scale; + var maxValidX = (Minimap.workspace.getMetrics().contentWidth - + Minimap.workspace.getMetrics().viewWidth) * Minimap.minimap.scale; - if(y + draggerHeight / 2 > Minimap.rect.bottom){ + if (y + draggerHeight / 2 > Minimap.rect.bottom) { finalY = Minimap.rect.bottom - Minimap.rect.top - draggerHeight; - }else if(y < Minimap.rect.top + draggerHeight / 2){ + } else if (y < Minimap.rect.top + draggerHeight / 2) { finalY = 0; } - if(x + draggerWidth / 2 > Minimap.rect.right){ + if (x + draggerWidth / 2 > Minimap.rect.right) { finalX = Minimap.rect.right - Minimap.rect.left - draggerWidth; - }else if(x < Minimap.rect.left + draggerWidth / 2){ + } else if (x < Minimap.rect.left + draggerWidth / 2) { finalX = 0; } // Do not go below lower bound of scrollbar. - if(finalY > maxValidY){ + if (finalY > maxValidY) { finalY = maxValidY; } - - if(finalX > maxValidX){ + if (finalX > maxValidX) { finalX = maxValidX; } - Minimap.mapDragger.setAttribute("y", finalY); - Minimap.mapDragger.setAttribute("x", finalX); + Minimap.mapDragger.setAttribute('y', finalY); + Minimap.mapDragger.setAttribute('x', finalX); // Required, otherwise creates a feedback loop. Minimap.disableScrollChange = true; - Minimap.workspace.scrollbar.vScroll.set((finalY * Minimap.workspace.scale) / Minimap.minimap.scale); - Minimap.workspace.scrollbar.hScroll.set((finalX * Minimap.workspace.scale) / Minimap.minimap.scale); + Minimap.workspace.scrollbar.vScroll.set((finalY * Minimap.workspace.scale) / + Minimap.minimap.scale); + Minimap.workspace.scrollbar.hScroll.set((finalX * Minimap.workspace.scale) / + Minimap.minimap.scale); Minimap.disableScrollChange = false; }; /** -* Handles the onclick event on the minimapBoundingBox, paramaters are passed by -* the event handler. -* @param {Float} position This is the absolute postion of the scrollbar. -* @param {boolean} horizontal Informs if the change event if for horizontal(true) -* scrollbar or vertical(false) scrollbar. -*/ -Minimap.onScrollChange = function(position, horizontal){ - - if(Minimap.disableScrollChange){ - return; - } - - var newDraggerPosition = (position * Minimap.minimap.scale / Minimap.workspace.scale); - if(horizontal){ - // Change the horizontal position of dragger. - Minimap.mapDragger.setAttribute("x", newDraggerPosition); - } - else{ - // Change the vertical position of dragger. - Minimap.mapDragger.setAttribute("y", newDraggerPosition); + * Handles the onclick event on the minimapBoundingBox, parameters are passed by + * the event handler. + * @param {number} position This is the absolute position of the scrollbar. + * @param {boolean} horizontal Informs if the change event if for + * horizontal (true) or vertical (false) scrollbar. + */ +Minimap.onScrollChange = function(position, horizontal) { + if (!Minimap.disableScrollChange) { + Minimap.mapDragger.setAttribute(horizontal ? 'x' : 'y', + position * Minimap.minimap.scale / Minimap.workspace.scale); } };