From 918efa1ef6854b7704551957cb664fbf4d7eb8b1 Mon Sep 17 00:00:00 2001 From: Matthew Ma Date: Tue, 15 Aug 2017 16:45:12 -0400 Subject: [PATCH 01/19] initial proof of concept --- examples/legend/main.js | 6 ++ examples/legend2d/example.json | 9 ++ examples/legend2d/index.pug | 1 + examples/legend2d/main.css | 0 examples/legend2d/main.js | 85 ++++++++++++++++ examples/legend2d/thumb.jpg | Bin 0 -> 101846 bytes src/ui/index.js | 1 + src/ui/legend2dWidget.js | 173 +++++++++++++++++++++++++++++++++ src/ui/legendWidget.js | 19 ++++ 9 files changed, 294 insertions(+) create mode 100644 examples/legend2d/example.json create mode 100644 examples/legend2d/index.pug create mode 100644 examples/legend2d/main.css create mode 100644 examples/legend2d/main.js create mode 100644 examples/legend2d/thumb.jpg create mode 100644 src/ui/legend2dWidget.js diff --git a/examples/legend/main.js b/examples/legend/main.js index 3c9896c88e..3d616f06d4 100644 --- a/examples/legend/main.js +++ b/examples/legend/main.js @@ -104,6 +104,12 @@ $(function () { fillColor: 'magenta', fillOpacity: 0.5 } + }, + { + name: 'test1', + type: 'discrete', + style: { + } } ]); diff --git a/examples/legend2d/example.json b/examples/legend2d/example.json new file mode 100644 index 0000000000..d3d9109fa9 --- /dev/null +++ b/examples/legend2d/example.json @@ -0,0 +1,9 @@ +{ + "path": "legend2d", + "title": "2D legends", + "exampleCss": ["main.css"], + "exampleJs": ["main.js"], + "about": { + "text": "This example shows how to create a legend to describe feature styles on a map." + } +} diff --git a/examples/legend2d/index.pug b/examples/legend2d/index.pug new file mode 100644 index 0000000000..4c9bea5c3e --- /dev/null +++ b/examples/legend2d/index.pug @@ -0,0 +1 @@ +extends ../common/templates/index.pug diff --git a/examples/legend2d/main.css b/examples/legend2d/main.css new file mode 100644 index 0000000000..e69de29bb2 diff --git a/examples/legend2d/main.js b/examples/legend2d/main.js new file mode 100644 index 0000000000..d68dcff0a7 --- /dev/null +++ b/examples/legend2d/main.js @@ -0,0 +1,85 @@ +// Run after the DOM loads +$(function () { + 'use strict'; + + // Create a map object + var map = geo.map({ + node: '#map', + zoom: 3 + }); + + // Add the default osm layer + // map.createLayer('osm'); + + // Create a ui layer + var ui = map.createLayer('ui'); + + // Create a legend widget + var legend = ui.createWidget('legend2d', { + position: { + right: 20, + top: 10 + } + }); + + // Add rows to the legend + // + // The categories are displayed in the order passed as + // a row on the legend. The category objects should + // contain the following properties: + // + // * name: (string) The name/description + // * style: (object) The feature style object + // * type: (string) The feature type ('point', 'line', 'other') + // + // Points are displayed as circles, lines as lines, and everything else + // is displayed as a rounded rectangle. The style objects have the same + // properties as feature styles (fill is ignored for lines): + // + // * stroke: (bool) Turn on or off the stroke + // * strokeWidth: (number) The stroke width in pixels + // * strokeColor: (string|object) The stroke color + // * strokeOpacity: (number) The stroke opacity + // * fill: (bool) Turn on or off the fill + // * fillColor: (string|object) The fill color + // * fillOpacity: (number) The fill opacity + legend.categories([ + { + name: 'test1', + type: 'discrete', + scale: { + type: 'ordinal', + domain: ['beijing', 'new york', 'london'], + range: ['red', 'green', 'blue'] + } + }, + { + name: 'test2', + type: 'discrete', + scale: { + type: 'quantize', + domain: [20000, 120000], + range: colorbrewer.YlGnBu["9"] + } + }, + { + name: 'test3', + type: 'continuous', + scale: { + type: 'pow', + domain: [100, 10000], + range: ['red', 'blue'] + } + }, + { + name: 'test4', + type: 'continuous', + scale: { + type: 'log', + domain: [100, 10000], + range: ['purple', 'orange'] + } + } + ]); + +}); diff --git a/examples/legend2d/thumb.jpg b/examples/legend2d/thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..49204293a34d0a2982726efb6e1a062ae5be3de1 GIT binary patch literal 101846 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 PYjpqrLXN)!-6sDJwETO~ literal 0 HcmV?d00001 diff --git a/src/ui/index.js b/src/ui/index.js index 65f9b52ff4..93ac20f988 100644 --- a/src/ui/index.js +++ b/src/ui/index.js @@ -4,6 +4,7 @@ module.exports = { domWidget: require('./domWidget'), legendWidget: require('./legendWidget'), + legend2dWidget: require('./legend2dWidget'), sliderWidget: require('./sliderWidget'), svgWidget: require('./svgWidget'), uiLayer: require('./uiLayer'), diff --git a/src/ui/legend2dWidget.js b/src/ui/legend2dWidget.js new file mode 100644 index 0000000000..6ba0529811 --- /dev/null +++ b/src/ui/legend2dWidget.js @@ -0,0 +1,173 @@ +var domWidget = require('./domWidget'); +var inherit = require('../inherit'); +var registerWidget = require('../registry').registerWidget; +require('./legend2dWidget.styl'); + +var legend2dWidget = function (arg) { + 'use strict'; + if (!(this instanceof legend2dWidget)) { + return new legend2dWidget(arg); + } + + domWidget.call(this, arg); + + var m_this = this, + m_default_canvas = 'div'; + var m_categories = []; + + /** + * Initializes DOM Widget. + * Sets the canvas for the widget, does parent/child relationship management, + * appends it to it's parent and handles any positioning logic. + */ + this._init = function () { + if (arg.hasOwnProperty('parent')) { + arg.parent.addChild(m_this); + } + + m_this._createCanvas(); + m_this._appendChild(); + + m_this.canvas().addEventListener('mousedown', function (e) { + e.stopPropagation(); + }); + + m_this.reposition(); + }; + + /** + * Creates the widget canvas. + * This is just a simple DOM element (based on args.el, or defaults to a div) + */ + this._createCanvas = function () { + m_this.canvas(document.createElement(arg.el || m_default_canvas)); + }; + + this.draw = function () { + m_this._init(); + var container = d3.select(m_this.canvas()).append('div'); + + var width = 700; + + m_categories.forEach(function (category, index) { + var legendSvg = container + .append('div') + .style({ + 'width': width + 'px', + 'height': '50px' + }) + .append('svg') + .attr({ + 'width': '100%', + 'height': '100%' + }) + + if (category.type === 'discrete') { + var steps; + var colorScale = d3.scale[category.scale.type]().domain(category.scale.domain).range(category.scale.range); + var axisScale; + if (category.scale.type === 'ordinal') { + steps = category.scale.domain; + + axisScale = d3.scale.ordinal() + .domain(category.scale.domain) + .rangePoints([0, width]); + var axis = d3.svg.axis() + .scale(axisScale); + } + else if (category.scale.type === 'quantize') { + steps = category.scale.range.map(function (color) { + var range = colorScale.invertExtent(color); + // console.log(color, range); + return (range[1] - range[0]) / 2 + range[0]; + }); + + var steps2 = category.scale.range.map(function (color) { + return colorScale.invertExtent(color)[0]; + }); + + var ticks = steps2.slice(); + ticks.push(colorScale.invertExtent( + category.scale.range[category.scale.range.length - 1])[1] + ); + + axisScale = d3.scale.ordinal() + .domain(ticks) + .rangePoints([0, width]); + var axis = d3.svg.axis() + .scale(axisScale) + .tickFormat(d3.format(".2s")); + } + + legendSvg.selectAll('rect') + .data(steps) + .enter() + .append('rect') + .attr('width', width / steps.length) + .attr('height', '20px') + .attr('fill', function (d) { + // console.log(d, colorScale(d)); + return colorScale(d); + }) + .attr('transform', function (d, i) { + return 'translate(' + i * width / steps.length + ' ,0)'; + }) + + } + + else if (category.type === 'continuous') { + var axisScale = d3.scale[category.scale.type]().domain(category.scale.domain).range([0, width]); + if (category.scale.type === 'log') { + axisScale.base(Math.E); + } + if (category.scale.type === 'pow') { + axisScale.exponent(1.5); + } + + var gradient = legendSvg + .append('defs') + .append('linearGradient') + .attr('id', 'gradient' + index); + gradient.append('stop') + .attr('offset', '0%') + .attr('stop-color', category.scale.range[0]); + gradient.append('stop') + .attr('offset', '100%') + .attr('stop-color', category.scale.range[1]); + legendSvg.append('rect') + .attr('fill', 'url(#gradient' + index + ')') + .attr('width', '100%') + .attr('height', '20px'); + + var axis = d3.svg.axis() + .scale(axisScale) + .tickFormat(d3.format(".2s")) + } + + legendSvg.append('g') + .attr('class', 'x axis') + .attr('transform', 'translate(0, 20)') + .call(function (g) { + g.call(axis); + g.selectAll('path.domain, line') + .attr({ + 'fill': 'none', + 'stroke': 'black' + }); + }); + }); + + } + + this.categories = function (categories) { + m_categories = categories; + this.draw(); + } + + return this; +}; + +inherit(legend2dWidget, domWidget); + +registerWidget('dom', 'legend2d', legend2dWidget); +module.exports = legend2dWidget; diff --git a/src/ui/legendWidget.js b/src/ui/legendWidget.js index e6023ac8a6..b5019f2e19 100644 --- a/src/ui/legendWidget.js +++ b/src/ui/legendWidget.js @@ -183,6 +183,25 @@ var legendWidget = function (arg) { return d.name; }); + var discreteCategories = m_categories.filter(function (category) { + return category.type == 'discrete'; + }); + + var dis = m_group + .selectAll('g.discrete') + .data(discreteCategories) + .enter() + .append('g') + .attr('transform', function (d, i) { + return 'translate(0,' + scale.y(i) + ')'; + }); + + dis.append('text') + .attr('x', '50px') + .attr('y', 0) + .attr('dy', '0.3em') + .text("abcdef") + m_this.reposition(); return m_this; From 921ea7e7ab8ab759a5fb4e70a561b7ee2b13095f Mon Sep 17 00:00:00 2001 From: Matthew Ma Date: Wed, 16 Aug 2017 11:45:39 -0400 Subject: [PATCH 02/19] initial functional implementation --- examples/legend2d/main.js | 93 ++++++++++++----- src/ui/legend2dWidget.js | 215 +++++++++++++++++++++----------------- 2 files changed, 189 insertions(+), 119 deletions(-) diff --git a/examples/legend2d/main.js b/examples/legend2d/main.js index d68dcff0a7..d1cfad69bf 100644 --- a/examples/legend2d/main.js +++ b/examples/legend2d/main.js @@ -43,42 +43,87 @@ $(function () { // * fill: (bool) Turn on or off the fill // * fillColor: (string|object) The fill color // * fillOpacity: (number) The fill opacity + // legend.categories([ + // { + // name: 'test1', + // type: 'discrete', + // scale: { + // type: 'ordinal', + // domain: ['beijing', 'new york', 'london'], + // range: ['red', 'green', 'blue'] + // } + // }, + // { + // name: 'test2', + // type: 'discrete', + // scale: { + // type: 'quantize', + // domain: [100, 1000], + // range: colorbrewer.YlGnBu["9"] + // } + // }, + // { + // name: 'test3', + // type: 'continuous', + // scale: { + // type: 'pow', + // domain: [100, 10000], + // range: ['red', 'blue'] + // } + // }, + // { + // name: 'test4', + // type: 'continuous', + // scale: { + // type: 'log', + // domain: [100, 10000], + // range: ['purple', 'orange'] + // } + // } + // ]); + legend.categories([ { - name: 'test1', + name: 'ordinal 1', + type: 'discrete', + scale: 'ordinal', + domain: ['beijing', 'new york', 'london', 'paris'], + colors: ['red', 'green', 'blue', 'orange'] + }, + { + name: 'discrete countinous 1', + type: 'discrete', + scale: 'linear', + domain: [100, 1000], + colors: colorbrewer.YlGnBu["9"] + }, + { + name: 'discrete countinous 2', type: 'discrete', - scale: { - type: 'ordinal', - domain: ['beijing', 'new york', 'london'], - range: ['red', 'green', 'blue'] - } + scale: 'sqrt', + domain: [100, 1000], + colors: colorbrewer.PRGn['8'] }, { - name: 'test2', + name: 'discrete countinous 3', type: 'discrete', - scale: { - type: 'quantize', - domain: [20000, 120000], - range: colorbrewer.YlGnBu["9"] - } + scale: 'linear', + domain: [0.001, 0.00001], + colors: colorbrewer.RdBu["8"] }, { - name: 'test3', + name: 'continuous continuous 1', type: 'continuous', - scale: { - type: 'pow', - domain: [100, 10000], - range: ['red', 'blue'] - } + scale: 'pow', + domain: [100, 10000], + colors: ['red', 'blue'] }, { - name: 'test4', + name: 'continuous continuous 2', type: 'continuous', - scale: { - type: 'log', - domain: [100, 10000], - range: ['purple', 'orange'] - } + scale: 'sqrt', + domain: [100, 10000], + colors: ['purple', 'orange'] } ]); diff --git a/src/ui/legend2dWidget.js b/src/ui/legend2dWidget.js index 6ba0529811..2b69567494 100644 --- a/src/ui/legend2dWidget.js +++ b/src/ui/legend2dWidget.js @@ -1,7 +1,6 @@ var domWidget = require('./domWidget'); var inherit = require('../inherit'); var registerWidget = require('../registry').registerWidget; -require('./legend2dWidget.styl'); var legend2dWidget = function (arg) { 'use strict'; @@ -48,113 +47,26 @@ var legend2dWidget = function (arg) { var container = d3.select(m_this.canvas()).append('div'); var width = 700; + var margin = 15; + // this.width = width; m_categories.forEach(function (category, index) { var legendSvg = container .append('div') - .style({ - 'width': width + 'px', - 'height': '50px' - }) .append('svg') .attr({ - 'width': '100%', - 'height': '100%' + 'width': width, + 'height': '50px', + 'viewBox': -margin + ' 0 ' + width + ' 50' }) if (category.type === 'discrete') { - var steps; - var colorScale = d3.scale[category.scale.type]().domain(category.scale.domain).range(category.scale.range); - var axisScale; - if (category.scale.type === 'ordinal') { - steps = category.scale.domain; - - axisScale = d3.scale.ordinal() - .domain(category.scale.domain) - .rangePoints([0, width]); - var axis = d3.svg.axis() - .scale(axisScale); - } - else if (category.scale.type === 'quantize') { - steps = category.scale.range.map(function (color) { - var range = colorScale.invertExtent(color); - // console.log(color, range); - return (range[1] - range[0]) / 2 + range[0]; - }); - - var steps2 = category.scale.range.map(function (color) { - return colorScale.invertExtent(color)[0]; - }); - - var ticks = steps2.slice(); - ticks.push(colorScale.invertExtent( - category.scale.range[category.scale.range.length - 1])[1] - ); - - axisScale = d3.scale.ordinal() - .domain(ticks) - .rangePoints([0, width]); - var axis = d3.svg.axis() - .scale(axisScale) - .tickFormat(d3.format(".2s")); - } - - legendSvg.selectAll('rect') - .data(steps) - .enter() - .append('rect') - .attr('width', width / steps.length) - .attr('height', '20px') - .attr('fill', function (d) { - // console.log(d, colorScale(d)); - return colorScale(d); - }) - .attr('transform', function (d, i) { - return 'translate(' + i * width / steps.length + ' ,0)'; - }) - + m_this._drawDiscrete(legendSvg, width - 2 * margin, category); } else if (category.type === 'continuous') { - var axisScale = d3.scale[category.scale.type]().domain(category.scale.domain).range([0, width]); - if (category.scale.type === 'log') { - axisScale.base(Math.E); - } - if (category.scale.type === 'pow') { - axisScale.exponent(1.5); - } - - var gradient = legendSvg - .append('defs') - .append('linearGradient') - .attr('id', 'gradient' + index); - gradient.append('stop') - .attr('offset', '0%') - .attr('stop-color', category.scale.range[0]); - gradient.append('stop') - .attr('offset', '100%') - .attr('stop-color', category.scale.range[1]); - legendSvg.append('rect') - .attr('fill', 'url(#gradient' + index + ')') - .attr('width', '100%') - .attr('height', '20px'); - - var axis = d3.svg.axis() - .scale(axisScale) - .tickFormat(d3.format(".2s")) + m_this.drawContinous(legendSvg, width - 2 * margin, category); } - - legendSvg.append('g') - .attr('class', 'x axis') - .attr('transform', 'translate(0, 20)') - .call(function (g) { - g.call(axis); - g.selectAll('path.domain, line') - .attr({ - 'fill': 'none', - 'stroke': 'black' - }); - }); }); } @@ -164,9 +76,122 @@ var legend2dWidget = function (arg) { this.draw(); } + this._drawDiscrete = function (svg, width, category) { + if (category.scale === 'ordinal') { + var colorScale = d3.scale.ordinal().domain(category.domain).range(category.colors); + m_this._renderDiscreteColors(svg, category.domain, colorScale, width); + + axisScale = d3.scale.ordinal() + .domain(category.domain) + .rangeRoundBands([0, width]); + var axis = d3.svg.axis() + .scale(axisScale); + m_this._renderAxis(svg, axis); + + } + else if (['linear', 'log', 'sqrt', 'pow'].indexOf(category.scale) != -1) { + var valueRange = [0, category.colors.length]; + var valueScale = d3.scale[category.scale]().domain(category.domain).range(valueRange).nice(); + var colorScale = d3.scale.quantize().domain(valueRange).range(category.colors); + var steps = range(0, category.colors.length - 1); + m_this._renderDiscreteColors(svg, steps, colorScale, width); + + + var ticks = steps.slice(); + ticks.push(category.colors.length); + var axisScale = d3.scale.ordinal() + .domain(ticks.map(function (tick) { + return valueScale.invert(tick); + })) + .rangePoints([0, width]); + var axis = d3.svg.axis() + .scale(axisScale) + .tickFormat(d3.format(".1s")); + m_this._renderAxis(svg, axis); + } + } + + this._renderDiscreteColors = function (svg, steps, colorScale, width) { + svg.selectAll('rect') + .data(steps) + .enter() + .append('rect') + .attr('width', width / steps.length) + .attr('height', '20px') + .attr('fill', function (d) { + return colorScale(d); + }) + .attr('transform', function (d, i) { + return 'translate(' + i * width / steps.length + ' ,0)'; + }); + } + + this._renderAxis = function (svg, axis) { + svg.append('g') + .attr('class', 'x axis') + .attr('transform', 'translate(0, 20)') + .call(function (g) { + g.call(axis); + g.selectAll('path.domain, line') + .style({ + 'fill': 'none', + 'stroke': 'black', + 'stroke-width': '0.7' + }); + g.selectAll('text') + .style({ + 'font-size': '12px' + }); + }); + } + + this.drawContinous = function (svg, width, category) { + if (['linear', 'log', 'sqrt', 'pow'].indexOf(category.scale) == -1) { + throw new Error('unsupported scale'); + } + var axisScale = d3.scale[category.scale]().domain(category.domain).range([0, width]).nice(); + if (category.scale === 'log' && category.base) { + axisScale.base(category.base); + } + if (category.scale === 'pow' && category.exponent) { + axisScale.exponent(category.exponent); + } + + var randomString = Math.random().toString(36).substring(5); + + var gradient = svg + .append('defs') + .append('linearGradient') + .attr('id', 'gradient' + randomString); + gradient.append('stop') + .attr('offset', '0%') + .attr('stop-color', category.colors[0]); + gradient.append('stop') + .attr('offset', '100%') + .attr('stop-color', category.colors[1]); + svg.append('rect') + .attr('fill', 'url(#gradient' + randomString + ')') + .attr('width', width) + .attr('height', '20px'); + + var axis = d3.svg.axis() + .scale(axisScale) + .tickFormat(d3.format(".1s")); + + this._renderAxis(svg, axis); + } + return this; }; +function range(start, end) { + var foo = []; + for (var i = start; i <= end; i++) { + foo.push(i); + } + return foo; +} + inherit(legend2dWidget, domWidget); registerWidget('dom', 'legend2d', legend2dWidget); From f6f4466b746013843a3455a49a25a2be88fab921 Mon Sep 17 00:00:00 2001 From: Matthew Ma Date: Wed, 16 Aug 2017 12:36:41 -0400 Subject: [PATCH 03/19] Reverts some unintential changes; --- examples/legend/main.js | 6 ------ src/ui/legendWidget.js | 19 ------------------- 2 files changed, 25 deletions(-) diff --git a/examples/legend/main.js b/examples/legend/main.js index 3d616f06d4..3c9896c88e 100644 --- a/examples/legend/main.js +++ b/examples/legend/main.js @@ -104,12 +104,6 @@ $(function () { fillColor: 'magenta', fillOpacity: 0.5 } - }, - { - name: 'test1', - type: 'discrete', - style: { - } } ]); diff --git a/src/ui/legendWidget.js b/src/ui/legendWidget.js index b5019f2e19..e6023ac8a6 100644 --- a/src/ui/legendWidget.js +++ b/src/ui/legendWidget.js @@ -183,25 +183,6 @@ var legendWidget = function (arg) { return d.name; }); - var discreteCategories = m_categories.filter(function (category) { - return category.type == 'discrete'; - }); - - var dis = m_group - .selectAll('g.discrete') - .data(discreteCategories) - .enter() - .append('g') - .attr('transform', function (d, i) { - return 'translate(0,' + scale.y(i) + ')'; - }); - - dis.append('text') - .attr('x', '50px') - .attr('y', 0) - .attr('dy', '0.3em') - .text("abcdef") - m_this.reposition(); return m_this; From 84a8d934697ad9a22c77a2aea86bf41ae38ea4b9 Mon Sep 17 00:00:00 2001 From: Matthew Ma Date: Thu, 17 Aug 2017 12:11:15 -0400 Subject: [PATCH 04/19] Initial implementation of mouseover popup; Other improvements; --- examples/legend2d/main.js | 64 ++++------------------ src/ui/legend2dWidget.js | 108 +++++++++++++++++++++++++------------- 2 files changed, 83 insertions(+), 89 deletions(-) diff --git a/examples/legend2d/main.js b/examples/legend2d/main.js index d1cfad69bf..0b79b0c5c1 100644 --- a/examples/legend2d/main.js +++ b/examples/legend2d/main.js @@ -32,56 +32,7 @@ $(function () { // * style: (object) The feature style object // * type: (string) The feature type ('point', 'line', 'other') // - // Points are displayed as circles, lines as lines, and everything else - // is displayed as a rounded rectangle. The style objects have the same - // properties as feature styles (fill is ignored for lines): - // - // * stroke: (bool) Turn on or off the stroke - // * strokeWidth: (number) The stroke width in pixels - // * strokeColor: (string|object) The stroke color - // * strokeOpacity: (number) The stroke opacity - // * fill: (bool) Turn on or off the fill - // * fillColor: (string|object) The fill color - // * fillOpacity: (number) The fill opacity - // legend.categories([ - // { - // name: 'test1', - // type: 'discrete', - // scale: { - // type: 'ordinal', - // domain: ['beijing', 'new york', 'london'], - // range: ['red', 'green', 'blue'] - // } - // }, - // { - // name: 'test2', - // type: 'discrete', - // scale: { - // type: 'quantize', - // domain: [100, 1000], - // range: colorbrewer.YlGnBu["9"] - // } - // }, - // { - // name: 'test3', - // type: 'continuous', - // scale: { - // type: 'pow', - // domain: [100, 10000], - // range: ['red', 'blue'] - // } - // }, - // { - // name: 'test4', - // type: 'continuous', - // scale: { - // type: 'log', - // domain: [100, 10000], - // range: ['purple', 'orange'] - // } - // } - // ]); - + legend.categories([ { name: 'ordinal 1', @@ -101,14 +52,14 @@ $(function () { name: 'discrete countinous 2', type: 'discrete', scale: 'sqrt', - domain: [100, 1000], - colors: colorbrewer.PRGn['8'] + domain: [10000, 1000000], + colors: colorbrewer.PRGn['11'] }, { name: 'discrete countinous 3', type: 'discrete', scale: 'linear', - domain: [0.001, 0.00001], + domain: [0.1, 0.001], colors: colorbrewer.RdBu["8"] }, { @@ -124,6 +75,13 @@ $(function () { scale: 'sqrt', domain: [100, 10000], colors: ['purple', 'orange'] + }, + { + name: 'continuous continuous 3', + type: 'continuous', + scale: 'log', + domain: [100, 10000], + colors: ['blue', 'olive'] } ]); diff --git a/src/ui/legend2dWidget.js b/src/ui/legend2dWidget.js index 2b69567494..30bf9cc9dd 100644 --- a/src/ui/legend2dWidget.js +++ b/src/ui/legend2dWidget.js @@ -14,41 +14,30 @@ var legend2dWidget = function (arg) { m_default_canvas = 'div'; var m_categories = []; - /** - * Initializes DOM Widget. - * Sets the canvas for the widget, does parent/child relationship management, - * appends it to it's parent and handles any positioning logic. - */ - this._init = function () { - if (arg.hasOwnProperty('parent')) { - arg.parent.addChild(m_this); - } + var oldInit = this._init; - m_this._createCanvas(); - m_this._appendChild(); - - m_this.canvas().addEventListener('mousedown', function (e) { - e.stopPropagation(); - }); - - m_this.reposition(); - }; - - /** - * Creates the widget canvas. - * This is just a simple DOM element (based on args.el, or defaults to a div) - */ - this._createCanvas = function () { - m_this.canvas(document.createElement(arg.el || m_default_canvas)); - }; + this._init = function () { + oldInit(); + m_this.popup = d3.select(m_this.canvas()).append('div') + .style({ + 'position': 'absolute', + 'background': 'white', + 'height': '22px', + 'font-size': '14px', + 'border': 'solid 1px black', + 'padding': '0 5px', + 'pointer-events': 'none', + 'white-space': 'nowrap', + 'z-index': 100000, + 'opacity': 0, + }) + } this.draw = function () { - m_this._init(); var container = d3.select(m_this.canvas()).append('div'); var width = 700; var margin = 15; - // this.width = width; m_categories.forEach(function (category, index) { var legendSvg = container @@ -79,7 +68,9 @@ var legend2dWidget = function (arg) { this._drawDiscrete = function (svg, width, category) { if (category.scale === 'ordinal') { var colorScale = d3.scale.ordinal().domain(category.domain).range(category.colors); - m_this._renderDiscreteColors(svg, category.domain, colorScale, width); + m_this._renderDiscreteColors(svg, category.domain, colorScale, width, function (d) { + return d; + }); axisScale = d3.scale.ordinal() .domain(category.domain) @@ -94,8 +85,9 @@ var legend2dWidget = function (arg) { var valueScale = d3.scale[category.scale]().domain(category.domain).range(valueRange).nice(); var colorScale = d3.scale.quantize().domain(valueRange).range(category.colors); var steps = range(0, category.colors.length - 1); - m_this._renderDiscreteColors(svg, steps, colorScale, width); - + m_this._renderDiscreteColors(svg, steps, colorScale, width, function (d) { + return m_this.popupFormatter(valueScale.invert(d)) + ' - ' + m_this.popupFormatter(valueScale.invert(d + 1)); + }); var ticks = steps.slice(); ticks.push(category.colors.length); @@ -106,12 +98,12 @@ var legend2dWidget = function (arg) { .rangePoints([0, width]); var axis = d3.svg.axis() .scale(axisScale) - .tickFormat(d3.format(".1s")); + .tickFormat(d3.format('.2s')); m_this._renderAxis(svg, axis); } } - this._renderDiscreteColors = function (svg, steps, colorScale, width) { + this._renderDiscreteColors = function (svg, steps, colorScale, width, getValue) { svg.selectAll('rect') .data(steps) .enter() @@ -123,7 +115,11 @@ var legend2dWidget = function (arg) { }) .attr('transform', function (d, i) { return 'translate(' + i * width / steps.length + ' ,0)'; - }); + }) + .on('mouseover', function (d) { + m_this._showPopup(getValue(d)); + }) + .on('mouseout', m_this._hidePopup); } this._renderAxis = function (svg, axis) { @@ -172,15 +168,48 @@ var legend2dWidget = function (arg) { svg.append('rect') .attr('fill', 'url(#gradient' + randomString + ')') .attr('width', width) - .attr('height', '20px'); + .attr('height', '20px') + .on('mouseover', function (d) { + var value = axisScale.invert(d3.mouse(this)[0]); + var text = m_this.popupFormatter(value); + m_this._showPopup(text); + }) + .on('mouseout', m_this._hidePopup) var axis = d3.svg.axis() .scale(axisScale) - .tickFormat(d3.format(".1s")); + .ticks(6, '.2s'); this._renderAxis(svg, axis); } + this.popupFormatter = function (number) { + number = parseFloat(number.toFixed(6)); + var precision = getPrecision(number); + precision = Math.min(precision, Math.max(3, 7 - Math.trunc(number).toString().length)) + return d3.format('.' + precision + 'f')(number); + } + + this._showPopup = function (text) { + var offset = d3.mouse(m_this.canvas()); + m_this.popup + .text(text) + .style({ + 'left': offset[0] + 'px', + 'top': (offset[1] - 22) + 'px' + }) + m_this.popup + .transition() + .duration(200) + .style('opacity', 1) + } + + this._hidePopup = function () { + m_this.popup.transition() + .duration(500) + .style('opacity', 0); + } + return this; }; @@ -192,6 +221,13 @@ function range(start, end) { return foo; } +function getPrecision(a) { + if (!isFinite(a)) return 0; + var e = 1, p = 0; + while (Math.round(a * e) / e !== a) { e *= 10; p++; } + return p; +} + inherit(legend2dWidget, domWidget); registerWidget('dom', 'legend2d', legend2dWidget); From d45d2f153bab9a8eb3d8d93a38f575aada25bd3b Mon Sep 17 00:00:00 2001 From: Matthew Ma Date: Thu, 17 Aug 2017 13:35:50 -0400 Subject: [PATCH 05/19] Limits number of axis ticks for all type of legend; Adds legend name; Adds container style; --- examples/legend2d/main.js | 20 ++++++++-------- src/ui/legend2dWidget.js | 49 +++++++++++++++++++++++++++++++++------ 2 files changed, 52 insertions(+), 17 deletions(-) diff --git a/examples/legend2d/main.js b/examples/legend2d/main.js index 0b79b0c5c1..54a6c9d99c 100644 --- a/examples/legend2d/main.js +++ b/examples/legend2d/main.js @@ -35,49 +35,49 @@ $(function () { legend.categories([ { - name: 'ordinal 1', + name: 'Discrete Ordinal 1', type: 'discrete', scale: 'ordinal', domain: ['beijing', 'new york', 'london', 'paris'], colors: ['red', 'green', 'blue', 'orange'] }, { - name: 'discrete countinous 1', + name: 'Discrete countinous 1', type: 'discrete', scale: 'linear', domain: [100, 1000], - colors: colorbrewer.YlGnBu["9"] + colors: colorbrewer.YlGnBu['9'] }, { - name: 'discrete countinous 2', + name: 'Discrete countinous 2', type: 'discrete', scale: 'sqrt', domain: [10000, 1000000], colors: colorbrewer.PRGn['11'] }, { - name: 'discrete countinous 3', + name: 'Discrete countinous 3', type: 'discrete', scale: 'linear', domain: [0.1, 0.001], - colors: colorbrewer.RdBu["8"] + colors: colorbrewer.RdBu['8'] }, { - name: 'continuous continuous 1', + name: 'Continuous continuous 1', type: 'continuous', scale: 'pow', domain: [100, 10000], colors: ['red', 'blue'] }, { - name: 'continuous continuous 2', + name: 'Continuous continuous 2', type: 'continuous', scale: 'sqrt', - domain: [100, 10000], + domain: [100, 1000], colors: ['purple', 'orange'] }, { - name: 'continuous continuous 3', + name: 'Continuous continuous 3', type: 'continuous', scale: 'log', domain: [100, 10000], diff --git a/src/ui/legend2dWidget.js b/src/ui/legend2dWidget.js index 30bf9cc9dd..1899c64b58 100644 --- a/src/ui/legend2dWidget.js +++ b/src/ui/legend2dWidget.js @@ -18,7 +18,25 @@ var legend2dWidget = function (arg) { this._init = function () { oldInit(); - m_this.popup = d3.select(m_this.canvas()).append('div') + var canvas = m_this.canvas(); + d3.select(canvas) + .style({ + 'padding': '10px', + 'border': '1.5px solid black', + 'border-radius': '3px', + 'transition': '250ms background linear', + 'background-color': 'rgba(255, 255, 255, 0.75)' + }) + .on('mouseover', function () { + d3.select(this) + .style('background-color', 'rgba(255, 255, 255, 1)'); + }) + .on('mouseout', function () { + d3.select(this) + .style('background-color', 'rgba(255, 255, 255, 0.75)'); + }); + + m_this.popup = d3.select(canvas).append('div') .style({ 'position': 'absolute', 'background': 'white', @@ -36,17 +54,30 @@ var legend2dWidget = function (arg) { this.draw = function () { var container = d3.select(m_this.canvas()).append('div'); - var width = 700; - var margin = 15; + var width = 300; + var margin = 20; m_categories.forEach(function (category, index) { - var legendSvg = container + var legendContainer = container .append('div') + .style({ + 'margin-bottom': '10px' + }); + + legendContainer + .append('div') + .text(category.name) + .style({ + 'text-align': 'center' + }) + + var legendSvg = legendContainer .append('svg') .attr({ + 'display': 'block', 'width': width, - 'height': '50px', - 'viewBox': -margin + ' 0 ' + width + ' 50' + 'height': '40px', + 'viewBox': -margin + ' 0 ' + width + ' 40' }) if (category.type === 'discrete') { @@ -98,7 +129,11 @@ var legend2dWidget = function (arg) { .rangePoints([0, width]); var axis = d3.svg.axis() .scale(axisScale) - .tickFormat(d3.format('.2s')); + .tickFormat(d3.format('.2s')) + .tickValues(function () { + var skip = Math.ceil(axisScale.domain().length / 6); + return axisScale.domain().filter(function (d, i) { return i % skip === 0; }); + }); m_this._renderAxis(svg, axis); } } From ced0ec294dee6d4a95f74a56395b78977c91da7e Mon Sep 17 00:00:00 2001 From: Matthew Ma Date: Thu, 17 Aug 2017 15:24:34 -0400 Subject: [PATCH 06/19] Supports pass in categories in beginning; precision display improvement, don't add unnecessary precision; --- src/ui/legend2dWidget.js | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src/ui/legend2dWidget.js b/src/ui/legend2dWidget.js index 1899c64b58..af6539e036 100644 --- a/src/ui/legend2dWidget.js +++ b/src/ui/legend2dWidget.js @@ -49,10 +49,18 @@ var legend2dWidget = function (arg) { 'z-index': 100000, 'opacity': 0, }) + + if (arg.categories) { + this.categories(arg.categories); + } } this.draw = function () { - var container = d3.select(m_this.canvas()).append('div'); + d3.select(m_this.canvas()).selectAll('div.legends').remove(); + + var container = d3.select(m_this.canvas()) + .append('div') + .attr('class', 'legends'); var width = 300; var margin = 20; @@ -99,9 +107,7 @@ var legend2dWidget = function (arg) { this._drawDiscrete = function (svg, width, category) { if (category.scale === 'ordinal') { var colorScale = d3.scale.ordinal().domain(category.domain).range(category.colors); - m_this._renderDiscreteColors(svg, category.domain, colorScale, width, function (d) { - return d; - }); + m_this._renderDiscreteColors(svg, category.domain, colorScale, width, function (d) { return d; }); axisScale = d3.scale.ordinal() .domain(category.domain) @@ -116,8 +122,9 @@ var legend2dWidget = function (arg) { var valueScale = d3.scale[category.scale]().domain(category.domain).range(valueRange).nice(); var colorScale = d3.scale.quantize().domain(valueRange).range(category.colors); var steps = range(0, category.colors.length - 1); + var precision = Math.max.apply(null, category.domain.map(function (number) { return getPrecision(number) })); m_this._renderDiscreteColors(svg, steps, colorScale, width, function (d) { - return m_this.popupFormatter(valueScale.invert(d)) + ' - ' + m_this.popupFormatter(valueScale.invert(d + 1)); + return m_this._popupFormatter(valueScale.invert(d), precision) + ' - ' + m_this._popupFormatter(valueScale.invert(d + 1), precision); }); var ticks = steps.slice(); @@ -151,7 +158,7 @@ var legend2dWidget = function (arg) { .attr('transform', function (d, i) { return 'translate(' + i * width / steps.length + ' ,0)'; }) - .on('mouseover', function (d) { + .on('mousemove', function (d) { m_this._showPopup(getValue(d)); }) .on('mouseout', m_this._hidePopup); @@ -189,6 +196,7 @@ var legend2dWidget = function (arg) { } var randomString = Math.random().toString(36).substring(5); + var precision = Math.max.apply(null, category.domain.map(function (number) { return getPrecision(number) })); var gradient = svg .append('defs') @@ -204,9 +212,9 @@ var legend2dWidget = function (arg) { .attr('fill', 'url(#gradient' + randomString + ')') .attr('width', width) .attr('height', '20px') - .on('mouseover', function (d) { + .on('mousemove', function (d) { var value = axisScale.invert(d3.mouse(this)[0]); - var text = m_this.popupFormatter(value); + var text = m_this._popupFormatter(value, precision); m_this._showPopup(text); }) .on('mouseout', m_this._hidePopup) @@ -218,9 +226,9 @@ var legend2dWidget = function (arg) { this._renderAxis(svg, axis); } - this.popupFormatter = function (number) { - number = parseFloat(number.toFixed(6)); - var precision = getPrecision(number); + this._popupFormatter = function (number, precision) { + number = parseFloat(number.toFixed(8)); + var precision = Math.min(precision, getPrecision(number)); precision = Math.min(precision, Math.max(3, 7 - Math.trunc(number).toString().length)) return d3.format('.' + precision + 'f')(number); } From c903e4ac1422d939eb1d0ef9f3e4086dda00cc0f Mon Sep 17 00:00:00 2001 From: Matthew Ma Date: Thu, 17 Aug 2017 16:20:06 -0400 Subject: [PATCH 07/19] Adds support for quantile scale --- examples/legend2d/main.js | 26 +++++++++++++++++--------- src/ui/legend2dWidget.js | 36 ++++++++++++++++++++++++++++++------ 2 files changed, 47 insertions(+), 15 deletions(-) diff --git a/examples/legend2d/main.js b/examples/legend2d/main.js index 54a6c9d99c..c746b2cf00 100644 --- a/examples/legend2d/main.js +++ b/examples/legend2d/main.js @@ -9,7 +9,7 @@ $(function () { }); // Add the default osm layer - // map.createLayer('osm'); + map.createLayer('osm'); // Create a ui layer var ui = map.createLayer('ui'); @@ -32,54 +32,62 @@ $(function () { // * style: (object) The feature style object // * type: (string) The feature type ('point', 'line', 'other') // - legend.categories([ { - name: 'Discrete Ordinal 1', + name: 'Discrete ordinal', type: 'discrete', scale: 'ordinal', domain: ['beijing', 'new york', 'london', 'paris'], colors: ['red', 'green', 'blue', 'orange'] }, { - name: 'Discrete countinous 1', + name: 'Discrete linear', type: 'discrete', scale: 'linear', domain: [100, 1000], colors: colorbrewer.YlGnBu['9'] }, { - name: 'Discrete countinous 2', + name: 'Discrete sqrt', type: 'discrete', scale: 'sqrt', domain: [10000, 1000000], colors: colorbrewer.PRGn['11'] }, { - name: 'Discrete countinous 3', + name: 'Discrete quantile', + type: 'discrete', + scale: 'quantile', + domain: [96, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144, 148, 152, 156, 160, 164, 168, 172, 176, 180, 184, 188, 192, 196, 200], + colors: colorbrewer.Greens['8'] + }, + { + name: 'Discrete linear 2', type: 'discrete', scale: 'linear', domain: [0.1, 0.001], colors: colorbrewer.RdBu['8'] }, { - name: 'Continuous continuous 1', + name: 'Continuous Pow', type: 'continuous', scale: 'pow', + exponent: 1.1, domain: [100, 10000], colors: ['red', 'blue'] }, { - name: 'Continuous continuous 2', + name: 'Continuous sqrt', type: 'continuous', scale: 'sqrt', domain: [100, 1000], colors: ['purple', 'orange'] }, { - name: 'Continuous continuous 3', + name: 'Continuous log', type: 'continuous', scale: 'log', + base: Math.E, domain: [100, 10000], colors: ['blue', 'olive'] } diff --git a/src/ui/legend2dWidget.js b/src/ui/legend2dWidget.js index af6539e036..e9ebf9821b 100644 --- a/src/ui/legend2dWidget.js +++ b/src/ui/legend2dWidget.js @@ -117,6 +117,26 @@ var legend2dWidget = function (arg) { m_this._renderAxis(svg, axis); } + else if (category.scale === 'quantile') { + var valueRange = [0, category.colors.length]; + var steps = range(0, category.colors.length - 1); + var valueScale = d3.scale.quantile().domain(category.domain).range(steps); + var colorScale = d3.scale.quantize().domain(valueRange).range(category.colors); + m_this._renderDiscreteColors(svg, steps, colorScale, width, function (d) { + return valueScale.invertExtent(d).join(' - '); + }); + + var axisDomain = [valueScale.invertExtent(0)[0]]; + axisDomain = axisDomain.concat(steps.map(function (step) { return valueScale.invertExtent(step)[1] })); + + var ticks = steps.slice(); + ticks.push(category.colors.length); + var axisScale = d3.scale.ordinal() + .domain(axisDomain) + .rangePoints([0, width]); + var axis = createDiscreteContinousAxis(axisScale); + m_this._renderAxis(svg, axis); + } else if (['linear', 'log', 'sqrt', 'pow'].indexOf(category.scale) != -1) { var valueRange = [0, category.colors.length]; var valueScale = d3.scale[category.scale]().domain(category.domain).range(valueRange).nice(); @@ -134,14 +154,18 @@ var legend2dWidget = function (arg) { return valueScale.invert(tick); })) .rangePoints([0, width]); - var axis = d3.svg.axis() + var axis = createDiscreteContinousAxis(axisScale); + m_this._renderAxis(svg, axis); + } + + function createDiscreteContinousAxis(axisScale) { + return d3.svg.axis() .scale(axisScale) .tickFormat(d3.format('.2s')) .tickValues(function () { var skip = Math.ceil(axisScale.domain().length / 6); return axisScale.domain().filter(function (d, i) { return i % skip === 0; }); }); - m_this._renderAxis(svg, axis); } } @@ -194,7 +218,6 @@ var legend2dWidget = function (arg) { if (category.scale === 'pow' && category.exponent) { axisScale.exponent(category.exponent); } - var randomString = Math.random().toString(36).substring(5); var precision = Math.max.apply(null, category.domain.map(function (number) { return getPrecision(number) })); @@ -249,16 +272,17 @@ var legend2dWidget = function (arg) { this._hidePopup = function () { m_this.popup.transition() - .duration(500) + .duration(200) .style('opacity', 0); } return this; }; -function range(start, end) { +function range(start, end, step) { + step = step || 1; var foo = []; - for (var i = start; i <= end; i++) { + for (var i = start; i <= end; i += step) { foo.push(i); } return foo; From 3931db6b1b572601a61f7a909ecfdbdd64188ec0 Mon Sep 17 00:00:00 2001 From: Matthew Ma Date: Thu, 17 Aug 2017 22:15:50 -0400 Subject: [PATCH 08/19] Improves popup positioning; --- examples/legend2d/example.json | 3 ++- examples/legend2d/main.js | 2 +- src/ui/legend2dWidget.js | 10 +++++++--- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/examples/legend2d/example.json b/examples/legend2d/example.json index d3d9109fa9..5fa98f3ed6 100644 --- a/examples/legend2d/example.json +++ b/examples/legend2d/example.json @@ -5,5 +5,6 @@ "exampleJs": ["main.js"], "about": { "text": "This example shows how to create a legend to describe feature styles on a map." - } + }, + "disabled": true } diff --git a/examples/legend2d/main.js b/examples/legend2d/main.js index c746b2cf00..95fb776b31 100644 --- a/examples/legend2d/main.js +++ b/examples/legend2d/main.js @@ -69,7 +69,7 @@ $(function () { colors: colorbrewer.RdBu['8'] }, { - name: 'Continuous Pow', + name: 'Continuous pow', type: 'continuous', scale: 'pow', exponent: 1.1, diff --git a/src/ui/legend2dWidget.js b/src/ui/legend2dWidget.js index e9ebf9821b..3e7e558b18 100644 --- a/src/ui/legend2dWidget.js +++ b/src/ui/legend2dWidget.js @@ -257,14 +257,18 @@ var legend2dWidget = function (arg) { } this._showPopup = function (text) { + // The cursor location relative to the container var offset = d3.mouse(m_this.canvas()); m_this.popup - .text(text) + .text(text); + var containerWidth = m_this.canvas().clientWidth; + var popupWidth = m_this.popup[0][0].clientWidth; + m_this.popup .style({ - 'left': offset[0] + 'px', + // If the popup will be longer or almost longer than the container + 'left': offset[0] - (offset[0] + popupWidth - containerWidth > -10 ? popupWidth : 0) + 'px', 'top': (offset[1] - 22) + 'px' }) - m_this.popup .transition() .duration(200) .style('opacity', 1) From c21553d1ddbab1a53d3ff9dd028d908ba4d8e7e9 Mon Sep 17 00:00:00 2001 From: Matthew Ma Date: Thu, 17 Aug 2017 22:40:37 -0400 Subject: [PATCH 09/19] Fixes eslint errors; --- src/ui/legend2dWidget.js | 97 ++++++++++++++++++++-------------------- 1 file changed, 48 insertions(+), 49 deletions(-) diff --git a/src/ui/legend2dWidget.js b/src/ui/legend2dWidget.js index 3e7e558b18..70a0577d61 100644 --- a/src/ui/legend2dWidget.js +++ b/src/ui/legend2dWidget.js @@ -1,3 +1,4 @@ +var d3 = require('d3'); var domWidget = require('./domWidget'); var inherit = require('../inherit'); var registerWidget = require('../registry').registerWidget; @@ -10,8 +11,7 @@ var legend2dWidget = function (arg) { domWidget.call(this, arg); - var m_this = this, - m_default_canvas = 'div'; + var m_this = this; var m_categories = []; var oldInit = this._init; @@ -47,13 +47,13 @@ var legend2dWidget = function (arg) { 'pointer-events': 'none', 'white-space': 'nowrap', 'z-index': 100000, - 'opacity': 0, - }) + 'opacity': 0 + }); if (arg.categories) { this.categories(arg.categories); } - } + }; this.draw = function () { d3.select(m_this.canvas()).selectAll('div.legends').remove(); @@ -77,7 +77,7 @@ var legend2dWidget = function (arg) { .text(category.name) .style({ 'text-align': 'center' - }) + }); var legendSvg = legendContainer .append('svg') @@ -86,75 +86,73 @@ var legend2dWidget = function (arg) { 'width': width, 'height': '40px', 'viewBox': -margin + ' 0 ' + width + ' 40' - }) + }); if (category.type === 'discrete') { m_this._drawDiscrete(legendSvg, width - 2 * margin, category); - } - - else if (category.type === 'continuous') { + } else if (category.type === 'continuous') { m_this.drawContinous(legendSvg, width - 2 * margin, category); } }); - } + }; this.categories = function (categories) { m_categories = categories; this.draw(); - } + }; this._drawDiscrete = function (svg, width, category) { + var valueRange, valueScale, colorScale, axisScale, axis, steps, ticks; if (category.scale === 'ordinal') { - var colorScale = d3.scale.ordinal().domain(category.domain).range(category.colors); + colorScale = d3.scale.ordinal().domain(category.domain).range(category.colors); m_this._renderDiscreteColors(svg, category.domain, colorScale, width, function (d) { return d; }); axisScale = d3.scale.ordinal() .domain(category.domain) .rangeRoundBands([0, width]); - var axis = d3.svg.axis() + axis = d3.svg.axis() .scale(axisScale); m_this._renderAxis(svg, axis); - } - else if (category.scale === 'quantile') { - var valueRange = [0, category.colors.length]; - var steps = range(0, category.colors.length - 1); - var valueScale = d3.scale.quantile().domain(category.domain).range(steps); - var colorScale = d3.scale.quantize().domain(valueRange).range(category.colors); + } else if (category.scale === 'quantile') { + valueRange = [0, category.colors.length]; + steps = range(0, category.colors.length - 1); + valueScale = d3.scale.quantile().domain(category.domain).range(steps); + colorScale = d3.scale.quantize().domain(valueRange).range(category.colors); m_this._renderDiscreteColors(svg, steps, colorScale, width, function (d) { return valueScale.invertExtent(d).join(' - '); }); var axisDomain = [valueScale.invertExtent(0)[0]]; - axisDomain = axisDomain.concat(steps.map(function (step) { return valueScale.invertExtent(step)[1] })); + axisDomain = axisDomain.concat(steps.map(function (step) { return valueScale.invertExtent(step)[1]; })); - var ticks = steps.slice(); + ticks = steps.slice(); ticks.push(category.colors.length); - var axisScale = d3.scale.ordinal() + axisScale = d3.scale.ordinal() .domain(axisDomain) .rangePoints([0, width]); - var axis = createDiscreteContinousAxis(axisScale); + axis = createDiscreteContinousAxis(axisScale); m_this._renderAxis(svg, axis); - } - else if (['linear', 'log', 'sqrt', 'pow'].indexOf(category.scale) != -1) { - var valueRange = [0, category.colors.length]; - var valueScale = d3.scale[category.scale]().domain(category.domain).range(valueRange).nice(); - var colorScale = d3.scale.quantize().domain(valueRange).range(category.colors); - var steps = range(0, category.colors.length - 1); - var precision = Math.max.apply(null, category.domain.map(function (number) { return getPrecision(number) })); + + } else if (['linear', 'log', 'sqrt', 'pow'].indexOf(category.scale) !== -1) { + valueRange = [0, category.colors.length]; + valueScale = d3.scale[category.scale]().domain(category.domain).range(valueRange).nice(); + colorScale = d3.scale.quantize().domain(valueRange).range(category.colors); + steps = range(0, category.colors.length - 1); + var precision = Math.max.apply(null, category.domain.map(function (number) { return getPrecision(number); })); m_this._renderDiscreteColors(svg, steps, colorScale, width, function (d) { return m_this._popupFormatter(valueScale.invert(d), precision) + ' - ' + m_this._popupFormatter(valueScale.invert(d + 1), precision); }); - var ticks = steps.slice(); + ticks = steps.slice(); ticks.push(category.colors.length); - var axisScale = d3.scale.ordinal() + axisScale = d3.scale.ordinal() .domain(ticks.map(function (tick) { return valueScale.invert(tick); })) .rangePoints([0, width]); - var axis = createDiscreteContinousAxis(axisScale); + axis = createDiscreteContinousAxis(axisScale); m_this._renderAxis(svg, axis); } @@ -167,7 +165,7 @@ var legend2dWidget = function (arg) { return axisScale.domain().filter(function (d, i) { return i % skip === 0; }); }); } - } + }; this._renderDiscreteColors = function (svg, steps, colorScale, width, getValue) { svg.selectAll('rect') @@ -186,7 +184,7 @@ var legend2dWidget = function (arg) { m_this._showPopup(getValue(d)); }) .on('mouseout', m_this._hidePopup); - } + }; this._renderAxis = function (svg, axis) { svg.append('g') @@ -205,13 +203,14 @@ var legend2dWidget = function (arg) { 'font-size': '12px' }); }); - } + }; this.drawContinous = function (svg, width, category) { - if (['linear', 'log', 'sqrt', 'pow'].indexOf(category.scale) == -1) { + var axisScale, axis; + if (['linear', 'log', 'sqrt', 'pow'].indexOf(category.scale) === -1) { throw new Error('unsupported scale'); } - var axisScale = d3.scale[category.scale]().domain(category.domain).range([0, width]).nice(); + axisScale = d3.scale[category.scale]().domain(category.domain).range([0, width]).nice(); if (category.scale === 'log' && category.base) { axisScale.base(category.base); } @@ -219,7 +218,7 @@ var legend2dWidget = function (arg) { axisScale.exponent(category.exponent); } var randomString = Math.random().toString(36).substring(5); - var precision = Math.max.apply(null, category.domain.map(function (number) { return getPrecision(number) })); + var precision = Math.max.apply(null, category.domain.map(function (number) { return getPrecision(number); })); var gradient = svg .append('defs') @@ -240,21 +239,21 @@ var legend2dWidget = function (arg) { var text = m_this._popupFormatter(value, precision); m_this._showPopup(text); }) - .on('mouseout', m_this._hidePopup) + .on('mouseout', m_this._hidePopup); - var axis = d3.svg.axis() + axis = d3.svg.axis() .scale(axisScale) .ticks(6, '.2s'); this._renderAxis(svg, axis); - } + }; this._popupFormatter = function (number, precision) { number = parseFloat(number.toFixed(8)); - var precision = Math.min(precision, getPrecision(number)); - precision = Math.min(precision, Math.max(3, 7 - Math.trunc(number).toString().length)) + precision = Math.min(precision, getPrecision(number)); + precision = Math.min(precision, Math.max(3, 7 - Math.trunc(number).toString().length)); return d3.format('.' + precision + 'f')(number); - } + }; this._showPopup = function (text) { // The cursor location relative to the container @@ -271,14 +270,14 @@ var legend2dWidget = function (arg) { }) .transition() .duration(200) - .style('opacity', 1) - } + .style('opacity', 1); + }; this._hidePopup = function () { m_this.popup.transition() .duration(200) .style('opacity', 0); - } + }; return this; }; From fd4b1664750c0b3a9b5f3712d3b2eaa3cf1c6125 Mon Sep 17 00:00:00 2001 From: Matthew Ma Date: Fri, 18 Aug 2017 15:19:41 -0400 Subject: [PATCH 10/19] Rename from legend2DWidget to colorLegendWidget; add methods for adding and removing categories; other improvements; --- examples/color-legend/example.json | 10 ++++++ examples/{legend2d => color-legend}/index.pug | 0 examples/{legend2d => color-legend}/main.css | 0 examples/{legend2d => color-legend}/main.js | 2 +- examples/color-legend/thumb.jpg | Bin 0 -> 88784 bytes examples/legend2d/example.json | 10 ------ examples/legend2d/thumb.jpg | Bin 101846 -> 0 bytes ...legend2dWidget.js => colorLegendWidget.js} | 32 ++++++++++++++---- src/ui/index.js | 2 +- 9 files changed, 38 insertions(+), 18 deletions(-) create mode 100644 examples/color-legend/example.json rename examples/{legend2d => color-legend}/index.pug (100%) rename examples/{legend2d => color-legend}/main.css (100%) rename examples/{legend2d => color-legend}/main.js (97%) create mode 100755 examples/color-legend/thumb.jpg delete mode 100644 examples/legend2d/example.json delete mode 100644 examples/legend2d/thumb.jpg rename src/ui/{legend2dWidget.js => colorLegendWidget.js} (92%) diff --git a/examples/color-legend/example.json b/examples/color-legend/example.json new file mode 100644 index 0000000000..6334765f32 --- /dev/null +++ b/examples/color-legend/example.json @@ -0,0 +1,10 @@ +{ + "path": "color-legend", + "title": "Color legends", + "exampleCss": ["main.css"], + "exampleJs": ["main.js"], + "about": { + "text": "This example shows how to create a discrete or continous color legends." + }, + "disabled": true +} diff --git a/examples/legend2d/index.pug b/examples/color-legend/index.pug similarity index 100% rename from examples/legend2d/index.pug rename to examples/color-legend/index.pug diff --git a/examples/legend2d/main.css b/examples/color-legend/main.css similarity index 100% rename from examples/legend2d/main.css rename to examples/color-legend/main.css diff --git a/examples/legend2d/main.js b/examples/color-legend/main.js similarity index 97% rename from examples/legend2d/main.js rename to examples/color-legend/main.js index 95fb776b31..23fe0cc883 100644 --- a/examples/legend2d/main.js +++ b/examples/color-legend/main.js @@ -15,7 +15,7 @@ $(function () { var ui = map.createLayer('ui'); // Create a legend widget - var legend = ui.createWidget('legend2d', { + var legend = ui.createWidget('colorLegend', { position: { right: 20, top: 10 diff --git a/examples/color-legend/thumb.jpg b/examples/color-legend/thumb.jpg new file mode 100755 index 0000000000000000000000000000000000000000..bb396df9b642905c740bd473c93cfea22e246f9b GIT binary patch literal 88784 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 dwV0$SIZcgeUDzjcxwS{y$Z#4>JG& literal 0 HcmV?d00001 diff --git a/examples/legend2d/example.json b/examples/legend2d/example.json deleted file mode 100644 index 5fa98f3ed6..0000000000 --- a/examples/legend2d/example.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "path": "legend2d", - "title": "2D legends", - "exampleCss": ["main.css"], - "exampleJs": ["main.js"], - "about": { - "text": "This example shows how to create a legend to describe feature styles on a map." - }, - "disabled": true -} diff --git a/examples/legend2d/thumb.jpg b/examples/legend2d/thumb.jpg deleted file mode 100644 index 49204293a34d0a2982726efb6e1a062ae5be3de1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101846 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 PYjpqrLXN)!-6sDJwETO~ diff --git a/src/ui/legend2dWidget.js b/src/ui/colorLegendWidget.js similarity index 92% rename from src/ui/legend2dWidget.js rename to src/ui/colorLegendWidget.js index 70a0577d61..54b93952e7 100644 --- a/src/ui/legend2dWidget.js +++ b/src/ui/colorLegendWidget.js @@ -3,10 +3,10 @@ var domWidget = require('./domWidget'); var inherit = require('../inherit'); var registerWidget = require('../registry').registerWidget; -var legend2dWidget = function (arg) { +var colorLegendWidget = function (arg) { 'use strict'; - if (!(this instanceof legend2dWidget)) { - return new legend2dWidget(arg); + if (!(this instanceof colorLegendWidget)) { + return new colorLegendWidget(arg); } domWidget.call(this, arg); @@ -21,6 +21,7 @@ var legend2dWidget = function (arg) { var canvas = m_this.canvas(); d3.select(canvas) .style({ + 'display': 'none', 'padding': '10px', 'border': '1.5px solid black', 'border-radius': '3px', @@ -58,6 +59,13 @@ var legend2dWidget = function (arg) { this.draw = function () { d3.select(m_this.canvas()).selectAll('div.legends').remove(); + if (!m_categories.length) { + d3.select(m_this.canvas()).style('display', 'none'); + return; + } else { + d3.select(m_this.canvas()).style('display', 'block'); + } + var container = d3.select(m_this.canvas()) .append('div') .attr('class', 'legends'); @@ -102,6 +110,18 @@ var legend2dWidget = function (arg) { this.draw(); }; + this.addCategories = function (categories) { + m_categories = m_categories.concat(categories); + this.draw(); + }; + + this.removeCategories = function (categories) { + m_categories = m_categories.filter(function (category) { + return categories.indexOf(category) === -1; + }); + this.draw(); + }; + this._drawDiscrete = function (svg, width, category) { var valueRange, valueScale, colorScale, axisScale, axis, steps, ticks; if (category.scale === 'ordinal') { @@ -298,7 +318,7 @@ function getPrecision(a) { return p; } -inherit(legend2dWidget, domWidget); +inherit(colorLegendWidget, domWidget); -registerWidget('dom', 'legend2d', legend2dWidget); -module.exports = legend2dWidget; +registerWidget('dom', 'colorLegend', colorLegendWidget); +module.exports = colorLegendWidget; diff --git a/src/ui/index.js b/src/ui/index.js index 93ac20f988..8ab164d051 100644 --- a/src/ui/index.js +++ b/src/ui/index.js @@ -4,7 +4,7 @@ module.exports = { domWidget: require('./domWidget'), legendWidget: require('./legendWidget'), - legend2dWidget: require('./legend2dWidget'), + colorLegendWidget: require('./colorLegendWidget'), sliderWidget: require('./sliderWidget'), svgWidget: require('./svgWidget'), uiLayer: require('./uiLayer'), From 1d78b450d943b766ca5e47824f5c85bb38ed2c71 Mon Sep 17 00:00:00 2001 From: Matthew Ma Date: Mon, 21 Aug 2017 10:22:07 -0400 Subject: [PATCH 11/19] Adds legend tick limit to ordinal scale as well. --- src/ui/colorLegendWidget.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/ui/colorLegendWidget.js b/src/ui/colorLegendWidget.js index 54b93952e7..b70c1efde2 100644 --- a/src/ui/colorLegendWidget.js +++ b/src/ui/colorLegendWidget.js @@ -132,7 +132,11 @@ var colorLegendWidget = function (arg) { .domain(category.domain) .rangeRoundBands([0, width]); axis = d3.svg.axis() - .scale(axisScale); + .scale(axisScale) + .tickValues(function () { + var skip = Math.ceil(axisScale.domain().length / 6); + return axisScale.domain().filter(function (d, i) { return i % skip === 0; }); + }); m_this._renderAxis(svg, axis); } else if (category.scale === 'quantile') { From 1fec30d7f9b8abc633eb22a5732d08e09b4eec8c Mon Sep 17 00:00:00 2001 From: Matthew Ma Date: Fri, 25 Aug 2017 14:59:31 -0400 Subject: [PATCH 12/19] Adds unit test --- examples/color-legend/main.js | 2 + src/ui/colorLegendWidget.js | 8 +- tests/cases/colorLegend.js | 187 ++++++++++++++++++++++++++++++++++ 3 files changed, 194 insertions(+), 3 deletions(-) create mode 100644 tests/cases/colorLegend.js diff --git a/examples/color-legend/main.js b/examples/color-legend/main.js index 23fe0cc883..95cbddb940 100644 --- a/examples/color-legend/main.js +++ b/examples/color-legend/main.js @@ -1,3 +1,5 @@ +var colorbrewer = colorbrewer; + // Run after the DOM loads $(function () { 'use strict'; diff --git a/src/ui/colorLegendWidget.js b/src/ui/colorLegendWidget.js index b70c1efde2..cdc887a0d2 100644 --- a/src/ui/colorLegendWidget.js +++ b/src/ui/colorLegendWidget.js @@ -28,16 +28,17 @@ var colorLegendWidget = function (arg) { 'transition': '250ms background linear', 'background-color': 'rgba(255, 255, 255, 0.75)' }) - .on('mouseover', function () { + .on('mouseenter', function () { d3.select(this) .style('background-color', 'rgba(255, 255, 255, 1)'); }) - .on('mouseout', function () { + .on('mouseleave', function () { d3.select(this) .style('background-color', 'rgba(255, 255, 255, 0.75)'); }); m_this.popup = d3.select(canvas).append('div') + .attr('class', 'color-legend-popup') .style({ 'position': 'absolute', 'background': 'white', @@ -76,6 +77,7 @@ var colorLegendWidget = function (arg) { m_categories.forEach(function (category, index) { var legendContainer = container .append('div') + .attr('class', 'legend') .style({ 'margin-bottom': '10px' }); @@ -258,7 +260,7 @@ var colorLegendWidget = function (arg) { .attr('fill', 'url(#gradient' + randomString + ')') .attr('width', width) .attr('height', '20px') - .on('mousemove', function (d) { + .on('mousemove', function () { var value = axisScale.invert(d3.mouse(this)[0]); var text = m_this._popupFormatter(value, precision); m_this._showPopup(text); diff --git a/tests/cases/colorLegend.js b/tests/cases/colorLegend.js new file mode 100644 index 0000000000..2ad9e57e74 --- /dev/null +++ b/tests/cases/colorLegend.js @@ -0,0 +1,187 @@ +var $ = require('jquery'); +var colorbrewer = require('colorbrewer'); +var geo = require('../test-utils').geo; + +describe('color legend', function () { + 'use strict'; + + var map; + var container = null; + var legendWidget = null; + var allCategories = [ + { + name: 'Discrete ordinal', + type: 'discrete', + scale: 'ordinal', + domain: ['beijing', 'new york', 'london', 'paris'], + colors: ['red', 'green', 'blue', 'orange'] + }, + { + name: 'Discrete linear', + type: 'discrete', + scale: 'linear', + domain: [100, 1000], + colors: colorbrewer.YlGnBu['9'] + }, + { + name: 'Discrete sqrt', + type: 'discrete', + scale: 'sqrt', + domain: [10000, 1000000], + colors: colorbrewer.PRGn['11'] + }, + { + name: 'Discrete quantile', + type: 'discrete', + scale: 'quantile', + domain: [96, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144, 148, 152, 156, 160, 164, 168, 172, 176, 180, 184, 188, 192, 196, 200], + colors: colorbrewer.Greens['8'] + }, + { + name: 'Discrete linear 2', + type: 'discrete', + scale: 'linear', + domain: [0.1, 0.001], + colors: colorbrewer.RdBu['8'] + }, + { + name: 'Continuous pow', + type: 'continuous', + scale: 'pow', + exponent: 1.1, + domain: [100, 10000], + colors: ['red', 'blue'] + }, + { + name: 'Continuous sqrt', + type: 'continuous', + scale: 'sqrt', + domain: [100, 1000], + colors: ['purple', 'orange'] + }, + { + name: 'Continuous log', + type: 'continuous', + scale: 'log', + base: Math.E, + domain: [100, 10000], + colors: ['blue', 'olive'] + } + ]; + + beforeEach(function () { + container = $('

