Skip to content

Commit

Permalink
Refactor layout
Browse files Browse the repository at this point in the history
  • Loading branch information
GuillaumeFavelier committed Mar 9, 2021
1 parent e83c927 commit 0f0fa02
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 44 deletions.
18 changes: 3 additions & 15 deletions mne/viz/_brain/_brain.py
Original file line number Diff line number Diff line change
Expand Up @@ -900,11 +900,7 @@ def _configure_dock_time_widget(self, layout=None):
widget=self._renderer._dock_add_label(value="+", layout=hlayout),
notebook=self.notebook,
)
if self.notebook:
from ..backends._notebook import _ipy_add_widget
_ipy_add_widget(layout, hlayout, self._renderer.dock_width)
else:
layout.addLayout(hlayout)
self._renderer._layout_add_widget(layout, hlayout)
min_time = float(self._data['time'][0])
max_time = float(self._data['time'][-1])
self.widgets["min_time"].set_value(f"{min_time: .3f}")
Expand Down Expand Up @@ -1069,11 +1065,7 @@ def _configure_dock_colormap_widget(self, name):
notebook=self.notebook,
)
up.widgets[key] = [self.widgets[key], self.widgets[f"entry_{key}"]]
if self.notebook:
from ..backends._notebook import _ipy_add_widget
_ipy_add_widget(layout, hlayout, self._renderer.dock_width)
else:
layout.addLayout(hlayout)
self._renderer._layout_add_widget(layout, hlayout)

# reset / minus / plus
hlayout = self._renderer._dock_add_layout(vertical=False)
Expand Down Expand Up @@ -1104,11 +1096,7 @@ def _configure_dock_colormap_widget(self, name):
),
notebook=self.notebook,
)
if self.notebook:
from ..backends._notebook import _ipy_add_widget
_ipy_add_widget(layout, hlayout, self._renderer.dock_width)
else:
layout.addLayout(hlayout)
self._renderer._layout_add_widget(layout, hlayout)

# register colorbar slider representations
widgets = {key: self.widgets[key] for key in self.keys}
Expand Down
2 changes: 1 addition & 1 deletion mne/viz/_brain/tests/test.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@
" assert isinstance(brain, brain_class)\n",
" assert brain.notebook\n",
" assert brain._renderer.figure.display is not None\n",
" brain._update()\n",
" brain._renderer._update()\n",
" total_number_of_buttons = len([k for k in brain._renderer.actions.keys() if '_field' not in k])\n",
" number_of_buttons = 0\n",
" for action in brain._renderer.actions.values():\n",
Expand Down
10 changes: 10 additions & 0 deletions mne/viz/backends/_abstract.py
Original file line number Diff line number Diff line change
Expand Up @@ -443,6 +443,16 @@ def remove_mesh(self, mesh_data):
pass


class _AbstractLayout(ABC):
@abstractmethod
def _layout_initialize(self, max_width):
pass

@abstractmethod
def _layout_add_widget(self, layout, widget):
pass


class _AbstractToolBar(ABC):
@abstractmethod
def _tool_bar_load_icons(self):
Expand Down
56 changes: 31 additions & 25 deletions mne/viz/backends/_notebook.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

from ...fixes import nullcontext
from ._abstract import (_AbstractDock, _AbstractToolBar, _AbstractMenuBar,
_AbstractStatusBar)
_AbstractStatusBar, _AbstractLayout)
from ._pyvista import _PyVistaRenderer, _close_all, _set_3d_view, _set_3d_title # noqa: F401,E501, analysis:ignore


Expand All @@ -19,6 +19,7 @@ def _dock_initialize(self, window):
self.dock_width = 300
self.dock = self.dock_layout = VBox()
self.dock.layout.width = f"{self.dock_width}px"
self._layout_initialize(self.dock_width)

def _dock_finalize(self):
pass
Expand All @@ -38,13 +39,13 @@ def _dock_add_layout(self, vertical=True):
def _dock_add_label(self, value, align=False, layout=None):
layout = self.dock_layout if layout is None else layout
widget = Text(value=value, disabled=True)
_ipy_add_widget(layout, widget, self.dock_width)
self._layout_add_widget(layout, widget)
return widget

def _dock_add_button(self, name, callback, layout=None):
widget = Button(description=name)
widget.on_click(lambda x: callback())
_ipy_add_widget(layout, widget, self.dock_width)
self._layout_add_widget(layout, widget)
return widget

def _dock_named_layout(self, name, layout, compact):
Expand All @@ -53,7 +54,7 @@ def _dock_named_layout(self, name, layout, compact):
hlayout = self._dock_add_layout(not compact)
self._dock_add_label(
value=name, align=not compact, layout=hlayout)
_ipy_add_widget(layout, hlayout, self.dock_width)
self._layout_add_widget(layout, hlayout)
layout = hlayout
return layout

Expand All @@ -68,7 +69,7 @@ def _dock_add_slider(self, name, value, rng, callback,
readout=False,
)
widget.observe(_generate_callback(callback), names='value')
_ipy_add_widget(layout, widget, self.dock_width)
self._layout_add_widget(layout, widget)
return widget

