libcosmic/src/widget/search/mod.rs
2023-09-14 01:38:56 +02:00

98 lines
2.3 KiB
Rust

// Copyright 2023 System76 <info@system76.com>
// SPDX-License-Identifier: MPL-2.0
//! A COSMIC search widget
//!
//! ## Example
//!
//! Store the model in the application:
//!
//! ```ignore
//! App {
//! search: search::Model::default()
//! }
//! ```
//!
//! Generate the element in the view:
//!
//! ```ignore
//! let search_field = search::search(&self.search, Message::Search);
//! ```
//!
//! Handle messages in the update method:
//!
//! ```ignore
//! match message {
//! Message::Search(search::Message::Activate) => {
//! // Returns command to focus the text input.
//! return self.search.focus();
//! }
//! Message::Search(search::Message::Changed) => {
//! self.search.phrase = phrase;
//! self.search_changed();
//! }
//! Message::Search(search::Message::Clear) => {
//! self.search_clear();
//! },
//! Message::Search(search::Message::Submit) => {
//! self.search_submit();
//! }
//! }
mod field;
mod model;
mod button {
use crate::widget::{container, icon};
use apply::Apply;
/// A search button which converts to a search [`field`] on click.
#[must_use]
pub fn button<Message: 'static + Clone>(on_press: Message) -> crate::Element<'static, Message> {
icon::handle::from_svg_bytes(&include_bytes!("search.svg")[..])
.symbolic(true)
.apply(crate::widget::button::icon)
.on_press(on_press)
.apply(container)
.padding([0, 0, 0, 11])
.into()
}
}
pub use button::button;
pub use field::{field, Field};
pub use model::Model;
/// Creates the COSMIC search field widget
///
/// A button is displayed when inactive, and the search field when active.
pub fn search<M: 'static + Clone>(model: &Model, on_emit: fn(Message) -> M) -> crate::Element<M> {
let element = match model.state {
State::Active => field(
model.input_id.clone(),
&model.phrase,
Message::Changed,
Message::Clear,
Some(Message::Clear),
)
.into(),
State::Inactive => button(Message::Activate),
};
element.map(on_emit)
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub enum Message {
Activate,
Changed(String),
Clear,
Submit,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum State {
Active,
Inactive,
}