') + .css({ width: '500px', height: '400px' }).appendTo('body'); + map = geo.map({ + 'node': container, + 'center': [0, 0], + 'zoom': 2, + 'clampZoom': false, + 'clampBoundsX': false, + 'clampBoundsY': false + }); + legendWidget = map.createLayer('ui').createWidget('colorLegend', { + categories: [allCategories[0]] + }); + map.draw(); + }); + + afterEach(function () { + map.exit(); + container.remove(); + }); + + it('Create basic color legend widget', function (done) { + expect($(container).find('.legend').length).toBe(1); + done(); + }); + + it('set new categories', function (done) { + legendWidget.categories([allCategories[1], allCategories[2]]); + expect($(container).find('.legend').length).toBe(2); + done(); + }); + + it('add remove categories', function (done) { + legendWidget.addCategories([allCategories[1], allCategories[2]]); + expect($(container).find('.legend').length).toBe(3); + legendWidget.removeCategories([allCategories[1], allCategories[2]]); + expect($(container).find('.legend').length).toBe(1); + done(); + }); + + it('test different kind of categories', function (done) { + legendWidget.categories(allCategories); + var legends = $(container).find('.legend'); + expect(legends.length).toBe(allCategories.length); + expect($(legends[0]).find('svg>rect').length).toBe(4); + expect($(legends[0]).find('svg>rect:first').attr('fill')).toBe('red'); + expect($(legends[0]).find('svg g.tick').length).toBe(4); + + expect($(legends[1]).find('svg>rect').length).toBe(9); + expect($(legends[1]).find('svg g.tick').length).toBe(5); + + expect($(legends[2]).find('svg>rect').length).toBe(11); + expect($(legends[2]).find('svg g.tick').length).toBe(6); + expect($(legends[2]).find('svg g.tick:last text').text()).toBe('830k'); + + expect($(legends[3]).find('svg>rect').length).toBe(8); + expect($(legends[3]).find('svg g.tick').length).toBe(5); + expect($(legends[3]).find('svg g.tick:eq(2) text').text()).toBe('150'); + + expect($(legends[4]).find('svg>rect').length).toBe(8); + expect($(legends[4]).find('svg>rect:first').attr('fill')).toBe(allCategories[4].colors[0]); + expect($(legends[4]).find('svg g.tick:last text').text()).toBe('0.0'); + + expect($(legends[5]).find('svg>rect').length).toBe(1); + expect($(legends[5]).find('svg>rect:first').attr('fill').indexOf('url')).not.toBe(-1); + expect($(legends[5]).find('svg g.tick').length).toBe(6); + expect($(legends[5]).find('svg g.tick:first text').text()).toBe('0.00k'); + + expect($(legends[6]).find('svg>rect').length).toBe(1); + expect($(legends[6]).find('svg g.tick').length).toBe(5); + + expect($(legends[7]).find('svg>rect').length).toBe(1); + expect($(legends[7]).find('svg g.tick').length).toBe(5); + expect($(legends[7]).find('svg g.tick text').toArray().map(function (text) { + return $(text).text(); + }).join(', ')).toBe('150, 400, 1.1k, 3.0k, 8.1k'); + done(); + }); + + it('test mouse events', function (done) { + function CreateEvent(eventType, params) { + params = params || { bubbles: false, cancelable: false }; + var mouseEvent = document.createEvent('MouseEvent'); + mouseEvent.initMouseEvent(eventType, params.bubbles, params.cancelable, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); + return mouseEvent; + } + + Math.trunc = Math.trunc || function (x) { + if (isNaN(x)) { + return NaN; + } + if (x > 0) { + return Math.floor(x); + } + return Math.ceil(x); + }; + + container[0].dispatchEvent(CreateEvent('mouseenter')); + container[0].dispatchEvent(CreateEvent('mouseleave')); + + legendWidget.categories([allCategories[1], allCategories[6]]); + var mousemove = CreateEvent('mousemove'); + mousemove.pageX = 115; + mousemove.pageY = 574; + var mouseout = CreateEvent('mousemove'); + var legends = $(container).find('.legend'); + $(legends[0]).find('svg>rect')[0].dispatchEvent(mousemove); + $(legends[0]).find('svg>rect')[0].dispatchEvent(mouseout); + expect($(container).find('.color-legend-popup').text()).toBe('100 - 200'); + $(legends[1]).find('svg>rect')[0].dispatchEvent(mousemove); + expect($(container).find('.color-legend-popup').text()).toBe('46'); + $(legends[1]).find('svg>rect')[0].dispatchEvent(mouseout); + done(); + }); +}); From 5b1811f7180660dd4b8630d5041b9cca02b075f8 Mon Sep 17 00:00:00 2001 From: Matthew Ma Date: Mon, 28 Aug 2017 12:27:10 -0400 Subject: [PATCH 13/19] Adds JSDocs --- src/ui/colorLegendWidget.js | 107 ++++++++++++++++++++++++++---------- 1 file changed, 78 insertions(+), 29 deletions(-) diff --git a/src/ui/colorLegendWidget.js b/src/ui/colorLegendWidget.js index cdc887a0d2..0a8b24db61 100644 --- a/src/ui/colorLegendWidget.js +++ b/src/ui/colorLegendWidget.js @@ -3,6 +3,30 @@ var domWidget = require('./domWidget'); var inherit = require('../inherit'); var registerWidget = require('../registry').registerWidget; +/** + * @typedef {object} [geo.gui.colorLegendWidget.category] + * @property {string} name The text label of the legend. + * @property {string} type The type of the legend, either discrete or continuous. + * @property {string} scale The scale of the legend. For discrete type, + * linear, log, sqrt, pow, ordinal, and quantile is supported. + * For continuous type, linear, log, sqrt, and pow is supported. + * @property {number[]|string[]} domain Only for ordinal scale legend, string values are acceptable. For ordinal legend, the number in the domain array should be the same number of colors. For quantile scale legend, the domain should be an array of all values. For other scales, the domain needs to be an array of two number for marking the upper bound and lower bound. + * @property {string[]} colors The colors of the legend. All valid svg color can be used. For discrete type, multiple values are accepted. For continuous type, an array of two values is supported. + */ + +/** + * A UI widget that enables display discrete colors or two-color continuous transition legend. + * + * @class + * @alias geo.gui.colorLegendWidget + * @extends geo.gui.domWidget + * @param {object} [arg] Widget options. + * @param {object} [args.position] Position setting relatively to the map container. + * @param {number} [args.position.right] The pixel distance the widget to the right of the map container. + * @param {number} [args.position.top] The pixel distance the widget to the top of the map container. + * @param {geo.gui.colorLegendWidget.category[]} [args.categories] An array of category definitions for the initial color legends + * @returns {geo.gui.colorLegendWidget} + */ var colorLegendWidget = function (arg) { 'use strict'; if (!(this instanceof colorLegendWidget)) { @@ -15,7 +39,7 @@ var colorLegendWidget = function (arg) { var m_categories = []; var oldInit = this._init; - + // get the widget container ready this._init = function () { oldInit(); var canvas = m_this.canvas(); @@ -57,7 +81,8 @@ var colorLegendWidget = function (arg) { } }; - this.draw = function () { + // clear the DOM container and create legends + this._draw = function () { d3.select(m_this.canvas()).selectAll('div.legends').remove(); if (!m_categories.length) { @@ -101,29 +126,48 @@ var colorLegendWidget = function (arg) { if (category.type === 'discrete') { m_this._drawDiscrete(legendSvg, width - 2 * margin, category); } else if (category.type === 'continuous') { - m_this.drawContinous(legendSvg, width - 2 * margin, category); + m_this._drawContinous(legendSvg, width - 2 * margin, category); } }); }; + /** + * Set or get categories + * @param {geo.gui.colorLegendWidget.category[]} [categories] If `undefined`, return the current legend categories array. If an array is provided, remove current legends and recreate with the new categories. + * @returns {geo.gui.colorLegendWidget.category[]} + */ this.categories = function (categories) { + if (categories === undefined) { + return m_categories; + } m_categories = categories; - this.draw(); + this._draw(); }; + /** + * Add additional categories + * + * @param {geo.gui.colorLegendWidget.category[]} categories Append additional legend categories to the end the of the current list of legends. + */ this.addCategories = function (categories) { m_categories = m_categories.concat(categories); - this.draw(); + this._draw(); }; + /** + * Remove categories + * + * @param {geo.gui.colorLegendWidget.category[]} categories If a category object exists in the current legend categories, that category will be removed. + */ this.removeCategories = function (categories) { m_categories = m_categories.filter(function (category) { return categories.indexOf(category) === -1; }); - this.draw(); + this._draw(); }; + // Draw an individual discrete type legend this._drawDiscrete = function (svg, width, category) { var valueRange, valueScale, colorScale, axisScale, axis, steps, ticks; if (category.scale === 'ordinal') { @@ -158,7 +202,7 @@ var colorLegendWidget = function (arg) { axisScale = d3.scale.ordinal() .domain(axisDomain) .rangePoints([0, width]); - axis = createDiscreteContinousAxis(axisScale); + axis = createAxis(axisScale); m_this._renderAxis(svg, axis); } else if (['linear', 'log', 'sqrt', 'pow'].indexOf(category.scale) !== -1) { @@ -178,11 +222,11 @@ var colorLegendWidget = function (arg) { return valueScale.invert(tick); })) .rangePoints([0, width]); - axis = createDiscreteContinousAxis(axisScale); + axis = createAxis(axisScale); m_this._renderAxis(svg, axis); } - function createDiscreteContinousAxis(axisScale) { + function createAxis(axisScale) { return d3.svg.axis() .scale(axisScale) .tickFormat(d3.format('.2s')) @@ -193,6 +237,7 @@ var colorLegendWidget = function (arg) { } }; + // Actually render colors for discrete type with d3 this._renderDiscreteColors = function (svg, steps, colorScale, width, getValue) { svg.selectAll('rect') .data(steps) @@ -212,26 +257,8 @@ var colorLegendWidget = function (arg) { .on('mouseout', m_this._hidePopup); }; - this._renderAxis = function (svg, axis) { - svg.append('g') - .attr('class', 'x axis') - .attr('transform', 'translate(0, 20)') - .call(function (g) { - g.call(axis); - g.selectAll('path.domain, line') - .style({ - 'fill': 'none', - 'stroke': 'black', - 'stroke-width': '0.7' - }); - g.selectAll('text') - .style({ - 'font-size': '12px' - }); - }); - }; - - this.drawContinous = function (svg, width, category) { + // Draw an individual continous type legend + this._drawContinous = function (svg, width, category) { var axisScale, axis; if (['linear', 'log', 'sqrt', 'pow'].indexOf(category.scale) === -1) { throw new Error('unsupported scale'); @@ -274,6 +301,27 @@ var colorLegendWidget = function (arg) { this._renderAxis(svg, axis); }; + // actually render the axis with d3 + this._renderAxis = function (svg, axis) { + svg.append('g') + .attr('class', 'x axis') + .attr('transform', 'translate(0, 20)') + .call(function (g) { + g.call(axis); + g.selectAll('path.domain, line') + .style({ + 'fill': 'none', + 'stroke': 'black', + 'stroke-width': '0.7' + }); + g.selectAll('text') + .style({ + 'font-size': '12px' + }); + }); + }; + + // formatter of number that tries to maximize the precision while making the output shorter this._popupFormatter = function (number, precision) { number = parseFloat(number.toFixed(8)); precision = Math.min(precision, getPrecision(number)); @@ -281,6 +329,7 @@ var colorLegendWidget = function (arg) { return d3.format('.' + precision + 'f')(number); }; + // show the popup based on current mouse event this._showPopup = function (text) { // The cursor location relative to the container var offset = d3.mouse(m_this.canvas()); From 8e9e5b877ce7cc3e2a6d1a6a1f26cc530ef1a6b3 Mon Sep 17 00:00:00 2001 From: Matthew Ma Date: Mon, 4 Sep 2017 13:28:31 -0400 Subject: [PATCH 14/19] Updates jsdocs; refactors codes based on review. --- examples/color-legend/example.json | 2 +- src/ui/colorLegendWidget.js | 223 ++++++++++++++++------------- src/ui/colorLegendWidget.styl | 42 ++++++ src/ui/widget.js | 12 ++ src/util/index.js | 15 ++ tests/cases/colorLegend.js | 53 +++++-- 6 files changed, 231 insertions(+), 116 deletions(-) create mode 100644 src/ui/colorLegendWidget.styl diff --git a/examples/color-legend/example.json b/examples/color-legend/example.json index 6334765f32..0e20f95f2f 100644 --- a/examples/color-legend/example.json +++ b/examples/color-legend/example.json @@ -1,7 +1,7 @@ { "path": "color-legend", "title": "Color legends", - "exampleCss": ["main.css"], + "exampleCss": [], "exampleJs": ["main.js"], "about": { "text": "This example shows how to create a discrete or continous color legends." diff --git a/src/ui/colorLegendWidget.js b/src/ui/colorLegendWidget.js index 0a8b24db61..f76970d623 100644 --- a/src/ui/colorLegendWidget.js +++ b/src/ui/colorLegendWidget.js @@ -2,29 +2,46 @@ var d3 = require('d3'); var domWidget = require('./domWidget'); var inherit = require('../inherit'); var registerWidget = require('../registry').registerWidget; +var util = require('../util'); + +require('./colorLegendWidget.styl'); /** - * @typedef {object} [geo.gui.colorLegendWidget.category] + * @typedef {object} geo.gui.colorLegendWidget.category * @property {string} name The text label of the legend. * @property {string} type The type of the legend, either discrete or continuous. * @property {string} scale The scale of the legend. For discrete type, * linear, log, sqrt, pow, ordinal, and quantile is supported. * For continuous type, linear, log, sqrt, and pow is supported. - * @property {number[]|string[]} domain Only for ordinal scale legend, string values are acceptable. For ordinal legend, the number in the domain array should be the same number of colors. For quantile scale legend, the domain should be an array of all values. For other scales, the domain needs to be an array of two number for marking the upper bound and lower bound. - * @property {string[]} colors The colors of the legend. All valid svg color can be used. For discrete type, multiple values are accepted. For continuous type, an array of two values is supported. + * @property {number[]|string[]} domain Only for ordinal scale legend, string + * values are acceptable. For ordinal legend, the number in the domain array + * should be the same number of colors. For quantile scale legend, the domain + * should be an array of all values. For other scales, the domain needs to be + * an array of two number for marking the upper bound and lower bound. + * This domain property will be used with d3 scale object internally. + * @property {geo.geoColor[]} colors The colors of the legend. + * All valid svg color can be used. For discrete type, multiple values + * are accepted. For continuous type, an array of two values is supported. + * @property {number} [base] The base of log when log scale is used. + * default to 10. + * @property {number} [exponent] The exponent of power when power scale is used. + * default to 1. */ /** - * A UI widget that enables display discrete colors or two-color continuous transition legend. + * A UI widget that enables display discrete colors or two-color continuous + * transition legend. * * @class * @alias geo.gui.colorLegendWidget * @extends geo.gui.domWidget * @param {object} [arg] Widget options. - * @param {object} [args.position] Position setting relatively to the map container. - * @param {number} [args.position.right] The pixel distance the widget to the right of the map container. - * @param {number} [args.position.top] The pixel distance the widget to the top of the map container. - * @param {geo.gui.colorLegendWidget.category[]} [args.categories] An array of category definitions for the initial color legends + * @param {geo.gui.widget.position} [arg.position] Position setting relatively to the map + * container. + * @param {geo.gui.colorLegendWidget.category[]} [arg.categories] An array + * of category definitions for the initial color legends + * @param {number} [arg.width] The pixel width of the wiget in number. Default is 300px. + * @param {number} [arg.ticks] The maximum number of ticks on the axis of a legend, default is 6. * @returns {geo.gui.colorLegendWidget} */ var colorLegendWidget = function (arg) { @@ -35,53 +52,29 @@ var colorLegendWidget = function (arg) { domWidget.call(this, arg); - var m_this = this; - var m_categories = []; - - var oldInit = this._init; + var m_this = this, + m_categories = [], + m_width = arg.width || 300, + m_ticks = arg.ticks || 6, + s_init = this._init; // get the widget container ready this._init = function () { - oldInit(); + s_init(); var canvas = m_this.canvas(); d3.select(canvas) - .style({ - 'display': 'none', - 'padding': '10px', - 'border': '1.5px solid black', - 'border-radius': '3px', - 'transition': '250ms background linear', - 'background-color': 'rgba(255, 255, 255, 0.75)' - }) - .on('mouseenter', function () { - d3.select(this) - .style('background-color', 'rgba(255, 255, 255, 1)'); - }) - .on('mouseleave', function () { - d3.select(this) - .style('background-color', 'rgba(255, 255, 255, 0.75)'); - }); + .attr('class', 'color-legend-container'); m_this.popup = d3.select(canvas).append('div') - .attr('class', 'color-legend-popup') - .style({ - 'position': 'absolute', - 'background': 'white', - 'height': '22px', - 'font-size': '14px', - 'border': 'solid 1px black', - 'padding': '0 5px', - 'pointer-events': 'none', - 'white-space': 'nowrap', - 'z-index': 100000, - 'opacity': 0 - }); + .attr('class', 'color-legend-popup'); if (arg.categories) { this.categories(arg.categories); } }; - // clear the DOM container and create legends + /** + * clear the DOM container and create legends + */ this._draw = function () { d3.select(m_this.canvas()).selectAll('div.legends').remove(); @@ -96,28 +89,23 @@ var colorLegendWidget = function (arg) { .append('div') .attr('class', 'legends'); - var width = 300; + var width = m_width; var margin = 20; m_categories.forEach(function (category, index) { var legendContainer = container .append('div') - .attr('class', 'legend') - .style({ - 'margin-bottom': '10px' - }); + .attr('class', 'legend'); legendContainer .append('div') - .text(category.name) - .style({ - 'text-align': 'center' - }); + .attr('class', 'title') + .text(category.name); var legendSvg = legendContainer .append('svg') .attr({ - 'display': 'block', + 'class': 'svg', 'width': width, 'height': '40px', 'viewBox': -margin + ' 0 ' + width + ' 40' @@ -133,46 +121,73 @@ var colorLegendWidget = function (arg) { }; /** - * Set or get categories - * @param {geo.gui.colorLegendWidget.category[]} [categories] If `undefined`, return the current legend categories array. If an array is provided, remove current legends and recreate with the new categories. - * @returns {geo.gui.colorLegendWidget.category[]} + * Set or get categories. + * @param {geo.gui.colorLegendWidget.category[]} [categories] If `undefined`, + * return the current legend categories array. If an array is provided, + * remove current legends and recreate with the new categories. + * @returns {geo.gui.colorLegendWidget.category[]|this} + * The current list of categories or the current class instance. */ this.categories = function (categories) { if (categories === undefined) { return m_categories; } - m_categories = categories; + m_categories = this._prepareCategories(categories); this._draw(); + return this; }; /** - * Add additional categories - * - * @param {geo.gui.colorLegendWidget.category[]} categories Append additional legend categories to the end the of the current list of legends. + * Add additional categories. + * @param {geo.gui.colorLegendWidget.category[]} categories Append additional + * legend categories to the end the of the current list of legends. + * @returns {this} The current class instance. */ this.addCategories = function (categories) { - m_categories = m_categories.concat(categories); + m_categories = m_categories.concat(this._prepareCategories(categories)); this._draw(); + return this; }; /** * Remove categories * - * @param {geo.gui.colorLegendWidget.category[]} categories If a category object exists in the current legend categories, that category will be removed. + * @param {geo.gui.colorLegendWidget.category[]} categories If a category + * object exists in the current legend categories, that category will be + * removed. + * @returns {this} The current class instance. */ this.removeCategories = function (categories) { m_categories = m_categories.filter(function (category) { return categories.indexOf(category) === -1; }); this._draw(); + return this; }; - // Draw an individual discrete type legend + this._prepareCategories = function (categories) { + categories.forEach(function (category) { + category.color = category.colors.map(function (color) { + return util.convertColorToHex(color, true); + }); + }); + return categories; + }; + + /** + * Draw an individual discrete type legend + */ this._drawDiscrete = function (svg, width, category) { + if (['linear', 'log', 'sqrt', 'pow', 'quantile', 'ordinal'].indexOf(category.scale) === -1) { + throw new Error('unsupported scale'); + } var valueRange, valueScale, colorScale, axisScale, axis, steps, ticks; if (category.scale === 'ordinal') { - colorScale = d3.scale.ordinal().domain(category.domain).range(category.colors); - m_this._renderDiscreteColors(svg, category.domain, colorScale, width, function (d) { return d; }); + colorScale = d3.scale.ordinal() + .domain(category.domain) + .range(category.colors); + m_this._renderDiscreteColors( + svg, category.domain, colorScale, width, function (d) { return d; }); axisScale = d3.scale.ordinal() .domain(category.domain) @@ -180,14 +195,15 @@ var colorLegendWidget = function (arg) { axis = d3.svg.axis() .scale(axisScale) .tickValues(function () { - var skip = Math.ceil(axisScale.domain().length / 6); - return axisScale.domain().filter(function (d, i) { return i % skip === 0; }); + var skip = Math.ceil(axisScale.domain().length / m_ticks); + return axisScale.domain() + .filter(function (d, i) { return i % skip === 0; }); }); m_this._renderAxis(svg, axis); } else if (category.scale === 'quantile') { valueRange = [0, category.colors.length]; - steps = range(0, category.colors.length - 1); + steps = util.range(0, category.colors.length - 1); valueScale = d3.scale.quantile().domain(category.domain).range(steps); colorScale = d3.scale.quantize().domain(valueRange).range(category.colors); m_this._renderDiscreteColors(svg, steps, colorScale, width, function (d) { @@ -195,7 +211,8 @@ var colorLegendWidget = function (arg) { }); var axisDomain = [valueScale.invertExtent(0)[0]]; - axisDomain = axisDomain.concat(steps.map(function (step) { return valueScale.invertExtent(step)[1]; })); + axisDomain = axisDomain.concat(steps.map( + function (step) { return valueScale.invertExtent(step)[1]; })); ticks = steps.slice(); ticks.push(category.colors.length); @@ -207,12 +224,15 @@ var colorLegendWidget = function (arg) { } else if (['linear', 'log', 'sqrt', 'pow'].indexOf(category.scale) !== -1) { valueRange = [0, category.colors.length]; - valueScale = d3.scale[category.scale]().domain(category.domain).range(valueRange).nice(); + valueScale = d3.scale[category.scale]() + .domain(category.domain).range(valueRange).nice(); colorScale = d3.scale.quantize().domain(valueRange).range(category.colors); - steps = range(0, category.colors.length - 1); - var precision = Math.max.apply(null, category.domain.map(function (number) { return getPrecision(number); })); + steps = util.range(0, category.colors.length - 1); + var precision = Math.max.apply(null, category.domain + .map(function (number) { return getPrecision(number); })); m_this._renderDiscreteColors(svg, steps, colorScale, width, function (d) { - return m_this._popupFormatter(valueScale.invert(d), precision) + ' - ' + m_this._popupFormatter(valueScale.invert(d + 1), precision); + return m_this._popupFormatter(valueScale.invert(d), precision) + + ' - ' + m_this._popupFormatter(valueScale.invert(d + 1), precision); }); ticks = steps.slice(); @@ -226,18 +246,23 @@ var colorLegendWidget = function (arg) { m_this._renderAxis(svg, axis); } + /** + * render the axis based on the axis Scale + */ function createAxis(axisScale) { return d3.svg.axis() .scale(axisScale) .tickFormat(d3.format('.2s')) .tickValues(function () { - var skip = Math.ceil(axisScale.domain().length / 6); + var skip = Math.ceil(axisScale.domain().length / m_ticks); return axisScale.domain().filter(function (d, i) { return i % skip === 0; }); }); } }; - // Actually render colors for discrete type with d3 + /** + * Actually render colors for discrete type with d3 + */ this._renderDiscreteColors = function (svg, steps, colorScale, width, getValue) { svg.selectAll('rect') .data(steps) @@ -257,7 +282,9 @@ var colorLegendWidget = function (arg) { .on('mouseout', m_this._hidePopup); }; - // Draw an individual continous type legend + /** + * Draw an individual continous type legend + */ this._drawContinous = function (svg, width, category) { var axisScale, axis; if (['linear', 'log', 'sqrt', 'pow'].indexOf(category.scale) === -1) { @@ -270,8 +297,9 @@ var colorLegendWidget = function (arg) { if (category.scale === 'pow' && category.exponent) { axisScale.exponent(category.exponent); } - var randomString = Math.random().toString(36).substring(5); - var precision = Math.max.apply(null, category.domain.map(function (number) { return getPrecision(number); })); + var randomString = util.randomString(5); + var precision = Math.max.apply(null, category.domain + .map(function (number) { return getPrecision(number); })); var gradient = svg .append('defs') @@ -296,32 +324,27 @@ var colorLegendWidget = function (arg) { axis = d3.svg.axis() .scale(axisScale) - .ticks(6, '.2s'); + .ticks(m_ticks, '.2s'); this._renderAxis(svg, axis); }; - // actually render the axis with d3 + /** + * actually render the axis with d3. + */ this._renderAxis = function (svg, axis) { svg.append('g') - .attr('class', 'x axis') + .attr('class', 'axis x') .attr('transform', 'translate(0, 20)') .call(function (g) { g.call(axis); - g.selectAll('path.domain, line') - .style({ - 'fill': 'none', - 'stroke': 'black', - 'stroke-width': '0.7' - }); - g.selectAll('text') - .style({ - 'font-size': '12px' - }); }); }; - // formatter of number that tries to maximize the precision while making the output shorter + /** + * formatter of number that tries to maximize the precision + * while making the output shorter. + */ this._popupFormatter = function (number, precision) { number = parseFloat(number.toFixed(8)); precision = Math.min(precision, getPrecision(number)); @@ -329,7 +352,9 @@ var colorLegendWidget = function (arg) { return d3.format('.' + precision + 'f')(number); }; - // show the popup based on current mouse event + /** + * show the popup based on current mouse event. + */ this._showPopup = function (text) { // The cursor location relative to the container var offset = d3.mouse(m_this.canvas()); @@ -340,7 +365,8 @@ var colorLegendWidget = function (arg) { m_this.popup .style({ // If the popup will be longer or almost longer than the container - 'left': offset[0] - (offset[0] + popupWidth - containerWidth > -10 ? popupWidth : 0) + 'px', + 'left': offset[0] - (offset[0] + + popupWidth - containerWidth > -10 ? popupWidth : 0) + 'px', 'top': (offset[1] - 22) + 'px' }) .transition() @@ -357,15 +383,6 @@ var colorLegendWidget = function (arg) { return this; }; -function range(start, end, step) { - step = step || 1; - var foo = []; - for (var i = start; i <= end; i += step) { - foo.push(i); - } - return foo; -} - function getPrecision(a) { if (!isFinite(a)) return 0; var e = 1, p = 0; diff --git a/src/ui/colorLegendWidget.styl b/src/ui/colorLegendWidget.styl new file mode 100644 index 0000000000..582ab174c9 --- /dev/null +++ b/src/ui/colorLegendWidget.styl @@ -0,0 +1,42 @@ +.color-legend-container + display none + padding 10px + border 1.5px solid black + border-radius 3px + transition 250ms background linear + background-color rgba(255, 255, 255, 0.75) + + &:hover + background-color rgba(255, 255, 255, 1) + + .legends + + .legend + margin-bottom 10px + + .title + text-align center + + svg.svg + display block + + .axis.x + path.domain, line + fill none + stroke black + stroke-width 0.7 + text + font-size 12px + + .color-legend-popup + position absolute + background white + height 22px + font-size 14px + border solid 1px black + padding 0 5px + pointer-events none + white-space nowrap + z-index 100000 + opacity 0 + diff --git a/src/ui/widget.js b/src/ui/widget.js index 5a95a7ae65..72c60af141 100644 --- a/src/ui/widget.js +++ b/src/ui/widget.js @@ -1,6 +1,18 @@ var inherit = require('../inherit'); var sceneObject = require('../sceneObject'); +/** + * @typedef {object} geo.gui.widget.position + * @property {string|number} top The position to the top of the container. + * A string css position or a number. If a number is used, it will be treated as px value. + * @property {string|number} right The position to the right of the container. + * Value is used similarly to the top property. + * @property {string|number} bottom The position to the bottom of the container. + * Value is used similarly to the top property. + * @property {string|number} left The position to the left of the container. + * Value is used similarly to the top property. + */ + /** * Create a new instance of class widget * diff --git a/src/util/index.js b/src/util/index.js index b5ad093aaf..6fe323d6b0 100644 --- a/src/util/index.js +++ b/src/util/index.js @@ -395,6 +395,21 @@ var util = module.exports = { }; }, + /** + * Create an integer array contains elements from one integer to another integer. + * @param {integer} start The start integer + * @param {integer} end The end integer + * @param {integer} [step] The step, default to 1 + */ + range: function (start, end, step) { + step = step || 1; + var results = []; + for (var i = start; i <= end; i += step) { + results.push(i); + } + return results; + }, + /** * Compare two arrays and return if their contents are equal. * @param {array} a1 First array to compare. diff --git a/tests/cases/colorLegend.js b/tests/cases/colorLegend.js index 2ad9e57e74..8fc214828e 100644 --- a/tests/cases/colorLegend.js +++ b/tests/cases/colorLegend.js @@ -8,6 +8,7 @@ describe('color legend', function () { var map; var container = null; var legendWidget = null; + var uiLayer = null; var allCategories = [ { name: 'Discrete ordinal', @@ -80,7 +81,8 @@ describe('color legend', function () { 'clampBoundsX': false, 'clampBoundsY': false }); - legendWidget = map.createLayer('ui').createWidget('colorLegend', { + uiLayer = map.createLayer('ui'); + legendWidget = uiLayer.createWidget('colorLegend', { categories: [allCategories[0]] }); map.draw(); @@ -91,26 +93,55 @@ describe('color legend', function () { container.remove(); }); - it('Create basic color legend widget', function (done) { + it('Create basic color legend widget', function () { expect($(container).find('.legend').length).toBe(1); - done(); }); - it('set new categories', function (done) { + it('Create color legend widget without initial categories', function () { + uiLayer.removeChild(legendWidget); + legendWidget._exit(); + legendWidget = uiLayer.createWidget('colorLegend', { + categories: [] + }); + expect($(container).find('.legend').length).toBe(0); + }); + + it('Use unsupported scale', function () { + expect(function () { + legendWidget.categories([{ + name: '', + type: 'discrete', + scale: 'curvilinear', + domain: [100, 1000], + colors: colorbrewer.YlGnBu['9'] + }]); + }).toThrow(new Error('unsupported scale')); + + expect(function () { + legendWidget.categories([{ + name: '', + type: 'continuous', + scale: 'curvilinear', + domain: [100, 1000], + colors: colorbrewer.YlGnBu['9'] + }]); + }).toThrow(new Error('unsupported scale')); + }); + + it('set new categories', function () { legendWidget.categories([allCategories[1], allCategories[2]]); expect($(container).find('.legend').length).toBe(2); - done(); + expect(legendWidget.categories().length).toBe(2); }); - it('add remove categories', function (done) { + it('add remove categories', function () { legendWidget.addCategories([allCategories[1], allCategories[2]]); expect($(container).find('.legend').length).toBe(3); legendWidget.removeCategories([allCategories[1], allCategories[2]]); expect($(container).find('.legend').length).toBe(1); - done(); }); - it('test different kind of categories', function (done) { + it('test different kind of categories', function () { legendWidget.categories(allCategories); var legends = $(container).find('.legend'); expect(legends.length).toBe(allCategories.length); @@ -146,10 +177,9 @@ describe('color legend', function () { expect($(legends[7]).find('svg g.tick text').toArray().map(function (text) { return $(text).text(); }).join(', ')).toBe('150, 400, 1.1k, 3.0k, 8.1k'); - done(); }); - it('test mouse events', function (done) { + it('test mouse events', function () { function CreateEvent(eventType, params) { params = params || { bubbles: false, cancelable: false }; var mouseEvent = document.createEvent('MouseEvent'); @@ -174,7 +204,7 @@ describe('color legend', function () { var mousemove = CreateEvent('mousemove'); mousemove.pageX = 115; mousemove.pageY = 574; - var mouseout = CreateEvent('mousemove'); + var mouseout = CreateEvent('mouseout'); var legends = $(container).find('.legend'); $(legends[0]).find('svg>rect')[0].dispatchEvent(mousemove); $(legends[0]).find('svg>rect')[0].dispatchEvent(mouseout); @@ -182,6 +212,5 @@ describe('color legend', function () { $(legends[1]).find('svg>rect')[0].dispatchEvent(mousemove); expect($(container).find('.color-legend-popup').text()).toBe('46'); $(legends[1]).find('svg>rect')[0].dispatchEvent(mouseout); - done(); }); }); From dba0a881107676ba50c1ba751c4bdfdeb363af19 Mon Sep 17 00:00:00 2001 From: Matthew Ma Date: Thu, 7 Sep 2017 12:35:31 -0400 Subject: [PATCH 15/19] Further jsdocs changes --- src/ui/colorLegendWidget.js | 53 +++++++++++++++++++++++++++---------- src/ui/widget.js | 10 ++++--- 2 files changed, 45 insertions(+), 18 deletions(-) diff --git a/src/ui/colorLegendWidget.js b/src/ui/colorLegendWidget.js index f76970d623..67ec875450 100644 --- a/src/ui/colorLegendWidget.js +++ b/src/ui/colorLegendWidget.js @@ -3,6 +3,7 @@ var domWidget = require('./domWidget'); var inherit = require('../inherit'); var registerWidget = require('../registry').registerWidget; var util = require('../util'); +var uniqueID = require('../d3/uniqueID'); require('./colorLegendWidget.styl'); @@ -40,8 +41,8 @@ require('./colorLegendWidget.styl'); * container. * @param {geo.gui.colorLegendWidget.category[]} [arg.categories] An array * of category definitions for the initial color legends - * @param {number} [arg.width] The pixel width of the wiget in number. Default is 300px. - * @param {number} [arg.ticks] The maximum number of ticks on the axis of a legend, default is 6. + * @param {number} [arg.width=300] The width of the widget in pixels. + * @param {number} [arg.ticks=6] The maximum number of ticks on the axis of a legend, default is 6. * @returns {geo.gui.colorLegendWidget} */ var colorLegendWidget = function (arg) { @@ -73,7 +74,7 @@ var colorLegendWidget = function (arg) { }; /** - * clear the DOM container and create legends + * Clear the DOM container and create legends. */ this._draw = function () { d3.select(m_this.canvas()).selectAll('div.legends').remove(); @@ -150,7 +151,7 @@ var colorLegendWidget = function (arg) { }; /** - * Remove categories + * Remove categories. * * @param {geo.gui.colorLegendWidget.category[]} categories If a category * object exists in the current legend categories, that category will be @@ -165,6 +166,11 @@ var colorLegendWidget = function (arg) { return this; }; + /** + * This function normalize color input string with the utility function. It modifies the original object. + * @param {geo.gui.colorLegendWidget.category[]} categories The categories + * @returns {geo.gui.colorLegendWidget.category[]} prepared categories + */ this._prepareCategories = function (categories) { categories.forEach(function (category) { category.color = category.colors.map(function (color) { @@ -175,7 +181,10 @@ var colorLegendWidget = function (arg) { }; /** - * Draw an individual discrete type legend + * Draw an individual discrete type legend. + * @param {Element} svg svg element that the legend will be drawn + * @param {number} width width of the svg element in pixel + * @param {geo.gui.colorLegendWidget.category} category The discrete type legend category */ this._drawDiscrete = function (svg, width, category) { if (['linear', 'log', 'sqrt', 'pow', 'quantile', 'ordinal'].indexOf(category.scale) === -1) { @@ -247,7 +256,9 @@ var colorLegendWidget = function (arg) { } /** - * render the axis based on the axis Scale + * Render the d3 axis object based on the axis d3 Scale. + * @param {object} axisScale d3 scale object + * @returns {object} d3 axis object */ function createAxis(axisScale) { return d3.svg.axis() @@ -261,7 +272,12 @@ var colorLegendWidget = function (arg) { }; /** - * Actually render colors for discrete type with d3 + * Render colors for discrete type with d3. + * @param {Element} svg svg element that the legend will be drawn + * @param {number[]} steps discrete input scale domain for d3 scale + * @param {object} colorScale d3 scale for transform input into color + * @param {number} width width of the svg element in pixel + * @param {function} getValue function that transforms raw domain into desired discrete range */ this._renderDiscreteColors = function (svg, steps, colorScale, width, getValue) { svg.selectAll('rect') @@ -283,7 +299,10 @@ var colorLegendWidget = function (arg) { }; /** - * Draw an individual continous type legend + * Draw an individual continous type legend. + * @param {Element} svg svg element that the legend will be drawn + * @param {number} width width of the svg element in pixel + * @param {geo.gui.colorLegendWidget.category} category The continuous type legend category */ this._drawContinous = function (svg, width, category) { var axisScale, axis; @@ -297,14 +316,14 @@ var colorLegendWidget = function (arg) { if (category.scale === 'pow' && category.exponent) { axisScale.exponent(category.exponent); } - var randomString = util.randomString(5); + var id = uniqueID(); var precision = Math.max.apply(null, category.domain .map(function (number) { return getPrecision(number); })); var gradient = svg .append('defs') .append('linearGradient') - .attr('id', 'gradient' + randomString); + .attr('id', 'gradient' + id); gradient.append('stop') .attr('offset', '0%') .attr('stop-color', category.colors[0]); @@ -312,7 +331,7 @@ var colorLegendWidget = function (arg) { .attr('offset', '100%') .attr('stop-color', category.colors[1]); svg.append('rect') - .attr('fill', 'url(#gradient' + randomString + ')') + .attr('fill', 'url(#gradient' + id + ')') .attr('width', width) .attr('height', '20px') .on('mousemove', function () { @@ -330,7 +349,9 @@ var colorLegendWidget = function (arg) { }; /** - * actually render the axis with d3. + * Actually render the axis with d3. + * @param {Element} svg svg element that the axis will be drawn + * @param {object} axis d3 axis object */ this._renderAxis = function (svg, axis) { svg.append('g') @@ -342,8 +363,11 @@ var colorLegendWidget = function (arg) { }; /** - * formatter of number that tries to maximize the precision + * Formatter of number that tries to maximize the precision * while making the output shorter. + * @param {number} number to be formatted + * @param {precision} precision number of decimal precision will be tried to be kept + * @returns {string} formatted string output */ this._popupFormatter = function (number, precision) { number = parseFloat(number.toFixed(8)); @@ -353,7 +377,8 @@ var colorLegendWidget = function (arg) { }; /** - * show the popup based on current mouse event. + * Show the popup based on current mouse event. + * @param {string} text content to be shown in the popup */ this._showPopup = function (text) { // The cursor location relative to the container diff --git a/src/ui/widget.js b/src/ui/widget.js index 72c60af141..505db899f2 100644 --- a/src/ui/widget.js +++ b/src/ui/widget.js @@ -3,14 +3,16 @@ var sceneObject = require('../sceneObject'); /** * @typedef {object} geo.gui.widget.position - * @property {string|number} top The position to the top of the container. + * @property {string|number} [top] The position to the top of the container. * A string css position or a number. If a number is used, it will be treated as px value. - * @property {string|number} right The position to the right of the container. + * @property {string|number} [right] The position to the right of the container. * Value is used similarly to the top property. - * @property {string|number} bottom The position to the bottom of the container. + * @property {string|number} [bottom] The position to the bottom of the container. * Value is used similarly to the top property. - * @property {string|number} left The position to the left of the container. + * @property {string|number} [left] The position to the left of the container. * Value is used similarly to the top property. + * @property {*} [...] Additional css properties that affect position are + allowed. See the css specification for details. */ /** From 03cb58ec77149a666cd27aa89ac4887c104ea62c Mon Sep 17 00:00:00 2001 From: Matthew Ma Date: Mon, 18 Sep 2017 10:44:58 -0400 Subject: [PATCH 16/19] Conforms with latest example framework --- examples/color-legend/example.json | 2 -- examples/color-legend/index.pug | 1 - examples/color-legend/main.css | 0 3 files changed, 3 deletions(-) delete mode 100644 examples/color-legend/index.pug delete mode 100644 examples/color-legend/main.css diff --git a/examples/color-legend/example.json b/examples/color-legend/example.json index 0e20f95f2f..5d0d107ed6 100644 --- a/examples/color-legend/example.json +++ b/examples/color-legend/example.json @@ -1,7 +1,5 @@ { - "path": "color-legend", "title": "Color legends", - "exampleCss": [], "exampleJs": ["main.js"], "about": { "text": "This example shows how to create a discrete or continous color legends." diff --git a/examples/color-legend/index.pug b/examples/color-legend/index.pug deleted file mode 100644 index 4c9bea5c3e..0000000000 --- a/examples/color-legend/index.pug +++ /dev/null @@ -1 +0,0 @@ -extends ../common/templates/index.pug diff --git a/examples/color-legend/main.css b/examples/color-legend/main.css deleted file mode 100644 index e69de29bb2..0000000000 From b8f5c713ba8dac809c38555dbe81414e017e7b15 Mon Sep 17 00:00:00 2001 From: Matthew Ma Date: Mon, 18 Sep 2017 14:09:13 -0400 Subject: [PATCH 17/19] Updates test to support all three test browsers --- tests/cases/colorLegend.js | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/tests/cases/colorLegend.js b/tests/cases/colorLegend.js index 8fc214828e..2431c2f205 100644 --- a/tests/cases/colorLegend.js +++ b/tests/cases/colorLegend.js @@ -201,16 +201,29 @@ describe('color legend', function () { container[0].dispatchEvent(CreateEvent('mouseleave')); legendWidget.categories([allCategories[1], allCategories[6]]); - var mousemove = CreateEvent('mousemove'); - mousemove.pageX = 115; - mousemove.pageY = 574; + var mousemove; + var result; + if (navigator.userAgent.indexOf('Firefox') > 0) { + result = '320'; + } else { + result = '319'; + } + try { + var MouseEvent = MouseEvent || MouseEvent; + mousemove = new MouseEvent('mousemove', { clientX: 134, clientY: 574 }); + } catch (e) { + mousemove = CreateEvent('mousemove'); + mousemove.pageX = 134; + mousemove.pageY = 574; + result = '46'; + } var mouseout = CreateEvent('mouseout'); var legends = $(container).find('.legend'); $(legends[0]).find('svg>rect')[0].dispatchEvent(mousemove); $(legends[0]).find('svg>rect')[0].dispatchEvent(mouseout); expect($(container).find('.color-legend-popup').text()).toBe('100 - 200'); $(legends[1]).find('svg>rect')[0].dispatchEvent(mousemove); - expect($(container).find('.color-legend-popup').text()).toBe('46'); + expect($(container).find('.color-legend-popup').text()).toBe(result); $(legends[1]).find('svg>rect')[0].dispatchEvent(mouseout); }); }); From 8bbf1d76cde332389948ff6cc765a21cae74d5df Mon Sep 17 00:00:00 2001 From: Matthew Ma Date: Mon, 18 Sep 2017 17:03:36 -0400 Subject: [PATCH 18/19] continously tries to make the test pass; --- tests/cases/colorLegend.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/cases/colorLegend.js b/tests/cases/colorLegend.js index 2431c2f205..310006a63c 100644 --- a/tests/cases/colorLegend.js +++ b/tests/cases/colorLegend.js @@ -208,8 +208,9 @@ describe('color legend', function () { } else { result = '319'; } + + /*global MouseEvent*/ try { - var MouseEvent = MouseEvent || MouseEvent; mousemove = new MouseEvent('mousemove', { clientX: 134, clientY: 574 }); } catch (e) { mousemove = CreateEvent('mousemove'); From 74759cd67a221f6c45f58380b5ff5c6953d7576b Mon Sep 17 00:00:00 2001 From: Matthew Ma Date: Tue, 19 Sep 2017 11:35:11 -0400 Subject: [PATCH 19/19] Some minor fixes based on review --- src/ui/colorLegendWidget.js | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/ui/colorLegendWidget.js b/src/ui/colorLegendWidget.js index 67ec875450..37ea2a2d8e 100644 --- a/src/ui/colorLegendWidget.js +++ b/src/ui/colorLegendWidget.js @@ -366,7 +366,7 @@ var colorLegendWidget = function (arg) { * Formatter of number that tries to maximize the precision * while making the output shorter. * @param {number} number to be formatted - * @param {precision} precision number of decimal precision will be tried to be kept + * @param {number} precision maximum number of decimal places that are kept * @returns {string} formatted string output */ this._popupFormatter = function (number, precision) { @@ -399,6 +399,9 @@ var colorLegendWidget = function (arg) { .style('opacity', 1); }; + /** + * Hide the popup. + */ this._hidePopup = function () { m_this.popup.transition() .duration(200) @@ -408,10 +411,19 @@ var colorLegendWidget = function (arg) { return this; }; -function getPrecision(a) { - if (!isFinite(a)) return 0; +/** + * Get the number of decimals of a number. + * @param {number} number the number input + * @returns {number} the number of decimal + */ +function getPrecision(number) { + if (!isFinite(number)) return 0; var e = 1, p = 0; - while (Math.round(a * e) / e !== a) { e *= 10; p++; } + while (Math.round(number * e) / e !== number) { + if (!isFinite(number * e)) { return 0; } + e *= 10; + p++; + } return p; }