Skip to main content

State

Struct State 

Source
pub struct State<T> { /* private fields */ }
Expand description

Searchable select state.

The inner state keeps the current search query and filtered Material menu options. The public state also stores the original options so selected values and typed input can be mirrored by the demo/application state without replacing user-entered text on blur.

Implementations§

Source§

impl<T> State<T>
where T: Display + Clone,

Source

pub fn new(options: Vec<T>) -> Self

Creates a new State for a combobox with the given list of options.

Source

pub fn with_selection(options: Vec<T>, selection: Option<&T>) -> Self

Creates a new State for a combobox with the given list of options and selected value.

Examples found in repository?
examples/showcase/app.rs (lines 213-216)
203    fn default() -> Self {
204        Self {
205            navigation: navigation::NavigationState::new(ShowcasePage::Inputs),
206            window_size: Size::new(1080.0, 980.0),
207            count: 0,
208            note: String::new(),
209            editor_content: material::widget::text_editor::Content::with_text(
210                "Material 3 multi-line text editor",
211            ),
212            select_choice: Some("Assist"),
213            combobox_options: material::widget::combobox::State::with_selection(
214                vec!["Assist", "Suggestion", "Filter"],
215                Some(&"Suggestion"),
216            ),
217            combobox_choice: Some("Suggestion"),
218            combobox_input: String::new(),
219            search_query: String::new(),
220            date_picker: material::widget::picker::DatePickerState::new(
221                material::widget::picker::Date::new(2026, 7, 4),
222            ),
223            date_range_picker: material::widget::picker::DateRangePickerState::new(
224                material::widget::picker::Date::new(2026, 7, 4),
225                material::widget::picker::Date::new(2026, 7, 10),
226            ),
227            time_picker: material::widget::picker::TimePickerState::new(14, 30, false),
228            progress: 42.0,
229            enabled: true,
230            radio_choice: Some(RadioChoice::Standard),
231            segment_choice: SegmentChoice::List,
232            segment_state: material::widget::segmented_button::State::new(
233                SegmentChoice::List.index(),
234            ),
235            primary_tab: TabChoice::Inputs,
236            primary_tab_state: material::widget::tabs::State::new(TabChoice::Inputs.index()),
237            secondary_tab: TabChoice::Controls,
238            secondary_tab_state: material::widget::tabs::State::new(TabChoice::Controls.index()),
239            log_viewer: material::widget::log_viewer::State::new(),
240            log_entries: sample_log_entries(),
241            progress_animation: material::widget::progress_bar::IndeterminateState::new(
242                Instant::now(),
243            ),
244            login_dialog: material::widget::dialog::Transition::default(),
245            dialog_account: String::new(),
246            dialog_password: String::new(),
247            dialog_remember_password: false,
248            snackbar: material::widget::snackbar::Transition::default(),
249            theme_controller: theme_picker::ThemeController::default(),
250        }
251    }
Source

pub fn options(&self) -> &[T]

Returns the original options.

Source

pub fn push(&mut self, new_option: T)

Pushes a new option.

Source

pub fn into_options(self) -> Vec<T>

Returns ownership of the original options.

Source

pub fn set_input(&mut self, input: impl Into<String>)

Synchronizes the internal query with the latest user input.

