示例#1
0
文件: main_gui.py 项目: pcbre/pcbre
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))