[docs]class ExtensionWidget(QMdiSubWindow):
"""MDIArea with extension."""
# ----------------------------------------------------------------------
def __init__(self, mdi_area,
mode: str,
extensions_list: List[str] = [],
autostart: Optional[str] = None,
hide_menu: Optional[bool] = False,
directory: Optional[str] = None):
""""""
super().__init__(None)
if mode == 'timelock':
ui = os.path.realpath(os.path.join(
os.environ['BCISTREAM_ROOT'], 'framework', 'qtgui', 'extension_timelock_widget.ui'))
else:
ui = os.path.realpath(os.path.join(
os.environ['BCISTREAM_ROOT'], 'framework', 'qtgui', 'extension_widget.ui'))
self.main = QUiLoader().load(ui, self)
self.mdi_area = mdi_area
self.main.DPI = 70
self.mode = mode
self.current_viz = None
if autostart:
self.extensions_list = [('name', autostart)]
else:
self.extensions_list = extensions_list
if directory:
self.projects_dir = directory
else:
if '--local' in sys.argv:
self.projects_dir = os.path.join(
os.getenv('BCISTREAM_ROOT'), 'default_extensions')
else:
self.projects_dir = os.path.join(
os.getenv('BCISTREAM_HOME'), 'default_extensions')
self.setWindowFlag(Qt.FramelessWindowHint)
self.setWidget(self.main)
self.config = ConfigManager()
if not self.is_timeloclk:
style = f"""
* {{
border: 2px solid {os.getenv('QTMATERIAL_SECONDARYCOLOR', '#000000')};
border-width: 0px 2px 2px 2px;
}}
"""
else:
style = ''
self.setStyleSheet(f"""
{style}
QMenuBar {{
background: {os.getenv('QTMATERIAL_SECONDARYCOLOR', '#000000')};
border-width: 0;
}}
""")
if autostart:
self.load_extension(autostart)
if hide_menu:
self.menubar.hide()
# ----------------------------------------------------------------------
@property
def is_visualization(self) -> str:
""""""
return self.mode == 'visualization'
# ----------------------------------------------------------------------
@property
def is_stimuli(self) -> bool:
""""""
return self.mode in ['stimuli', 'delivery']
# ----------------------------------------------------------------------
@property
def is_analysis(self) -> bool:
""""""
return self.mode == 'analysis'
# ----------------------------------------------------------------------
@property
def is_timeloclk(self) -> bool:
""""""
return self.mode == 'timelock'
# ----------------------------------------------------------------------
# ----------------------------------------------------------------------
# keep this
# ----------------------------------------------------------------------
# keep this
# ----------------------------------------------------------------------
# ----------------------------------------------------------------------
def on_remove(self, callback: Callable) -> None:
""""""
self.on_remove_callback = callback
# ----------------------------------------------------------------------
# ----------------------------------------------------------------------
# ----------------------------------------------------------------------
def resize_menubar(self) -> None:
""""""
if hasattr(self, 'menubar'):
self.menubar.setGeometry(
QRect(0, 0, self.menubar.parent().rect().width(), 37))
# ----------------------------------------------------------------------
def resizeEvent(self, event: Event) -> None:
""""""
super().resizeEvent(event)
self.resize_menubar()
# QTimer.singleShot(10, self.resize_menubar)
# ----------------------------------------------------------------------
# ----------------------------------------------------------------------
# ----------------------------------------------------------------------
# ----------------------------------------------------------------------
def build_interactive(self, items: Sequence[str, List[str], str, str, bool]) -> None:
""""""
for item in items:
if item[0] == '#':
continue
name, values, default, _, exclusive = item
menu_ = QMenu(f'{name} ({default})')
if exclusive:
action_group = QActionGroup(menu_)
action_group.setExclusive(True)
for value in values:
if exclusive:
# action = ag.addAction(QAction(
# f'{value}', menu_, checkable=True, checked=True))
action = QAction(
f'{value}', menu_, checkable=True, triggered=self.set_interactive(menu_, name, value))
action_group.addAction(action)
else:
action = QAction(f'{value}', menu_, checkable=True,
triggered=self.set_interactive_non_exclusive(menu_, name, value))
menu_.addAction(action)
if value == default:
action.setChecked(True)
self.main.INTERACTIVE[name] = default
self.menubar.addMenu(menu_)
# ----------------------------------------------------------------------
def set_interactive_non_exclusive(self, menu_, name: str, value: int) -> Callable:
""""""
def wrap():
if value == 'All':
[action.setChecked(False) for action in menu_.actions()]
[action.setChecked(True) for action in menu_.actions(
) if action.text() == f'{value}']
else:
menu_.actions()[0].setChecked(False)
self.main.INTERACTIVE[name] = ','.join([
action.text() for action in menu_.actions() if action.isChecked()])
menu_.setTitle(f'{name} ({value})')
return wrap
# ----------------------------------------------------------------------
# ----------------------------------------------------------------------
# # ----------------------------------------------------------------------
# def set_dpi(self, menu_dpi, text: str, dpi: int) -> Callable:
# """Set the DPI value for matplotlib figures."""
# def wrap():
# [action.setChecked(False) for action in menu_dpi.actions()]
# [action.setChecked(
# True) for action in menu_dpi.actions() if action.text() == text]
# self.main.DPI = dpi
# menu_dpi.setTitle(f'DPI ({dpi})')
# return wrap
# ----------------------------------------------------------------------
# ----------------------------------------------------------------------
def build_menu_timeloclk(self, visualization: bool, debugger: Optional[bool] = False) -> None:
""""""
self.menubar = QMenuBar(self)
self.menubar.clear()
self.menubar.setMinimumWidth(1e4)
self.accent_menubar = QMenuBar(self)
# Title
if debugger:
menu_stimuli = QMenu(f"Debugging: {visualization}")
else:
if visualization:
menu_stimuli = QMenu(f'{visualization } 🞃')
else:
menu_stimuli = QMenu('Timelock analysis 🞃')
# Add visualizations
for viz, path in self.extensions_list:
if viz != visualization:
menu_stimuli.addAction(QAction(viz, menu_stimuli,
triggered=self.set_extension(path)))
self.accent_menubar.addMenu(menu_stimuli)
# Menu with accent color
self.accent_menubar.setStyleSheet(f"""
QMenuBar::item {{
background-color: {os.getenv('QTMATERIAL_PRIMARYCOLOR', '#ffffff')};
color: {os.getenv('QTMATERIAL_PRIMARYTEXTCOLOR', '#ffffff')};
}}""")
# Set the menu in first position
self.menubar.setCornerWidget(
self.accent_menubar, corner=Qt.TopLeftCorner)
# View
menu_view = QMenu("View")
if visualization:
menu_view.addAction(
QAction('Reload', menu_view, triggered=self.reload))
# menu_view.addAction(
# QAction('Save capture', menu_view, triggered=self.save_img))
# if not debugger:
# menu_view.addSeparator()
# menu_view.addAction(
# QAction('Close', menu_view, triggered=self.remove))
else:
menu_view.setEnabled(False)
self.menubar.addMenu(menu_view)