class MainWindow(QtWidgets.QMainWindow): # Emitted when something changes the currently selected layer def __init__(self, p: Project) -> None: super(MainWindow, self).__init__() self.project: Project = p self.viewArea = BoardViewWidget(self.project) self.installEventFilter(self.viewArea) self.undo_stack = QtWidgets.QUndoStack() self.undo_stack.indexChanged.connect(self.viewArea.update) self.pcbre_actions = MainWindowActions(self) self.debug_actions = DebugActions(self) self.setCentralWidget(self.viewArea) self.createToolbars() self.createMenubar() self.createDockWidgets() self.setWindowTitle("PCB Reversing Suite") self.current_tool: Optional[BaseTool] = None self.current_controller: Optional[BaseToolController] = None @QtCore.Slot(object) def changeViewLayer(self, layer: Layer) -> None: """Change the selected view layer""" assert layer in self.project.stackup.layers self.viewArea.boardViewState.current_layer = layer def submitCommand(self, cmd: QtWidgets.QUndoCommand) -> None: self.undo_stack.push(cmd) def toolBarChanged(self, bid: int) -> None: self.current_tool = self.tool_map[bid] controller = self.current_tool.getToolController( self.viewArea, self.submitCommand) self.current_controller = controller self.viewArea.setInteractionDelegate(controller) self.viewArea.setFocus() def createToolbars(self) -> None: self.createViewToolbar() self.bg = QtWidgets.QButtonGroup() self.bg.setExclusive(True) self.bg.buttonClicked.connect(self.toolBarChanged) toolbar = self.addToolBar("Tool Selection") self.tool_map: Dict[int, BaseTool] = {} self.current_tool = None for n, tt in enumerate(TOOLS): tool = tt(self.project) toolbutton = tool.getToolButton() self.tool_map[toolbutton] = tool self.bg.addButton(toolbutton) toolbar.addWidget(toolbutton) toolbutton.setCheckable(True) if n == 0: toolbutton.setChecked(True) self.toolBarChanged(toolbutton) def createDockWidgets(self) -> None: # TODO: make this modular, remember view state dock = LayerListWidget(self, self.project, self.viewArea.boardViewState) # dock.hide() self.addDockWidget(QtCore.Qt.RightDockWidgetArea, dock) self._view_menu.subWindowMenu.addAction(dock.toggleViewAction()) dock = ConsoleWidget(self.project) dock.hide() self.addDockWidget(QtCore.Qt.BottomDockWidgetArea, dock) self._view_menu.subWindowMenu.addAction(dock.toggleViewAction()) dock = UndoDock(self.undo_stack) # dock.hide() self.addDockWidget(QtCore.Qt.RightDockWidgetArea, dock) self._view_menu.subWindowMenu.addAction(dock.toggleViewAction()) dock = InfoWidget(self.project) dock.hide() self.addDockWidget(QtCore.Qt.RightDockWidgetArea, dock) self._view_menu.subWindowMenu.addAction(dock.toggleViewAction()) def createViewToolbar(self) -> None: tb = self.addToolBar("View") tb.addAction(self.pcbre_actions.view_flip_x) tb.addAction(self.pcbre_actions.view_flip_y) tb.addAction(self.pcbre_actions.view_rotate_l) tb.addAction(self.pcbre_actions.view_rotate_r) tb.addAction(self.pcbre_actions.view_cycle_draw_order) def closeEvent(self, evt: QtCore.QEvent) -> None: if checkCloseSave(self): evt.accept() else: evt.ignore() def createMenubar(self) -> None: from pcbre.ui.menu.file import FileMenu from pcbre.ui.menu.edit import EditMenu from pcbre.ui.menu.view import ViewMenu from pcbre.ui.menu.pcb import PCBMenu from pcbre.ui.menu.debug import DebugMenu self.menuBar().addMenu(FileMenu(self)) self.menuBar().addMenu(EditMenu(self)) self._view_menu = ViewMenu(self) self.menuBar().addMenu(self._view_menu) self.menuBar().addMenu(PCBMenu(self)) # TODO: Only show menu if started in debug mode self.menuBar().addMenu(DebugMenu(self))