def _dock_add_spin_box(self, name, value, rng, callback,
Expand All @@ -82,7 +83,7 @@ def _dock_add_spin_box(self, name, value, rng, callback,
readout=False,
)
widget.observe(_generate_callback(callback), names='value')
_ipy_add_widget(layout, widget, self.dock_width)
self._layout_add_widget(layout, widget)
return widget

def _dock_add_combo_box(self, name, value, rng,
Expand All @@ -93,13 +94,13 @@ def _dock_add_combo_box(self, name, value, rng,
options=rng,
)
widget.observe(_generate_callback(callback), names='value')
_ipy_add_widget(layout, widget, self.dock_width)
self._layout_add_widget(layout, widget)
return widget

def _dock_add_group_box(self, name, layout=None):
layout = self.dock_layout if layout is None else layout
hlayout = VBox()
_ipy_add_widget(layout, hlayout, self.dock_width)
self._layout_add_widget(layout, hlayout)
return hlayout


Expand Down Expand Up @@ -128,6 +129,7 @@ def _tool_bar_load_icons(self):
def _tool_bar_initialize(self, window, name="default"):
self.actions = dict()
self.tool_bar = HBox()
self._layout_initialize(None)

def _tool_bar_finalize(self):
pass
Expand All @@ -139,15 +141,15 @@ def _tool_bar_add_button(self, name, desc, func, icon_name=None):
return
widget = Button(tooltip=desc, icon=icon)
widget.on_click(lambda x: func())
_ipy_add_widget(self.tool_bar, widget)
self._layout_add_widget(self.tool_bar, widget)
self.actions[name] = widget

def _tool_bar_update_button_icon(self, name, icon_name):
self.actions[name].icon = self.icons[icon_name]

def _tool_bar_add_text(self, name, value, placeholder):
widget = Text(value=value, placeholder=placeholder)
_ipy_add_widget(self.tool_bar, widget)
self._layout_add_widget(self.tool_bar, widget)
self.actions[name] = widget

def _tool_bar_add_spacer(self):
Expand Down Expand Up @@ -176,8 +178,26 @@ def _status_bar_add_progress_bar(self, stretch=0):
pass


class _IpyLayout(_AbstractLayout):
def _layout_initialize(self, max_width):
self._layout_max_width = max_width

def _layout_add_widget(self, layout, widget):
widget.layout.margin = "2px 0px 2px 0px"
widget.layout.min_width = "0px"
children = list(layout.children)
children.append(widget)
layout.children = tuple(children)
# Fix columns
if self._layout_max_width is not None and isinstance(widget, HBox):
children = widget.children
width = int(self._layout_max_width / len(children))
for child in children:
child.layout.width = f"{width}px"


class _Renderer(_PyVistaRenderer, _IpyDock, _IpyToolBar, _IpyMenuBar,
_IpyStatusBar):
_IpyStatusBar, _IpyLayout):
def __init__(self, *args, **kwargs):
self.dock = None
self.tool_bar = None
Expand Down Expand Up @@ -226,18 +246,4 @@ def show(self):
return self.scene()


def _ipy_add_widget(layout, widget, max_width=None):
widget.layout.margin = "2px 0px 2px 0px"
widget.layout.min_width = "0px"
children = list(layout.children)
children.append(widget)
layout.children = tuple(children)
# Fix columns
if max_width is not None and isinstance(widget, HBox):
children = widget.children
width = int(max_width / len(children))
for child in children:
child.layout.width = f"{width}px"


_testing_context = nullcontext
17 changes: 14 additions & 3 deletions mne/viz/backends/_qt.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,13 @@
QHBoxLayout, QLabel, QToolButton, QMenuBar,
QSlider, QSpinBox, QVBoxLayout, QWidget,
QSizePolicy, QScrollArea, QStyle, QProgressBar,
QStyleOptionSlider)
QStyleOptionSlider, QLayout)

from ._pyvista import _PyVistaRenderer
from ._pyvista import (_close_all, _close_3d_figure, _check_3d_figure, # noqa: F401,E501 analysis:ignore
_set_3d_view, _set_3d_title, _take_3d_screenshot) # noqa: F401,E501 analysis:ignore
from ._abstract import (_AbstractDock, _AbstractToolBar, _AbstractMenuBar,
_AbstractStatusBar)
_AbstractStatusBar, _AbstractLayout)
from ._utils import _init_qt_resources


Expand Down Expand Up @@ -280,8 +280,19 @@ def _status_bar_add_progress_bar(self, stretch=0):
return widget


class _QtLayout(_AbstractLayout):
def _layout_initialize(self, max_width):
pass

def _layout_add_widget(self, layout, widget, max_width=None):
if isinstance(widget, QLayout):
layout.addLayout(widget)
else:
layout.addWidget(widget)


class _Renderer(_PyVistaRenderer, _QtDock, _QtToolBar, _QtMenuBar,
_QtStatusBar):
_QtStatusBar, _QtLayout):
pass


Expand Down

0 comments on commit 0f0fa02

Please sign in to comment.