diff options
| author | 2023-11-29 22:28:31 +0100 | |
|---|---|---|
| committer | 2023-11-29 22:28:31 +0100 | |
| commit | e09b4e24dda51b8212d8ece52431dacaa3922a7b (patch) | |
| tree | 7005e181528134ebdde5bbbe5909273db9f30174 /examples/combo_box | |
| parent | 83c7870c569a2976923ee6243a19813094d44673 (diff) | |
| parent | 7f8b17604a31e00becc43130ec516c1a53552c88 (diff) | |
| download | iced-e09b4e24dda51b8212d8ece52431dacaa3922a7b.tar.gz iced-e09b4e24dda51b8212d8ece52431dacaa3922a7b.tar.bz2 iced-e09b4e24dda51b8212d8ece52431dacaa3922a7b.zip | |
Merge branch 'master' into feat/multi-window-support
Diffstat (limited to '')
| -rw-r--r-- | examples/combo_box/Cargo.toml | 10 | ||||
| -rw-r--r-- | examples/combo_box/README.md | 18 | ||||
| -rw-r--r-- | examples/combo_box/combobox.gif | bin | 0 -> 1414629 bytes | |||
| -rw-r--r-- | examples/combo_box/src/main.rs | 142 | 
4 files changed, 170 insertions, 0 deletions
| diff --git a/examples/combo_box/Cargo.toml b/examples/combo_box/Cargo.toml new file mode 100644 index 00000000..0f5ecf2a --- /dev/null +++ b/examples/combo_box/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "combo_box" +version = "0.1.0" +authors = ["Joao Freitas <jhff.15@gmail.com>"] +edition = "2021" +publish = false + +[dependencies] +iced.workspace = true +iced.features = ["debug"] diff --git a/examples/combo_box/README.md b/examples/combo_box/README.md new file mode 100644 index 00000000..9cd224ad --- /dev/null +++ b/examples/combo_box/README.md @@ -0,0 +1,18 @@ +## Combo-Box + +A dropdown list of searchable and selectable options. + +It displays and positions an overlay based on the window position of the widget. + +The __[`main`]__ file contains all the code of the example. + +<div align="center"> +    <img src="combobox.gif"> +</div> + +You can run it with `cargo run`: +``` +cargo run --package combo_box +``` + +[`main`]: src/main.rs diff --git a/examples/combo_box/combobox.gif b/examples/combo_box/combobox.gifBinary files differ new file mode 100644 index 00000000..f216c026 --- /dev/null +++ b/examples/combo_box/combobox.gif diff --git a/examples/combo_box/src/main.rs b/examples/combo_box/src/main.rs new file mode 100644 index 00000000..4f347667 --- /dev/null +++ b/examples/combo_box/src/main.rs @@ -0,0 +1,142 @@ +use iced::widget::{ +    column, combo_box, container, scrollable, text, vertical_space, +}; +use iced::{Alignment, Element, Length, Sandbox, Settings}; + +pub fn main() -> iced::Result { +    Example::run(Settings::default()) +} + +struct Example { +    languages: combo_box::State<Language>, +    selected_language: Option<Language>, +    text: String, +} + +#[derive(Debug, Clone, Copy)] +enum Message { +    Selected(Language), +    OptionHovered(Language), +    Closed, +} + +impl Sandbox for Example { +    type Message = Message; + +    fn new() -> Self { +        Self { +            languages: combo_box::State::new(Language::ALL.to_vec()), +            selected_language: None, +            text: String::new(), +        } +    } + +    fn title(&self) -> String { +        String::from("Combo box - Iced") +    } + +    fn update(&mut self, message: Message) { +        match message { +            Message::Selected(language) => { +                self.selected_language = Some(language); +                self.text = language.hello().to_string(); +            } +            Message::OptionHovered(language) => { +                self.text = language.hello().to_string(); +            } +            Message::Closed => { +                self.text = self +                    .selected_language +                    .map(|language| language.hello().to_string()) +                    .unwrap_or_default(); +            } +        } +    } + +    fn view(&self) -> Element<Message> { +        let combo_box = combo_box( +            &self.languages, +            "Type a language...", +            self.selected_language.as_ref(), +            Message::Selected, +        ) +        .on_option_hovered(Message::OptionHovered) +        .on_close(Message::Closed) +        .width(250); + +        let content = column![ +            text(&self.text), +            "What is your language?", +            combo_box, +            vertical_space(150), +        ] +        .width(Length::Fill) +        .align_items(Alignment::Center) +        .spacing(10); + +        container(scrollable(content)) +            .width(Length::Fill) +            .height(Length::Fill) +            .center_x() +            .center_y() +            .into() +    } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] +pub enum Language { +    Danish, +    #[default] +    English, +    French, +    German, +    Italian, +    Portuguese, +    Spanish, +    Other, +} + +impl Language { +    const ALL: [Language; 8] = [ +        Language::Danish, +        Language::English, +        Language::French, +        Language::German, +        Language::Italian, +        Language::Portuguese, +        Language::Spanish, +        Language::Other, +    ]; + +    fn hello(&self) -> &str { +        match self { +            Language::Danish => "Halloy!", +            Language::English => "Hello!", +            Language::French => "Salut!", +            Language::German => "Hallo!", +            Language::Italian => "Ciao!", +            Language::Portuguese => "Olá!", +            Language::Spanish => "¡Hola!", +            Language::Other => "... hello?", +        } +    } +} + +impl std::fmt::Display for Language { +    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { +        write!( +            f, +            "{}", +            match self { +                Language::Danish => "Danish", +                Language::English => "English", +                Language::French => "French", +                Language::German => "German", +                Language::Italian => "Italian", +                Language::Portuguese => "Portuguese", +                Language::Spanish => "Spanish", +                Language::Other => "Some other language", +            } +        ) +    } +} | 
