@@ -3,73 +3,86 @@ import {GlyphRenderer, GlyphRendererView} from "./glyph_renderer"
33import { LayoutProvider } from "../graphs/layout_provider"
44import { GraphHitTestPolicy , NodesOnly } from "../graphs/graph_hit_test_policy"
55import * as p from "core/properties"
6- import { build_views , remove_views } from "core/build_views"
6+ import { build_view } from "core/build_views"
77import { SelectionManager } from "core/selection_manager"
8+ import { XYGlyph } from "../glyphs/xy_glyph"
9+ import { MultiLine } from "../glyphs/multi_line"
10+ import { ColumnarDataSource } from "../sources/columnar_data_source"
11+ import { Arrayable } from "core/types"
12+ import { assert } from "core/util/assert"
813
914export class GraphRendererView extends DataRendererView {
1015 model : GraphRenderer
1116
12- node_view : GlyphRendererView
1317 edge_view : GlyphRendererView
14-
15- protected _renderer_views : Map < GlyphRenderer , GlyphRendererView >
16-
17- initialize ( ) : void {
18- super . initialize ( )
19- this . _renderer_views = new Map ( )
20- }
18+ node_view : GlyphRendererView
2119
2220 async lazy_initialize ( ) : Promise < void > {
23- [ this . node_view , this . edge_view ] = await build_views ( this . _renderer_views , [
24- this . model . node_renderer ,
25- this . model . edge_renderer ,
26- ] , { parent : this . parent } )
27-
28- this . set_data ( )
29- }
30-
31- remove ( ) : void {
32- remove_views ( this . _renderer_views )
33- super . remove ( )
34- }
35-
36- connect_signals ( ) : void {
37- super . connect_signals ( )
21+ await super . lazy_initialize ( )
3822
39- this . connect ( this . model . layout_provider . change , ( ) => this . set_data ( ) )
40- this . connect ( this . model . node_renderer . data_source . _select , ( ) => this . set_data ( ) )
41- this . connect ( this . model . node_renderer . data_source . inspect , ( ) => this . set_data ( ) )
42- this . connect ( this . model . node_renderer . data_source . change , ( ) => this . set_data ( ) )
43- this . connect ( this . model . edge_renderer . data_source . _select , ( ) => this . set_data ( ) )
44- this . connect ( this . model . edge_renderer . data_source . inspect , ( ) => this . set_data ( ) )
45- this . connect ( this . model . edge_renderer . data_source . change , ( ) => this . set_data ( ) )
23+ const graph = this . model
4624
47- const { x_ranges, y_ranges} = this . plot_view . frame
25+ // TODO: replace this with bi-variate transforms
26+ let xs_ys : [ Arrayable < number > [ ] , Arrayable < number > [ ] ] | null = null
27+ let x_y : [ Arrayable < number > , Arrayable < number > ] | null = null
4828
49- for ( const [ , range ] of x_ranges ) {
50- this . connect ( range . change , ( ) => this . set_data ( ) )
29+ const xs_expr = {
30+ v_compute ( source : ColumnarDataSource ) {
31+ assert ( xs_ys == null )
32+ const [ xs ] = xs_ys = graph . layout_provider . get_edge_coordinates ( source )
33+ return xs
34+ } ,
35+ }
36+ const ys_expr = {
37+ v_compute ( _source : ColumnarDataSource ) {
38+ assert ( xs_ys != null )
39+ const [ , ys ] = xs_ys
40+ xs_ys = null
41+ return ys
42+ } ,
5143 }
5244
53- for ( const [ , range ] of y_ranges ) {
54- this . connect ( range . change , ( ) => this . set_data ( ) )
45+ const x_expr = {
46+ v_compute ( source : ColumnarDataSource ) {
47+ assert ( x_y == null )
48+ const [ x ] = x_y = graph . layout_provider . get_node_coordinates ( source )
49+ return x
50+ } ,
51+ }
52+ const y_expr = {
53+ v_compute ( _source : ColumnarDataSource ) {
54+ assert ( x_y != null )
55+ const [ , y ] = x_y
56+ x_y = null
57+ return y
58+ } ,
5559 }
56- }
5760
58- set_data ( request_render : boolean = true ) : void {
59- // XXX
60- const node_glyph : any = this . node_view . glyph
61- ; [ node_glyph . _x , node_glyph . _y ] =
62- this . model . layout_provider . get_node_coordinates ( this . model . node_renderer . data_source ) as any
61+ const { edge_renderer, node_renderer} = this . model
6362
64- const edge_glyph : any = this . edge_view . glyph
65- ; [ edge_glyph . _xs , edge_glyph . _ys ] =
66- this . model . layout_provider . get_edge_coordinates ( this . model . edge_renderer . data_source ) as any
63+ edge_renderer . glyph . xs = { expr : xs_expr }
64+ edge_renderer . glyph . ys = { expr : ys_expr }
6765
68- node_glyph . index_data ( )
69- edge_glyph . index_data ( )
66+ node_renderer . glyph . x = { expr : x_expr }
67+ node_renderer . glyph . y = { expr : y_expr }
7068
71- if ( request_render )
69+ this . edge_view = await build_view ( edge_renderer , { parent : this . parent } )
70+ this . node_view = await build_view ( node_renderer , { parent : this . parent } )
71+ }
72+
73+ connect_signals ( ) : void {
74+ super . connect_signals ( )
75+ this . connect ( this . model . layout_provider . change , ( ) => {
76+ this . edge_view . set_data ( false )
77+ this . node_view . set_data ( false )
7278 this . request_render ( )
79+ } )
80+ }
81+
82+ remove ( ) : void {
83+ this . edge_view . remove ( )
84+ this . node_view . remove ( )
85+ super . remove ( )
7386 }
7487
7588 protected _render ( ) : void {
@@ -83,8 +96,8 @@ export namespace GraphRenderer {
8396
8497 export type Props = DataRenderer . Props & {
8598 layout_provider : p . Property < LayoutProvider >
86- node_renderer : p . Property < GlyphRenderer >
87- edge_renderer : p . Property < GlyphRenderer >
99+ node_renderer : p . Property < GlyphRenderer & { glyph : XYGlyph } >
100+ edge_renderer : p . Property < GlyphRenderer & { glyph : MultiLine } >
88101 selection_policy : p . Property < GraphHitTestPolicy >
89102 inspection_policy : p . Property < GraphHitTestPolicy >
90103 }
@@ -104,11 +117,11 @@ export class GraphRenderer extends DataRenderer {
104117 this . prototype . default_view = GraphRendererView
105118
106119 this . define < GraphRenderer . Props > ( {
107- layout_provider : [ p . Instance ] ,
108- node_renderer : [ p . Instance ] ,
109- edge_renderer : [ p . Instance ] ,
110- selection_policy : [ p . Instance , ( ) => new NodesOnly ( ) ] ,
111- inspection_policy : [ p . Instance , ( ) => new NodesOnly ( ) ] ,
120+ layout_provider : [ p . Instance ] ,
121+ node_renderer : [ p . Instance ] ,
122+ edge_renderer : [ p . Instance ] ,
123+ selection_policy : [ p . Instance , ( ) => new NodesOnly ( ) ] ,
124+ inspection_policy : [ p . Instance , ( ) => new NodesOnly ( ) ] ,
112125 } )
113126 }
114127
0 commit comments