summaryrefslogtreecommitdiffstats
path: root/examples/combo_box
diff options
context:
space:
mode:
Diffstat (limited to 'examples/combo_box')
-rw-r--r--examples/combo_box/Cargo.toml10
-rw-r--r--examples/combo_box/README.md18
-rw-r--r--examples/combo_box/combobox.gifbin0 -> 1414629 bytes
-rw-r--r--examples/combo_box/src/main.rs142
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.gif
new file mode 100644
index 00000000..f216c026
--- /dev/null
+++ b/examples/combo_box/combobox.gif
Binary files differ
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",
+ }
+ )
+ }
+}