sjy-ecos/public/lib/bokeh/js/tree/models/plots/plot.js

446 lines
15 KiB
JavaScript

var ColumnDataSource, EQ, GE, GlyphRenderer, LayoutDOM, Plot, PlotCanvas, PlotView, Strength, Title, ToolEvents, Toolbar, Variable, WEAK_EQ, _, logger, p, ref,
extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
hasProp = {}.hasOwnProperty,
slice = [].slice;
_ = require("underscore");
ref = require("../../core/layout/solver"), WEAK_EQ = ref.WEAK_EQ, GE = ref.GE, EQ = ref.EQ, Strength = ref.Strength, Variable = ref.Variable;
logger = require("../../core/logging").logger;
p = require("../../core/properties");
LayoutDOM = require("../layouts/layout_dom");
Title = require("../annotations/title");
Toolbar = require("../tools/toolbar");
ToolEvents = require("../../common/tool_events");
PlotCanvas = require("./plot_canvas").Model;
ColumnDataSource = require("../sources/column_data_source");
GlyphRenderer = require("../renderers/glyph_renderer");
Title = require("../annotations/title");
PlotView = (function(superClass) {
extend(PlotView, superClass);
function PlotView() {
return PlotView.__super__.constructor.apply(this, arguments);
}
PlotView.prototype.className = "bk-plot-layout";
PlotView.prototype.bind_bokeh_events = function() {
var title_msg;
PlotView.__super__.bind_bokeh_events.call(this);
title_msg = "Title object cannot be replaced. Try changing properties on title to update it after initialization.";
return this.listenTo(this.model, 'change:title', (function(_this) {
return function() {
return logger.warn(title_msg);
};
})(this));
};
PlotView.prototype.render = function() {
var height, ref1, s, width;
PlotView.__super__.render.call(this);
if (this.model.sizing_mode === 'scale_both') {
ref1 = this.get_width_height(), width = ref1[0], height = ref1[1];
s = this.model.document.solver();
s.suggest_value(this.model._width, width);
s.suggest_value(this.model._height, height);
return this.$el.css({
position: 'absolute',
left: this.model._dom_left._value,
top: this.model._dom_top._value,
width: this.model._width.value(),
height: this.model._height.value()
});
}
};
PlotView.prototype.get_width_height = function() {
var ar, height, new_height_1, new_height_2, new_width_1, new_width_2, parent_height, parent_width, width;
parent_height = this.el.parentNode.clientHeight;
parent_width = this.el.parentNode.clientWidth;
ar = this.model.get_aspect_ratio();
new_width_1 = parent_width;
new_height_1 = parent_width / ar;
new_width_2 = parent_height * ar;
new_height_2 = parent_height;
if (new_width_1 < new_width_2) {
width = new_width_1;
height = new_height_1;
} else {
width = new_width_2;
height = new_height_2;
}
return [width, height];
};
PlotView.prototype.get_height = function() {
return this.model._width._value / this.model.get_aspect_ratio();
};
PlotView.prototype.get_width = function() {
return this.model._height._value * this.model.get_aspect_ratio();
};
return PlotView;
})(LayoutDOM.View);
Plot = (function(superClass) {
extend(Plot, superClass);
function Plot() {
return Plot.__super__.constructor.apply(this, arguments);
}
Plot.prototype.type = 'Plot';
Plot.prototype.default_view = PlotView;
Plot.prototype.initialize = function(options) {
var i, j, len, len1, plots, ref1, ref2, ref3, title, xr, yr;
Plot.__super__.initialize.call(this, options);
ref1 = _.values(this.extra_x_ranges).concat(this.x_range);
for (i = 0, len = ref1.length; i < len; i++) {
xr = ref1[i];
plots = xr.get('plots');
if (_.isArray(plots)) {
plots = plots.concat(this);
xr.set('plots', plots);
}
}
ref2 = _.values(this.extra_y_ranges).concat(this.y_range);
for (j = 0, len1 = ref2.length; j < len1; j++) {
yr = ref2[j];
plots = yr.get('plots');
if (_.isArray(plots)) {
plots = plots.concat(this);
yr.set('plots', plots);
}
}
this._horizontal = false;
if ((ref3 = this.toolbar_location) === 'left' || ref3 === 'right') {
this._horizontal = true;
}
if (this.min_border != null) {
if (this.min_border_top == null) {
this.min_border_top = this.min_border;
}
if (this.min_border_bottom == null) {
this.min_border_bottom = this.min_border;
}
if (this.min_border_left == null) {
this.min_border_left = this.min_border;
}
if (this.min_border_right == null) {
this.min_border_right = this.min_border;
}
}
if (this.title != null) {
title = _.isString(this.title) ? new Title.Model({
text: this.title
}) : this.title;
this.add_layout(title, this.title_location);
}
this._plot_canvas = new PlotCanvas({
plot: this
});
this.toolbar.toolbar_location = this.toolbar_location;
this.toolbar.toolbar_sticky = this.toolbar_sticky;
this.plot_canvas.toolbar = this.toolbar;
if (this.width == null) {
this.width = this.plot_width;
}
if (this.height == null) {
return this.height = this.plot_height;
}
};
Object.defineProperty(Plot.prototype, "plot_canvas", {
get: function() {
return this._plot_canvas;
}
});
Plot.prototype._doc_attached = function() {
var i, j, layout_renderers, len, len1, r, ref1, side;
ref1 = ['above', 'below', 'left', 'right'];
for (i = 0, len = ref1.length; i < len; i++) {
side = ref1[i];
layout_renderers = this.get(side);
for (j = 0, len1 = layout_renderers.length; j < len1; j++) {
r = layout_renderers[j];
this.plot_canvas.add_renderer_to_canvas_side(r, side);
}
}
this.plot_canvas.attach_document(this.document);
this._set_orientation_variables(this);
this._set_orientation_variables(this.toolbar);
return this._set_orientation_variables(this.plot_canvas);
};
Plot.prototype.add_renderers = function() {
var new_renderers, renderers;
new_renderers = 1 <= arguments.length ? slice.call(arguments, 0) : [];
renderers = this.get('renderers');
renderers = renderers.concat(new_renderers);
return this.set('renderers', renderers);
};
Plot.prototype.add_layout = function(renderer, side) {
var side_renderers;
if (side == null) {
side = "center";
}
if (renderer.props.plot != null) {
renderer.plot = this;
}
this.add_renderers(renderer);
if (side !== 'center') {
side_renderers = this.get(side);
return side_renderers.push(renderer);
}
};
Plot.prototype.add_glyph = function(glyph, source, attrs) {
var renderer;
if (attrs == null) {
attrs = {};
}
if (source == null) {
source = new ColumnDataSource.Model();
}
attrs = _.extend({}, attrs, {
data_source: source,
glyph: glyph
});
renderer = new GlyphRenderer.Model(attrs);
this.add_renderers(renderer);
return renderer;
};
Plot.prototype.add_tools = function() {
var attrs, new_tools, tool, tools;
tools = 1 <= arguments.length ? slice.call(arguments, 0) : [];
new_tools = (function() {
var i, len, results;
results = [];
for (i = 0, len = tools.length; i < len; i++) {
tool = tools[i];
if (tool.overlay != null) {
this.add_renderers(tool.overlay);
}
if (tool.plot != null) {
results.push(tool);
} else {
attrs = _.clone(tool.attributes);
attrs.plot = this;
results.push(new tool.constructor(attrs));
}
}
return results;
}).call(this);
return this.toolbar.tools = this.toolbar.tools.concat(new_tools);
};
Plot.prototype.get_aspect_ratio = function() {
return this.width / this.height;
};
Plot.prototype.get_layoutable_children = function() {
var children;
children = [this.plot_canvas];
if (this.toolbar_location != null) {
children = [this.toolbar, this.plot_canvas];
}
return children;
};
Plot.prototype.get_edit_variables = function() {
var child, edit_variables, i, len, ref1;
edit_variables = Plot.__super__.get_edit_variables.call(this);
if (this.sizing_mode === 'scale_both') {
edit_variables.push({
edit_variable: this._width,
strength: Strength.strong
});
edit_variables.push({
edit_variable: this._height,
strength: Strength.strong
});
}
ref1 = this.get_layoutable_children();
for (i = 0, len = ref1.length; i < len; i++) {
child = ref1[i];
edit_variables = edit_variables.concat(child.get_edit_variables());
}
return edit_variables;
};
Plot.prototype.get_constraints = function() {
var child, constraints, i, len, ref1, ref2, ref3, sticky_edge;
constraints = Plot.__super__.get_constraints.call(this);
if (this.toolbar_location != null) {
if (this.toolbar_sticky === true) {
constraints.push(EQ(this._sizeable, [-1, this.plot_canvas._sizeable]));
} else {
constraints.push(EQ(this._sizeable, [-1, this.plot_canvas._sizeable], [-1, this.toolbar._sizeable]));
}
constraints.push(EQ(this._full, [-1, this.plot_canvas._full]));
if (this.toolbar_location === 'above') {
sticky_edge = this.toolbar_sticky === true ? this.plot_canvas._top : this.plot_canvas._dom_top;
constraints.push(EQ(sticky_edge, [-1, this.toolbar._dom_top], [-1, this.toolbar._height]));
}
if (this.toolbar_location === 'below') {
if (this.toolbar_sticky === false) {
constraints.push(EQ(this.toolbar._dom_top, [-1, this.plot_canvas._height], this.toolbar._bottom, [-1, this.toolbar._height]));
}
if (this.toolbar_sticky === true) {
constraints.push(GE(this.plot_canvas.below_panel._height, [-1, this.toolbar._height]));
constraints.push(WEAK_EQ(this.toolbar._dom_top, [-1, this.plot_canvas._height], this.plot_canvas.below_panel._height));
}
}
if (this.toolbar_location === 'left') {
sticky_edge = this.toolbar_sticky === true ? this.plot_canvas._left : this.plot_canvas._dom_left;
constraints.push(EQ(sticky_edge, [-1, this.toolbar._dom_left], [-1, this.toolbar._width]));
}
if (this.toolbar_location === 'right') {
if (this.toolbar_sticky === false) {
constraints.push(EQ(this.toolbar._dom_left, [-1, this.plot_canvas._width], this.toolbar._right, [-1, this.toolbar._width]));
}
if (this.toolbar_sticky === true) {
constraints.push(GE(this.plot_canvas.right_panel._width, [-1, this.toolbar._width]));
constraints.push(WEAK_EQ(this.toolbar._dom_left, [-1, this.plot_canvas._width], this.plot_canvas.right_panel._width));
}
}
if ((ref1 = this.toolbar_location) === 'above' || ref1 === 'below') {
constraints.push(EQ(this._width, [-1, this.toolbar._width], [-1, this.plot_canvas._width_minus_right]));
}
if ((ref2 = this.toolbar_location) === 'left' || ref2 === 'right') {
constraints.push(EQ(this._height, [-1, this.toolbar._height], [-1, this.plot_canvas.above_panel._height]));
constraints.push(EQ(this.toolbar._dom_top, [-1, this.plot_canvas.above_panel._height]));
}
}
if (this.toolbar_location == null) {
constraints.push(EQ(this._width, [-1, this.plot_canvas._width]));
constraints.push(EQ(this._height, [-1, this.plot_canvas._height]));
}
ref3 = this.get_layoutable_children();
for (i = 0, len = ref3.length; i < len; i++) {
child = ref3[i];
constraints = constraints.concat(child.get_constraints());
}
return constraints;
};
Plot.prototype.get_constrained_variables = function() {
var constrained_variables;
constrained_variables = Plot.__super__.get_constrained_variables.call(this);
constrained_variables = _.extend(constrained_variables, {
'on-edge-align-top': this.plot_canvas._top,
'on-edge-align-bottom': this.plot_canvas._height_minus_bottom,
'on-edge-align-left': this.plot_canvas._left,
'on-edge-align-right': this.plot_canvas._width_minus_right,
'box-cell-align-top': this.plot_canvas._top,
'box-cell-align-bottom': this.plot_canvas._height_minus_bottom,
'box-cell-align-left': this.plot_canvas._left,
'box-cell-align-right': this.plot_canvas._width_minus_right,
'box-equal-size-top': this.plot_canvas._top,
'box-equal-size-bottom': this.plot_canvas._height_minus_bottom
});
if (this.sizing_mode !== 'fixed') {
constrained_variables = _.extend(constrained_variables, {
'box-equal-size-left': this.plot_canvas._left,
'box-equal-size-right': this.plot_canvas._width_minus_right
});
}
return constrained_variables;
};
Plot.prototype._set_orientation_variables = function(model) {
if (this._horizontal === false) {
model._sizeable = model._height;
model._full = model._width;
}
if (this._horizontal === true) {
model._sizeable = model._width;
return model._full = model._height;
}
};
Plot.mixins(['line:outline_', 'fill:background_', 'fill:border_']);
Plot.define({
toolbar: [
p.Instance, function() {
return new Toolbar.Model();
}
],
toolbar_location: [p.Location, 'right'],
toolbar_sticky: [p.Bool, true],
plot_width: [p.Number, 600],
plot_height: [p.Number, 600],
title: [
p.Any, function() {
return new Title.Model({
text: ""
});
}
],
title_location: [p.Location, 'above'],
h_symmetry: [p.Bool, true],
v_symmetry: [p.Bool, false],
above: [p.Array, []],
below: [p.Array, []],
left: [p.Array, []],
right: [p.Array, []],
renderers: [p.Array, []],
x_range: [p.Instance],
extra_x_ranges: [p.Any, {}],
y_range: [p.Instance],
extra_y_ranges: [p.Any, {}],
x_mapper_type: [p.String, 'auto'],
y_mapper_type: [p.String, 'auto'],
tool_events: [
p.Instance, function() {
return new ToolEvents.Model();
}
],
lod_factor: [p.Number, 10],
lod_interval: [p.Number, 300],
lod_threshold: [p.Number, 2000],
lod_timeout: [p.Number, 500],
webgl: [p.Bool, false],
hidpi: [p.Bool, true],
min_border: [p.Number, 5],
min_border_top: [p.Number, null],
min_border_left: [p.Number, null],
min_border_bottom: [p.Number, null],
min_border_right: [p.Number, null]
});
Plot.override({
outline_line_color: '#e5e5e5',
border_fill_color: "#ffffff",
background_fill_color: "#ffffff"
});
return Plot;
})(LayoutDOM.Model);
module.exports = {
View: PlotView,
Model: Plot
};