From 4e20d9384c765b6b3a725a63f973676b3fdcb0e8 Mon Sep 17 00:00:00 2001 From: madonuko Date: Wed, 30 Oct 2024 01:02:23 +0800 Subject: [PATCH] fix(pages/whoareyou): proper username checking --- src/macros.rs | 5 ++++- src/pages/_01_whoareyou.rs | 23 ++++++++++++++++++++--- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/macros.rs b/src/macros.rs index 003b7f2..3d63a59 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -60,7 +60,7 @@ macro_rules! generate_pages { macro_rules! generate_page { ($page:ident $({$($model:tt)+})?: $( - init($root:ident, $initsender:ident, $initmodel:ident, $initwidgets:ident) $initblock:block + init$([$($local_ref:ident)+])?($root:ident, $initsender:ident, $initmodel:ident, $initwidgets:ident) $initblock:block )? update($self:ident, $message:ident, $sender:ident) { $( $msg:ident$(($($param:ident: $paramtype:ty),+$(,)?))? => $msghdl:expr ),*$(,)? @@ -111,6 +111,9 @@ macro_rules! generate_page { $sender: ComponentSender, ) -> ComponentParts { let model = Self::default(); + + $($($(let $local_ref = &model.$local_ref;)+)?)? + // HACK: invoking view_output!() directly gives `()` when $init* is given. // I don't know why this fixes the issue. — mado let widgets = []!(); diff --git a/src/pages/_01_whoareyou.rs b/src/pages/_01_whoareyou.rs index ffdcc61..e46d68c 100644 --- a/src/pages/_01_whoareyou.rs +++ b/src/pages/_01_whoareyou.rs @@ -1,16 +1,20 @@ crate::generate_page!(WhoAreYou { pub name: String, pub user: String, + lbl_error: gtk::Label, }: - init(root, sender, model, widgets) { + init[lbl_error](root, sender, model, widgets) { let s1 = sender.clone(); widgets.tf_fullname.internal_entry().connect_changed(move |en| { s1.input(Self::Input::NotifyFullName(en.text().to_string())); }); - let s2 = sender.clone(); widgets.tf_username.internal_entry().connect_changed(move |en| { - s2.input(Self::Input::NotifyUsername(en.text().to_string())); + if en.parent().and_then(|x| x.parent()).and_then(|x| x.parent()).and_then(|x| x.parent()).unwrap().dynamic_cast::().unwrap().is_valid() { + sender.input(Self::Input::NotifyUsername(en.text().to_string())); + } else { + sender.input(Self::Input::InvalidUsername); + } }); tracing::trace!(?model, ?widgets); @@ -23,7 +27,11 @@ crate::generate_page!(WhoAreYou { NotifyUsername(user: String) => { tracing::trace!(?user, "Username Input"); self.user = user; + self.lbl_error.set_visible(false); }, + InvalidUsername => { + self.lbl_error.set_visible(true); + } } => {} gtk::Box { @@ -63,6 +71,15 @@ crate::generate_page!(WhoAreYou { set_needs_validation: true, set_regex: &libhelium::glib::Regex::new(r"^[a-z][-a-z0-9_]*\$?$", gtk::glib::RegexCompileFlags::DEFAULT, gtk::glib::RegexMatchFlags::DEFAULT).unwrap().unwrap(), }, + + #[local_ref] + lbl_error -> gtk::Label { + set_label: &gettext("Username \n- must start with lowercase letters\n- must contain only alphanumericals, underscore (_) or dash (-)\n- may optionally end with a dollar sign ($)"), + set_use_markup: true, + set_visible: false, + add_css_class: "destructive-action", + inline_css: "color: orange", + } }, #[template] crate::ui::PrevNextBtns {