Yoda/src/app/browser/window/tab/item/page/search.rs
2024-12-17 01:50:12 +02:00

83 lines
1.8 KiB
Rust

mod buffer;
mod form;
mod placeholder;
use buffer::Buffer;
use form::Form;
use placeholder::Placeholder;
use gtk::{
prelude::{BoxExt, WidgetExt},
Align, Box, Orientation, TextBuffer,
};
use std::{cell::RefCell, rc::Rc};
pub struct Search {
buffer: Rc<RefCell<Option<Buffer>>>,
pub form: Rc<Form>,
pub placeholder: Rc<Placeholder>,
pub g_box: Box,
}
impl Search {
// Constructors
/// Create new `Self`
pub fn new() -> Self {
// Init components
let buffer = Rc::new(RefCell::new(None));
let form = Rc::new(Form::new(&buffer));
let placeholder = Rc::new(Placeholder::new());
// Init main container
let g_box = Box::builder()
.orientation(Orientation::Vertical)
.valign(Align::Center)
.vexpand(false)
.visible(false)
.build();
g_box.append(&form.g_box);
g_box.append(&placeholder.label);
// Done
Self {
buffer,
form,
g_box,
placeholder,
}
}
// Actions
pub fn show(&self) {
if self.buffer.borrow().is_some() {
self.form.show();
self.placeholder.hide();
} else {
self.form.hide();
self.placeholder.show();
}
self.g_box.set_visible(true)
}
pub fn hide(&self) {
self.g_box.set_visible(false)
}
pub fn toggle(&self) {
if self.g_box.is_visible() {
self.hide()
} else {
self.show()
}
}
pub fn update(&self, text_buffer: Option<TextBuffer>) {
self.buffer.replace(match text_buffer {
Some(buffer) => Some(Buffer::new(buffer)),
None => None,
});
}
}