Add mock mode support and input validation
This commit is contained in:
@@ -1,14 +1,22 @@
|
||||
import re
|
||||
|
||||
import gi
|
||||
|
||||
gi.require_version("Gtk", "4.0")
|
||||
gi.require_version("Adw", "1")
|
||||
from gi.repository import Adw, Gtk
|
||||
from gi.repository import Adw, GObject, Gtk
|
||||
|
||||
|
||||
class UserPage(Adw.Bin):
|
||||
__gsignals__ = {
|
||||
"validity-changed": (GObject.SignalFlags.RUN_FIRST, None, (bool,)),
|
||||
}
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
self._is_valid = False
|
||||
|
||||
clamp = Adw.Clamp()
|
||||
clamp.set_maximum_size(500)
|
||||
self.set_child(clamp)
|
||||
@@ -32,6 +40,7 @@ class UserPage(Adw.Bin):
|
||||
self.fullname_row.set_title("Full Name")
|
||||
self.fullname_row.set_text("Administrator")
|
||||
self.fullname_row.connect("notify::text", self.on_fullname_changed)
|
||||
self.fullname_row.connect("notify::text", self.on_input_changed)
|
||||
group.add(self.fullname_row)
|
||||
|
||||
self.username_row = Adw.EntryRow()
|
||||
@@ -40,14 +49,17 @@ class UserPage(Adw.Bin):
|
||||
self.username_handler_id = self.username_row.connect(
|
||||
"notify::text", self.on_username_changed
|
||||
)
|
||||
self.username_row.connect("notify::text", self.on_input_changed)
|
||||
group.add(self.username_row)
|
||||
|
||||
self.password_row = Adw.PasswordEntryRow()
|
||||
self.password_row.set_title("Password")
|
||||
self.password_row.connect("notify::text", self.on_input_changed)
|
||||
group.add(self.password_row)
|
||||
|
||||
self.confirm_row = Adw.PasswordEntryRow()
|
||||
self.confirm_row.set_title("Confirm Password")
|
||||
self.confirm_row.connect("notify::text", self.on_input_changed)
|
||||
group.add(self.confirm_row)
|
||||
|
||||
# Hostname
|
||||
@@ -58,10 +70,14 @@ class UserPage(Adw.Bin):
|
||||
self.hostname_row = Adw.EntryRow()
|
||||
self.hostname_row.set_title("Hostname")
|
||||
self.hostname_row.set_text("iridium")
|
||||
self.hostname_row.connect("notify::text", self.on_input_changed)
|
||||
host_group.add(self.hostname_row)
|
||||
|
||||
self.username_manually_set = False
|
||||
|
||||
# Initial validation
|
||||
self.validate()
|
||||
|
||||
def on_fullname_changed(self, entry, _pspec):
|
||||
if self.username_manually_set:
|
||||
return
|
||||
@@ -113,6 +129,53 @@ class UserPage(Adw.Bin):
|
||||
def on_username_changed(self, entry, _pspec):
|
||||
self.username_manually_set = True
|
||||
|
||||
def on_input_changed(self, *args):
|
||||
self.validate()
|
||||
|
||||
def validate(self):
|
||||
valid = True
|
||||
|
||||
# Username validation
|
||||
username = self.username_row.get_text()
|
||||
if not username:
|
||||
valid = False
|
||||
self.username_row.add_css_class("error")
|
||||
elif not re.match(r"^[a-z_][a-z0-9_-]*$", username):
|
||||
valid = False
|
||||
self.username_row.add_css_class("error")
|
||||
else:
|
||||
self.username_row.remove_css_class("error")
|
||||
|
||||
# Password validation
|
||||
pw = self.password_row.get_text()
|
||||
confirm = self.confirm_row.get_text()
|
||||
|
||||
if not pw:
|
||||
valid = False
|
||||
# Don't show error for empty password initially, just invalidate
|
||||
# It looks a lot nicer like that
|
||||
|
||||
if pw != confirm:
|
||||
valid = False
|
||||
self.confirm_row.add_css_class("error")
|
||||
else:
|
||||
self.confirm_row.remove_css_class("error")
|
||||
|
||||
# Hostname validation
|
||||
hostname = self.hostname_row.get_text()
|
||||
if not hostname:
|
||||
valid = False
|
||||
self.hostname_row.add_css_class("error")
|
||||
else:
|
||||
self.hostname_row.remove_css_class("error")
|
||||
|
||||
if self._is_valid != valid:
|
||||
self._is_valid = valid
|
||||
self.emit("validity-changed", valid)
|
||||
|
||||
def is_valid(self):
|
||||
return self._is_valid
|
||||
|
||||
def get_user_info(self):
|
||||
return {
|
||||
"fullname": self.fullname_row.get_text(),
|
||||
|
||||
Reference in New Issue
Block a user