Add mock mode support and input validation

This commit is contained in:
2026-02-02 20:19:36 +01:00
parent 7a69d62782
commit 26757288c4
4 changed files with 107 additions and 19 deletions

View File

@@ -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(),