@@ -210,7 +210,7 @@ def _qt_xsize_zoom(self, xmove):
210210 factor = xmove / 100.
211211 newsize = self .xsize * (factor + 1. )
212212 limits = self .spinbox_xsize .opts ['bounds' ]
213- if newsize > 0. and newsize < limits [1 ]:
213+ if newsize > 0. and newsize < limits [1 ]:
214214 self .spinbox_xsize .setValue (newsize )
215215
216216 def _qt_on_scroll_time (self , val ):
@@ -348,6 +348,14 @@ def _panel_seek_with_selected_spike(self):
348348 self .refresh ()
349349 self .notify_time_info_updated ()
350350
351+ def _panel_on_double_tap (self , event ):
352+ time = event .x
353+ ind_spike_nearest = find_nearest_spike (self .controller , time , self .controller .get_time ()[1 ])
354+ if ind_spike_nearest is not None :
355+ self .controller .set_indices_spike_selected ([ind_spike_nearest ])
356+ self ._panel_seek_with_selected_spike ()
357+ self .notify_spike_selection_changed ()
358+
351359 # TODO: pan behavior like Qt?
352360 # def _panel_on_pan_start(self, event):
353361 # self.drag_state["x_start"] = event.x
@@ -535,24 +543,25 @@ def _qt_on_time_info_updated(self):
535543
536544 self ._qt_change_segment (segment_index )
537545 self .timeseeker .seek (time )
538-
539- self ._block_auto_refresh_and_notify = False
540- # we need refresh in QT because changing tab/docking/undocking doesn't trigger a refresh
541546 self .refresh ()
547+ self ._block_auto_refresh_and_notify = False
542548
543549 def _qt_on_use_times_updated (self ):
544550 # Update time seeker
551+ self ._block_auto_refresh_and_notify = True
545552 t_start , t_stop = self .controller .get_t_start_t_stop ()
546553 self .timeseeker .set_start_stop (t_start , t_stop )
547554 self .timeseeker .seek (self .controller .get_time ()[0 ])
555+ self .refresh ()
556+ self ._block_auto_refresh_and_notify = False
548557
549558 ## panel ##
550559 def _panel_make_layout (self ):
551560 import panel as pn
552561 import bokeh .plotting as bpl
553562 from .utils_panel import _bg_color
554563 from bokeh .models import ColumnDataSource , Range1d
555- from bokeh .events import Tap , MouseWheel
564+ from bokeh .events import DoubleTap , MouseWheel
556565
557566 self .figure = bpl .figure (
558567 sizing_mode = "stretch_both" ,
@@ -592,7 +601,7 @@ def _panel_make_layout(self):
592601 x = "x" , y = "y" , size = 10 , fill_color = "color" , fill_alpha = self .settings ['alpha' ], source = self .spike_source
593602 )
594603
595- self .figure .on_event (Tap , self ._panel_on_tap )
604+ self .figure .on_event (DoubleTap , self ._panel_on_double_tap )
596605
597606 self ._panel_create_toolbar ()
598607
@@ -652,13 +661,6 @@ def _panel_refresh(self):
652661 self .figure .y_range .end = n - 0.5
653662
654663 # TODO: if from a different unit, change unit visibility
655- def _panel_on_tap (self , event ):
656- time = event .x
657- ind_spike_nearest = find_nearest_spike (self .controller , time , self .controller .get_time ()[1 ])
658- if ind_spike_nearest is not None :
659- self .controller .set_indices_spike_selected ([ind_spike_nearest ])
660- self ._panel_seek_with_selected_spike ()
661- self .notify_spike_selection_changed ()
662664
663665 def _panel_on_spike_selection_changed (self ):
664666 self ._panel_seek_with_selected_spike ()
@@ -676,22 +678,22 @@ def _panel_auto_scale(self, event):
676678 def _panel_on_time_info_updated (self ):
677679 # Update segment and time slider range
678680 time , segment_index = self .controller .get_time ()
679- self ._block_auto_refresh = True
681+ self ._block_auto_refresh_and_notify = True
680682 self ._panel_change_segment (segment_index )
681683 # Update time slider value
682684 self .time_slider .value = time
683- self ._block_auto_refresh = False
684- # we don't need a refresh in panel because changing tab triggers a refresh
685+ self .refresh ()
686+ self . _block_auto_refresh_and_notify = False
685687
686688 def _panel_on_use_times_updated (self ):
687689 # Update time seeker
688690 t_start , t_stop = self .controller .get_t_start_t_stop ()
691+ self ._block_auto_refresh_and_notify = True
689692 self .time_slider .start = t_start
690693 self .time_slider .end = t_stop
691-
692- # Optionally clamp the current value if out of range
693694 self .time_slider .value = self .controller .get_time ()[0 ]
694695 self .refresh ()
696+ self ._block_auto_refresh_and_notify = False
695697
696698
697699
@@ -725,4 +727,5 @@ def find_nearest_spike(controller, x, segment_index, max_distance_samples=None):
725727* **auto scale**: Automatically adjust the scale of the traces.
726728* **time (s)**: Set the time point to display traces.
727729* **mouse wheel**: change the scale of the traces.
730+ * **double click**: select the nearest spike and center the view on it.
728731"""
0 commit comments