Source code for populse_mia.user_interface.data_viewer.data_viewer_tab

# -*- coding: utf-8 -*-
"""
Populse-MIA data viewer GUI interface, in the "Data Viewer" tab.

Contains:
    Class:
        - DataViewerTab

"""

import importlib
import os
import traceback

from soma.qt_gui.qt_backend import Qt


[docs] class DataViewerTab(Qt.QWidget): """ DataViewerTab is the widget in the data viewer tab of Populse-MIA GUI. A combobox containing the available viewers will always appear. If import of viewers fails, it won't impact the work of Mia itself. Viewers are put in Qt.QStackedLayout in order to share a same project. A new viewer can be added simply by placing it in the data_viewer directory. """
[docs] def __init__(self, main_window): """The constructor ... :param main_window: an instance of the MainWindow class """ super(DataViewerTab, self).__init__() self.docs = [] self.lay = [] self.project = [] self.stacks = [] self.viewers_loaded = {} self.viewer_current = {} # Display of combobox containing the viewers self.main_window = main_window self.lay = Qt.QVBoxLayout() self.setLayout(self.lay) hlay = Qt.QHBoxLayout() self.lay.addLayout(hlay) hlay.addWidget(Qt.QLabel("use viewer:")) # Combobox will contain the viewers if they are available self.viewers_combo = Qt.QComboBox() self.viewers_combo.setMinimumWidth(150) hlay.addWidget(self.viewers_combo) hlay.addStretch(1) self.viewers_combo.currentIndexChanged.connect(self.change_viewer)
[docs] def activate_viewer(self, viewer_name): """Activates viewer viewer_name which was selected in the combobox. :param viewer_name: a viewer name (a string) """ if self.viewer_current and list(self.viewer_current)[0] == viewer_name: return print("\n- activate viewer:", viewer_name) viewer = self.viewers_loaded[viewer_name] if viewer: self.stacks.setCurrentWidget(viewer) self.viewer_current.clear() self.viewer_current[viewer_name] = viewer
[docs] def change_viewer(self): """Switches to viewer selected in the combobox pass the project from on viewer to the other. """ index = self.viewers_combo.currentIndex() viewer_name = self.viewers_combo.itemText(index).lower() self.activate_viewer(viewer_name) self.set_documents(self.project, self.docs)
[docs] def clear(self): """Clears all loaded viewers before closing Mia.""" for viewer in list(self.viewers_loaded): self.viewers_loaded[viewer].close() del self.viewers_loaded[viewer]
[docs] def closeEvent(self, event): """clears and closes all events before closing Mia.""" self.clear() super().close()
[docs] def current_viewer(self): """Return current viewer (selected viewer in combobox) used when user changes from BrowserTab or PipelineManagerTab to DataViewerTab. """ if not self.viewer_current: return self.viewers_combo.currentText().lower() else: return list(self.viewer_current)[0]
[docs] def load_viewer(self, viewer_name): """Available viewers in data_viewer folder are loaded as soon as Data Viewer tab is clicked. :param viewer_name: string """ if viewer_name: detected_viewer = [viewer_name] else: detected_viewer = [ p for p in os.listdir(os.path.dirname(__file__)) if os.path.isdir( os.path.abspath(os.path.join(os.path.dirname(__file__), p)) ) and p != "__pycache__" ] if not self.viewers_loaded: self.stacks = Qt.QStackedLayout() self.lay.addLayout(self.stacks) init_global_handlers = True # Try import detected viewers for viewer_name in detected_viewer: if viewer_name not in self.viewers_loaded: try: viewer_module = importlib.import_module( "%s.%s" % (__name__.rsplit(".", 1)[0], viewer_name) ) self.viewers_loaded[viewer_name] = viewer_module.MiaViewer( init_global_handlers ) self.stacks.addWidget(self.viewers_loaded[viewer_name]) self.viewers_combo.addItem(viewer_name) # Check if initialization of controls has been done: if self.viewers_loaded[ viewer_name ].anaviewer._global_handlers_initialized: init_global_handlers = False except Exception as e: print( "\n{0} viewer is not available or not working " "...!\nTraceback:".format(viewer_name) ) print( "".join(traceback.format_tb(e.__traceback__)), end="" ) print("{0}: {1}\n".format(e.__class__.__name__, e))
[docs] def set_documents(self, project, documents): """Shares project with documents to all viewers. :param project: whole project :param documents: objects (images) contained in the project """ if self.viewer_current: self.viewer_current[list(self.viewer_current)[0]].set_documents( project, documents ) self.project = project self.docs = documents