Skip to content

Commit 2a7cd8e

Browse files
committed
Merge branch 'main' of github.com:SpikeInterface/spikeinterface-gui into handle-times
2 parents 23448c9 + 120907a commit 2a7cd8e

File tree

8 files changed

+811
-266
lines changed

8 files changed

+811
-266
lines changed

spikeinterface_gui/backend_panel.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -199,10 +199,9 @@ def listen_setting_changes(view):
199199

200200
class PanelMainWindow:
201201

202-
def __init__(self, controller, layout_preset=None, layout=None, user_settings=None):
202+
def __init__(self, controller, layout_dict=None, user_settings=None):
203203
self.controller = controller
204-
self.layout_preset = layout_preset
205-
self.layout = layout
204+
self.layout_dict = layout_dict
206205
self.verbose = controller.verbose
207206

208207
self.make_views(user_settings)
@@ -272,7 +271,7 @@ def create_main_layout(self):
272271

273272
pn.extension("gridstack")
274273

275-
preset = get_layout_description(self.layout_preset, self.layout)
274+
preset = self.layout_dict
276275

277276
layout_zone = {}
278277
for zone, view_names in preset.items():

spikeinterface_gui/backend_qt.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -155,13 +155,12 @@ def stop_listen_setting_changes(view):
155155
class QtMainWindow(QT.QMainWindow):
156156
main_window_closed = QT.pyqtSignal(object)
157157

158-
def __init__(self, controller, parent=None, layout_preset=None, layout=None, user_settings=None):
158+
def __init__(self, controller, parent=None, layout_dict=None, user_settings=None):
159159
QT.QMainWindow.__init__(self, parent)
160160

161161
self.controller = controller
162162
self.verbose = controller.verbose
163-
self.layout_preset = layout_preset
164-
self.layout = layout
163+
self.layout_dict = layout_dict
165164

166165
self.make_views(user_settings)
167166
self.create_main_layout()
@@ -220,7 +219,7 @@ def create_main_layout(self):
220219

221220
self.setDockNestingEnabled(True)
222221

223-
preset = get_layout_description(self.layout_preset, self.layout)
222+
preset = self.layout_dict
224223

225224
widgets_zone = {}
226225
for zone, view_names in preset.items():

spikeinterface_gui/layout_presets.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def _check_valid_layout_dict(layout_dict):
3434
list_of_possible_class_views = list(possible_class_views.keys())
3535
if class_view not in list_of_possible_class_views:
3636
raise KeyError(f"View '{class_view}' in layout dictionary not equal to a valid View. "\
37-
"Valid views are {list_of_possible_class_views}")
37+
f"Valid views are {list_of_possible_class_views}")
3838

3939
def get_layout_description(preset_name, layout=None):
4040
if isinstance(layout, dict):
@@ -53,7 +53,7 @@ def get_layout_description(preset_name, layout=None):
5353

