示例#1
0
class TopPanel(QFrame):
    def __init__(self, maze_widget=None):
        super().__init__()
        self.setMaximumHeight(150)

        self._manager = Manager()
        self._maze_widget = maze_widget

        layout = QHBoxLayout()
        layout.setContentsMargins(20, 20, 20, 20)

        self.add_algorithm_group(layout)
        self.add_mode_group(layout)
        self.add_width_heigth_fields(layout)
        self.add_generate_button(layout)

        self.setLayout(layout)

    def generate_new_maze(self):
        try:
            height = int(self._height_field.text())
            width = int(self._width_field.text())
        except ValueError:
            return

        if height <= 0 or width <= 0:
            return

        self._maze_widget.update_labyrinth(
            self._manager.generate_new_maze(height, width))

    # Method for adding subwidgets in layout
    def add_algorithm_group(self, layout):
        self._DFS_radio = QRadioButton("DFS")
        self._prim_radio = QRadioButton("Prim")
        self._DFS_radio.setChecked(True)
        self._DFS_radio.clicked.connect(
            lambda f: self._manager.set_generator(DFSGenerator()))
        self._prim_radio.clicked.connect(
            lambda f: self._manager.set_generator(PrimGenerator()))

        self._algorithm_group = QGroupBox("Choose algorithm")
        group_layout = QVBoxLayout()
        group_layout.addWidget(self._DFS_radio)
        group_layout.addWidget(self._prim_radio)
        self._algorithm_group.setLayout(group_layout)

        layout.addStretch()
        layout.addWidget(self._algorithm_group)
        layout.addStretch()

    # Method for adding subwidgets in layout
    def add_mode_group(self, layout):
        self._auto_radio = QRadioButton("Auto solve")
        self._manual_radio = QRadioButton("Manual")
        self._auto_radio.setChecked(True)
        self._auto_radio.clicked.connect(lambda f: self._maze_widget.set_mode(
            MazeWidget.WorkMode.AUTO_SOLVE))
        self._manual_radio.clicked.connect(
            lambda f: self._maze_widget.set_mode(MazeWidget.WorkMode.
                                                 MANUAL_SOLVE))

        self._mode_group = QGroupBox("Mode")
        group_layout = QVBoxLayout()
        group_layout.addWidget(self._auto_radio)
        group_layout.addWidget(self._manual_radio)
        self._mode_group.setLayout(group_layout)

        layout.addStretch()
        layout.addWidget(self._mode_group)
        layout.addStretch()

    # Method for adding subwidgets in layout
    def add_width_heigth_fields(self, layout):
        layout.addStretch()
        inner_layout = QGridLayout()
        self._width_label = QLabel("Width")
        self._height_label = QLabel("Height")
        self._width_field = QLineEdit()
        self._height_field = QLineEdit()

        inner_layout.addWidget(self._width_label, 0, 0, 1, 1)
        inner_layout.addWidget(self._width_field, 0, 1, 1, 1)
        inner_layout.addWidget(self._height_label, 1, 0, 1, 1)
        inner_layout.addWidget(self._height_field, 1, 1, 1, 1)

        layout.addLayout(inner_layout)

    # Method for adding subwidgets in layout
    def add_generate_button(self, layout):
        layout.addStretch()
        layout.addStretch()

        self._generate_button = QPushButton("Generate!")
        self._generate_button.clicked.connect(
            lambda f: self.generate_new_maze())

        layout.addWidget(self._generate_button)
        layout.addStretch()