コード例 #1
0
ファイル: foctviewer.py プロジェクト: arrrobase/foct-viewer
class FoctViewer(QMainWindow):
    """Create the main window that stores all of the widgets necessary for the application."""
    def __init__(self, parent=None):
        """Initialize the components of the main window."""
        super(FoctViewer, self).__init__(parent)

        self.resize(1024, 768)
        self.setWindowTitle('FoctViewer')
        window_icon = pkg_resources.resource_filename(
            'foct_viewer.images', 'ic_insert_drive_file_black_48dp_1x.png')
        self.setWindowIcon(QIcon(window_icon))

        self.error_dialog = QErrorMessage()
        self.error_dialog.setFixedWidth(600)
        self.error_dialog.setMinimumHeight(300)

        self.menu_bar = self.menuBar()
        self.about_dialog = AboutDialog()

        self.status_bar = self.create_status_bar()
        self.status_bar.showMessage('Ready', 5000)

        self.central_widget = MainWidget(self)
        self.setCentralWidget(self.central_widget)

        self.file_menu()
        self.help_menu()

        # left line dock widget
        self.ui_dock = LinesDock('Layers', self)
        self.addDockWidget(Qt.LeftDockWidgetArea, self.ui_dock)

        # self.tool_bar_items()
        self.show()

    def create_status_bar(self):
        """
        Creates the status bar
        """
        statusbar = QStatusBar()
        statusbar.setSizeGripEnabled(False)

        statusbar.ind_label = QLabel('0 ')
        statusbar.addPermanentWidget(statusbar.ind_label)
        statusbar.ind_label.hide()

        self.create_loading_bar(statusbar)

        self.setStatusBar(statusbar)
        statusbar.showMessage('Welcome', 2000)

        return statusbar

    def create_loading_bar(self, statusbar):
        """Creates loading bar
        """
        STYLE = """
        QProgressBar{
            height: 10px;
            border: 1px solid grey;
        }

        QProgressBar::chunk {
            background-color: darkblue;
        }
        """

        self.load_bar = QProgressBar(self)
        statusbar.addPermanentWidget(self.load_bar)
        self.load_bar.setMaximum(100)
        self.load_bar.setStyleSheet(STYLE)
        self.load_bar.setTextVisible(False)

        self.load_bar.hide()

    def file_menu(self):
        """Create a file submenu with an Open File item that opens a file dialog."""

        ### FILE ###

        self.menu_file = self.menu_bar.addMenu('File')

        menu_open = QAction('Open OCTA', self)
        menu_open.setStatusTip('Open a file into FoctViewer.')
        menu_open.setShortcut('CTRL+O')
        menu_open.triggered.connect(self.on_file_open)

        menu_open_seg = QAction('Open seg', self)
        menu_open_seg.setStatusTip('Open a segment file.')
        menu_open_seg.triggered.connect(self.on_file_open_seg)

        menu_open_second_seg = QAction('Open comparison seg', self)
        menu_open_second_seg.setStatusTip('Open a segment file to compare.')
        menu_open_second_seg.triggered.connect(self.on_file_open_second_seg)

        menu_exit = QAction('Exit Application', self)
        menu_exit.setStatusTip('Exit the application.')
        menu_exit.setShortcut('CTRL+Q')
        menu_exit.triggered.connect(lambda: QApplication.quit())

        self.menu_file.addAction(menu_open)
        self.menu_file.addAction(menu_open_seg)
        self.menu_file.addAction(menu_open_second_seg)
        self.menu_file.addAction(menu_exit)

        ### VIEW ###

        self.menu_view = self.menu_bar.addMenu('View')

        view_histogram = QAction('Toggle hist', self)
        view_histogram.setStatusTip('Hide or show the LUT levels histogram.')
        view_histogram.setShortcut('CTRL+H')
        view_histogram.triggered.connect(self.central_widget.toggle_histogram)

        self.menu_view.addAction(view_histogram)

        ### OPTIONS ###

        self.menu_options = self.menu_bar.addMenu('Options')

        self.options_ssada = QAction('Autoload ssada', self)
        self.options_ssada.setStatusTip(
            'Whether or not to load SSADA when loading FOCT.')
        self.options_ssada.setCheckable(True)
        self.options_ssada.setChecked(False)

        self.options_seg = QAction('Autoload seg', self)
        self.options_seg.setStatusTip(
            'Whether or not to load segment when loading FOCT.')
        self.options_seg.setCheckable(True)
        self.options_seg.setChecked(True)

        options_save_gif = QAction('Save gif', self)
        options_save_gif.setStatusTip(
            'Save a gif of the OCTA optionally with segment data.')
        options_save_gif.triggered.connect(self.central_widget.save_gif)
        options_save_gif.setShortcut('CTRL+S')

        self.menu_options.addAction(self.options_ssada)
        self.menu_options.addAction(self.options_seg)
        self.menu_options.addAction(options_save_gif)

    def help_menu(self):
        """Create a help submenu with an About item that opens an about dialog."""
        self.help_sub_menu = self.menu_bar.addMenu('Help')

        self.about_action = QAction('About', self)
        self.about_action.setStatusTip('About the application.')
        # self.about_action.setShortcut('CTRL+H')
        self.about_action.triggered.connect(lambda: self.about_dialog.exec_())

        self.help_sub_menu.addAction(self.about_action)

    def tool_bar_items(self):
        """Create a tool bar for the main window."""
        self.tool_bar = QToolBar()
        self.addToolBar(Qt.TopToolBarArea, self.tool_bar)
        self.tool_bar.setMovable(False)

        open_icon = pkg_resources.resource_filename(
            'foct_viewer.images', 'ic_open_in_new_black_48dp_1x.png')
        tool_bar_open_action = QAction(QIcon(open_icon), 'Open File', self)
        tool_bar_open_action.triggered.connect(self.on_file_open)

        self.tool_bar.addAction(tool_bar_open_action)

    def on_file_open(self):
        """Open a QFileDialog to allow the user to open a file into the application."""
        filename, accepted = QFileDialog.getOpenFileName(self, 'Open File',
                                                         filter='Optovue (*.foct);;'\
                                                                'All files (*)')

        if accepted:
            filename = Path(filename)
            self.central_widget.open_oct(filename)

    def on_file_open_seg(self):
        """Open a QFileDialog to allow the user to open a file into the application."""
        filename, accepted = QFileDialog.getOpenFileName(self, 'Open File',
                                                         filter='Segment (*.mat);;'\
                                                                'All files (*)')

        if accepted:
            filename = Path(filename)
            self.central_widget.open_seg(filename)

    def on_file_open_second_seg(self):
        """Open a QFileDialog to allow the user to open a file into the application."""
        filename, accepted = QFileDialog.getOpenFileName(self, 'Open File',
                                                         filter='Segment (*.mat);;'\
                                                                'All files (*)')

        if accepted:
            filename = Path(filename)
            self.central_widget.open_second_seg(filename)

    def show_traceback(self, type, value, traceback):
        """
        Formatting error dialog
        """
        self.error_dialog.showMessage('<br><br>'.join(
            tb.format_exception(*(type, value, traceback))))