UNPKG

@quartic/bokehjs

Version:

Interactive, novel data visualization

87 lines (70 loc) 2.67 kB
import {TextAnnotation, TextAnnotationView} from "./text_annotation" import {hide} from "core/dom" import * as p from "core/properties" export class LabelView extends TextAnnotationView initialize: (options) -> super(options) @canvas = @plot_model.canvas @xmapper = @plot_view.frame.x_mappers[@model.x_range_name] @ymapper = @plot_view.frame.y_mappers[@model.y_range_name] @visuals.warm_cache(null) _get_size: () -> ctx = @plot_view.canvas_view.ctx @visuals.text.set_value(ctx) side = @model.panel.side if side == "above" or side == "below" height = ctx.measureText(@model.text).ascent return height if side == 'left' or side == 'right' width = ctx.measureText(@model.text).width return width render: () -> if not @model.visible and @model.render_mode == 'css' hide(@el) if not @model.visible return ctx = @plot_view.canvas_view.ctx # Here because AngleSpec does units tranform and label doesn't support specs switch @model.angle_units when "rad" then angle = -1 * @model.angle when "deg" then angle = -1 * @model.angle * Math.PI/180.0 if @model.x_units == "data" vx = @xmapper.map_to_target(@model.x) else vx = @model.x sx = @canvas.vx_to_sx(vx) if @model.y_units == "data" vy = @ymapper.map_to_target(@model.y) else vy = @model.y sy = @canvas.vy_to_sy(vy) if @model.panel? panel_offset = @_get_panel_offset() sx += panel_offset.x sy += panel_offset.y if @model.render_mode == 'canvas' @_canvas_text(ctx, @model.text, sx + @model.x_offset, sy - @model.y_offset, angle) else @_css_text(ctx, @model.text, sx + @model.x_offset, sy - @model.y_offset, angle) export class Label extends TextAnnotation default_view: LabelView type: 'Label' @mixins ['text', 'line:border_', 'fill:background_'] @define { x: [ p.Number, ] x_units: [ p.SpatialUnits, 'data' ] y: [ p.Number, ] y_units: [ p.SpatialUnits, 'data' ] text: [ p.String, ] angle: [ p.Angle, 0 ] angle_units: [ p.AngleUnits, 'rad' ] x_offset: [ p.Number, 0 ] y_offset: [ p.Number, 0 ] x_range_name: [ p.String, 'default' ] y_range_name: [ p.String, 'default' ] render_mode: [ p.RenderMode, 'canvas' ] } @override { background_fill_color: null border_line_color: null }