84 lines
2.7 KiB
Python
84 lines
2.7 KiB
Python
from PySide6.QtWidgets import QWidget, QLineEdit, QLabel, QHBoxLayout, QVBoxLayout, QSizePolicy
|
|
from PySide6.QtCore import Qt, Signal
|
|
|
|
|
|
class ValidationInput(QWidget):
|
|
textChanged = Signal(str)
|
|
|
|
def __init__(self, placeholder_text="", is_password=False):
|
|
super().__init__()
|
|
self.validator = None
|
|
self.is_valid = False
|
|
self.is_required = True
|
|
|
|
self.main_layout = QVBoxLayout(self)
|
|
self.main_layout.setContentsMargins(0, 0, 0, 0)
|
|
self.main_layout.setSpacing(5)
|
|
|
|
input_layout = QHBoxLayout()
|
|
self.input = QLineEdit()
|
|
self.input.setPlaceholderText(placeholder_text)
|
|
self.input.setFixedHeight(40)
|
|
if is_password:
|
|
self.input.setEchoMode(QLineEdit.Password)
|
|
|
|
# self.status_label = QLabel()
|
|
# self.status_label.setFixedSize(20, 20)
|
|
# self.status_label.setAlignment(Qt.AlignCenter)
|
|
# font = self.status_label.font()
|
|
# font.setPointSize(14)
|
|
# self.status_label.setFont(font)
|
|
|
|
input_layout.addWidget(self.input)
|
|
# input_layout.addWidget(self.status_label)
|
|
|
|
self.error_label = QLabel()
|
|
self.error_label.setWordWrap(True)
|
|
self.error_label.setStyleSheet("color: red; font-size: 12px;")
|
|
self.error_label.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
|
|
self.error_label.hide()
|
|
|
|
self.main_layout.addLayout(input_layout)
|
|
self.main_layout.addWidget(self.error_label)
|
|
|
|
self.input.textChanged.connect(self.on_text_changed)
|
|
|
|
def set_validator(self, validator, is_required=True):
|
|
self.validator = validator
|
|
self.is_required = is_required
|
|
|
|
def on_text_changed(self, text):
|
|
self.textChanged.emit(text)
|
|
if not self.validator:
|
|
return
|
|
|
|
if not self.is_required and not text:
|
|
self.is_valid = True
|
|
# self.status_label.clear()
|
|
self.error_label.hide()
|
|
return
|
|
|
|
is_valid, message = self.validator(text)
|
|
self.is_valid = is_valid
|
|
if is_valid:
|
|
# self.status_label.setText("✓")
|
|
# self.status_label.setStyleSheet("color: green;")
|
|
self.error_label.hide()
|
|
else:
|
|
# self.status_label.setText("✗")
|
|
# self.status_label.setStyleSheet("color: red;")
|
|
self.error_label.setText(message)
|
|
self.error_label.show()
|
|
|
|
def text(self):
|
|
return self.input.text()
|
|
|
|
def setText(self, text):
|
|
self.input.setText(text)
|
|
|
|
def clear(self):
|
|
self.input.clear()
|
|
# self.status_label.clear()
|
|
self.error_label.hide()
|
|
self.is_valid = False
|