@@ -20,6 +20,7 @@ var splitData = require('./data_split_helpers');
2020var Color = require ( '../../components/color' ) ;
2121
2222module . exports = function plot ( gd , wrappedTraceHolders ) {
23+ var dynamic = ! gd . _context . staticPlot ;
2324
2425 var table = gd . _fullLayout . _paper . selectAll ( '.' + c . cn . table )
2526 . data ( wrappedTraceHolders . map ( function ( wrappedTraceHolder ) {
@@ -51,20 +52,30 @@ module.exports = function plot(gd, wrappedTraceHolders) {
5152 var tableControlView = table . selectAll ( '.' + c . cn . tableControlView )
5253 . data ( gup . repeat , gup . keyFun ) ;
5354
54- tableControlView . enter ( )
55+ var cvEnter = tableControlView . enter ( )
5556 . append ( 'g' )
5657 . classed ( c . cn . tableControlView , true )
57- . style ( 'box-sizing' , 'content-box' )
58- . on ( 'mousemove' , function ( d ) { tableControlView . filter ( function ( dd ) { return d === dd ; } ) . call ( renderScrollbarKit , gd ) ; } )
59- . on ( 'mousewheel' , function ( d ) {
60- if ( d . scrollbarState . wheeling ) return ;
61- d . scrollbarState . wheeling = true ;
62- d3 . event . stopPropagation ( ) ;
63- d3 . event . preventDefault ( ) ;
64- makeDragRow ( gd , tableControlView , null , d . scrollY + d3 . event . deltaY ) ( d ) ;
65- d . scrollbarState . wheeling = false ;
66- } )
67- . call ( renderScrollbarKit , gd , true ) ;
58+ . style ( 'box-sizing' , 'content-box' ) ;
59+ if ( dynamic ) {
60+ cvEnter
61+ . on ( 'mousemove' , function ( d ) {
62+ tableControlView
63+ . filter ( function ( dd ) { return d === dd ; } )
64+ . call ( renderScrollbarKit , gd ) ;
65+ } )
66+ . on ( 'mousewheel' , function ( d ) {
67+ if ( d . scrollbarState . wheeling ) return ;
68+ d . scrollbarState . wheeling = true ;
69+ var newY = d . scrollY + d3 . event . deltaY ;
70+ var noChange = makeDragRow ( gd , tableControlView , null , newY ) ( d ) ;
71+ if ( ! noChange ) {
72+ d3 . event . stopPropagation ( ) ;
73+ d3 . event . preventDefault ( ) ;
74+ }
75+ d . scrollbarState . wheeling = false ;
76+ } )
77+ . call ( renderScrollbarKit , gd , true ) ;
78+ }
6879
6980 tableControlView
7081 . attr ( 'transform' , function ( d ) { return 'translate(' + d . size . l + ' ' + d . size . t + ')' ; } ) ;
@@ -96,9 +107,10 @@ module.exports = function plot(gd, wrappedTraceHolders) {
96107
97108 yColumn . exit ( ) . remove ( ) ;
98109
99- yColumn
100- . attr ( 'transform' , function ( d ) { return 'translate(' + d . x + ' 0)' ; } )
101- . call ( d3 . behavior . drag ( )
110+ yColumn . attr ( 'transform' , function ( d ) { return 'translate(' + d . x + ' 0)' ; } ) ;
111+
112+ if ( dynamic ) {
113+ yColumn . call ( d3 . behavior . drag ( )
102114 . origin ( function ( d ) {
103115 var movedColumn = d3 . select ( this ) ;
104116 easeColumn ( movedColumn , d , - c . uplift ) ;
@@ -137,6 +149,7 @@ module.exports = function plot(gd, wrappedTraceHolders) {
137149 columnMoved ( gd , p , p . columns . map ( function ( dd ) { return dd . xIndex ; } ) ) ;
138150 } )
139151 ) ;
152+ }
140153
141154 yColumn . each ( function ( d ) {
142155 Drawing . setClipUrl ( d3 . select ( this ) , columnBoundaryClipKey ( gd , d ) , gd ) ;
@@ -158,8 +171,8 @@ module.exports = function plot(gd, wrappedTraceHolders) {
158171 var headerColumnBlock = columnBlock . filter ( headerBlock ) ;
159172 var cellsColumnBlock = columnBlock . filter ( cellsBlock ) ;
160173
161- cellsColumnBlock
162- . call ( d3 . behavior . drag ( )
174+ if ( dynamic ) {
175+ cellsColumnBlock . call ( d3 . behavior . drag ( )
163176 . origin ( function ( d ) {
164177 d3 . event . stopPropagation ( ) ;
165178 return d ;
@@ -169,6 +182,7 @@ module.exports = function plot(gd, wrappedTraceHolders) {
169182 // fixme emit plotly notification
170183 } )
171184 ) ;
185+ }
172186
173187 // initial rendering: header is rendered first, as it may may have async LaTeX (show header first)
174188 // but blocks are _entered_ the way they are due to painter's algo (header on top)
@@ -711,13 +725,20 @@ function updateBlockYPosition(gd, cellsColumnBlock, tableControlView) {
711725
712726function makeDragRow ( gd , allTableControlView , optionalMultiplier , optionalPosition ) {
713727 return function dragRow ( eventD ) {
714- // may come from whicever DOM event target: drag, wheel, bar... eventD corresponds to event target
728+ // may come from whichever DOM event target: drag, wheel, bar... eventD corresponds to event target
715729 var d = eventD . calcdata ? eventD . calcdata : eventD ;
716730 var tableControlView = allTableControlView . filter ( function ( dd ) { return d . key === dd . key ; } ) ;
717731 var multiplier = optionalMultiplier || d . scrollbarState . dragMultiplier ;
732+
733+ var initialScrollY = d . scrollY ;
734+
718735 d . scrollY = optionalPosition === void ( 0 ) ? d . scrollY + multiplier * d3 . event . dy : optionalPosition ;
719736 var cellsColumnBlock = tableControlView . selectAll ( '.' + c . cn . yColumn ) . selectAll ( '.' + c . cn . columnBlock ) . filter ( cellsBlock ) ;
720737 updateBlockYPosition ( gd , cellsColumnBlock , tableControlView ) ;
738+
739+ // return false if we've "used" the scroll, ie it did something,
740+ // so the event shouldn't bubble (if appropriate)
741+ return d . scrollY === initialScrollY ;
721742 } ;
722743}
723744
0 commit comments