diff --git a/activity_browser/app/ui/main.py b/activity_browser/app/ui/main.py index e91422bdd..75031b6ee 100644 --- a/activity_browser/app/ui/main.py +++ b/activity_browser/app/ui/main.py @@ -9,7 +9,6 @@ from .panels import LeftPanel, RightPanel from .statusbar import Statusbar from .utils import StdRedirector -from ..signals import signals class MainWindow(QtWidgets.QMainWindow): @@ -83,7 +82,9 @@ def __init__(self): # Layout: extra items outside main layout self.menu_bar = MenuBar(self) - self.statusbar = Statusbar(self) + self.setMenuBar(self.menu_bar) + self.status_bar = Statusbar(self) + self.setStatusBar(self.status_bar) self.connect_signals() diff --git a/activity_browser/app/ui/menu_bar.py b/activity_browser/app/ui/menu_bar.py index 3d2a312a4..45776423b 100644 --- a/activity_browser/app/ui/menu_bar.py +++ b/activity_browser/app/ui/menu_bar.py @@ -1,6 +1,4 @@ # -*- coding: utf-8 -*- -import json - import brightway2 as bw from PySide2 import QtCore, QtWidgets, QtGui @@ -11,29 +9,40 @@ from .wizards.settings_wizard import SettingsWizard from .wizards.db_export_wizard import DatabaseExportWizard -# TODO: Revise this entire class by subclassing QMenuBar - -class MenuBar(object): +class MenuBar(QtWidgets.QMenuBar): def __init__(self, window): + super().__init__(parent=window) self.window = window + self.settings_wizard = None + self.export_wizard = None + self.biosphere_updater = None + self.file_menu = QtWidgets.QMenu('&File', self.window) + self.view_menu = QtWidgets.QMenu('&View', self.window) + self.windows_menu = QtWidgets.QMenu('&Windows', self.window) + self.help_menu = QtWidgets.QMenu('&Help', self.window) + self.update_biosphere_action = QtWidgets.QAction( window.style().standardIcon(QtWidgets.QStyle.SP_BrowserReload), "&Update biosphere...", None ) - self.biosphere_updater = None + self.export_db_action = QtWidgets.QAction( + self.window.style().standardIcon(QtWidgets.QStyle.SP_DriveHDIcon), + "&Export database...", None + ) self.import_db_action = QtWidgets.QAction( qicons.import_db, '&Import database...', None ) - self.menubar = QtWidgets.QMenuBar() - self.menubar.addMenu(self.setup_file_menu()) - # self.menubar.addMenu(self.setup_tools_menu()) - # self.menubar.addMenu(self.setup_extensions_menu()) - self.menubar.addMenu(self.setup_view_menu()) - self.menubar.addMenu(self.setup_windows_menu()) - self.menubar.addMenu(self.setup_help_menu()) - window.setMenuBar(self.menubar) + self.addMenu(self.file_menu) + self.addMenu(self.view_menu) + self.addMenu(self.windows_menu) + self.addMenu(self.help_menu) + + self.setup_file_menu() + self.setup_view_menu() + self.update_windows_menu() + self.setup_help_menu() self.connect_signals() def connect_signals(self): @@ -41,52 +50,40 @@ def connect_signals(self): signals.project_selected.connect(self.biosphere_exists) signals.databases_changed.connect(self.biosphere_exists) self.update_biosphere_action.triggered.connect(self.update_biosphere) + self.export_db_action.triggered.connect(self.transfer_database_wizard) self.import_db_action.triggered.connect(lambda: signals.import_database.emit(self.window)) - # FILE - def setup_file_menu(self): - menu = QtWidgets.QMenu('&File', self.window) - menu.addAction(self.import_db_action) - menu.addAction( - self.window.style().standardIcon(QtWidgets.QStyle.SP_DriveHDIcon), - "&Export database...", - self.transfer_database_wizard - ) - menu.addAction(self.update_biosphere_action) - menu.addAction( + def setup_file_menu(self) -> None: + """Build the menu for specific importing/export/updating actions.""" + self.file_menu.addAction(self.import_db_action) + self.file_menu.addAction(self.export_db_action) + self.file_menu.addAction(self.update_biosphere_action) + self.file_menu.addAction( qicons.settings, '&Settings...', self.open_settings_wizard ) - return menu - # VIEW - def setup_view_menu(self): - view_menu = QtWidgets.QMenu('&View', self.window) - view_menu.addAction( + def setup_view_menu(self) -> None: + """Build the menu for viewing or hiding specific tabs""" + self.view_menu.addAction( qicons.graph_explorer, '&Graph Explorer', lambda x="Graph Explorer": signals.toggle_show_or_hide_tab.emit(x) ) - view_menu.addAction( + self.view_menu.addAction( qicons.history, '&Activity History', lambda x="History": signals.toggle_show_or_hide_tab.emit(x) ) - view_menu.addAction( + self.view_menu.addAction( qicons.welcome, '&Welcome screen', lambda x="Welcome": signals.toggle_show_or_hide_tab.emit(x) ) - return view_menu - - # WINDOWS - def setup_windows_menu(self): - self.windows_menu = QtWidgets.QMenu('&Windows', self.window) - self.update_windows_menu() - return self.windows_menu def update_windows_menu(self): + """Clear and rebuild the menu for switching between tabs.""" self.windows_menu.clear() for index in range(self.window.stacked.count()): # iterate over widgets in QStackedWidget widget = self.window.stacked.widget(index) @@ -96,25 +93,22 @@ def update_windows_menu(self): lambda widget=widget: self.window.stacked.setCurrentWidget(widget), ) - # HELP - def setup_help_menu(self): - help_menu = QtWidgets.QMenu('&Help', self.window) - help_menu.addAction( + def setup_help_menu(self) -> None: + """Build the help menu for the menubar.""" + self.help_menu.addAction( self.window.icon, '&About Activity Browser', self.about) - help_menu.addAction( + self.help_menu.addAction( '&About Qt', lambda: QtWidgets.QMessageBox.aboutQt(self.window) ) - help_menu.addAction( + self.help_menu.addAction( qicons.issue, '&Report an idea/issue on GitHub', self.raise_issue_github ) - return help_menu - def about(self): text = """ Activity Browser - a graphical interface for Brightway2.

