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))))