Iced Pick_List - borrow trait not implemented error

⚓ Rust    📅 2026-04-04    👤 surdeus    👁️ 6      

surdeus

I have a view that works. I am attempting to add a pick_list widget with no success. It is my first attempt using a pick_list so I have modeled my code after the example with fruits in the iced documentation. I get two errors. 1) "selected_time_interval" needs to implement the borrow trait but I have not idea how to do that. 2) "intervals" has a mismatched type. Intervals is an array but pick_list expects an Option but the example in the iced doc appears to use an array. Any assistance will be appreciated.

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TimeInterval {
    QtrYear,
    HalfYear,
    OneYear,
    AllYears,
}

pub struct State {
    pub records_read: u64,
    pub records_inserted: u64,
    pub records_updated: u64,
    pub screen: Screen,
    pub closing_values: Vec<QueryResults>,
    pub all_closing_values: Vec<QueryResults>,
    pub heading: String,
    pub time_interval: i64,
    pub selected_time_interval: Option<TimeInterval>,
}

pub fn testing_view<'a>(heading: & str, query_results: &Vec<QueryResults>, selected_time_interval: &Option<TimeInterval>) -> iced::Element<'a, Message> {

    let mut col1: widget::Column<'_,Message, Theme, Renderer> = widget::Column::new();
    let mut col2: widget::Column<'_,Message, Theme, Renderer> = widget::Column::new();  
    
    let cell_width = 150.0; 
    let cell_height = 30.0;

    for result in query_results {

        let naive_date = NaiveDate::parse_from_str(&result.date, "%Y-%m-%d").unwrap();
        let formatted_date = naive_date.format("%b %e, %Y").to_string();

        col1 = col1.push(widget::container(
            widget::text(format!("{}", formatted_date))
                    .size(20.0)
            )
            .width(Length::Fixed(cell_width))
            .height(Length::Fixed(cell_height))
            .align_x(Horizontal::Center)
            .align_y(Vertical::Center)
            .style(container_style_spreadsheet)
        );

        col2 = col2.push(widget::container(
            widget::text(format!("${:.2}", result.close))
                    .size(20.0)
            )
            .width(Length::Fixed(cell_width))
            .height(Length::Fixed(cell_height))
            .align_x(Horizontal::Center)
            .align_y(Vertical::Center)
            .style(container_style_spreadsheet)
        );

    }

    let intervals = [
        TimeInterval::QtrYear,
        TimeInterval::HalfYear,
        TimeInterval::OneYear,
        TimeInterval::AllYears,
    ];

    let column_widget = 

        widget::column![
    
            widget::container(
                widget::button(widget::text("Home").size(15.0))
                    .on_press(Message::GoToHomeScreen)
                    .style(btn_blue_no_border)
            )
                .width(Length::Fill)
                .align_x(Horizontal::Right)
                .align_y(Vertical::Top),


            widget::container(
                widget::text(format!("{}", heading)).size(30.0)
            )
            .width(Length::Fill)
            .padding(iced::padding::bottom(10))
            .align_x(Horizontal::Center)
            .align_y(Vertical::Center), 

            widget::container(
                widget::row![
                    widget::text("Date").size(20.0),
                    widget::text("Close").size(20.0),
                ]
                .width(Length::Fill)
                .spacing(110)
                .padding(iced::padding::top(20))
                .padding(iced::padding::left(200))
            )
            .width(Length::Fill)
            .align_x(Horizontal::Center), 

            widget::container(
                widget::rule::horizontal(1)
                    .style(horizontal_rule)
            )
            .width(Length::Fill)
            .padding(iced::padding::bottom(10)),

            widget::container(

                widget::row![ 

                    widget::container(
                        widget::space()
                        // widget::text("")
                    )
                    .width(Length::FillPortion(1)),

                    widget::container(
                        widget::scrollable(
                            widget::row![

                                col1
                                .align_x(Horizontal::Right)
                                .width(Length::FillPortion(1)),

                                col2
                                .align_x(Horizontal::Left)
                                .width(Length::FillPortion(1)),

                            ] // end of row
                        ) // end of scrollable
                    ) // end of inner container
                    .width(Length::FillPortion(2))
                    .align_x(Horizontal::Center)
                    .align_y(Vertical::Top)
                    .style(container_style_grid),

// put pick list in container below ###############################################
                    widget::container(
                        
                        widget::pick_list(
                            selected_time_interval,  
                            // error: the trait borrow<&TimeInterval> is not implemented for &Option<TimeInterval>
                            // selected_time_interval is a state variable passed in
                            // initial value for some_time_interval set in new function as follows:
                            //selected_time_interval: Some(TimeInterval::QtrYear),

                            Some(intervals),
                            // this variable is created above
                            
                            TimeInterval::to_string,
                            // the std::fmt::Display trait is implemented for TimeInterval

                        )
                        .on_select(Message::TimeIntervalSelected)
                        .placeholder("Select Time Interval")
                        .width(Length::Fixed(100.0))
                    )
                    .width(Length::FillPortion(1)),

                ], // end of row   

            ) // end of outer container
            .width(Length::Fill)
            .align_x(Horizontal::Center)
            .padding(iced::padding::bottom(14)),

        ]; // end of column

    let my_container: widget::Container<'_, Message> =
        widget::Container::new(column_widget)
            .width(Length::Fill)
            .height(Length::Fill)
            .style(container_style);

    my_container.into()

}

3 posts - 3 participants

Read full topic

🏷️ Rust_feed