Skip to content

Add shadow to pick list - #3535

Open
Aziks0 wants to merge 1 commit into
iced-rs:masterfrom
Aziks0:feat-add-shadow-pick-list
Open

Aziks0 wants to merge 1 commit into
iced-rs:masterfrom
Aziks0:feat-add-shadow-pick-list

Conversation

@Aziks0

@Aziks0 Aziks0 commented Nov 8, 2026

Copy link
Copy Markdown

This PR adds the option to add a shadow to the pick_list widget.

image
Code sample for the image.

This is just the pick_list example with the added shadow:

use iced::widget::{column, pick_list, scrollable, space};
use iced::{Center, Color, Fill, Shadow, Vector, Widget};

pub fn main() -> iced::Result {
    iced::run(Example::update, Example::view)
}

#[derive(Default)]
struct Example {
    selected_language: Option<Language>,
}

#[derive(Debug, Clone, Copy)]
enum Message {
    LanguageSelected(Language),
}

impl Example {
    fn update(&mut self, message: Message) {
        match message {
            Message::LanguageSelected(language) => {
                self.selected_language = Some(language);
            }
        }
    }

    fn view(&self) -> impl Widget<Message> {
        let languages = pick_list(self.selected_language, Language::ALL, Language::to_string)
            .on_select(Message::LanguageSelected)
            .placeholder("Choose a language...")
            .style(|theme, status| pick_list::Style {
                shadow: Shadow {
                    color: Color::BLACK.scale_alpha(0.2),
                    offset: Vector::new(2., 2.),
                    blur_radius: 1.,
                },
                ..pick_list::default(theme, status)
            });

        let content = column![
            space().height(600),
            "Which is your favorite language?",
            languages,
            space().height(600),
        ]
        .width(Fill)
        .align_x(Center)
        .spacing(10);

        scrollable(content)
    }
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum Language {
    #[default]
    Rust,
    Elm,
    Ruby,
    Haskell,
    C,
    Javascript,
    Other,
}

impl Language {
    const ALL: &[Language] = &[
        Language::C,
        Language::Elm,
        Language::Ruby,
        Language::Haskell,
        Language::Rust,
        Language::Javascript,
        Language::Other,
    ];
}

impl std::fmt::Display for Language {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(
            f,
            "{}",
            match self {
                Language::Rust => "Rust",
                Language::Elm => "Elm",
                Language::Ruby => "Ruby",
                Language::Haskell => "Haskell",
                Language::C => "C",
                Language::Javascript => "Javascript",
                Language::Other => "Some other language",
            }
        )
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant