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>>, pub form: Rc
, pub placeholder: Rc, 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) { self.buffer.replace(match text_buffer { Some(buffer) => Some(Buffer::new(buffer)), None => None, }); } }