desktop_app/app/ui/widgets/validation_input.py
2025-09-09 13:20:22 +03:00

87 lines
2.8 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.setStyleSheet("color: red;")
# self.error_label.hide()
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