def addFileToolBar(self): """Create toolbar to house file actions""" tb = QToolBar() tb.setWindowTitle("File Actions") tb.addActions([ self.openAction, self.saveAction, self.closeAction, ]) self.addToolBar(tb)
def __init__(self): super().__init__() widget = QWidget() self.setCentralWidget(widget) file_icons = { "file" : "icons/file.svg", "folder" : "icons/folder.svg", "save" : "icons/save.svg", "search" : "icons/search.svg", } contact_icons = { "facebook" : "icons/facebook.svg", "instagram" : "icons/instagram.svg", "twitter" : "icons/twitter.svg", "mail" : "icons/mail.svg", "phone" : "icons/phone.svg", } file_actions = [QAction(QIcon(src), label, self) for label, src in file_icons.items()] contact_actions = [QAction(QIcon(src), label, self) for label, src in contact_icons.items()] menubar = self.menuBar() file_menu = menubar.addMenu("File") file_menu.addActions(file_actions) contact_menu = menubar.addMenu("Contact") contact_menu.addActions(contact_actions) file_toolbar = QToolBar("File") file_toolbar.addActions(file_actions) self.addToolBar(file_toolbar) contact_toolbar = QToolBar("Contact") contact_toolbar.addActions(contact_actions) self.addToolBar(contact_toolbar) self.insertToolBarBreak(contact_toolbar)
class Ui_FE14CharacterEditor(QMainWindow): def __init__(self, parent=None): super().__init__(parent) self.search_bar = QLineEdit() self.search_bar.setPlaceholderText("Search...") self.search_bar.setFixedWidth(225) self.characters_list_view = QListView() self.characters_list_view.setContextMenuPolicy( QtCore.Qt.CustomContextMenu) self.characters_list_view.setFixedWidth(225) self.characters_list_layout = QVBoxLayout() self.characters_list_layout.addWidget(self.search_bar) self.characters_list_layout.addWidget(self.characters_list_view) self.character_details_box = QGroupBox(title="Character Details") self.portrait_display = QGraphicsView() self.portrait_display.setFixedSize(140, 140) self.character_details_form_contents_1 = QWidget() self.character_details_form_contents_2 = QWidget() self.character_details_layout = QHBoxLayout() self.character_details_layout.addWidget(self.portrait_display) self.character_details_layout.addWidget( self.character_details_form_contents_1) self.character_details_layout.addWidget( self.character_details_form_contents_2) self.character_details_box.setLayout(self.character_details_layout) self.character_details_box.setFixedHeight(200) self.tab_widget = QTabWidget() self.ids_tab = QWidget() self.classes_tab = QWidget() self.stats_tab = QScrollArea() self.skills_tab = QScrollArea() self.misc_tab = QScrollArea() self.portraits_tab = PortraitViewer() self.stats_contents = QWidget() self.stats_tab.setWidget(self.stats_contents) self.stats_tab.setWidgetResizable(True) self.stats_layout = QVBoxLayout() self.stats_layout.setAlignment(QtCore.Qt.AlignTop) self.stats_contents.setLayout(self.stats_layout) self.skills_contents = QWidget() self.skills_tab.setWidget(self.skills_contents) self.skills_tab.setWidgetResizable(True) self.misc_contents = QWidget() self.misc_tab.setWidget(self.misc_contents) self.misc_tab.setWidgetResizable(True) self.misc_layout = QVBoxLayout() self.misc_layout.setAlignment(QtCore.Qt.AlignTop) self.misc_contents.setLayout(self.misc_layout) self.tab_widget.addTab(self.ids_tab, "IDs") self.tab_widget.addTab(self.classes_tab, "Classes") self.tab_widget.addTab(self.stats_tab, "Stats") self.tab_widget.addTab(self.skills_tab, "Skills") self.tab_widget.addTab(self.misc_tab, "Misc.") self.tab_widget.addTab(self.portraits_tab, "Portraits") self.editor_layout = QVBoxLayout() self.editor_layout.addWidget(self.character_details_box) self.editor_layout.addWidget(self.tab_widget) self.main_layout = QHBoxLayout() self.main_layout.addLayout(self.characters_list_layout) self.visual_splitter = QFrame() self.visual_splitter.setFrameShape(QFrame.VLine) self.visual_splitter.setFrameShadow(QFrame.Sunken) self.main_layout.addWidget(self.visual_splitter) self.main_layout.addLayout(self.editor_layout) self.tool_bar = QToolBar() self.action_add = QAction(text="Add") self.action_remove = QAction(text="Remove") self.action_copy_to = QAction(text="Copy To") self.tool_bar.addActions( [self.action_add, self.action_remove, self.action_copy_to]) self.addToolBar(self.tool_bar) self.resize(1000, 600) central_widget = QWidget() central_widget.setLayout(self.main_layout) self.setWindowTitle("Character Editor") self.setWindowIcon(QIcon("paragon.ico")) self.setCentralWidget(central_widget)
class MainWindow(QMainWindow): def __init__(self, app: QApplication): super().__init__() self.current_file = None self.console_dock: QDockWidget = None self.tools_dock: QDockWidget = None self.toolbar: QToolBar = None self.graph_widget: GraphWidget = None self.log_console_widget: LogConsoleWidget = None self.tools_widget: ToolsWidget = None self.file_menu: QMenu = None self.help_menu: QMenu = None self.view_menu: QMenu = None self.docks_menu: QMenu = None self.about_action: QAction = None self.new_action: QAction = None self.open_action: QAction = None self.save_action: QAction = None self.save_as_action: QAction = None self.exit_action: QAction = None self.toggle_tools_dock: QAction = None self.toggle_console_dock: QAction = None self.create_actions(app) self.create_widgets() self.create_docks() self.create_menus() self.create_toolbar() self.create_statusbar() self.setCentralWidget(self.graph_widget) self.addDockWidget(Qt.BottomDockWidgetArea, self.console_dock) self.addDockWidget(Qt.RightDockWidgetArea, self.tools_dock) self.addToolBar(self.toolbar) self.setWindowTitle(self.tr("Proofy")) self.read_settings() def create_statusbar(self): self.statusBar().showMessage(self.tr("Welcome to Proofy!")) def create_docks(self): self.console_dock = QDockWidget(self.tr("Console")) self.console_dock.setWidget(self.log_console_widget) self.tools_dock = QDockWidget(self.tr("Tools")) self.tools_dock.setWidget(self.tools_widget) def create_toolbar(self): self.toolbar = QToolBar(self.tr("Tools"), self) self.toolbar.setStatusTip(self.tr("Tools")) self.toolbar.addActions([ self.new_action, self.open_action, self.save_action, self.save_as_action, self.exit_action, ]) self.toolbar.addSeparator() self.toolbar.addAction(self.about_action) def create_widgets(self): self.log_console_widget = LogConsoleWidget() self.log_console_widget.add_loggers(logger) self.graph_widget = GraphWidget(self.log_console_widget) self.tools_widget = ToolsWidget(graph_widget=self.graph_widget) def create_menus(self): self.file_menu = self.menuBar().addMenu("File") self.file_menu.setStatusTip(self.tr("File operations")) self.file_menu.addActions([ self.new_action, self.open_action, self.save_action, self.save_as_action, self.exit_action, ]) self.view_menu = self.menuBar().addMenu("View") self.view_menu.setStatusTip(self.tr("View settings")) self.docks_menu = self.view_menu.addMenu("Docks") self.docks_menu.addAction(self.toggle_tools_dock) self.docks_menu.addAction(self.toggle_console_dock) self.help_menu = self.menuBar().addMenu("Help") self.help_menu.setStatusTip(self.tr("Help")) self.help_menu.addAction(self.about_action) def create_actions(self, app): self.about_action = QAction( app.style().standardIcon( QtWidgets.QStyle.SP_MessageBoxInformation), "About", self, ) self.about_action.setStatusTip("Show information about Proofy") self.about_action.triggered.connect(self.about) self.new_action = QAction( app.style().standardIcon(QtWidgets.QStyle.SP_FileIcon), "New...", self) self.new_action.setStatusTip(self.tr("Create a new file")) self.new_action.setShortcuts(QKeySequence.New) self.new_action.triggered.connect(self.new) self.open_action = QAction( app.style().standardIcon(QtWidgets.QStyle.SP_DialogOpenButton), "Open...", self, ) self.open_action.setStatusTip(self.tr("Open file")) self.open_action.setShortcuts(QKeySequence.Open) self.open_action.triggered.connect(self.open) self.save_action = QAction( app.style().standardIcon(QtWidgets.QStyle.SP_DialogSaveButton), "Save...", self, ) self.save_action.setStatusTip(self.tr("Save file")) self.save_action.setShortcuts(QKeySequence.Save) self.save_action.triggered.connect(self.save) self.save_as_action = QAction( app.style().standardIcon(QtWidgets.QStyle.SP_DriveFDIcon), "Save As...", self, ) self.save_as_action.setStatusTip(self.tr("Save to file")) self.save_as_action.setShortcuts(QKeySequence.SaveAs) self.save_as_action.triggered.connect(self.save_as) self.exit_action = QAction( app.style().standardIcon(QtWidgets.QStyle.SP_DialogCloseButton), "Exit", self, ) self.exit_action.setStatusTip(self.tr("Exit Proofy")) self.exit_action.setShortcuts(QKeySequence.Quit) self.exit_action.triggered.connect(self.exit) self.toggle_console_dock = QAction("Toggle Console Dock", self) self.toggle_console_dock.setStatusTip( "Toggle visibility of the console dock") self.toggle_console_dock.triggered.connect( lambda _: self.console_dock.setVisible(not self.console_dock. isVisible())) self.toggle_tools_dock = QAction("Toggle Tools Dock", self) self.toggle_tools_dock.setStatusTip( "Toggle visibility of the tools dock") self.toggle_tools_dock.triggered.connect( lambda _: self.tools_dock.setVisible(not self.tools_dock.isVisible( ))) @Slot() def about(self): logger.debug(locals()) QMessageBox.about( self, "About Proofy", self.tr(f""" <h1>Proofy {__version__}</h1> <p> <b>Proofy is a formal proof system GUI.</b> </p> <p> Oh, it looks like Proofy wants to talk! <blockquote>Proofy likes Sequent Calculus! And circles! And edges! And arrows! And ...</blockquote> </p> """), ) def closeEvent(self, event: QCloseEvent): logger.debug(locals()) if self.unsaved_check(): self.write_settings() event.accept() else: event.ignore() @Slot() def exit(self): logger.debug(locals()) if self.unsaved_check(): QApplication.quit() @Slot() def new(self): logger.debug(locals()) if self.unsaved_check(): self.current_file = None def set_file_status(self, *, modified: bool): if self.current_file: file = pathlib.Path(self.current_file[0]) self.setWindowTitle(f"{file.name}[*] [{file}] - Proofy") self.setWindowModified(modified) else: self.setWindowTitle(f"Proofy[*]") self.setWindowModified(modified) @Slot() def open(self): logger.debug(locals()) if self.unsaved_check(): if (path := QFileDialog.getOpenFileName( self, caption=self.tr("Open File"), filter=self.graph_widget.get_open_file_extensions(), )): try: QApplication.setOverrideCursor(Qt.WaitCursor) self.graph_widget.open_file(*path) self.statusBar().showMessage(f"Opened {path} successfully") self.current_file = path self.set_file_status(modified=False) except Exception as e: logger.error(e) finally: QApplication.restoreOverrideCursor()
class Ui_FE14MapEditor(QMainWindow): def __init__(self, parent=None): super().__init__(parent) self.toolbar = QToolBar() self.toggle_coordinate_type_action = QAction("Toggle Coordinate Type") self.refresh_action = QAction("Refresh") self.refresh_action.setShortcut(QKeySequence("Ctrl+R")) self.copy_spawn_action = QAction("Copy Spawn") self.copy_spawn_action.setShortcut(QKeySequence("Ctrl+C")) self.paste_spawn_action = QAction("Paste Spawn") self.paste_spawn_action.setShortcut(QKeySequence("Ctrl+V")) self.add_spawn_action = QAction("Add Spawn") self.delete_spawn_action = QAction("Delete Spawn") self.add_group_action = QAction("Add Group") self.delete_group_action = QAction("Delete Group") self.add_tile_action = QAction("Add Tile") self.toggle_mode_action = QAction("Toggle Mode") self.undo_action = QAction("Undo") self.undo_action.setShortcut(QKeySequence("Ctrl+Z")) self.redo_action = QAction("Redo") self.redo_action.setShortcut(QKeySequence("Ctrl+Shift+Z")) self.toolbar.addActions( [self.toggle_coordinate_type_action, self.refresh_action]) self.toolbar.addSeparator() self.toolbar.addActions([ self.copy_spawn_action, self.paste_spawn_action, self.add_spawn_action, self.delete_spawn_action, self.add_group_action, self.delete_group_action ]) self.toolbar.addSeparator() self.toolbar.addAction(self.add_tile_action) self.toolbar.addSeparator() self.toolbar.addAction(self.toggle_mode_action) self.toolbar.addSeparator() self.toolbar.addActions([self.undo_action, self.redo_action]) self.addToolBar(self.toolbar) self.model_view = QTreeView() self.model_view.setHeaderHidden(True) self.grid = FE14MapGrid() self.grid_scroll = QScrollArea() self.grid_scroll.setWidgetResizable(True) self.grid_scroll.setWidget(self.grid) self.tile_list = QListView() self.terrain_pane = FE14TerrainEditorPane() self.spawn_pane = FE14SpawnEditorPane() self.model_view.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.model_view_context_menu = QMenu() self.model_view_context_menu.addActions( [self.toggle_coordinate_type_action, self.refresh_action]) self.model_view_context_menu.addSeparator() self.model_view_context_menu.addActions([ self.copy_spawn_action, self.paste_spawn_action, self.add_spawn_action, self.delete_spawn_action, self.add_group_action, self.delete_group_action ]) self.model_view_context_menu.addSeparator() self.model_view_context_menu.addAction(self.add_tile_action) self.model_view_context_menu.addSeparator() self.model_view_context_menu.addAction(self.toggle_mode_action) self.model_view_context_menu.addSeparator() self.model_view_context_menu.addActions( [self.undo_action, self.redo_action]) self.status_bar = QStatusBar() self.coordinate_type_label = QLabel() self.status_bar.addPermanentWidget(self.coordinate_type_label) self.setStatusBar(self.status_bar) self.main_widget = QSplitter() self.main_widget.setOrientation(QtCore.Qt.Horizontal) self.main_widget.addWidget(self.model_view) self.main_widget.addWidget(self.grid_scroll) self.main_widget.addWidget(self.spawn_pane) self.main_widget.addWidget(self.terrain_pane) self.setCentralWidget(self.main_widget)