mirror of
https://github.com/YGGverse/Yoda.git
synced 2026-04-01 00:55:28 +00:00
83 lines
1.8 KiB
Rust
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,
|
|
});
|
|
}
|
|
}
|