class Load_Dialog(QDialog):
    def __init__(self, parent):
        super().__init__(parent)
        self.setWindowTitle('Cargar Fichero')
        self.dlg_v_layout = QVBoxLayout()
        form_layout = QFormLayout()
        self.load_file = QLineEdit()
        self.error_label = QLabel()
        form_layout.addRow('Ruta del archivo:', self.load_file)
        self.dlg_v_layout.addLayout(form_layout)
        self.dlg_v_layout.addWidget(self.error_label)
        buttons_h_layout = QHBoxLayout()
        button_cancel = QPushButton('Cancelar')
        self.button_ok = QPushButton('Aceptar')
        buttons_h_layout.addWidget(button_cancel)
        buttons_h_layout.addWidget(self.button_ok)
        self.dlg_v_layout.addLayout(buttons_h_layout)
        self.setLayout(self.dlg_v_layout)
        button_cancel.clicked.connect(self._clear)
        button_cancel.clicked.connect(self.close)
        self.button_ok.clicked.connect(self._load)

    def _load_file_dialog(self):
        dlg = Load_Dialog(self._view)
        dlg.exec()
        self.file = dlg.file_path_dialog
        try:
            if len(self.file) > 0:
                self.text_load_file = self._Model.load_file(self.file)
                self._view.set_display_text(
                    self.file, self.text_load_file[0], self.text_load_file[1],
                    self.text_load_file[2], self.text_load_file[3],
                    self.text_load_file[4], self.text_load_file[5],
                    self.text_load_file[6], self.text_load_file[7],
                    self.text_load_file[8])
            pass
        except:
            print("Error de carga de ficheros.")

    def _clear(self):
        self.load_file.clear()
        self.file_path_dialog = self.load_file.text()
Пример #2
0
class ClientGUI(QMainWindow, ClientLogger):
    def __init__(self):
        super().__init__()
        self.log.debug("Initializing ClientGUI instance")
        self.input_buffer = []
        self.status_bar = self.statusBar()
        self.input_dock = QDockWidget()
        self.client = Engine()
        self.__init_ui()
        self.client.connect()
        self.gui_reactor()

    def __init_ui(self):
        self.log.debug("Initializing UI")
        self.setWindowTitle("Revenant")
        # TODO: Update this with some sort of connection string when connected
        self.status_bar.showMessage("Not Connected")

        self.__add_output_window()
        self.__add_input_field()

        exit_action = QAction(QIcon("exit.png"), "&Exit", self)
        exit_action.setShortcut("Ctrl-Q")
        exit_action.setStatusTip("Exit")
        exit_action.triggered.connect(QApplication.instance().quit)

        view_status_bar = QAction("Status Bar", self, checkable=True)
        view_status_bar.setStatusTip("Show the status bar")
        view_status_bar.setChecked(True)
        view_status_bar.triggered.connect(self.toggle_menu)

        menubar = self.menuBar()
        file_menu = menubar.addMenu("&File")
        file_menu.addAction(exit_action)
        view_menu = menubar.addMenu("View")
        view_menu.addAction(view_status_bar)

        self.show()

    def __add_output_window(self):
        self.main_window = QTextEdit(readOnly=True)
        self.setCentralWidget(self.main_window)

    def __add_input_field(self):
        self.input = QLineEdit()
        # TODO: Fix the bottom dock. BottomDock thingy is incompatible with Qt6
        self.input_dock.setAllowedAreas(Qt.DockWidgetArea.BottomDockWidgetArea
                                        | Qt.DockWidgetArea.TopDockWidgetArea)
        self.input_dock.setWidget(self.input)
        self.addDockWidget(Qt.DockWidgetArea.BottomDockWidgetArea,
                           self.input_dock)
        self.input.returnPressed.connect(self.write_to_input_buffer)

    def write_to_input_buffer(self):
        self.input_buffer.append(self.input.text())

    def toggle_menu(self, state):
        if state:
            self.status_bar.show()
        else:
            self.status_bar.hide()

    def write_to_main_window(self, text: str):
        if not text.endswith("\n"):
            text = text + "\n"
        self.main_window.insertPlainText(text)
        self.main_window.moveCursor(QTextCursor.MoveOperation.End)

    def write(self, write_data: str):
        write_data = write_data + "\n"
        self.client.connection.write(write_data.encode("ASCII"))
        self.write_to_main_window(f">{write_data}")
        self.input.clear()

    def contextMenuEvent(self, event):
        context_menu = QMenu(self)
        exit_action = context_menu.addAction("Quit")
        action = context_menu.exec_(self.mapToGlobal(event.pos()))

        if action == exit_action:
            QApplication.instance().quit()

    def gui_reactor(self):
        def input_loop():
            while True:
                if self.input_buffer:
                    self.write(self.input_buffer.pop(0))
                sleep(0.01)

        def output_loop():
            callback = self.write_to_main_window
            while True:
                self.client.read(output_callback=callback)
                sleep(0.01)

        Thread(target=output_loop).start()
        Thread(target=input_loop).start()