5454
default_layout = dict(
5555
zone1=['curation', 'spikelist'],
56-
zone2=['unitlist', 'mergelist'],
56+
zone2=['unitlist', 'merge'],
5757
zone3=['trace', 'tracemap', 'spikeamplitude', 'spikedepth', 'spikerate'],
5858
zone4=[],
5959
zone5=['probe'],
@@ -67,7 +67,7 @@ def get_layout_description(preset_name, layout=None):
6767
# legacy layout for nostalgic people like me
6868
legacy_layout = dict(
6969
zone1=['curation', 'spikelist'],
70-
zone2=['unitlist', 'mergelist'],
70+
zone2=['unitlist', 'merge'],
7171
zone3=['trace', 'tracemap', 'waveform', 'waveformheatmap', 'isi', 'correlogram', 'spikeamplitude'],
7272
zone4=[],
7373
zone5=['probe'],
@@ -78,7 +78,7 @@ def get_layout_description(preset_name, layout=None):
7878
_presets['legacy'] = legacy_layout
7979

8080
unit_focus_layout = dict(
81-
zone1=['unitlist', 'mergelist', 'curation', 'spikelist'],
81+
zone1=['unitlist', 'merge', 'curation', 'spikelist'],
8282
zone2=[],
8383
zone3=['trace', 'tracemap', 'spikeamplitude', 'spikedepth'],
8484
zone4=[],

spikeinterface_gui/main.py

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@
77

88
from spikeinterface import load_sorting_analyzer, load
99
from spikeinterface.core.core_tools import is_path_remote
10+
from spikeinterface.core.sortinganalyzer import get_available_analyzer_extensions
1011
from .utils_global import get_config_folder
12+
from spikeinterface_gui.layout_presets import get_layout_description
1113

1214
import spikeinterface_gui
1315
from spikeinterface_gui.controller import Controller
14-
16+
from spikeinterface_gui.viewlist import possible_class_views
1517

1618
def run_mainwindow(
1719
analyzer,
@@ -121,6 +123,11 @@ def run_mainwindow(
121123
if verbose:
122124
import time
123125
t0 = time.perf_counter()
126+
127+
layout_dict = get_layout_description(layout_preset, layout)
128+
if skip_extensions is None:
129+
skip_extensions = find_skippable_extensions(layout_dict)
130+
124131
controller = Controller(
125132
analyzer, backend=backend, verbose=verbose,
126133
curation=curation, curation_data=curation_dict,
@@ -146,7 +153,7 @@ def run_mainwindow(
146153

147154
app = mkQApp()
148155

149-
win = QtMainWindow(controller, layout_preset=layout_preset, layout=layout, user_settings=user_settings)
156+
win = QtMainWindow(controller, layout_dict=layout_dict, user_settings=user_settings)
150157
win.setWindowTitle('SpikeInterface GUI')
151158
# Set window icon
152159
icon_file = Path(__file__).absolute().parent / 'img' / 'si.png'
@@ -158,7 +165,7 @@ def run_mainwindow(
158165

159166
elif backend == "panel":
160167
from .backend_panel import PanelMainWindow, start_server
161-
win = PanelMainWindow(controller, layout_preset=layout_preset, layout=layout, user_settings=user_settings)
168+
win = PanelMainWindow(controller, layout_dict=layout_dict, user_settings=user_settings)
162169

163170
if start_app or panel_window_servable:
164171
win.main_layout.servable(title='SpikeInterface GUI')
@@ -349,3 +356,25 @@ def run_mainwindow_cli():
349356
disable_save_settings_button=disable_save_settings_button,
350357
)
351358

359+
def find_skippable_extensions(layout_dict):
360+
"""
361+
Returns the extensions which don't need to be loaded, depending on which views the user
362+
wants to load. Does this by taking all possible extensions, then removing any which are
363+
needed by a view.
364+
"""
365+
366+
all_extensions = set(get_available_analyzer_extensions())
367+
368+
view_per_zone = list(layout_dict.values())
369+
list_of_views = [view for zone_views in view_per_zone for view in zone_views]
370+
371+
needed_extensions = ['unit_locations']
372+
373+
for view in list_of_views:
374+
extensions_view_depend_on = possible_class_views[view]._depend_on
375+
if extensions_view_depend_on is not None:
376+
needed_extensions += extensions_view_depend_on
377+
378+
skippable_extensions = list(all_extensions.difference(set(needed_extensions)))
379+
380+
return skippable_extensions

spikeinterface_gui/mainsettingsview.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ def save_current_settings(self, event=None):
6060
view_class_name = view.__class__.__name__
6161
view_name = view_class_name.replace("View", "").lower()
6262

63+
if view_name == "unitlist":
64+
continue
65+
6366
settings_dict[view_name] = {}
6467

6568
if backend == "panel":

spikeinterface_gui/probeview.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@ def _qt_refresh(self):
180180
for label in self.channel_labels:
181181
label.hide()
182182

183+
self._qt_highlight_visible_units()
183184

184185
def _qt_update_channel_visibility_from_roi(self, emit_signals=False):
185186
r, x, y = circle_from_roi(self.roi_channel)
@@ -224,6 +225,9 @@ def _qt_on_roi_units_changed(self, emit_signals=True):
224225
self._qt_on_roi_channel_changed(emit_signals=False)
225226

226227
def _qt_on_unit_visibility_changed(self, auto_zoom=None):
228+
self._qt_highlight_visible_units(auto_zoom=auto_zoom)
229+
230+
def _qt_highlight_visible_units(self, auto_zoom=None):
227231
import pyqtgraph as pg
228232

229233
# this change the ROI and so change also channel_visibility

spikeinterface_gui/utils_qt.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -193,12 +193,16 @@ class ViewBoxHandlingDoubleclickAndGain(pg.ViewBox):
193193
doubleclicked = QT.pyqtSignal()
194194
gain_zoom = QT.pyqtSignal(float)
195195
widen_narrow = QT.pyqtSignal(float)
196+
heighten_shorten = QT.pyqtSignal(float)
196197
limit_zoom = QT.pyqtSignal(float)
197198
def mouseDoubleClickEvent(self, ev):
198199
self.doubleclicked.emit()
199200
ev.accept()
200201
def wheelEvent(self, ev, axis=None):
201-
if ev.modifiers() == QT.Qt.AltModifier:
202+
if (ev.modifiers() & QT.Qt.AltModifier) and (ev.modifiers() & QT.Qt.ShiftModifier):
203+
z = 1.3 if ev.delta()>0 else 1/1.3
204+
self.heighten_shorten.emit(z)
205+
elif ev.modifiers() == QT.Qt.AltModifier:
202206
z = 1.3 if ev.delta()>0 else 1/1.3
203207
self.widen_narrow.emit(z)
204208
elif ev.modifiers() == QT.Qt.ShiftModifier:
@@ -243,11 +247,6 @@ def mouseDragEvent(self, ev):
243247
self.xsize_zoom.emit((ev.pos()-ev.lastPos()).x())
244248

245249

246-
247-
248-
249-
250-
251250
class TimeSeeker(QT.QWidget) :
252251

253252
time_changed = QT.pyqtSignal(float)

0 commit comments

Comments
 (0)