Examples found in repository?
examples/showcase/app.rs (line 307)
268fn update(state: &mut Showcase, message: Message) -> Task<Message> {
269    match message {
270        #[cfg(any(target_arch = "wasm32", test))]
271        Message::CjkCoreFontFinished => load_cjk_regional_font(),
272        #[cfg(any(target_arch = "wasm32", test))]
273        Message::CjkRegionalFontFinished => Task::none(),
274        Message::Navigate(page) => {
275            state
276                .navigation
277                .select(page, Instant::now(), state.adaptive_navigation_layout());
278            Task::none()
279        }
280        Message::Increment => {
281            state.count += 1;
282            Task::none()
283        }
284        Message::Decrement => {
285            state.count -= 1;
286            Task::none()
287        }
288        Message::TextChanged(note) => {
289            state.note = note;
290            Task::none()
291        }
292        Message::EditorAction(action) => {
293            state.editor_content.perform(action);
294            Task::none()
295        }
296        Message::SelectChanged(choice) => {
297            state.select_choice = Some(choice);
298            Task::none()
299        }
300        Message::ComboboxSelected(choice) => {
301            state.combobox_choice = Some(choice);
302            state.combobox_input.clear();
303            state.combobox_options.set_selection(Some(&choice));
304            Task::none()
305        }
306        Message::ComboboxInputChanged(input) => {
307            state.combobox_options.set_input(input.clone());
308            state.combobox_input = input;
309            state.combobox_choice = None;
310            Task::none()
311        }
312        Message::SearchChanged(query) => {
313            state.search_query = query;
314            Task::none()
315        }
316        Message::DatePickerChanged(action) => state.date_picker.update_and_scroll(action),
317        Message::DateRangePickerChanged(action) => {
318            state.date_range_picker.update_and_scroll(action)
319        }
320        Message::TimePickerChanged(action) => {
321            state.time_picker.update(action);
322            Task::none()
323        }
324        Message::SliderChanged(progress) => {
325            state.progress = progress;
326            Task::none()
327        }
328        Message::EnabledChanged(enabled) => {
329            state.enabled = enabled;
330            Task::none()
331        }
332        Message::ChoiceSelected(choice) => {
333            state.radio_choice = Some(choice);
334            Task::none()
335        }
336        Message::SegmentSelected(choice) => {
337            state.segment_choice = choice;
338            state.segment_state.select(choice.index(), Instant::now());
339            Task::none()
340        }
341        Message::PrimaryTabSelected(choice) => {
342            state.primary_tab = choice;
343            state.primary_tab_state.select(
344                choice.index(),
345                Instant::now(),
346                material::widget::tabs::Variant::Primary,
347            );
348            Task::none()
349        }
350        Message::SecondaryTabSelected(choice) => {
351            state.secondary_tab = choice;
352            state.secondary_tab_state.select(
353                choice.index(),
354                Instant::now(),
355                material::widget::tabs::Variant::Secondary,
356            );
357            Task::none()
358        }
359        Message::LogViewer(action) => state.log_viewer.update(action, &state.log_entries),
360        Message::MenuPressed => {
361            state.navigation.toggle_menu_now_for_size(state.window_size);
362            Task::none()
363        }
364        Message::DialogOpened => {
365            state.login_dialog.show(Instant::now());
366            iced::widget::operation::focus(dialog_account_input_id())
367        }
368        Message::DialogDismissed => {
369            state.login_dialog.dismiss(Instant::now());
370            Task::none()
371        }
372        Message::DialogConfirmed => {
373            state.login_dialog.dismiss(Instant::now());
374            state.count += 1;
375            Task::none()
376        }
377        Message::DialogAccountChanged(account) => {
378            state.dialog_account = account;
379            Task::none()
380        }
381        Message::DialogPasswordChanged(password) => {
382            state.dialog_password = password;
383            Task::none()
384        }
385        Message::DialogRememberPasswordChanged(remember_password) => {
386            state.dialog_remember_password = remember_password;
387            Task::none()
388        }
389        Message::ShowSnackbar => {
390            state.snackbar.show(Instant::now());
391            Task::none()
392        }
393        Message::SnackbarUndo => {
394            state.count -= 1;
395            state.snackbar.dismiss(Instant::now());
396            Task::none()
397        }
398        Message::WindowResized(size) => {
399            state.window_size = size;
400            Task::none()
401        }
402        Message::ThemeChanged(action) => {
403            state.theme_controller.update(
404                action,
405                state.window_size,
406                showcase_floating_bottom_margin(state.adaptive_navigation_layout()),
407                Instant::now(),
408            );
409            Task::none()
410        }
411        Message::Frame(now) => {
412            let _ = state.theme_controller.advance(now);
413            let _ = state.navigation.advance(now);
414            let _ = state.segment_state.advance(now);
415            let _ = state.primary_tab_state.advance(now);
416            let _ = state.secondary_tab_state.advance(now);
417            let _ = state.log_viewer.advance(now);
418            state.progress_animation.advance(now);
419            let _ = state.login_dialog.advance(now);
420            let _ = state.snackbar.advance(now);
421            let _ = state.date_picker.advance(now);
422            let _ = state.date_range_picker.advance(now);
423            let _ = state.time_picker.advance(now);
424            Task::none()
425        }
426    }
427}
Source

