From 383ca8258c5fa7d5c8b33ea315be574c2cd3b245 Mon Sep 17 00:00:00 2001 From: Neil Fraser Date: Tue, 1 Dec 2015 12:28:19 -0800 Subject: [PATCH] Fix toolbar with both colours and subcategories. Also fix updating of toolbar after loading Blockly. --- blockly_compressed.js | 27 ++++++++++++++------------- core/toolbox.js | 20 +++++++++++++------- core/workspace_svg.js | 1 + 3 files changed, 28 insertions(+), 20 deletions(-) diff --git a/blockly_compressed.js b/blockly_compressed.js index 2e504afd5..ce9480345 100644 --- a/blockly_compressed.js +++ b/blockly_compressed.js @@ -884,11 +884,10 @@ this.foreignObject_=this.textarea_=this.bubble_=null);this.setText(b);this.setBu Blockly.Comment.prototype.getText=function(){return this.textarea_?this.textarea_.value:this.text_};Blockly.Comment.prototype.setText=function(a){this.textarea_?this.textarea_.value=a:this.text_=a};Blockly.Comment.prototype.dispose=function(){this.block_.comment=null;Blockly.Icon.prototype.dispose.call(this)};Blockly.Connection=function(a,b){this.sourceBlock_=a;this.type=b;a.workspace.connectionDBList&&(this.db_=a.workspace.connectionDBList[b],this.dbOpposite_=a.workspace.connectionDBList[Blockly.OPPOSITE_TYPE[b]],this.hidden_=!this.db_)};Blockly.Connection.prototype.targetConnection=null;Blockly.Connection.prototype.check_=null;Blockly.Connection.prototype.shadowDom_=null;Blockly.Connection.prototype.x_=0;Blockly.Connection.prototype.y_=0;Blockly.Connection.prototype.inDB_=!1; Blockly.Connection.prototype.db_=null;Blockly.Connection.prototype.dbOpposite_=null;Blockly.Connection.prototype.hidden_=null;Blockly.Connection.prototype.dispose=function(){if(this.targetConnection)throw"Disconnect connection before disposing of it.";this.inDB_&&this.db_.removeConnection_(this);Blockly.highlightedConnection_==this&&(Blockly.highlightedConnection_=null);Blockly.localConnection_==this&&(Blockly.localConnection_=null);this.dbOpposite_=this.db_=null}; Blockly.Connection.prototype.isSuperior=function(){return this.type==Blockly.INPUT_VALUE||this.type==Blockly.NEXT_STATEMENT}; -Blockly.Connection.prototype.connect=function(a){if(this.sourceBlock_==a.sourceBlock_)throw"Attempted to connect a block to itself.";if(this.sourceBlock_.workspace!==a.sourceBlock_.workspace)throw"Blocks are on different workspaces.";if(Blockly.OPPOSITE_TYPE[this.type]!=a.type)throw"Attempt to connect incompatible types.";if(this.type==Blockly.INPUT_VALUE||this.type==Blockly.OUTPUT_VALUE){if(this.targetConnection)throw"Source connection already connected (value).";if(a.targetConnection){var b=a.getShadowDom(); -a.setShadowDom(null);var c=a.targetBlock();c.setParent(null);if(c.isShadow())a.setShadowDom(Blockly.Xml.blockToDom_(c)),c.dispose();else{if(!c.outputConnection)throw"Orphan block does not have an output connection.";for(var d=this.sourceBlock_,e;e=Blockly.Connection.singleConnection_(d,c);)if(d=e.targetBlock(),!d||d.isShadow()){c.outputConnection.connect(e);c=null;break}c&&setTimeout(function(){c.outputConnection.bumpAwayFrom_(a)},Blockly.BUMP_DELAY);a.setShadowDom(b)}}}else{if(this.targetConnection)throw"Source connection already connected (block)."; -if(a.targetConnection){if(this.type!=Blockly.PREVIOUS_STATEMENT)throw"Can only do a mid-stack connection with the top of a block.";c=a.targetBlock();c.setParent(null);if(!c.previousConnection)throw"Orphan block does not have a previous connection.";for(d=this.sourceBlock_;d.nextConnection;)if(d.nextConnection.targetConnection)d=d.getNextBlock();else{c.previousConnection.checkType_(d.nextConnection)&&(d.nextConnection.connect(c.previousConnection),c=null);break}c&&setTimeout(function(){c.previousConnection.bumpAwayFrom_(a)}, -Blockly.BUMP_DELAY)}}this.isSuperior()?(b=this.sourceBlock_,d=a.sourceBlock_):(b=a.sourceBlock_,d=this.sourceBlock_);this.targetConnection=a;a.targetConnection=this;d.setParent(b);b.rendered&&b.updateDisabled();d.rendered&&d.updateDisabled();b.rendered&&d.rendered&&(this.type==Blockly.NEXT_STATEMENT||this.type==Blockly.PREVIOUS_STATEMENT?d.render():b.render())}; -Blockly.Connection.singleConnection_=function(a,b){for(var c=!1,d=0;dthis.options.zoomOptions.maxScale?c=this.options.zoomOptions.maxScale/this.scale:dtext,",".blocklyEditableText>text {","fill: #000;","}",".blocklyEditableText:hover>rect {","stroke: #fff;","stroke-width: 2;","}",".blocklyBubbleText {","fill: #000;","}",".blocklySvg text {","user-select: none;","-moz-user-select: none;","-webkit-user-select: none;","cursor: inherit;","}",".blocklyHidden {","display: none;","}",".blocklyFieldDropdown:not(.blocklyHidden) {","display: block;","}",".blocklyIconGroup {","cursor: default;", "}",".blocklyIconGroup:not(:hover),",".blocklyIconGroupReadonly {","opacity: .6;","}",".blocklyMinimalBody {","margin: 0;","padding: 0;","}",".blocklyCommentTextarea {","background-color: #ffc;","border: 0;","margin: 0;","padding: 2px;","resize: none;","}",".blocklyHtmlInput {","border: none;","border-radius: 4px;","font-family: sans-serif;","height: 100%;","margin: 0;","outline: none;","padding: 0 1px;","width: 100%","}",".blocklyMainBackground {","stroke-width: 1;","stroke: #c6c6c6;","}",".blocklyMutatorBackground {", "fill: #fff;","stroke: #ddd;","stroke-width: 1;","}",".blocklyFlyoutBackground {","fill: #ddd;","fill-opacity: .8;","}",".blocklyScrollbarBackground {","opacity: 0;","}",".blocklyScrollbarKnob {","fill: #ccc;","}",".blocklyScrollbarBackground:hover+.blocklyScrollbarKnob,",".blocklyScrollbarKnob:hover {","fill: #bbb;","}",".blocklyZoom>image {","opacity: .4;","}",".blocklyZoom>image:hover {","opacity: .6;","}",".blocklyZoom>image:active {","opacity: .8;","}",".blocklyFlyout .blocklyScrollbarKnob {", -"fill: #bbb;","}",".blocklyFlyout .blocklyScrollbarBackground:hover+.blocklyScrollbarKnob,",".blocklyFlyout .blocklyScrollbarKnob:hover {","fill: #aaa;","}",".blocklyInvalidInput {","background: #faa;","}",".blocklyAngleCircle {","stroke: #444;","stroke-width: 1;","fill: #ddd;","fill-opacity: .8;","}",".blocklyAngleMarks {","stroke: #444;","stroke-width: 1;","}",".blocklyAngleGauge {","fill: #f88;","fill-opacity: .8; ","}",".blocklyAngleLine {","stroke: #f00;","stroke-width: 2;","stroke-linecap: round;", +"fill: #bbb;","}",".blocklyFlyout .blocklyScrollbarBackground:hover+.blocklyScrollbarKnob,",".blocklyFlyout .blocklyScrollbarKnob:hover {","fill: #aaa;","}",".blocklyInvalidInput {","background: #faa;","}",".blocklyAngleCircle {","stroke: #444;","stroke-width: 1;","fill: #ddd;","fill-opacity: .8;","}",".blocklyAngleMarks {","stroke: #444;","stroke-width: 1;","}",".blocklyAngleGauge {","fill: #f88;","fill-opacity: .8;","}",".blocklyAngleLine {","stroke: #f00;","stroke-width: 2;","stroke-linecap: round;", "}",".blocklyContextMenu {","border-radius: 4px;","}",".blocklyDropdownMenu {","padding: 0 !important;","}",".blocklyWidgetDiv .goog-option-selected .goog-menuitem-checkbox,",".blocklyWidgetDiv .goog-option-selected .goog-menuitem-icon {","background: url(<<>>/sprites.png) no-repeat -48px -16px !important;","}",".blocklyToolboxDiv {","background-color: #ddd;","overflow-x: visible;","overflow-y: auto;","position: absolute;","}",".blocklyTreeRoot {","padding: 4px 0;","}",".blocklyTreeRoot:focus {", "outline: none;","}",".blocklyTreeRow {","height: 22px;","line-height: 22px;","margin-bottom: 3px;","padding-right: 8px;","white-space: nowrap;","}",'.blocklyToolboxDiv[dir="RTL"] .blocklyTreeRow {',"margin-left: 8px;","}",".blocklyTreeRow:not(.blocklyTreeSelected):hover {","background-color: #e4e4e4;","}",".blocklyTreeSeparator {","border-bottom: solid #e5e5e5 1px;","height: 0px;","margin: 5px 0;","}",".blocklyTreeIcon {","background-image: url(<<>>/sprites.png);","height: 16px;","vertical-align: middle;", "width: 16px;","}",".blocklyTreeIconClosedLtr {","background-position: -32px -1px;","}",".blocklyTreeIconClosedRtl {","background-position: 0px -1px;","}",".blocklyTreeIconOpen {","background-position: -16px -1px;","}",".blocklyTreeSelected>.blocklyTreeIconClosedLtr {","background-position: -32px -17px;","}",".blocklyTreeSelected>.blocklyTreeIconClosedRtl {","background-position: 0px -17px;","}",".blocklyTreeSelected>.blocklyTreeIconOpen {","background-position: -16px -17px;","}",".blocklyTreeIconNone,", @@ -1289,7 +1289,8 @@ Blockly.createSvgElement=function(a,b,c,d){a=document.createElementNS(Blockly.SV Blockly.mouseToSvg=function(a,b){var c=b.createSVGPoint();c.x=a.clientX;c.y=a.clientY;var d=b.getScreenCTM(),d=d.inverse();return c.matrixTransform(d)};Blockly.shortestStringLength=function(a){if(!a.length)return 0;for(var b=a[0].length,c=1;c=g?(c=2,e=g,(g=d.join(""))&&b.push(g),d.length=0):(d.push("%",g),c=0):2==c&&("0"<=g&&"9">=g?e+=g:(b.push(parseInt(e,10)),f--,c=0))}(g=d.join(""))&&b.push(g);return b};Blockly.Realtime={isEnabled:function(){return!1},blockChanged:function(){},doCommand:function(a){a()}};var CLOSURE_DEFINES={"goog.DEBUG":!1};Blockly.SVG_NS="http://www.w3.org/2000/svg";Blockly.HTML_NS="http://www.w3.org/1999/xhtml";Blockly.HSV_SATURATION=.45;Blockly.HSV_VALUE=.65;Blockly.SPRITE={width:96,height:124,url:"sprites.png"};Blockly.makeColour=function(a){return goog.color.hsvToHex(a,Blockly.HSV_SATURATION,255*Blockly.HSV_VALUE)};Blockly.INPUT_VALUE=1;Blockly.OUTPUT_VALUE=2; +Blockly.tokenizeInterpolation=function(a){var b=[];a=a.split("");a.push("");for(var c=0,d=[],e=null,f=0;f=g?(c=2,e=g,(g=d.join(""))&&b.push(g),d.length=0):(d.push("%",g),c=0):2==c&&("0"<=g&&"9">=g?e+=g:(b.push(parseInt(e,10)),f--,c=0))}(g=d.join(""))&&b.push(g);return b}; +Blockly.genUid=function(){var a=Blockly.genUid.soup_.length,b=[];if(Blockly.genUid.crypto_){var c=new Uint32Array(20);Blockly.genUid.crypto_.getRandomValues(c);for(var d=0;20>d;d++)b[d]=Blockly.genUid.soup_.charAt(c[d]%a)}else for(d=0;20>d;d++)b[d]=Blockly.genUid.soup_.charAt(Math.random()*a);return b.join("")};Blockly.genUid.crypto_=this.crypto;Blockly.genUid.soup_="!#$%()*+,-./:;=?@[]^_`{|}~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";Blockly.Realtime={isEnabled:function(){return!1},blockChanged:function(){},doCommand:function(a){a()}};var CLOSURE_DEFINES={"goog.DEBUG":!1};Blockly.SVG_NS="http://www.w3.org/2000/svg";Blockly.HTML_NS="http://www.w3.org/1999/xhtml";Blockly.HSV_SATURATION=.45;Blockly.HSV_VALUE=.65;Blockly.SPRITE={width:96,height:124,url:"sprites.png"};Blockly.makeColour=function(a){return goog.color.hsvToHex(a,Blockly.HSV_SATURATION,255*Blockly.HSV_VALUE)};Blockly.INPUT_VALUE=1;Blockly.OUTPUT_VALUE=2; Blockly.NEXT_STATEMENT=3;Blockly.PREVIOUS_STATEMENT=4;Blockly.DUMMY_INPUT=5;Blockly.ALIGN_LEFT=-1;Blockly.ALIGN_CENTRE=0;Blockly.ALIGN_RIGHT=1;Blockly.OPPOSITE_TYPE=[];Blockly.OPPOSITE_TYPE[Blockly.INPUT_VALUE]=Blockly.OUTPUT_VALUE;Blockly.OPPOSITE_TYPE[Blockly.OUTPUT_VALUE]=Blockly.INPUT_VALUE;Blockly.OPPOSITE_TYPE[Blockly.NEXT_STATEMENT]=Blockly.PREVIOUS_STATEMENT;Blockly.OPPOSITE_TYPE[Blockly.PREVIOUS_STATEMENT]=Blockly.NEXT_STATEMENT;Blockly.selected=null;Blockly.highlightedConnection_=null; Blockly.localConnection_=null;Blockly.DRAG_RADIUS=5;Blockly.SNAP_RADIUS=20;Blockly.BUMP_DELAY=250;Blockly.COLLAPSE_CHARS=30;Blockly.LONGPRESS=750;Blockly.mainWorkspace=null;Blockly.clipboardXml_=null;Blockly.clipboardSource_=null;Blockly.dragMode_=0;Blockly.onTouchUpWrapper_=null;Blockly.svgSize=function(a){return{width:a.cachedWidth_,height:a.cachedHeight_}}; Blockly.svgResize=function(a){for(;a.options.parentWorkspace;)a=a.options.parentWorkspace;var b=a.options.svg,c=b.parentNode;if(c){var d=c.offsetWidth,c=c.offsetHeight;b.cachedWidth_!=d&&(b.setAttribute("width",d+"px"),b.cachedWidth_=d);b.cachedHeight_!=c&&(b.setAttribute("height",c+"px"),b.cachedHeight_=c);a.resize()}}; diff --git a/core/toolbox.js b/core/toolbox.js index 13176aee9..d142e08f7 100644 --- a/core/toolbox.js +++ b/core/toolbox.js @@ -136,12 +136,9 @@ Blockly.Toolbox.prototype.init = function() { tree.setShowLines(false); tree.setShowExpandIcons(false); tree.setSelectedItem(null); - this.hasColours_ = false; this.populate_(workspace.options.languageTree); tree.render(this.HtmlDiv); - if (this.hasColours_) { - this.addColour_(tree); - } + this.addColour_(); this.position(); }; @@ -224,12 +221,15 @@ Blockly.Toolbox.prototype.populate_ = function(newTree) { rootOut.setSelectedItem(childOut); } childOut.setExpanded(true); + } else { + childOut.setExpanded(false); } break; case 'SEP': treeOut.add(new Blockly.Toolbox.TreeSeparator()); break; case 'BLOCK': + case 'SHADOW': treeOut.blocks.push(childIn); break; } @@ -248,15 +248,21 @@ Blockly.Toolbox.prototype.populate_ = function(newTree) { /** * Recursively add colours to this toolbox. - * @param {!Blockly.Toolbox.TreeNode} + * @param {Blockly.Toolbox.TreeNode} opt_tree Starting point of tree. + * Defaults to the root node. * @private */ -Blockly.Toolbox.prototype.addColour_ = function(tree) { +Blockly.Toolbox.prototype.addColour_ = function(opt_tree) { + var tree = opt_tree || this.tree_; var children = tree.getChildren(); for (var i = 0, child; child = children[i]; i++) { var element = child.getRowElement(); if (element) { - var border = '8px solid ' + (child.hexColour || '#ddd'); + if (this.hasColours_) { + var border = '8px solid ' + (child.hexColour || '#ddd'); + } else { + var border = 'none'; + } if (this.workspace_.RTL) { element.style.borderRight = border; } else { diff --git a/core/workspace_svg.js b/core/workspace_svg.js index d9493a2b5..ffa5a7eb9 100644 --- a/core/workspace_svg.js +++ b/core/workspace_svg.js @@ -854,6 +854,7 @@ Blockly.WorkspaceSvg.prototype.updateToolbox = function(tree) { } this.options.languageTree = tree; this.toolbox_.populate_(tree); + this.toolbox_.addColour_(); } else { if (!this.flyout_) { throw 'Existing toolbox has categories. Can\'t change mode.';