""" Column definition dialog — used for both Add Column and Rename Column operations in the Table Designer. """ from PyQt6.QtWidgets import ( QDialog, QVBoxLayout, QHBoxLayout, QFormLayout, QLineEdit, QComboBox, QCheckBox, QDialogButtonBox, QLabel, ) from PyQt6.QtCore import Qt # Common SQL types offered in the dropdown (user can type anything) _COMMON_TYPES = [ "INT", "BIGINT", "SMALLINT", "TINYINT", "BOOLEAN", "FLOAT", "DOUBLE", "DECIMAL(10,2)", "VARCHAR(255)", "VARCHAR(100)", "CHAR(36)", "TEXT", "LONGTEXT", "DATE", "DATETIME", "TIMESTAMP", "TIME", "JSON", "BLOB", "BINARY(16)", ] class ColumnDialog(QDialog): """ Dialog for adding a new column or renaming an existing one. In rename mode only the Name field is shown; in add mode all fields appear. """ def __init__(self, mode: str = "add", column_name: str = "", db_type: str = "", parent=None): """ Args: mode: "add" | "rename" column_name: pre-filled name (for rename, the old name) db_type: driver db_type string — used to tailor type suggestions """ super().__init__(parent) self._mode = mode self._db_type = db_type self.setWindowTitle("Add Column" if mode == "add" else "Rename Column") self.setModal(True) self.setMinimumWidth(360) self._build_ui(column_name) # ── Properties ──────────────────────────────────────────────────────────── @property def column_name(self) -> str: return self._name_edit.text().strip() @property def column_type(self) -> str: return self._type_combo.currentText().strip() @property def nullable(self) -> bool: return self._nullable_cb.isChecked() @property def default_value(self) -> str: return self._default_edit.text().strip() # ── UI ──────────────────────────────────────────────────────────────────── def _build_ui(self, column_name: str): root = QVBoxLayout(self) form = QFormLayout() form.setLabelAlignment(Qt.AlignmentFlag.AlignRight) # Name self._name_edit = QLineEdit(column_name) self._name_edit.setPlaceholderText("column_name") form.addRow("Column name:", self._name_edit) if self._mode == "add": # Type self._type_combo = QComboBox() self._type_combo.setEditable(True) self._type_combo.addItems(_COMMON_TYPES) self._type_combo.setCurrentText("VARCHAR(255)") form.addRow("Data type:", self._type_combo) # Nullable self._nullable_cb = QCheckBox() self._nullable_cb.setChecked(True) form.addRow("Allow NULL:", self._nullable_cb) # Default self._default_edit = QLineEdit() self._default_edit.setPlaceholderText("optional default value") form.addRow("Default:", self._default_edit) else: # Stub widgets so properties don't crash in rename mode self._type_combo = QComboBox() self._nullable_cb = QCheckBox() self._nullable_cb.setChecked(True) self._default_edit = QLineEdit() root.addLayout(form) if self._mode == "add": note = QLabel( "Changes are applied immediately via ALTER TABLE." ) note.setWordWrap(True) root.addWidget(note) # Buttons btns = QDialogButtonBox( QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel ) btns.accepted.connect(self._accept) btns.rejected.connect(self.reject) root.addWidget(btns) def _accept(self): if not self.column_name: self._name_edit.setFocus() return if self._mode == "add" and not self.column_type: self._type_combo.setFocus() return self.accept()