pub fn set_selection(&mut self, selection: Option<&T>)

Synchronizes the internal query with the selected option.

Examples found in repository?
examples/showcase/app.rs (line 303)
268fn update(state: &mut Showcase, message: Message) -> Task<Message> {
269    match message {
270        #[cfg(any(target_arch = "wasm32", test))]
271        Message::CjkCoreFontFinished => load_cjk_regional_font(),
272        #[cfg(any(target_arch = "wasm32", test))]
273        Message::CjkRegionalFontFinished => Task::none(),
274        Message::Navigate(page) => {
275            state
276                .navigation
277                .select(page, Instant::now(), state.adaptive_navigation_layout());
278            Task::none()
279        }
280        Message::Increment => {
281            state.count += 1;
282            Task::none()
283        }
284        Message::Decrement => {
285            state.count -= 1;
286            Task::none()
287        }
288        Message::TextChanged(note) => {
289            state.note = note;
290            Task::none()
291        }
292        Message::EditorAction(action) => {
293            state.editor_content.perform(action);
294            Task::none()
295        }
296        Message::SelectChanged(choice) => {
297            state.select_choice = Some(choice);
298            Task::none()
299        }
300        Message::ComboboxSelected(choice) => {
301            state.combobox_choice = Some(choice);
302            state.combobox_input.clear();
303            state.combobox_options.set_selection(Some(&choice));
304            Task::none()
305        }
306        Message::ComboboxInputChanged(input) => {
307            state.combobox_options.set_input(input.clone());
308            state.combobox_input = input;
309            state.combobox_choice = None;
310            Task::none()
311        }
312        Message::SearchChanged(query) => {
313            state.search_query = query;
314            Task::none()
315        }
316        Message::DatePickerChanged(action) => state.date_picker.update_and_scroll(action),
317        Message::DateRangePickerChanged(action) => {
318            state.date_range_picker.update_and_scroll(action)
319        }
320        Message::TimePickerChanged(action) => {
321            state.time_picker.update(action);
322            Task::none()
323        }
324        Message::SliderChanged(progress) => {
325            state.progress = progress;
326            Task::none()
327        }
328        Message::EnabledChanged(enabled) => {
329            state.enabled = enabled;
330            Task::none()
331        }
332        Message::ChoiceSelected(choice) => {
333            state.radio_choice = Some(choice);
334            Task::none()
335        }
336        Message::SegmentSelected(choice) => {
337            state.segment_choice = choice;
338            state.segment_state.select(choice.index(), Instant::now());
339            Task::none()
340        }
341        Message::PrimaryTabSelected(choice) => {
342            state.primary_tab = choice;
343            state.primary_tab_state.select(
344                choice.index(),
345                Instant::now(),
346                material::widget::tabs::Variant::Primary,
347            );
348            Task::none()
349        }
350        Message::SecondaryTabSelected(choice) => {
351            state.secondary_tab = choice;
352            state.secondary_tab_state.select(
353                choice.index(),
354                Instant::now(),
355                material::widget::tabs::Variant::Secondary,
356            );
357            Task::none()
358        }
359        Message::LogViewer(action) => state.log_viewer.update(action, &state.log_entries),
360        Message::MenuPressed => {
361            state.navigation.toggle_menu_now_for_size(state.window_size);
362            Task::none()
363        }
364        Message::DialogOpened => {
365            state.login_dialog.show(Instant::now());
366            iced::widget::operation::focus(dialog_account_input_id())
367        }
368        Message::DialogDismissed => {
369            state.login_dialog.dismiss(Instant::now());
370            Task::none()
371        }
372        Message::DialogConfirmed => {
373            state.login_dialog.dismiss(Instant::now());
374            state.count += 1;
375            Task::none()
376        }
377        Message::DialogAccountChanged(account) => {
378            state.dialog_account = account;
379            Task::none()
380        }
381        Message::DialogPasswordChanged(password) => {
382            state.dialog_password = password;
383            Task::none()
384        }
385        Message::DialogRememberPasswordChanged(remember_password) => {
386            state.dialog_remember_password = remember_password;
387            Task::none()
388        }
389        Message::ShowSnackbar => {
390            state.snackbar.show(Instant::now());
391            Task::none()
392        }
393        Message::SnackbarUndo => {
394            state.count -= 1;
395            state.snackbar.dismiss(Instant::now());
396            Task::none()
397        }
398        Message::WindowResized(size) => {
399            state.window_size = size;
400            Task::none()
401        }
402        Message::ThemeChanged(action) => {
403            state.theme_controller.update(
404                action,
405                state.window_size,
406                showcase_floating_bottom_margin(state.adaptive_navigation_layout()),
407                Instant::now(),
408            );
409            Task::none()
410        }
411        Message::Frame(now) => {
412            let _ = state.theme_controller.advance(now);
413            let _ = state.navigation.advance(now);
414            let _ = state.segment_state.advance(now);
415            let _ = state.primary_tab_state.advance(now);
416            let _ = state.secondary_tab_state.advance(now);
417            let _ = state.log_viewer.advance(now);
418            state.progress_animation.advance(now);
419            let _ = state.login_dialog.advance(now);
420            let _ = state.snackbar.advance(now);
421            let _ = state.date_picker.advance(now);
422            let _ = state.date_range_picker.advance(now);
423            let _ = state.time_picker.advance(now);
424            Task::none()
425        }
426    }
427}

