Yoda/src/app/browser/window/tab/item/page/input/sensitive.rs
2024-11-08 05:45:15 +02:00

67 lines
1.6 KiB
Rust

mod form;
mod widget;
use form::Form;
use widget::Widget;
use gtk::{
gio::SimpleAction,
glib::{uuid_string_random, Uri, UriHideFlags},
prelude::{ActionExt, ToVariant, WidgetExt},
Box,
};
use std::rc::Rc;
pub struct Sensitive {
// Components
widget: Rc<Widget>,
}
impl Sensitive {
// Construct
pub fn new_rc(
action_page_open: SimpleAction,
base: Uri,
title: Option<&str>,
max_length: Option<i32>,
) -> Rc<Self> {
// Init local actions
let action_send = SimpleAction::new(&uuid_string_random(), None);
// Init components
let form = Form::new_rc(
action_send.clone(),
title,
max_length
.map(|value| value - base.to_string_partial(UriHideFlags::QUERY).len() as i32),
);
// Init widget
let widget = Widget::new_rc(form.gobject());
// Init events
action_send.connect_activate({
let form = form.clone();
move |_, _| {
action_page_open.activate(Some(
&format!(
"{}?{}",
base.to_string_partial(UriHideFlags::QUERY),
Uri::escape_string(form.text().as_str(), None, false),
)
.to_variant(),
));
}
});
widget.gobject().connect_realize(move |_| form.focus());
// Return activated struct
Rc::new(Self { widget })
}
// Getters
pub fn gobject(&self) -> &Box {
self.widget.gobject()
}
}