mirror of
https://github.com/YGGverse/Yoda.git
synced 2025-01-30 13:04:13 +00:00
add auth widget actions
This commit is contained in:
parent
5d01786596
commit
17f356dde7
@ -1,4 +1,7 @@
|
|||||||
|
mod action;
|
||||||
pub mod form;
|
pub mod form;
|
||||||
|
|
||||||
|
use action::Action;
|
||||||
use form::{list::item::value::Value, Form};
|
use form::{list::item::value::Value, Form};
|
||||||
|
|
||||||
use adw::{
|
use adw::{
|
||||||
@ -20,6 +23,7 @@ const RESPONSE_CANCEL: (&str, &str) = ("cancel", "Cancel");
|
|||||||
// Select options
|
// Select options
|
||||||
|
|
||||||
pub struct Widget {
|
pub struct Widget {
|
||||||
|
// pub action: Rc<Action>,
|
||||||
pub form: Rc<Form>,
|
pub form: Rc<Form>,
|
||||||
pub gobject: AlertDialog,
|
pub gobject: AlertDialog,
|
||||||
}
|
}
|
||||||
@ -29,8 +33,11 @@ impl Widget {
|
|||||||
|
|
||||||
/// Create new `Self`
|
/// Create new `Self`
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
|
// Init actions
|
||||||
|
let action = Rc::new(Action::new());
|
||||||
|
|
||||||
// Init child container
|
// Init child container
|
||||||
let form = Rc::new(Form::new());
|
let form = Rc::new(Form::new(action.clone()));
|
||||||
|
|
||||||
// Init main `GObject`
|
// Init main `GObject`
|
||||||
let gobject = AlertDialog::builder()
|
let gobject = AlertDialog::builder()
|
||||||
@ -55,8 +62,22 @@ impl Widget {
|
|||||||
gobject.set_response_appearance(RESPONSE_APPLY.0, ResponseAppearance::Suggested);
|
gobject.set_response_appearance(RESPONSE_APPLY.0, ResponseAppearance::Suggested);
|
||||||
gobject.set_response_appearance(RESPONSE_CANCEL.0, ResponseAppearance::Destructive);
|
gobject.set_response_appearance(RESPONSE_CANCEL.0, ResponseAppearance::Destructive);
|
||||||
|
|
||||||
|
// Init events
|
||||||
|
action.update.connect_activate({
|
||||||
|
let form = form.clone();
|
||||||
|
let gobject = gobject.clone();
|
||||||
|
move || {
|
||||||
|
// Deactivate apply button if the form values could not be processed
|
||||||
|
gobject.set_response_enabled(RESPONSE_APPLY.0, form.is_valid());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Return new activated `Self`
|
// Return new activated `Self`
|
||||||
Self { form, gobject }
|
Self {
|
||||||
|
// action,
|
||||||
|
form,
|
||||||
|
gobject,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Actions
|
// Actions
|
||||||
|
@ -0,0 +1,20 @@
|
|||||||
|
mod update;
|
||||||
|
use update::Update;
|
||||||
|
|
||||||
|
use std::rc::Rc;
|
||||||
|
|
||||||
|
/// [SimpleActionGroup](https://docs.gtk.org/gio/class.SimpleActionGroup.html) wrapper
|
||||||
|
pub struct Action {
|
||||||
|
pub update: Rc<Update>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Action {
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
/// Create new `Self`
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Self {
|
||||||
|
update: Rc::new(Update::new()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
use gtk::{gio::SimpleAction, glib::uuid_string_random, prelude::ActionExt};
|
||||||
|
|
||||||
|
/// [SimpleAction](https://docs.gtk.org/gio/class.SimpleAction.html) wrapper for `Update` action
|
||||||
|
pub struct Update {
|
||||||
|
pub gobject: SimpleAction,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Update {
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
/// Create new `Self`
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Self {
|
||||||
|
gobject: SimpleAction::new(&uuid_string_random(), None),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Actions
|
||||||
|
|
||||||
|
/// Emit [activate](https://docs.gtk.org/gio/signal.SimpleAction.activate.html) signal
|
||||||
|
/// with formatted for this action [Variant](https://docs.gtk.org/glib/struct.Variant.html) value
|
||||||
|
pub fn activate(&self) {
|
||||||
|
self.gobject.activate(None);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Events
|
||||||
|
|
||||||
|
/// Define callback function for
|
||||||
|
/// [SimpleAction::activate](https://docs.gtk.org/gio/signal.SimpleAction.activate.html) signal
|
||||||
|
pub fn connect_activate(&self, callback: impl Fn() + 'static) {
|
||||||
|
self.gobject.connect_activate(move |_, _| callback());
|
||||||
|
}
|
||||||
|
}
|
@ -4,6 +4,7 @@ mod name;
|
|||||||
use list::{item::value::Value, List};
|
use list::{item::value::Value, List};
|
||||||
use name::Name;
|
use name::Name;
|
||||||
|
|
||||||
|
use super::Action;
|
||||||
use gtk::{
|
use gtk::{
|
||||||
prelude::{BoxExt, WidgetExt},
|
prelude::{BoxExt, WidgetExt},
|
||||||
Box, Orientation,
|
Box, Orientation,
|
||||||
@ -11,19 +12,20 @@ use gtk::{
|
|||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
|
||||||
pub struct Form {
|
pub struct Form {
|
||||||
pub gobject: Box,
|
// pub action: Rc<Action>,
|
||||||
pub list: Rc<List>,
|
pub list: Rc<List>,
|
||||||
pub name: Rc<Name>,
|
pub name: Rc<Name>,
|
||||||
|
pub gobject: Box,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Form {
|
impl Form {
|
||||||
// Constructors
|
// Constructors
|
||||||
|
|
||||||
/// Create new `Self`
|
/// Create new `Self`
|
||||||
pub fn new() -> Self {
|
pub fn new(action: Rc<Action>) -> Self {
|
||||||
// Init components
|
// Init components
|
||||||
let list = Rc::new(List::new());
|
let list = Rc::new(List::new());
|
||||||
let name = Rc::new(Name::new());
|
let name = Rc::new(Name::new(action.clone()));
|
||||||
|
|
||||||
// Init main container
|
// Init main container
|
||||||
let gobject = Box::builder().orientation(Orientation::Vertical).build();
|
let gobject = Box::builder().orientation(Orientation::Vertical).build();
|
||||||
@ -34,19 +36,31 @@ impl Form {
|
|||||||
// Connect events
|
// Connect events
|
||||||
list.on_select({
|
list.on_select({
|
||||||
let name = name.clone();
|
let name = name.clone();
|
||||||
|
let update = action.update.clone();
|
||||||
move |key| {
|
move |key| {
|
||||||
|
// Change name entry visibility
|
||||||
name.gobject.set_visible(match key {
|
name.gobject.set_visible(match key {
|
||||||
Value::GENERATE_NEW_AUTH => true,
|
Value::GENERATE_NEW_AUTH => true,
|
||||||
_ => false,
|
_ => false,
|
||||||
})
|
});
|
||||||
|
|
||||||
|
// Update widget
|
||||||
|
update.activate();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Return activated `Self`
|
// Return activated `Self`
|
||||||
Self {
|
Self {
|
||||||
|
// action,
|
||||||
gobject,
|
gobject,
|
||||||
list,
|
list,
|
||||||
name,
|
name,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Actions
|
||||||
|
|
||||||
|
pub fn is_valid(&self) -> bool {
|
||||||
|
self.name.is_valid() // @TODO
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,15 @@
|
|||||||
use gtk::{glib::GString, prelude::EditableExt, Entry};
|
use super::Action;
|
||||||
|
use gtk::{
|
||||||
|
glib::GString,
|
||||||
|
prelude::{EditableExt, EntryExt},
|
||||||
|
Entry,
|
||||||
|
};
|
||||||
|
use std::rc::Rc;
|
||||||
|
|
||||||
const PLACEHOLDER_TEXT: &str = "Identity name (optional)";
|
const PLACEHOLDER_TEXT: &str = "Identity name (required)";
|
||||||
const MARGIN: i32 = 8;
|
const MARGIN: i32 = 8;
|
||||||
|
const MIN_LENGTH: u16 = 1;
|
||||||
|
const MAX_LENGTH: u16 = 36;
|
||||||
|
|
||||||
pub struct Name {
|
pub struct Name {
|
||||||
pub gobject: Entry,
|
pub gobject: Entry,
|
||||||
@ -11,14 +19,25 @@ impl Name {
|
|||||||
// Constructors
|
// Constructors
|
||||||
|
|
||||||
/// Create new `Self`
|
/// Create new `Self`
|
||||||
pub fn new() -> Self {
|
pub fn new(action: Rc<Action>) -> Self {
|
||||||
Self {
|
// Init `GObject`
|
||||||
gobject: Entry::builder()
|
let gobject = Entry::builder()
|
||||||
.max_length(36) // @TODO use profile const
|
.max_length(MAX_LENGTH as i32)
|
||||||
.placeholder_text(PLACEHOLDER_TEXT)
|
.placeholder_text(PLACEHOLDER_TEXT)
|
||||||
.margin_top(MARGIN)
|
.margin_top(MARGIN)
|
||||||
.build(),
|
.build();
|
||||||
|
|
||||||
|
// Init events
|
||||||
|
gobject.connect_changed(move |_| action.update.activate());
|
||||||
|
|
||||||
|
// Return activated `Self`
|
||||||
|
Self { gobject }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Actions
|
||||||
|
|
||||||
|
pub fn is_valid(&self) -> bool {
|
||||||
|
self.gobject.text_length() >= MIN_LENGTH && self.gobject.text_length() <= MAX_LENGTH
|
||||||
}
|
}
|
||||||
|
|
||||||
// Getters
|
// Getters
|
||||||
|
Loading…
x
Reference in New Issue
Block a user