X-Git-Url: https://adrianiainlam.tk/git/?a=blobdiff_plain;f=experimental%2Fpalette%2Fmulti-palette.js;h=ee01a4c2ff1219379f3954c4cfa836c335fc2fdf;hb=65129ba82d4efe12714be88fa3c792149c00ca10;hp=f378d824114d9c7bd677eef9af0480e8d0351aa8;hpb=58a18b025156273cc34cd7555f77369e1f924d74;p=dygraphs.git diff --git a/experimental/palette/multi-palette.js b/experimental/palette/multi-palette.js index f378d82..ee01a4c 100644 --- a/experimental/palette/multi-palette.js +++ b/experimental/palette/multi-palette.js @@ -33,7 +33,6 @@ function MultiPalette() { this.onchange = function() {}; } - MultiPalette.optionSetValues = { "global": "global", "x": "x axis", @@ -48,14 +47,21 @@ MultiPalette.prototype.create = function(parentElement) { var header = $("
").addClass("header").appendTo(this.root); // Selector for series and axes. var selectorRow = $("
").appendTo(header); - var optionSelector = $("") .change(function(x) { - self.activate(optionSelector.val()); + self.activate(self.optionSelector.val()); }); selectorRow .append($("").text("Option Set:")) - .append(optionSelector); + .append(this.optionSelector) + .append($("") + .append($("") + .addClass("link") + .text("to hash") + .css("float", "right") + .css("padding-right", "8px") + .click(function() { self.showHash(); }))); var filter = function() { $.each(self.palettes, function(key, value) { @@ -72,7 +78,6 @@ MultiPalette.prototype.create = function(parentElement) { .append($("").append(this.filterBar)) .append($("") .append($("") - .attr("href", "#") .addClass("link") .text("Redraw") .css("float", "right") @@ -80,28 +85,107 @@ MultiPalette.prototype.create = function(parentElement) { .click(function() { self.onchange(); })))); $.each(MultiPalette.optionSetValues, function(key, value) { - $(optionSelector) - .append($("") - .attr("value", key) - .text(value)); - var palette = new Palette(key); - palette.create(self.root); - palette.root.style.display = "none"; - palette.onchange = function() { - self.onchange(); - }; - self.palettes[key] = palette; + self.createPalette_(key, key, value); }); this.activate("global"); } +MultiPalette.prototype.createPalette_ = function(key, scope, value) { + this.optionSelector + .append($("") + .attr("value", key) + .text(value)); + var palette = new Palette(scope); + palette.create(this.root); + palette.root.hide(); + var self = this; + palette.onchange = function() { + self.onchange(); + }; + this.palettes[key] = palette; +} + +MultiPalette.prototype.setSeries = function(labels) { + for (var idx = 1; idx < labels.length; idx++) { + this.conditionallyAddSingleSeries_(labels[idx]); + } +} + +MultiPalette.prototype.conditionallyAddSingleSeries_ = function(series) { + var key = "series:" + series; + if (!this.palettes.hasOwnProperty(key)) { + this.createPalette_(key, "series", series + " (series)"); + } +} + MultiPalette.prototype.activate = function(key) { if (this.activePalette) { - this.activePalette.root.style.display = "none"; + this.activePalette.root.hide(); } this.activePalette = this.palettes[key]; - this.activePalette.root.style.display = "block"; + this.activePalette.root.show(); +} + +MultiPalette.prototype.showHash = function() { + var hash = this.read(); + var textarea = new TextArea(); + + var hashToString = function(hash) { + /* + * JSON.stringify isn't built to be nice to functions. The following fixes + * this. + * + * First, val.toString only does part of the work, turning it into + * "function () {\n alert(\"p-click!\");\n}", + * + * {start,end}Marker make the surrounding quotes easy to find, and then + * remove them. It also converts the instances of \n and \" so the + * result looks like: + * function () { + * alert("p-click!"); + * }", + */ + var startMarker = "<~%!<"; + var endMarker = ">!%~>"; + var replacer = function(key, val) { + if (typeof val === 'function') { + return startMarker + val.toString() + endMarker; + } + return val; + } + var text = JSON.stringify(hash, replacer, 2); + while(true) { + var start = text.indexOf(startMarker); + var end = text.indexOf(endMarker); + if (start == -1) { + break; + } + var substring = text.substring(start + startMarker.length, end); + while(substring.indexOf("\\n") >= 0) { + substring = substring.replace("\\n", "\n"); + } + while(substring.indexOf("\\\"") >= 0) { + substring = substring.replace("\\\"", "\""); + } + text = text.substring(0, start - 1) + + substring + + text.substring(end + endMarker.length + 1); + } + return text; + } + + var text = hashToString(hash); + var self = this; + textarea.show("options", text); + textarea.okCallback = function(value) { + if (value != text) { + var newHash; + eval("newHash = " + value + ";"); + self.write(newHash); + self.onchange(); + } + }; } /** @@ -110,19 +194,38 @@ MultiPalette.prototype.activate = function(key) { MultiPalette.prototype.read = function() { var results = this.palettes.global.read(); results.axes = {}; + results.series = {}; var clearIfEmpty = function(hash, key) { var val = hash[key]; if ($.isEmptyObject(val)) { delete hash[key]; } } + var clearEmptyChildren = function(hash) { + for (var key in hash) { + if (hash.hasOwnProperty(key)) { + clearIfEmpty(hash, key); + } + } + } + results.axes.x = this.palettes.x.read(); results.axes.y = this.palettes.y.read(); results.axes.y2 = this.palettes.y2.read(); - clearIfEmpty(results.axes, "x"); - clearIfEmpty(results.axes, "y"); - clearIfEmpty(results.axes, "y2"); + + clearEmptyChildren(results.axes); clearIfEmpty(results, "axes"); + + for (var key in this.palettes) { + if (key.indexOf("series:") == 0) { + var series = key.substring("series:".length); + results.series[series] = this.palettes[key].read(); + } + } + + clearEmptyChildren(results.series); + clearIfEmpty(results, "series"); + return results; } @@ -137,4 +240,13 @@ MultiPalette.prototype.write = function(hash) { this.palettes.y.write(axes["y"]); this.palettes.y2.write(axes["y2"]); } + + if (hash.hasOwnProperty("series")) { + for (var key in hash.series) { + if (hash.series.hasOwnProperty(key)) { + this.conditionallyAddSingleSeries_(key); + this.palettes["series:" + key].write(hash.series[key]); + } + } + } }