Exemple #1
0
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Pathfinding Algorithm Visualizer")
        self.layout = QVBoxLayout()

        columns = 40
        rows = 30
        self.graph = WeightedGraph(columns, rows)
        self.grid_ui = GridUI(self.graph, columns, rows)
        self.grid_ui.setContentsMargins(0, 0, 0, 0)
        self.grid_ui.setStyleSheet('background-color: white;')

        self.buttons_layout = QHBoxLayout()
        self.start_button = QPushButton('Start')
        self.reset_button = QPushButton('Reset grid')
        self.path_button = QPushButton('Clear path')
        self.change_button = QPushButton('Change parameters')
        self.buttons_layout.addWidget(self.start_button)
        self.buttons_layout.addWidget(self.reset_button)
        self.buttons_layout.addWidget(self.path_button)
        self.buttons_layout.addWidget(self.change_button)
        self.layout.addWidget(self.grid_ui)
        self.layout.addLayout(self.buttons_layout)
        self.widget = QWidget()
        self.widget.setLayout(self.layout)
        self.setCentralWidget(self.widget)

        self.reset_button.clicked.connect(self.clear_grid)
        self.change_button.clicked.connect(self.show_parameter_popup)
        self.start_button.clicked.connect(self.generate_path)
        self.path_button.clicked.connect(self.clear_path)

        self.parameters = ParametersPopup()
        self.parameters.buttonBox.accepted.connect(
            self.update_graph_with_parameters)

        self.ui_thread = QThread()
        self.ui_thread.start()
        self.ui_QObj = UIQObj()
        self.ui_QObj.moveToThread(self.ui_thread)
        self.ui_QObj.update.connect(self.handle_ui_update)
        self.ui_QObj.start.connect(self.ui_QObj.run)
        self.ui_QObj.start.emit()

        self.path_thread = QThread()
        self.path_thread.start()
        self.path_QObj = PathQObj()
        self.path_QObj.moveToThread(self.path_thread)
        self.path_QObj.start.connect(self.path_QObj.run)

    def closeEvent(self, event) -> None:
        sys.exit()

    def clear_grid(self) -> None:
        self.graph.clear_terrain_nodes()
        self.clear_path()

    def clear_path(self) -> None:
        self.graph.clear_path_nodes()
        self.graph.clear_frontier_nodes()

    def show_parameter_popup(self) -> None:
        self.parameters.raise_()
        self.parameters.show()

    def update_graph_with_parameters(self) -> None:
        start_row = self.parameters.start_row
        start_col = self.parameters.start_col
        end_row = self.parameters.end_row
        end_col = self.parameters.end_col
        self.graph.startpoint_node = Node(start_col, start_row)
        self.graph.endpoint_node = Node(end_col, end_row)
        self.graph.desert_weight = self.parameters.desert_weight
        self.graph.forest_weight = self.parameters.forest_weight
        self.graph.visualize_algorithm = self.parameters.visualize_checkBox.isChecked(
        )

    def generate_path(self) -> None:
        start = self.graph.startpoint_node
        end = self.graph.endpoint_node
        option = "b"
        if self.parameters.a_star_radio.isChecked():
            option = "a"
        elif self.parameters.dijkstra_radio.isChecked():
            option = "d"

        self.path_QObj.start.emit(self.graph, option, start, end)

    @pyqtSlot()
    def handle_ui_update(self):
        self.grid_ui.update()