@quartic/bokehjs
Version:
Interactive, novel data visualization
125 lines (97 loc) • 3.18 kB
text/coffeescript
import {SelectTool, SelectToolView} from "./select_tool"
import {PolyAnnotation} from "../../annotations/poly_annotation"
import * as p from "core/properties"
export class LassoSelectToolView extends SelectToolView
initialize: (options) ->
super(options)
= null
_active_change: () ->
if not .active
_keyup: (e) ->
if e.keyCode == 13
_pan_start: (e) ->
canvas = .canvas
vx = canvas.sx_to_vx(e.bokeh.sx)
vy = canvas.sy_to_vy(e.bokeh.sy)
= {vx: [vx], vy: [vy]}
return null
_pan: (e) ->
canvas = .canvas
vx = canvas.sx_to_vx(e.bokeh.sx)
vy = canvas.sy_to_vy(e.bokeh.sy)
h_range = .frame.h_range
v_range = .frame.v_range
if vx > h_range.end
vx = h_range.end
if vx < h_range.start
vx = h_range.start
if vy > v_range.end
vy = v_range.end
if vy < v_range.start
vy = v_range.start
.vx.push(vx)
.vy.push(vy)
overlay = .overlay
overlay.update({xs: .vx, ys: .vy})
if .select_every_mousemove
append = e.srcEvent.shiftKey ? false
_pan_end: (e) ->
append = e.srcEvent.shiftKey ? false
.push_state('lasso_select', {selection: .get_selection()})
_clear_overlay: () ->
.overlay.update({xs:[], ys:[]})
_select: (vx, vy, final, append) ->
geometry = {
type: 'poly'
vx: vx
vy: vy
}
for r in .computed_renderers
ds = r.data_source
sm = ds.selection_manager
sm.select(@, .renderer_views[r.id], geometry, final, append)
if .callback?
return null
_emit_callback: (geometry) ->
r = .computed_renderers[0]
canvas = .canvas
frame = .frame
geometry['sx'] = canvas.v_vx_to_sx(geometry.vx)
geometry['sy'] = canvas.v_vy_to_sy(geometry.vy)
xmapper = frame.x_mappers[r.x_range_name]
ymapper = frame.y_mappers[r.y_range_name]
geometry['x'] = xmapper.v_map_from_target(geometry.vx)
geometry['y'] = ymapper.v_map_from_target(geometry.vy)
.callback.execute(, {geometry: geometry})
return
DEFAULT_POLY_OVERLAY = () -> new PolyAnnotation({
level: "overlay"
xs_units: "screen"
ys_units: "screen"
fill_color: "lightgrey"
fill_alpha: 0.5
line_color: "black"
line_alpha: 1.0
line_width: 2
line_dash: [4, 4]
})
export class LassoSelectTool extends SelectTool
default_view: LassoSelectToolView
type: "LassoSelectTool"
tool_name: "Lasso Select"
icon: "bk-tool-icon-lasso-select"
event_type: "pan"
default_order: 12
{
select_every_mousemove: [ p.Bool, true ]
callback: [ p.Instance ]
overlay: [ p.Instance, DEFAULT_POLY_OVERLAY ]
}