Trait Implementations§

Source§

impl<T> Debug for State<T>
where T: Debug,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<T> Default for State<T>
where T: Display + Clone,

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl<T> !Freeze for State<T>

§

impl<T> !RefUnwindSafe for State<T>

§

impl<T> !Sync for State<T>

§

impl<T> Send for State<T>
where Vec<T>: Send, SearchState<DisplayValue<T>>: Send,

§

impl<T> Unpin for State<T>
where Vec<T>: Unpin, SearchState<DisplayValue<T>>: Unpin,

§

impl<T> UnsafeUnpin for State<T>
where Vec<T>: UnsafeUnpin, SearchState<DisplayValue<T>>: UnsafeUnpin,

§

impl<T> UnwindSafe for State<T>
where Vec<T>: UnwindSafe, SearchState<DisplayValue<T>>: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> Downcast<T> for T

Source§

fn downcast(&self) -> &T

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<State, Message> IntoBoot<State, Message> for State

Source§

fn into_boot(self) -> (State, Task<Message>)

Turns some type into the initial state of some Application.
Source§

impl<T> MaybeClone for T

Source§

impl<T> MaybeDebug for T

Source§

impl<T> MaybeSend for T
where T: Send,

Source§

impl<T> NoneValue for T
where T: Default,

Source§

type NoneType = T

Source§

fn null_value() -> T

The none-equivalent value.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> Upcast<T> for T

Source§

fn upcast(&self) -> Option<&T>

Source§

impl<T> WasmNotSend for T
where T: Send,

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more