pub struct ThemeController { /* private fields */ }Implementations§
Source§impl ThemeController
impl ThemeController
pub fn new(selected: MaterialColor, dark_mode: bool) -> Self
pub const fn picker_state(&self) -> &State
pub const fn is_picker_open(&self) -> bool
pub const fn selected_color(&self) -> MaterialColor
pub const fn dark_mode(&self) -> bool
pub const fn visible_scheme(&self) -> ColorScheme
pub const fn transition(&self) -> Option<ThemeRevealTransition>
Sourcepub const fn is_animating(&self) -> bool
pub const fn is_animating(&self) -> bool
Examples found in repository?
examples/showcase/app.rs (line 414)
410fn subscription(state: &Showcase) -> Subscription<Message> {
411 let mut subscriptions =
412 vec![iced::window::resize_events().map(|(_id, size)| Message::WindowResized(size))];
413
414 if state.theme_controller.is_animating()
415 || state.navigation.is_animating()
416 || state.segment_state.is_animating()
417 || state.primary_tab_state.is_animating()
418 || state.secondary_tab_state.is_animating()
419 || state.alert_dialog.is_animating()
420 || state.snackbar.is_active()
421 || state.date_picker.is_animating()
422 || state.date_range_picker.is_animating()
423 || state.time_picker.is_animating()
424 || (state.navigation.selected() == ShowcasePage::Feedback
425 && state.progress_animation.is_animating())
426 {
427 subscriptions.push(iced::window::frames().map(Message::Frame));
428 }
429
430 Subscription::batch(subscriptions)
431}Sourcepub fn update(
&mut self,
action: ThemeAction,
viewport: Size,
bottom_margin: f32,
now: Instant,
)
pub fn update( &mut self, action: ThemeAction, viewport: Size, bottom_margin: f32, now: Instant, )
Examples found in repository?
examples/showcase/app.rs (lines 376-381)
254fn update(state: &mut Showcase, message: Message) -> Task<Message> {
255 match message {
256 #[cfg(any(target_arch = "wasm32", test))]
257 Message::CjkCoreFontFinished => load_cjk_regional_font(),
258 #[cfg(any(target_arch = "wasm32", test))]
259 Message::CjkRegionalFontFinished => Task::none(),
260 Message::Navigate(page) => {
261 state
262 .navigation
263 .select(page, Instant::now(), state.adaptive_navigation_layout());
264 Task::none()
265 }
266 Message::Increment => {
267 state.count += 1;
268 Task::none()
269 }
270 Message::Decrement => {
271 state.count -= 1;
272 Task::none()
273 }
274 Message::TextChanged(note) => {
275 state.note = note;
276 Task::none()
277 }
278 Message::EditorAction(action) => {
279 state.editor_content.perform(action);
280 Task::none()
281 }
282 Message::SelectChanged(choice) => {
283 state.select_choice = Some(choice);
284 Task::none()
285 }
286 Message::ComboboxSelected(choice) => {
287 state.combobox_choice = Some(choice);
288 state.combobox_input.clear();
289 state.combobox_options.set_selection(Some(&choice));
290 Task::none()
291 }
292 Message::ComboboxInputChanged(input) => {
293 state.combobox_options.set_input(input.clone());
294 state.combobox_input = input;
295 state.combobox_choice = None;
296 Task::none()
297 }
298 Message::SearchChanged(query) => {
299 state.search_query = query;
300 Task::none()
301 }
302 Message::DatePickerChanged(action) => state.date_picker.update_and_scroll(action),
303 Message::DateRangePickerChanged(action) => {
304 state.date_range_picker.update_and_scroll(action)
305 }
306 Message::TimePickerChanged(action) => {
307 state.time_picker.update(action);
308 Task::none()
309 }
310 Message::SliderChanged(progress) => {
311 state.progress = progress;
312 Task::none()
313 }
314 Message::EnabledChanged(enabled) => {
315 state.enabled = enabled;
316 Task::none()
317 }
318 Message::ChoiceSelected(choice) => {
319 state.radio_choice = Some(choice);
320 Task::none()
321 }
322 Message::SegmentSelected(choice) => {
323 state.segment_choice = choice;
324 state.segment_state.select(choice.index(), Instant::now());
325 Task::none()
326 }
327 Message::PrimaryTabSelected(choice) => {
328 state.primary_tab = choice;
329 state.primary_tab_state.select(
330 choice.index(),
331 Instant::now(),
332 material::widget::tabs::Variant::Primary,
333 );
334 Task::none()
335 }
336 Message::SecondaryTabSelected(choice) => {
337 state.secondary_tab = choice;
338 state.secondary_tab_state.select(
339 choice.index(),
340 Instant::now(),
341 material::widget::tabs::Variant::Secondary,
342 );
343 Task::none()
344 }
345 Message::MenuPressed => {
346 state.navigation.toggle_menu_now();
347 Task::none()
348 }
349 Message::DialogOpened => {
350 state.alert_dialog.show(Instant::now());
351 Task::none()
352 }
353 Message::DialogDismissed => {
354 state.alert_dialog.dismiss(Instant::now());
355 Task::none()
356 }
357 Message::DialogConfirmed => {
358 state.alert_dialog.dismiss(Instant::now());
359 state.count += 1;
360 Task::none()
361 }
362 Message::ShowSnackbar => {
363 state.snackbar.show(Instant::now());
364 Task::none()
365 }
366 Message::SnackbarUndo => {
367 state.count -= 1;
368 state.snackbar.dismiss(Instant::now());
369 Task::none()
370 }
371 Message::WindowResized(size) => {
372 state.window_size = size;
373 Task::none()
374 }
375 Message::ThemeChanged(action) => {
376 state.theme_controller.update(
377 action,
378 state.window_size,
379 theme_picker::bottom_margin(state.adaptive_navigation_layout()),
380 Instant::now(),
381 );
382 Task::none()
383 }
384 Message::Frame(now) => {
385 let _ = state.theme_controller.advance(now);
386 let _ = state.navigation.advance(now);
387 let _ = state.segment_state.advance(now);
388 let _ = state.primary_tab_state.advance(now);
389 let _ = state.secondary_tab_state.advance(now);
390 state.progress_animation.advance(now);
391 let _ = state.alert_dialog.advance(now);
392 let _ = state.snackbar.advance(now);
393 let _ = state.date_picker.advance(now);
394 let _ = state.date_range_picker.advance(now);
395 let _ = state.time_picker.advance(now);
396 Task::none()
397 }
398 }
399}Sourcepub fn advance(&mut self, now: Instant) -> bool
pub fn advance(&mut self, now: Instant) -> bool
Examples found in repository?
examples/showcase/app.rs (line 385)
254fn update(state: &mut Showcase, message: Message) -> Task<Message> {
255 match message {
256 #[cfg(any(target_arch = "wasm32", test))]
257 Message::CjkCoreFontFinished => load_cjk_regional_font(),
258 #[cfg(any(target_arch = "wasm32", test))]
259 Message::CjkRegionalFontFinished => Task::none(),
260 Message::Navigate(page) => {
261 state
262 .navigation
263 .select(page, Instant::now(), state.adaptive_navigation_layout());
264 Task::none()
265 }
266 Message::Increment => {
267 state.count += 1;
268 Task::none()
269 }
270 Message::Decrement => {
271 state.count -= 1;
272 Task::none()
273 }
274 Message::TextChanged(note) => {
275 state.note = note;
276 Task::none()
277 }
278 Message::EditorAction(action) => {
279 state.editor_content.perform(action);
280 Task::none()
281 }
282 Message::SelectChanged(choice) => {
283 state.select_choice = Some(choice);
284 Task::none()
285 }
286 Message::ComboboxSelected(choice) => {
287 state.combobox_choice = Some(choice);
288 state.combobox_input.clear();
289 state.combobox_options.set_selection(Some(&choice));
290 Task::none()
291 }
292 Message::ComboboxInputChanged(input) => {
293 state.combobox_options.set_input(input.clone());
294 state.combobox_input = input;
295 state.combobox_choice = None;
296 Task::none()
297 }
298 Message::SearchChanged(query) => {
299 state.search_query = query;
300 Task::none()
301 }
302 Message::DatePickerChanged(action) => state.date_picker.update_and_scroll(action),
303 Message::DateRangePickerChanged(action) => {
304 state.date_range_picker.update_and_scroll(action)
305 }
306 Message::TimePickerChanged(action) => {
307 state.time_picker.update(action);
308 Task::none()
309 }
310 Message::SliderChanged(progress) => {
311 state.progress = progress;
312 Task::none()
313 }
314 Message::EnabledChanged(enabled) => {
315 state.enabled = enabled;
316 Task::none()
317 }
318 Message::ChoiceSelected(choice) => {
319 state.radio_choice = Some(choice);
320 Task::none()
321 }
322 Message::SegmentSelected(choice) => {
323 state.segment_choice = choice;
324 state.segment_state.select(choice.index(), Instant::now());
325 Task::none()
326 }
327 Message::PrimaryTabSelected(choice) => {
328 state.primary_tab = choice;
329 state.primary_tab_state.select(
330 choice.index(),
331 Instant::now(),
332 material::widget::tabs::Variant::Primary,
333 );
334 Task::none()
335 }
336 Message::SecondaryTabSelected(choice) => {
337 state.secondary_tab = choice;
338 state.secondary_tab_state.select(
339 choice.index(),
340 Instant::now(),
341 material::widget::tabs::Variant::Secondary,
342 );
343 Task::none()
344 }
345 Message::MenuPressed => {
346 state.navigation.toggle_menu_now();
347 Task::none()
348 }
349 Message::DialogOpened => {
350 state.alert_dialog.show(Instant::now());
351 Task::none()
352 }
353 Message::DialogDismissed => {
354 state.alert_dialog.dismiss(Instant::now());
355 Task::none()
356 }
357 Message::DialogConfirmed => {
358 state.alert_dialog.dismiss(Instant::now());
359 state.count += 1;
360 Task::none()
361 }
362 Message::ShowSnackbar => {
363 state.snackbar.show(Instant::now());
364 Task::none()
365 }
366 Message::SnackbarUndo => {
367 state.count -= 1;
368 state.snackbar.dismiss(Instant::now());
369 Task::none()
370 }
371 Message::WindowResized(size) => {
372 state.window_size = size;
373 Task::none()
374 }
375 Message::ThemeChanged(action) => {
376 state.theme_controller.update(
377 action,
378 state.window_size,
379 theme_picker::bottom_margin(state.adaptive_navigation_layout()),
380 Instant::now(),
381 );
382 Task::none()
383 }
384 Message::Frame(now) => {
385 let _ = state.theme_controller.advance(now);
386 let _ = state.navigation.advance(now);
387 let _ = state.segment_state.advance(now);
388 let _ = state.primary_tab_state.advance(now);
389 let _ = state.secondary_tab_state.advance(now);
390 state.progress_animation.advance(now);
391 let _ = state.alert_dialog.advance(now);
392 let _ = state.snackbar.advance(now);
393 let _ = state.date_picker.advance(now);
394 let _ = state.date_range_picker.advance(now);
395 let _ = state.time_picker.advance(now);
396 Task::none()
397 }
398 }
399}Sourcepub fn dark_mode_switch<'a, Message, Renderer>(
&self,
label: impl IntoFragment<'a>,
on_action: impl Fn(ThemeAction) -> Message + 'a,
) -> Element<'a, Message, Theme, Renderer>
pub fn dark_mode_switch<'a, Message, Renderer>( &self, label: impl IntoFragment<'a>, on_action: impl Fn(ThemeAction) -> Message + 'a, ) -> Element<'a, Message, Theme, Renderer>
Examples found in repository?
examples/showcase/pages/controls.rs (line 121)
112fn selection_controls(state: &Showcase) -> material::Element<'_, Message> {
113 let switches = page::component_stack([
114 material::widget::checkbox::standard(
115 state.enabled,
116 "Enable actions",
117 Message::EnabledChanged,
118 ),
119 state
120 .theme_controller
121 .dark_mode_switch("Dark theme", Message::ThemeChanged),
122 ]);
123
124 let radios = page::row([
125 material::widget::radio::standard(
126 "Standard",
127 RadioChoice::Standard,
128 state.radio_choice,
129 Message::ChoiceSelected,
130 ),
131 material::widget::radio::standard(
132 "Expressive",
133 RadioChoice::Expressive,
134 state.radio_choice,
135 Message::ChoiceSelected,
136 ),
137 material::widget::radio::standard(
138 "Dense",
139 RadioChoice::Dense,
140 state.radio_choice,
141 Message::ChoiceSelected,
142 ),
143 ]);
144
145 page::spacious_stack([switches.into(), radios.into()]).into()
146}Sourcepub fn controls_over<'a, Message, Renderer>(
&self,
content: impl Into<Element<'a, Message, Theme, Renderer>>,
bottom_margin: f32,
on_action: impl Fn(ThemeAction) -> Message + 'a,
) -> Element<'a, Message, Theme, Renderer>
pub fn controls_over<'a, Message, Renderer>( &self, content: impl Into<Element<'a, Message, Theme, Renderer>>, bottom_margin: f32, on_action: impl Fn(ThemeAction) -> Message + 'a, ) -> Element<'a, Message, Theme, Renderer>
Examples found in repository?
examples/showcase/app.rs (lines 448-452)
433fn view(state: &Showcase) -> material::Element<'_, Message> {
434 let now = Instant::now();
435 let page_content = material::widget::snackbar::host(
436 pages::view(state),
437 &state.snackbar,
438 now,
439 "Photo archived",
440 "Undo",
441 Message::SnackbarUndo,
442 );
443
444 let content = navigation::suite(&NAV_DESTINATIONS, &state.navigation)
445 .layout(state.adaptive_navigation_layout())
446 .with_menu("Showcase", Message::MenuPressed)
447 .view(Message::Navigate, page_content);
448 let content = state.theme_controller.controls_over(
449 content,
450 theme_picker::bottom_margin(state.adaptive_navigation_layout()),
451 Message::ThemeChanged,
452 );
453
454 let content = material::widget::dialog::modal_animated(
455 content,
456 &state.alert_dialog,
457 now,
458 alert_dialog(state.alert_dialog.alpha(now)),
459 );
460
461 state.theme_controller.reveal_over(content, now)
462}Sourcepub fn reveal_over<'a, Message, Renderer>(
&self,
content: impl Into<Element<'a, Message, Theme, Renderer>>,
now: Instant,
) -> Element<'a, Message, Theme, Renderer>
pub fn reveal_over<'a, Message, Renderer>( &self, content: impl Into<Element<'a, Message, Theme, Renderer>>, now: Instant, ) -> Element<'a, Message, Theme, Renderer>
Examples found in repository?
examples/showcase/app.rs (line 461)
433fn view(state: &Showcase) -> material::Element<'_, Message> {
434 let now = Instant::now();
435 let page_content = material::widget::snackbar::host(
436 pages::view(state),
437 &state.snackbar,
438 now,
439 "Photo archived",
440 "Undo",
441 Message::SnackbarUndo,
442 );
443
444 let content = navigation::suite(&NAV_DESTINATIONS, &state.navigation)
445 .layout(state.adaptive_navigation_layout())
446 .with_menu("Showcase", Message::MenuPressed)
447 .view(Message::Navigate, page_content);
448 let content = state.theme_controller.controls_over(
449 content,
450 theme_picker::bottom_margin(state.adaptive_navigation_layout()),
451 Message::ThemeChanged,
452 );
453
454 let content = material::widget::dialog::modal_animated(
455 content,
456 &state.alert_dialog,
457 now,
458 alert_dialog(state.alert_dialog.alpha(now)),
459 );
460
461 state.theme_controller.reveal_over(content, now)
462}Trait Implementations§
Source§impl Clone for ThemeController
impl Clone for ThemeController
Source§fn clone(&self) -> ThemeController
fn clone(&self) -> ThemeController
Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl Debug for ThemeController
impl Debug for ThemeController
Auto Trait Implementations§
impl Freeze for ThemeController
impl RefUnwindSafe for ThemeController
impl Send for ThemeController
impl Sync for ThemeController
impl Unpin for ThemeController
impl UnsafeUnpin for ThemeController
impl UnwindSafe for ThemeController
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
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>
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)
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)
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> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<State, Message> IntoBoot<State, Message> for State
impl<State, Message> IntoBoot<State, Message> for State
Source§fn into_boot(self) -> (State, Task<Message>)
fn into_boot(self) -> (State, Task<Message>)
Turns some type into the initial state of some
Application.