@quartic/bokehjs
Version:
Interactive, novel data visualization
129 lines (102 loc) • 3.52 kB
text/coffeescript
import {SelectTool, SelectToolView} from "./select_tool"
import {BoxAnnotation} from "../../annotations/box_annotation"
import * as p from "core/properties"
export class BoxSelectToolView extends SelectToolView
_pan_start: (e) ->
canvas = .canvas
= [
canvas.sx_to_vx(e.bokeh.sx)
canvas.sy_to_vy(e.bokeh.sy)
]
return null
_pan: (e) ->
canvas = .canvas
curpoint = [
canvas.sx_to_vx(e.bokeh.sx)
canvas.sy_to_vy(e.bokeh.sy)
]
frame = .frame
dims = .dimensions
[vxlim, vylim] = ._get_dim_limits(, curpoint, frame, dims)
.overlay.update({left: vxlim[0], right: vxlim[1], top: vylim[1], bottom: vylim[0]})
if .select_every_mousemove
append = e.srcEvent.shiftKey ? false
return null
_pan_end: (e) ->
canvas = .canvas
curpoint = [
canvas.sx_to_vx(e.bokeh.sx)
canvas.sy_to_vy(e.bokeh.sy)
]
frame = .frame
dims = .dimensions
[vxlim, vylim] = ._get_dim_limits(, curpoint, frame, dims)
append = e.srcEvent.shiftKey ? false
.overlay.update({left: null, right: null, top: null, bottom: null})
= null
.push_state('box_select', {selection: .get_selection()})
return null
_select: ([vx0, vx1], [vy0, vy1], final, append=false) ->
geometry = {
type: 'rect'
vx0: vx0
vx1: vx1
vy0: vy0
vy1: vy1
}
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['sx0'] = canvas.vx_to_sx(geometry.vx0)
geometry['sx1'] = canvas.vx_to_sx(geometry.vx1)
geometry['sy0'] = canvas.vy_to_sy(geometry.vy0)
geometry['sy1'] = canvas.vy_to_sy(geometry.vy1)
xmapper = frame.x_mappers[r.x_range_name]
ymapper = frame.y_mappers[r.y_range_name]
geometry['x0'] = xmapper.map_from_target(geometry.vx0)
geometry['x1'] = xmapper.map_from_target(geometry.vx1)
geometry['y0'] = ymapper.map_from_target(geometry.vy0)
geometry['y1'] = ymapper.map_from_target(geometry.vy1)
.callback.execute(, {geometry: geometry})
return
DEFAULT_BOX_OVERLAY = () -> new BoxAnnotation({
level: "overlay"
render_mode: "css"
top_units: "screen"
left_units: "screen"
bottom_units: "screen"
right_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 BoxSelectTool extends SelectTool
default_view: BoxSelectToolView
type: "BoxSelectTool"
tool_name: "Box Select"
icon: "bk-tool-icon-box-select"
event_type: "pan"
default_order: 30
{
dimensions: [ p.Dimensions, "both" ]
select_every_mousemove: [ p. Bool, false ]
callback: [ p.Instance ]
overlay: [ p.Instance, DEFAULT_BOX_OVERLAY ]
}
{
tooltip: () ->
}