@bokeh/bokehjs
Version:
Interactive, novel data visualization
70 lines • 2.31 kB
JavaScript
import { Annotation, AnnotationView } from "./annotation";
import { ColumnarDataSource } from "../sources/columnar_data_source";
import { ColumnDataSource } from "../sources/column_data_source";
import { inplace } from "../../core/util/projections";
import * as p from "../../core/properties";
export class DataAnnotationView extends AnnotationView {
static __name__ = "DataAnnotationView";
connect_signals() {
super.connect_signals();
const update = () => {
this.set_data(this.model.source);
this._rerender();
};
this.connect(this.model.change, update);
this.connect(this.model.source.streaming, update);
this.connect(this.model.source.patching, update);
this.connect(this.model.source.change, update);
}
_rerender() {
this.request_paint();
}
set_data(source) {
const self = this;
for (const prop of this.model) {
if (!(prop instanceof p.VectorSpec || prop instanceof p.ScalarSpec)) {
continue;
}
if (prop instanceof p.BaseCoordinateSpec) {
const array = prop.array(source);
self[`_${prop.attr}`] = array;
}
else {
const uniform = prop.uniform(source);
self[`${prop.attr}`] = uniform;
}
}
if (this.plot_model.use_map) {
if (self._x != null) {
inplace.project_xy(self._x, self._y);
}
if (self._xs != null) {
inplace.project_xsys(self._xs, self._ys);
}
}
for (const visual of this.visuals) {
visual.update();
}
}
_initial_set_data = false;
_paint(ctx) {
if (!this._initial_set_data) {
this.set_data(this.model.source);
this._initial_set_data = true;
}
this.map_data();
this._paint_data(ctx);
}
}
export class DataAnnotation extends Annotation {
static __name__ = "DataAnnotation";
constructor(attrs) {
super(attrs);
}
static {
this.define(({ Ref }) => ({
source: [Ref(ColumnarDataSource), () => new ColumnDataSource()],
}));
}
}
//# sourceMappingURL=data_annotation.js.map