From ebddab5a142891729ff2ddd1f50a2f921175350e Mon Sep 17 00:00:00 2001 From: Guillaume Favelier Date: Fri, 20 May 2022 13:01:47 +0200 Subject: [PATCH 1/7] update --- mne/viz/backends/_qt.py | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/mne/viz/backends/_qt.py b/mne/viz/backends/_qt.py index 3df98daa317..f4d02c450e3 100644 --- a/mne/viz/backends/_qt.py +++ b/mne/viz/backends/_qt.py @@ -11,7 +11,7 @@ import pyvista from pyvistaqt.plotting import FileDialog, MainWindow -from qtpy.QtCore import Qt, Signal, QLocale, QObject +from qtpy.QtCore import Qt, Signal, QLocale, QObject, QEvent from qtpy.QtGui import QIcon, QCursor from qtpy.QtWidgets import (QComboBox, QDockWidget, QDoubleSpinBox, QGroupBox, QHBoxLayout, QLabel, QToolButton, QMenuBar, @@ -723,12 +723,7 @@ def _window_set_theme(self, theme=None): else: default_theme = theme theme = get_config('MNE_3D_OPTION_THEME', default_theme) - stylesheet = _qt_get_stylesheet(theme) - self._window.setStyleSheet(stylesheet) - if _qt_is_dark(self._window): - QIcon.setThemeName('dark') - else: - QIcon.setThemeName('light') + _set_window_theme(self._window, theme) class _QtWidgetList(_AbstractWidgetList): @@ -921,6 +916,15 @@ def _create_dock_widget(window, name, area, *, max_width=None): return dock, dock_layout +def _set_window_theme(window, theme): + stylesheet = _qt_get_stylesheet(theme) + window.setStyleSheet(stylesheet) + if _qt_is_dark(window): + QIcon.setThemeName('dark') + else: + QIcon.setThemeName('light') + + @contextmanager def _testing_context(interactive): from . import renderer @@ -952,3 +956,18 @@ class _MNEMainWindow(MainWindow): def __init__(self, parent=None, title=None, size=None): super().__init__(parent, title, size) self.setAttribute(Qt.WA_ShowWithoutActivating, True) + self._palette_lock = False # prevent palette change loop + + def _filter_palette_change(self, ev): + if self._palette_lock: + return + self._palette_lock = True + theme = get_config('MNE_3D_OPTION_THEME', 'auto') + _set_window_theme(self, theme) + self._palette_lock = False + + def event(self, ev): + """Catch system events.""" + if ev.type() == QEvent.PaletteChange: # detect theme switches + self._filter_palette_change(ev) + return super().event(ev) From fd474fdff5a60d7b019b45171af48c585122b77b Mon Sep 17 00:00:00 2001 From: Guillaume Favelier Date: Fri, 20 May 2022 15:39:27 +0200 Subject: [PATCH 2/7] fix --- mne/viz/backends/_qt.py | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/mne/viz/backends/_qt.py b/mne/viz/backends/_qt.py index f4d02c450e3..db574b0b10e 100644 --- a/mne/viz/backends/_qt.py +++ b/mne/viz/backends/_qt.py @@ -946,6 +946,19 @@ def _testing_context(interactive): renderer.MNE_3D_BACKEND_INTERACTIVE = orig_interactive +class _EventFilter(QObject): + def __init__(self, event_name): + super().__init__() + self._event_name = event_name + + def eventFilter(self, obj, ev): + event_type = getattr(QEvent, self._event_name) + if ev.type() == event_type: + ev.accept() + return True + return False + + # In theory we should be able to do this later (e.g., in _pyvista.py when # initializing), but at least on Qt6 this has to be done earlier. So let's do # it immediately upon instantiation of the QMainWindow class. @@ -956,15 +969,15 @@ class _MNEMainWindow(MainWindow): def __init__(self, parent=None, title=None, size=None): super().__init__(parent, title, size) self.setAttribute(Qt.WA_ShowWithoutActivating, True) - self._palette_lock = False # prevent palette change loop def _filter_palette_change(self, ev): - if self._palette_lock: - return - self._palette_lock = True + # _setStyleSheet triggers a PaletteChange event so we need to filter + # out the newly created one to avoid ending in an infinite loop + event_filter = _EventFilter('PaletteChange') + self.installEventFilter(event_filter) theme = get_config('MNE_3D_OPTION_THEME', 'auto') _set_window_theme(self, theme) - self._palette_lock = False + self.removeEventFilter(event_filter) def event(self, ev): """Catch system events.""" From 0f0a1dddd78f0ef13604583be4a98ec56678ddcb Mon Sep 17 00:00:00 2001 From: Guillaume Favelier Date: Fri, 20 May 2022 15:42:15 +0200 Subject: [PATCH 3/7] refactor --- mne/viz/backends/_qt.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/mne/viz/backends/_qt.py b/mne/viz/backends/_qt.py index db574b0b10e..e3790d379ab 100644 --- a/mne/viz/backends/_qt.py +++ b/mne/viz/backends/_qt.py @@ -956,7 +956,8 @@ def eventFilter(self, obj, ev): if ev.type() == event_type: ev.accept() return True - return False + else: + return False # In theory we should be able to do this later (e.g., in _pyvista.py when @@ -971,11 +972,12 @@ def __init__(self, parent=None, title=None, size=None): self.setAttribute(Qt.WA_ShowWithoutActivating, True) def _filter_palette_change(self, ev): - # _setStyleSheet triggers a PaletteChange event so we need to filter - # out the newly created one to avoid ending in an infinite loop + theme = get_config('MNE_3D_OPTION_THEME', 'auto') + # The setStyleSheet() function triggers a PaletteChange event so we + # need to filter out the newly created one to avoid ending in an + # infinite loop. event_filter = _EventFilter('PaletteChange') self.installEventFilter(event_filter) - theme = get_config('MNE_3D_OPTION_THEME', 'auto') _set_window_theme(self, theme) self.removeEventFilter(event_filter) From 14bb16c6cfa601824b3b181dfd2294ca4e40ff7e Mon Sep 17 00:00:00 2001 From: Guillaume Favelier Date: Fri, 20 May 2022 15:45:56 +0200 Subject: [PATCH 4/7] rename --- mne/viz/backends/_qt.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mne/viz/backends/_qt.py b/mne/viz/backends/_qt.py index e3790d379ab..8d10c1f29d5 100644 --- a/mne/viz/backends/_qt.py +++ b/mne/viz/backends/_qt.py @@ -946,7 +946,7 @@ def _testing_context(interactive): renderer.MNE_3D_BACKEND_INTERACTIVE = orig_interactive -class _EventFilter(QObject): +class _DiscardEventFilter(QObject): def __init__(self, event_name): super().__init__() self._event_name = event_name @@ -976,7 +976,7 @@ def _filter_palette_change(self, ev): # The setStyleSheet() function triggers a PaletteChange event so we # need to filter out the newly created one to avoid ending in an # infinite loop. - event_filter = _EventFilter('PaletteChange') + event_filter = _DiscardEventFilter('PaletteChange') self.installEventFilter(event_filter) _set_window_theme(self, theme) self.removeEventFilter(event_filter) From f783cac6d484a071a8f78a3ce2acca2dc07982b3 Mon Sep 17 00:00:00 2001 From: Guillaume Favelier Date: Fri, 20 May 2022 16:01:39 +0200 Subject: [PATCH 5/7] fix --- mne/viz/backends/_qt.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mne/viz/backends/_qt.py b/mne/viz/backends/_qt.py index 8d10c1f29d5..aea57bddf42 100644 --- a/mne/viz/backends/_qt.py +++ b/mne/viz/backends/_qt.py @@ -918,7 +918,13 @@ def _create_dock_widget(window, name, area, *, max_width=None): def _set_window_theme(window, theme): stylesheet = _qt_get_stylesheet(theme) + # The setStyleSheet() function triggers a PaletteChange event so we + # need to filter out the newly created one to avoid ending in an + # infinite loop. + event_filter = _DiscardEventFilter('PaletteChange') + window.installEventFilter(event_filter) window.setStyleSheet(stylesheet) + window.removeEventFilter(event_filter) if _qt_is_dark(window): QIcon.setThemeName('dark') else: @@ -973,13 +979,7 @@ def __init__(self, parent=None, title=None, size=None): def _filter_palette_change(self, ev): theme = get_config('MNE_3D_OPTION_THEME', 'auto') - # The setStyleSheet() function triggers a PaletteChange event so we - # need to filter out the newly created one to avoid ending in an - # infinite loop. - event_filter = _DiscardEventFilter('PaletteChange') - self.installEventFilter(event_filter) _set_window_theme(self, theme) - self.removeEventFilter(event_filter) def event(self, ev): """Catch system events.""" From 43b80d40fa6fa1c3756fe91fd3b20cdd8dd18cf6 Mon Sep 17 00:00:00 2001 From: Guillaume Favelier Date: Fri, 20 May 2022 16:07:38 +0200 Subject: [PATCH 6/7] refactor --- mne/viz/backends/_qt.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/mne/viz/backends/_qt.py b/mne/viz/backends/_qt.py index aea57bddf42..919b5a6562e 100644 --- a/mne/viz/backends/_qt.py +++ b/mne/viz/backends/_qt.py @@ -955,11 +955,10 @@ def _testing_context(interactive): class _DiscardEventFilter(QObject): def __init__(self, event_name): super().__init__() - self._event_name = event_name + self._event_type = getattr(QEvent, event_name) def eventFilter(self, obj, ev): - event_type = getattr(QEvent, self._event_name) - if ev.type() == event_type: + if ev.type() == self._event_type: ev.accept() return True else: From 3ee87965849b56daf87e171f0faf35e0ee91f699 Mon Sep 17 00:00:00 2001 From: Guillaume Favelier Date: Fri, 20 May 2022 16:09:46 +0200 Subject: [PATCH 7/7] refactor --- mne/viz/backends/_qt.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/mne/viz/backends/_qt.py b/mne/viz/backends/_qt.py index 919b5a6562e..310c23128f3 100644 --- a/mne/viz/backends/_qt.py +++ b/mne/viz/backends/_qt.py @@ -976,12 +976,9 @@ def __init__(self, parent=None, title=None, size=None): super().__init__(parent, title, size) self.setAttribute(Qt.WA_ShowWithoutActivating, True) - def _filter_palette_change(self, ev): - theme = get_config('MNE_3D_OPTION_THEME', 'auto') - _set_window_theme(self, theme) - def event(self, ev): """Catch system events.""" if ev.type() == QEvent.PaletteChange: # detect theme switches - self._filter_palette_change(ev) + theme = get_config('MNE_3D_OPTION_THEME', 'auto') + _set_window_theme(self, theme) return super().event(ev)