gui.dialogs.new_course_dialog
1import re 2 3from PySide6.QtWidgets import ( 4 QDialog, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, 5 QPushButton, QDialogButtonBox, 6) 7from PySide6.QtCore import Qt 8 9 10_NAME_RE = re.compile(r'^[a-z0-9][a-z0-9_-]*$') 11 12 13class NewCourseDialog(QDialog): 14 def __init__(self, parent=None): 15 super().__init__(parent) 16 self.setWindowTitle('Nuevo curso') 17 self.setMinimumWidth(340) 18 self._build_ui() 19 20 def _build_ui(self) -> None: 21 layout = QVBoxLayout(self) 22 layout.setSpacing(12) 23 24 layout.addWidget(QLabel('Nombre del curso (minúsculas, guiones, sin espacios):')) 25 26 self._input = QLineEdit() 27 self._input.setPlaceholderText('mi-curso') 28 self._input.textChanged.connect(self._validate) 29 layout.addWidget(self._input) 30 31 self._error = QLabel('') 32 self._error.setStyleSheet('color:#c0392b; font-size:11px;') 33 layout.addWidget(self._error) 34 35 btns = QDialogButtonBox( 36 QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel 37 ) 38 btns.accepted.connect(self._on_accept) 39 btns.rejected.connect(self.reject) 40 self._ok_btn = btns.button(QDialogButtonBox.StandardButton.Ok) 41 self._ok_btn.setEnabled(False) 42 layout.addWidget(btns) 43 44 def _validate(self, text: str) -> None: 45 if not text: 46 self._error.setText('') 47 self._ok_btn.setEnabled(False) 48 elif not _NAME_RE.match(text): 49 self._error.setText('Solo minúsculas, dígitos, guión y guión-bajo.') 50 self._ok_btn.setEnabled(False) 51 else: 52 self._error.setText('') 53 self._ok_btn.setEnabled(True) 54 55 def _on_accept(self) -> None: 56 if _NAME_RE.match(self._input.text()): 57 self.accept() 58 59 def course_name(self) -> str: 60 return self._input.text().strip()
class
NewCourseDialog(PySide6.QtWidgets.QDialog):
14class NewCourseDialog(QDialog): 15 def __init__(self, parent=None): 16 super().__init__(parent) 17 self.setWindowTitle('Nuevo curso') 18 self.setMinimumWidth(340) 19 self._build_ui() 20 21 def _build_ui(self) -> None: 22 layout = QVBoxLayout(self) 23 layout.setSpacing(12) 24 25 layout.addWidget(QLabel('Nombre del curso (minúsculas, guiones, sin espacios):')) 26 27 self._input = QLineEdit() 28 self._input.setPlaceholderText('mi-curso') 29 self._input.textChanged.connect(self._validate) 30 layout.addWidget(self._input) 31 32 self._error = QLabel('') 33 self._error.setStyleSheet('color:#c0392b; font-size:11px;') 34 layout.addWidget(self._error) 35 36 btns = QDialogButtonBox( 37 QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel 38 ) 39 btns.accepted.connect(self._on_accept) 40 btns.rejected.connect(self.reject) 41 self._ok_btn = btns.button(QDialogButtonBox.StandardButton.Ok) 42 self._ok_btn.setEnabled(False) 43 layout.addWidget(btns) 44 45 def _validate(self, text: str) -> None: 46 if not text: 47 self._error.setText('') 48 self._ok_btn.setEnabled(False) 49 elif not _NAME_RE.match(text): 50 self._error.setText('Solo minúsculas, dígitos, guión y guión-bajo.') 51 self._ok_btn.setEnabled(False) 52 else: 53 self._error.setText('') 54 self._ok_btn.setEnabled(True) 55 56 def _on_accept(self) -> None: 57 if _NAME_RE.match(self._input.text()): 58 self.accept() 59 60 def course_name(self) -> str: 61 return self._input.text().strip()
QDialog(self, /, parent: PySide6.QtWidgets.QWidget | None = None, f: PySide6.QtCore.Qt.WindowType = Default(Qt.WindowFlags), *, sizeGripEnabled: bool | None = None, modal: bool | None = None) -> None