@@ -144,13 +138,13 @@ def about(self): def raise_issue_github(self): url = QtCore.QUrl('https://github.com/LCA-ActivityBrowser/activity-browser/issues/new') - QtGui.QDesktopServices.openUrl(url) + QtGui.QDesktopServices.openUrl(url=url) def open_settings_wizard(self): - self.settings_wizard = SettingsWizard() + self.settings_wizard = SettingsWizard(self.window) def transfer_database_wizard(self) -> None: - wizard = DatabaseExportWizard() + self.export_wizard = DatabaseExportWizard(self.window) def biosphere_exists(self) -> None: """ Test if the default biosphere exists as a database in the project @@ -166,8 +160,8 @@ def update_biosphere(self): ok = QtWidgets.QMessageBox.question( self.window, "Update biosphere3?", "Updating the biosphere3 database cannot be undone!", - buttons=QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Abort, - defaultButton=QtWidgets.QMessageBox.Abort + QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Abort, + QtWidgets.QMessageBox.Abort ) if ok == QtWidgets.QMessageBox.Ok: - self.biosphere_updater = BiosphereUpdater() + self.biosphere_updater = BiosphereUpdater(self.window) diff --git a/activity_browser/app/ui/statusbar.py b/activity_browser/app/ui/statusbar.py index b0b0196c6..1b1ae3823 100644 --- a/activity_browser/app/ui/statusbar.py +++ b/activity_browser/app/ui/statusbar.py @@ -1,24 +1,22 @@ # -*- coding: utf-8 -*- -from PySide2 import QtWidgets +from PySide2.QtCore import Slot +from PySide2.QtWidgets import QLabel, QStatusBar -from brightway2 import projects +import brightway2 as bw from ..signals import signals -class Statusbar(object): +class Statusbar(QStatusBar): def __init__(self, window): - self.window = window - self.statusbar = QtWidgets.QStatusBar() - self.window.setStatusBar(self.statusbar) + super().__init__(parent=window) + self.status_message_left = QLabel('Welcome') + self.status_message_right = QLabel('Database') + self.status_message_center = QLabel('Project') - self.status_message_left = QtWidgets.QLabel('Welcome') - self.status_message_right = QtWidgets.QLabel('Database') - self.status_message_center = QtWidgets.QLabel('Project') - - self.statusbar.addWidget(self.status_message_left, 1) - self.statusbar.addWidget(self.status_message_center, 2) - self.statusbar.addWidget(self.status_message_right, 0) + self.addWidget(self.status_message_left, 1) + self.addWidget(self.status_message_center, 2) + self.addWidget(self.status_message_right, 0) self.connect_signals() @@ -27,21 +25,26 @@ def connect_signals(self): signals.project_selected.connect(self.update_project) signals.database_selected.connect(self.set_database) - def left(self, message): + @Slot(str, name="statusLeft") + def left(self, message: str) -> None: print(message) # for console output if isinstance(message, str): self.status_message_left.setText(message) + @Slot(str, name="statusCenter") def center(self, message): self.status_message_center.setText(message) + @Slot(str, name="statusRight") def right(self, message): self.status_message_right.setText(message) + @Slot(name="updateProjectStatus") def update_project(self): - name = projects.current + name = bw.projects.current self.center("Project: {}".format(name)) self.right("Database: None") + @Slot(str, name="setDatabaseName") def set_database(self, name): self.right("Database: {}".format(name)) diff --git a/activity_browser/app/ui/widgets/biosphere_update.py b/activity_browser/app/ui/widgets/biosphere_update.py index e2f39121f..841e171d3 100644 --- a/activity_browser/app/ui/widgets/biosphere_update.py +++ b/activity_browser/app/ui/widgets/biosphere_update.py @@ -12,8 +12,8 @@ class BiosphereUpdater(QtWidgets.QProgressDialog): - def __init__(self): - super().__init__() + def __init__(self, parent=None): + super().__init__(parent=parent) self.setWindowTitle("Updating '{}' database".format(bw.config.biosphere)) self.setLabelText("Adding new flows to biosphere database") self.setRange(0, 0)