Source code for qt_data_extractor.design.create_connection

from PySide6 import QtCore, QtGui
from PySide6.QtWidgets import (
    QComboBox,
    QDialog,
    QDialogButtonBox,
    QFileDialog,
    QGridLayout,
    QHBoxLayout,
    QLabel,
    QLayout,
    QLineEdit,
    QPushButton,
    QSizePolicy,
)


[docs] class DirectoryBrowserField(QDialog): def __init__(self): super().__init__() self._main_layout = QHBoxLayout() self._main_layout.setContentsMargins(0, 0, 0, 0) self._selected_dir = QLineEdit() self._main_layout.addWidget(self._selected_dir) dir_browser = QPushButton("...") dir_browser.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Minimum) def on_folder_select(): folder = str( QFileDialog.getExistingDirectory(self, "Select Archive Folder") ) self._selected_dir.setText(folder) dir_browser.clicked.connect(on_folder_select) self._main_layout.addWidget(dir_browser) self.setLayout(self._main_layout)
[docs] def text(self): return self._selected_dir.text()
[docs] class FileBrowserField(QDialog): def __init__(self): super().__init__() self._main_layout = QHBoxLayout() self._main_layout.setContentsMargins(0, 0, 0, 0) self._selected_file = QLineEdit() self._main_layout.addWidget(self._selected_file) file_browser = QPushButton("...") file_browser.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Minimum) def on_file_select(): selected_file, _ = QFileDialog.getSaveFileName(self, "Select Archive File") self._selected_file.setText(selected_file) file_browser.clicked.connect(on_file_select) self._main_layout.addWidget(file_browser) self.setLayout(self._main_layout)
[docs] def text(self): return self._selected_file.text()
[docs] class CreateConnectionDialog(QDialog): def __init__(self, connectors): super().__init__() self._connectors = connectors self._main_layout = QGridLayout() submit_button = QPushButton(self.tr("&Submit")) submit_button.setDefault(True) submit_button.setEnabled(False) submit_button.clicked.connect(self.accept) cancel_button = QPushButton(self.tr("&Cancel")) # cancelButton.setAutoDefault(False) cancel_button.clicked.connect(self.reject) @QtCore.Slot(str) def on_mandatory_field_changed(val): if not val.strip(): submit_button.setEnabled(False) else: submit_button.setEnabled(True) self._main_layout.addWidget(QLabel("Enter new connection details:"), 0, 0) self.connection_name = QLineEdit() self.connection_name.setValidator( QtGui.QRegularExpressionValidator("[a-zA-Z0-9\_]+") # noqa: W605 ) self.connection_name.textChanged.connect(on_mandatory_field_changed) self._main_layout.addWidget(QLabel("Connection name:"), 1, 0) self._main_layout.addWidget(self.connection_name, 1, 1) self.connection_type = QComboBox() for connector in self._connectors: self.connection_type.addItem(f"{connector}", self._connectors[connector]) @QtCore.Slot(str) def on_connection_type_change(index): _update_dynamic_fields() self.connection_type.currentIndexChanged.connect(on_connection_type_change) self._main_layout.addWidget(QLabel("Connection type:"), 2, 0) self._main_layout.addWidget(self.connection_type, 2, 1) self.dynamic_fields = {} def _update_dynamic_fields(): self.dynamic_fields = {} for row in range(10): for col in range(2): layout = self._main_layout.itemAtPosition(3 + row, col) if layout is not None: layout.widget().deleteLater() self._main_layout.removeItem(layout) connection_data = self.connection_type.currentData() if not connection_data: return fields = connection_data["connection_fields"] for i, field_name in enumerate(fields): label = QLabel(f"{fields[field_name]['name']}:") if fields[field_name]["type"] == "str": widget = QLineEdit() elif fields[field_name]["type"] == "list": widget = QComboBox() for item in fields[field_name]["values"]: widget.addItem(item) if ( "default_value" in fields[field_name] and fields[field_name]["default_value"] in fields[field_name]["values"] ): widget.setCurrentIndex( fields[field_name]["values"].index( fields[field_name]["default_value"] ) ) elif fields[field_name]["type"] == "local_folder": widget = DirectoryBrowserField() elif fields[field_name]["type"] == "local_file": widget = FileBrowserField() else: raise RuntimeError("Unsupported Widget") self._main_layout.addWidget(label, 3 + i, 0) self._main_layout.addWidget(widget, 3 + i, 1) self.dynamic_fields[field_name] = widget self._main_layout.setSizeConstraint(QLayout.SetMinimumSize) self._button_box = QDialogButtonBox() self._button_box.addButton(submit_button, QDialogButtonBox.ActionRole) self._button_box.addButton(cancel_button, QDialogButtonBox.ActionRole) # self._button_box.clicked.connect(self.accept) # self._button_box.rejected.connect(self.reject) self._main_layout.addWidget(self._button_box, 20, 0) self._main_layout.setSizeConstraint(QLayout.SetMinimumSize) self.setLayout(self._main_layout) _update_dynamic_fields() @property def values(self): res = { "conn_name": self.connection_name.text().strip(), "conn_type": self.connection_type.currentText().strip(), } for field in self.dynamic_fields: if isinstance(self.dynamic_fields[field], QLineEdit) or isinstance( self.dynamic_fields[field], DirectoryBrowserField ): res[field] = self.dynamic_fields[field].text().strip() elif isinstance(self.dynamic_fields[field], QComboBox): res[field] = self.dynamic_fields[field].currentText().strip() return res