pub struct ModalDialogOptions {Show 18 fields
pub overlay_layout: LayoutStyle,
pub dialog_layout: LayoutStyle,
pub body_layout: LayoutStyle,
pub scrim_visual: UiVisual,
pub dialog_visual: UiVisual,
pub title_text_style: TextStyle,
pub body_visual: UiVisual,
pub z_index: i16,
pub modal: bool,
pub trap_focus: bool,
pub focus_restore: FocusRestoreTarget,
pub focus_wrap: bool,
pub portal: UiPortalTarget,
pub dismissal: DialogDismissal,
pub show_close_button: bool,
pub close_action: Option<WidgetActionBinding>,
pub accessibility_label: Option<String>,
pub accessibility_hint: Option<String>,
}Fields§
§overlay_layout: LayoutStyle§dialog_layout: LayoutStyle§body_layout: LayoutStyle§scrim_visual: UiVisual§dialog_visual: UiVisual§title_text_style: TextStyle§body_visual: UiVisual§z_index: i16§modal: bool§trap_focus: bool§focus_restore: FocusRestoreTarget§focus_wrap: bool§portal: UiPortalTarget§dismissal: DialogDismissal§close_action: Option<WidgetActionBinding>§accessibility_label: Option<String>§accessibility_hint: Option<String>Implementations§
Source§impl ModalDialogOptions
impl ModalDialogOptions
Sourcepub fn with_size(self, width: f32, height: f32) -> Self
pub fn with_size(self, width: f32, height: f32) -> Self
Examples found in repository?
examples/showcase.rs (line 7101)
6926fn overlay_widgets(ui: &mut UiDocument, parent: UiNodeId, state: &ShowcaseState) {
6927 let body =
6928 section_with_min_viewport(ui, parent, "overlays", "Overlays", UiSize::new(420.0, 0.0));
6929 let header = widgets::collapsing_header(
6930 ui,
6931 body,
6932 "overlays.collapsing",
6933 "Collapsing header",
6934 widgets::CollapsingHeaderOptions::default()
6935 .expanded(state.overlay_expanded)
6936 .with_toggle_action("overlays.collapsing.toggle"),
6937 );
6938 if let Some(panel) = header.body {
6939 widgets::label(
6940 ui,
6941 panel,
6942 "overlays.collapsing.body",
6943 "Expanded content lives under the header and remains part of normal layout.",
6944 text(12.0, color(196, 210, 230)),
6945 LayoutStyle::new().with_width_percent(1.0),
6946 );
6947 }
6948
6949 let controls = wrapping_row(ui, body, "overlays.controls", 8.0);
6950 button(
6951 ui,
6952 controls,
6953 "overlays.popup.toggle",
6954 if state.overlay_popup_open {
6955 "Close popup"
6956 } else {
6957 "Open popup"
6958 },
6959 "overlays.popup.toggle",
6960 button_visual(48, 112, 184),
6961 );
6962 button(
6963 ui,
6964 controls,
6965 "overlays.modal.open",
6966 "Open modal",
6967 "overlays.modal.open",
6968 button_visual(58, 78, 96),
6969 );
6970
6971 let tooltip = TooltipContent::new("Tooltip")
6972 .body("Tooltip boxes are overlay surfaces with title, body, and shortcut text.")
6973 .shortcut_label("Ctrl+K")
6974 .disabled_reason("Disabled reasons can be announced without changing the trigger.");
6975 let mut tooltip_options = widgets::TooltipBoxOptions::default()
6976 .with_layout(
6977 LayoutStyle::column()
6978 .with_width(280.0)
6979 .with_padding(8.0)
6980 .with_gap(4.0),
6981 )
6982 .with_animation(None);
6983 tooltip_options.layer = UiLayer::AppContent;
6984 tooltip_options.z_index = 0;
6985 widgets::tooltip_box(ui, body, "overlays.tooltip", tooltip, tooltip_options);
6986
6987 let tooltip_anchor = row(ui, body, "overlays.tooltip_anchor", 8.0);
6988 widgets::label(
6989 ui,
6990 tooltip_anchor,
6991 "overlays.tooltip_anchor.label",
6992 "Tooltip placement clamps to its viewport.",
6993 text(12.0, color(166, 176, 190)),
6994 LayoutStyle::new().with_width_percent(1.0),
6995 );
6996 let clamped_rect = widgets::tooltip::tooltip_rect(
6997 UiRect::new(328.0, 12.0, 54.0, 24.0),
6998 UiSize::new(176.0, 58.0),
6999 UiRect::new(0.0, 0.0, 420.0, 190.0),
7000 TooltipPlacement::Right,
7001 8.0,
7002 None,
7003 );
7004 let clamped_preview = ui.add_child(
7005 body,
7006 UiNode::container(
7007 "overlays.tooltip_rect.preview",
7008 LayoutStyle::new()
7009 .with_width_percent(1.0)
7010 .with_height(78.0)
7011 .with_flex_shrink(0.0),
7012 )
7013 .with_visual(UiVisual::panel(
7014 color(12, 16, 22),
7015 Some(StrokeStyle::new(color(52, 64, 80), 1.0)),
7016 4.0,
7017 )),
7018 );
7019 ui.add_child(
7020 clamped_preview,
7021 UiNode::scene(
7022 "overlays.tooltip_rect.scene",
7023 vec![
7024 ScenePrimitive::Rect(
7025 PaintRect::solid(UiRect::new(328.0, 12.0, 54.0, 24.0), color(48, 112, 184))
7026 .corner_radii(CornerRadii::uniform(3.0)),
7027 ),
7028 ScenePrimitive::Rect(
7029 PaintRect::solid(clamped_rect, color(24, 29, 38))
7030 .stroke(AlignedStroke::inside(StrokeStyle::new(
7031 color(92, 106, 128),
7032 1.0,
7033 )))
7034 .corner_radii(CornerRadii::uniform(4.0)),
7035 ),
7036 ],
7037 LayoutStyle::new()
7038 .with_width_percent(1.0)
7039 .with_height_percent(1.0),
7040 ),
7041 );
7042
7043 if state.overlay_popup_open {
7044 let popup = ext_widgets::popup_panel(
7045 ui,
7046 parent,
7047 "overlays.popup_panel",
7048 UiRect::new(18.0, 150.0, 220.0, 112.0),
7049 ext_widgets::PopupOptions {
7050 z_index: 20,
7051 portal: UiPortalTarget::Parent,
7052 accessibility: Some(
7053 AccessibilityMeta::new(AccessibilityRole::Dialog).label("Popup"),
7054 ),
7055 ..Default::default()
7056 },
7057 );
7058 let popup_body = ui.add_child(
7059 popup,
7060 UiNode::container(
7061 "overlays.popup_panel.body",
7062 LayoutStyle::column()
7063 .with_width_percent(1.0)
7064 .with_height_percent(1.0)
7065 .with_padding(10.0)
7066 .with_gap(6.0),
7067 ),
7068 );
7069 let popup_header = row(ui, popup_body, "overlays.popup_panel.header", 8.0);
7070 widgets::label(
7071 ui,
7072 popup_header,
7073 "overlays.popup_panel.label",
7074 "Popup panel",
7075 text(12.0, color(220, 228, 238)),
7076 LayoutStyle::new().with_width_percent(1.0),
7077 );
7078 let mut close = widgets::ButtonOptions::new(LayoutStyle::size(26.0, 22.0))
7079 .with_action("overlays.popup.close");
7080 close.visual = UiVisual::panel(color(28, 34, 43), None, 3.0);
7081 close.hovered_visual = Some(button_visual(54, 70, 92));
7082 close.text_style = text(12.0, color(220, 228, 238));
7083 widgets::button(ui, popup_header, "overlays.popup_panel.close", "x", close);
7084 widgets::label(
7085 ui,
7086 popup_body,
7087 "overlays.popup_panel.body_text",
7088 "Popup content is conditionally rendered.",
7089 text(11.0, color(196, 210, 230)),
7090 LayoutStyle::new().with_width_percent(1.0),
7091 );
7092 }
7093
7094 if state.overlay_modal_open {
7095 let modal = widgets::modal_dialog(
7096 ui,
7097 parent,
7098 "overlays.modal",
7099 "Modal dialog",
7100 widgets::ModalDialogOptions::default()
7101 .with_size(320.0, 180.0)
7102 .with_close_action("overlays.modal.close")
7103 .with_dismissal(ext_widgets::DialogDismissal::MODAL)
7104 .with_focus_restore(FocusRestoreTarget::Previous),
7105 );
7106 widgets::label(
7107 ui,
7108 modal.body,
7109 "overlays.modal.body.text",
7110 "Modal dialogs are portaled to the application overlay, include a scrim, and trap focus.",
7111 text(12.0, color(220, 228, 238)),
7112 LayoutStyle::new().with_width_percent(1.0),
7113 );
7114 button(
7115 ui,
7116 modal.body,
7117 "overlays.modal.body.close",
7118 "Close modal",
7119 "overlays.modal.close",
7120 button_visual(48, 112, 184),
7121 );
7122 }
7123}Sourcepub fn with_close_action(self, action: impl Into<WidgetActionBinding>) -> Self
pub fn with_close_action(self, action: impl Into<WidgetActionBinding>) -> Self
Examples found in repository?
examples/showcase.rs (line 7102)
6926fn overlay_widgets(ui: &mut UiDocument, parent: UiNodeId, state: &ShowcaseState) {
6927 let body =
6928 section_with_min_viewport(ui, parent, "overlays", "Overlays", UiSize::new(420.0, 0.0));
6929 let header = widgets::collapsing_header(
6930 ui,
6931 body,
6932 "overlays.collapsing",
6933 "Collapsing header",
6934 widgets::CollapsingHeaderOptions::default()
6935 .expanded(state.overlay_expanded)
6936 .with_toggle_action("overlays.collapsing.toggle"),
6937 );
6938 if let Some(panel) = header.body {
6939 widgets::label(
6940 ui,
6941 panel,
6942 "overlays.collapsing.body",
6943 "Expanded content lives under the header and remains part of normal layout.",
6944 text(12.0, color(196, 210, 230)),
6945 LayoutStyle::new().with_width_percent(1.0),
6946 );
6947 }
6948
6949 let controls = wrapping_row(ui, body, "overlays.controls", 8.0);
6950 button(
6951 ui,
6952 controls,
6953 "overlays.popup.toggle",
6954 if state.overlay_popup_open {
6955 "Close popup"
6956 } else {
6957 "Open popup"
6958 },
6959 "overlays.popup.toggle",
6960 button_visual(48, 112, 184),
6961 );
6962 button(
6963 ui,
6964 controls,
6965 "overlays.modal.open",
6966 "Open modal",
6967 "overlays.modal.open",
6968 button_visual(58, 78, 96),
6969 );
6970
6971 let tooltip = TooltipContent::new("Tooltip")
6972 .body("Tooltip boxes are overlay surfaces with title, body, and shortcut text.")
6973 .shortcut_label("Ctrl+K")
6974 .disabled_reason("Disabled reasons can be announced without changing the trigger.");
6975 let mut tooltip_options = widgets::TooltipBoxOptions::default()
6976 .with_layout(
6977 LayoutStyle::column()
6978 .with_width(280.0)
6979 .with_padding(8.0)
6980 .with_gap(4.0),
6981 )
6982 .with_animation(None);
6983 tooltip_options.layer = UiLayer::AppContent;
6984 tooltip_options.z_index = 0;
6985 widgets::tooltip_box(ui, body, "overlays.tooltip", tooltip, tooltip_options);
6986
6987 let tooltip_anchor = row(ui, body, "overlays.tooltip_anchor", 8.0);
6988 widgets::label(
6989 ui,
6990 tooltip_anchor,
6991 "overlays.tooltip_anchor.label",
6992 "Tooltip placement clamps to its viewport.",
6993 text(12.0, color(166, 176, 190)),
6994 LayoutStyle::new().with_width_percent(1.0),
6995 );
6996 let clamped_rect = widgets::tooltip::tooltip_rect(
6997 UiRect::new(328.0, 12.0, 54.0, 24.0),
6998 UiSize::new(176.0, 58.0),
6999 UiRect::new(0.0, 0.0, 420.0, 190.0),
7000 TooltipPlacement::Right,
7001 8.0,
7002 None,
7003 );
7004 let clamped_preview = ui.add_child(
7005 body,
7006 UiNode::container(
7007 "overlays.tooltip_rect.preview",
7008 LayoutStyle::new()
7009 .with_width_percent(1.0)
7010 .with_height(78.0)
7011 .with_flex_shrink(0.0),
7012 )
7013 .with_visual(UiVisual::panel(
7014 color(12, 16, 22),
7015 Some(StrokeStyle::new(color(52, 64, 80), 1.0)),
7016 4.0,
7017 )),
7018 );
7019 ui.add_child(
7020 clamped_preview,
7021 UiNode::scene(
7022 "overlays.tooltip_rect.scene",
7023 vec![
7024 ScenePrimitive::Rect(
7025 PaintRect::solid(UiRect::new(328.0, 12.0, 54.0, 24.0), color(48, 112, 184))
7026 .corner_radii(CornerRadii::uniform(3.0)),
7027 ),
7028 ScenePrimitive::Rect(
7029 PaintRect::solid(clamped_rect, color(24, 29, 38))
7030 .stroke(AlignedStroke::inside(StrokeStyle::new(
7031 color(92, 106, 128),
7032 1.0,
7033 )))
7034 .corner_radii(CornerRadii::uniform(4.0)),
7035 ),
7036 ],
7037 LayoutStyle::new()
7038 .with_width_percent(1.0)
7039 .with_height_percent(1.0),
7040 ),
7041 );
7042
7043 if state.overlay_popup_open {
7044 let popup = ext_widgets::popup_panel(
7045 ui,
7046 parent,
7047 "overlays.popup_panel",
7048 UiRect::new(18.0, 150.0, 220.0, 112.0),
7049 ext_widgets::PopupOptions {
7050 z_index: 20,
7051 portal: UiPortalTarget::Parent,
7052 accessibility: Some(
7053 AccessibilityMeta::new(AccessibilityRole::Dialog).label("Popup"),
7054 ),
7055 ..Default::default()
7056 },
7057 );
7058 let popup_body = ui.add_child(
7059 popup,
7060 UiNode::container(
7061 "overlays.popup_panel.body",
7062 LayoutStyle::column()
7063 .with_width_percent(1.0)
7064 .with_height_percent(1.0)
7065 .with_padding(10.0)
7066 .with_gap(6.0),
7067 ),
7068 );
7069 let popup_header = row(ui, popup_body, "overlays.popup_panel.header", 8.0);
7070 widgets::label(
7071 ui,
7072 popup_header,
7073 "overlays.popup_panel.label",
7074 "Popup panel",
7075 text(12.0, color(220, 228, 238)),
7076 LayoutStyle::new().with_width_percent(1.0),
7077 );
7078 let mut close = widgets::ButtonOptions::new(LayoutStyle::size(26.0, 22.0))
7079 .with_action("overlays.popup.close");
7080 close.visual = UiVisual::panel(color(28, 34, 43), None, 3.0);
7081 close.hovered_visual = Some(button_visual(54, 70, 92));
7082 close.text_style = text(12.0, color(220, 228, 238));
7083 widgets::button(ui, popup_header, "overlays.popup_panel.close", "x", close);
7084 widgets::label(
7085 ui,
7086 popup_body,
7087 "overlays.popup_panel.body_text",
7088 "Popup content is conditionally rendered.",
7089 text(11.0, color(196, 210, 230)),
7090 LayoutStyle::new().with_width_percent(1.0),
7091 );
7092 }
7093
7094 if state.overlay_modal_open {
7095 let modal = widgets::modal_dialog(
7096 ui,
7097 parent,
7098 "overlays.modal",
7099 "Modal dialog",
7100 widgets::ModalDialogOptions::default()
7101 .with_size(320.0, 180.0)
7102 .with_close_action("overlays.modal.close")
7103 .with_dismissal(ext_widgets::DialogDismissal::MODAL)
7104 .with_focus_restore(FocusRestoreTarget::Previous),
7105 );
7106 widgets::label(
7107 ui,
7108 modal.body,
7109 "overlays.modal.body.text",
7110 "Modal dialogs are portaled to the application overlay, include a scrim, and trap focus.",
7111 text(12.0, color(220, 228, 238)),
7112 LayoutStyle::new().with_width_percent(1.0),
7113 );
7114 button(
7115 ui,
7116 modal.body,
7117 "overlays.modal.body.close",
7118 "Close modal",
7119 "overlays.modal.close",
7120 button_visual(48, 112, 184),
7121 );
7122 }
7123}Sourcepub const fn with_dismissal(self, dismissal: DialogDismissal) -> Self
pub const fn with_dismissal(self, dismissal: DialogDismissal) -> Self
Examples found in repository?
examples/showcase.rs (line 7103)
6926fn overlay_widgets(ui: &mut UiDocument, parent: UiNodeId, state: &ShowcaseState) {
6927 let body =
6928 section_with_min_viewport(ui, parent, "overlays", "Overlays", UiSize::new(420.0, 0.0));
6929 let header = widgets::collapsing_header(
6930 ui,
6931 body,
6932 "overlays.collapsing",
6933 "Collapsing header",
6934 widgets::CollapsingHeaderOptions::default()
6935 .expanded(state.overlay_expanded)
6936 .with_toggle_action("overlays.collapsing.toggle"),
6937 );
6938 if let Some(panel) = header.body {
6939 widgets::label(
6940 ui,
6941 panel,
6942 "overlays.collapsing.body",
6943 "Expanded content lives under the header and remains part of normal layout.",
6944 text(12.0, color(196, 210, 230)),
6945 LayoutStyle::new().with_width_percent(1.0),
6946 );
6947 }
6948
6949 let controls = wrapping_row(ui, body, "overlays.controls", 8.0);
6950 button(
6951 ui,
6952 controls,
6953 "overlays.popup.toggle",
6954 if state.overlay_popup_open {
6955 "Close popup"
6956 } else {
6957 "Open popup"
6958 },
6959 "overlays.popup.toggle",
6960 button_visual(48, 112, 184),
6961 );
6962 button(
6963 ui,
6964 controls,
6965 "overlays.modal.open",
6966 "Open modal",
6967 "overlays.modal.open",
6968 button_visual(58, 78, 96),
6969 );
6970
6971 let tooltip = TooltipContent::new("Tooltip")
6972 .body("Tooltip boxes are overlay surfaces with title, body, and shortcut text.")
6973 .shortcut_label("Ctrl+K")
6974 .disabled_reason("Disabled reasons can be announced without changing the trigger.");
6975 let mut tooltip_options = widgets::TooltipBoxOptions::default()
6976 .with_layout(
6977 LayoutStyle::column()
6978 .with_width(280.0)
6979 .with_padding(8.0)
6980 .with_gap(4.0),
6981 )
6982 .with_animation(None);
6983 tooltip_options.layer = UiLayer::AppContent;
6984 tooltip_options.z_index = 0;
6985 widgets::tooltip_box(ui, body, "overlays.tooltip", tooltip, tooltip_options);
6986
6987 let tooltip_anchor = row(ui, body, "overlays.tooltip_anchor", 8.0);
6988 widgets::label(
6989 ui,
6990 tooltip_anchor,
6991 "overlays.tooltip_anchor.label",
6992 "Tooltip placement clamps to its viewport.",
6993 text(12.0, color(166, 176, 190)),
6994 LayoutStyle::new().with_width_percent(1.0),
6995 );
6996 let clamped_rect = widgets::tooltip::tooltip_rect(
6997 UiRect::new(328.0, 12.0, 54.0, 24.0),
6998 UiSize::new(176.0, 58.0),
6999 UiRect::new(0.0, 0.0, 420.0, 190.0),
7000 TooltipPlacement::Right,
7001 8.0,
7002 None,
7003 );
7004 let clamped_preview = ui.add_child(
7005 body,
7006 UiNode::container(
7007 "overlays.tooltip_rect.preview",
7008 LayoutStyle::new()
7009 .with_width_percent(1.0)
7010 .with_height(78.0)
7011 .with_flex_shrink(0.0),
7012 )
7013 .with_visual(UiVisual::panel(
7014 color(12, 16, 22),
7015 Some(StrokeStyle::new(color(52, 64, 80), 1.0)),
7016 4.0,
7017 )),
7018 );
7019 ui.add_child(
7020 clamped_preview,
7021 UiNode::scene(
7022 "overlays.tooltip_rect.scene",
7023 vec![
7024 ScenePrimitive::Rect(
7025 PaintRect::solid(UiRect::new(328.0, 12.0, 54.0, 24.0), color(48, 112, 184))
7026 .corner_radii(CornerRadii::uniform(3.0)),
7027 ),
7028 ScenePrimitive::Rect(
7029 PaintRect::solid(clamped_rect, color(24, 29, 38))
7030 .stroke(AlignedStroke::inside(StrokeStyle::new(
7031 color(92, 106, 128),
7032 1.0,
7033 )))
7034 .corner_radii(CornerRadii::uniform(4.0)),
7035 ),
7036 ],
7037 LayoutStyle::new()
7038 .with_width_percent(1.0)
7039 .with_height_percent(1.0),
7040 ),
7041 );
7042
7043 if state.overlay_popup_open {
7044 let popup = ext_widgets::popup_panel(
7045 ui,
7046 parent,
7047 "overlays.popup_panel",
7048 UiRect::new(18.0, 150.0, 220.0, 112.0),
7049 ext_widgets::PopupOptions {
7050 z_index: 20,
7051 portal: UiPortalTarget::Parent,
7052 accessibility: Some(
7053 AccessibilityMeta::new(AccessibilityRole::Dialog).label("Popup"),
7054 ),
7055 ..Default::default()
7056 },
7057 );
7058 let popup_body = ui.add_child(
7059 popup,
7060 UiNode::container(
7061 "overlays.popup_panel.body",
7062 LayoutStyle::column()
7063 .with_width_percent(1.0)
7064 .with_height_percent(1.0)
7065 .with_padding(10.0)
7066 .with_gap(6.0),
7067 ),
7068 );
7069 let popup_header = row(ui, popup_body, "overlays.popup_panel.header", 8.0);
7070 widgets::label(
7071 ui,
7072 popup_header,
7073 "overlays.popup_panel.label",
7074 "Popup panel",
7075 text(12.0, color(220, 228, 238)),
7076 LayoutStyle::new().with_width_percent(1.0),
7077 );
7078 let mut close = widgets::ButtonOptions::new(LayoutStyle::size(26.0, 22.0))
7079 .with_action("overlays.popup.close");
7080 close.visual = UiVisual::panel(color(28, 34, 43), None, 3.0);
7081 close.hovered_visual = Some(button_visual(54, 70, 92));
7082 close.text_style = text(12.0, color(220, 228, 238));
7083 widgets::button(ui, popup_header, "overlays.popup_panel.close", "x", close);
7084 widgets::label(
7085 ui,
7086 popup_body,
7087 "overlays.popup_panel.body_text",
7088 "Popup content is conditionally rendered.",
7089 text(11.0, color(196, 210, 230)),
7090 LayoutStyle::new().with_width_percent(1.0),
7091 );
7092 }
7093
7094 if state.overlay_modal_open {
7095 let modal = widgets::modal_dialog(
7096 ui,
7097 parent,
7098 "overlays.modal",
7099 "Modal dialog",
7100 widgets::ModalDialogOptions::default()
7101 .with_size(320.0, 180.0)
7102 .with_close_action("overlays.modal.close")
7103 .with_dismissal(ext_widgets::DialogDismissal::MODAL)
7104 .with_focus_restore(FocusRestoreTarget::Previous),
7105 );
7106 widgets::label(
7107 ui,
7108 modal.body,
7109 "overlays.modal.body.text",
7110 "Modal dialogs are portaled to the application overlay, include a scrim, and trap focus.",
7111 text(12.0, color(220, 228, 238)),
7112 LayoutStyle::new().with_width_percent(1.0),
7113 );
7114 button(
7115 ui,
7116 modal.body,
7117 "overlays.modal.body.close",
7118 "Close modal",
7119 "overlays.modal.close",
7120 button_visual(48, 112, 184),
7121 );
7122 }
7123}pub const fn with_focus_trap(self, trap_focus: bool) -> Self
Sourcepub const fn with_focus_restore(self, restore: FocusRestoreTarget) -> Self
pub const fn with_focus_restore(self, restore: FocusRestoreTarget) -> Self
Examples found in repository?
examples/showcase.rs (line 7104)
6926fn overlay_widgets(ui: &mut UiDocument, parent: UiNodeId, state: &ShowcaseState) {
6927 let body =
6928 section_with_min_viewport(ui, parent, "overlays", "Overlays", UiSize::new(420.0, 0.0));
6929 let header = widgets::collapsing_header(
6930 ui,
6931 body,
6932 "overlays.collapsing",
6933 "Collapsing header",
6934 widgets::CollapsingHeaderOptions::default()
6935 .expanded(state.overlay_expanded)
6936 .with_toggle_action("overlays.collapsing.toggle"),
6937 );
6938 if let Some(panel) = header.body {
6939 widgets::label(
6940 ui,
6941 panel,
6942 "overlays.collapsing.body",
6943 "Expanded content lives under the header and remains part of normal layout.",
6944 text(12.0, color(196, 210, 230)),
6945 LayoutStyle::new().with_width_percent(1.0),
6946 );
6947 }
6948
6949 let controls = wrapping_row(ui, body, "overlays.controls", 8.0);
6950 button(
6951 ui,
6952 controls,
6953 "overlays.popup.toggle",
6954 if state.overlay_popup_open {
6955 "Close popup"
6956 } else {
6957 "Open popup"
6958 },
6959 "overlays.popup.toggle",
6960 button_visual(48, 112, 184),
6961 );
6962 button(
6963 ui,
6964 controls,
6965 "overlays.modal.open",
6966 "Open modal",
6967 "overlays.modal.open",
6968 button_visual(58, 78, 96),
6969 );
6970
6971 let tooltip = TooltipContent::new("Tooltip")
6972 .body("Tooltip boxes are overlay surfaces with title, body, and shortcut text.")
6973 .shortcut_label("Ctrl+K")
6974 .disabled_reason("Disabled reasons can be announced without changing the trigger.");
6975 let mut tooltip_options = widgets::TooltipBoxOptions::default()
6976 .with_layout(
6977 LayoutStyle::column()
6978 .with_width(280.0)
6979 .with_padding(8.0)
6980 .with_gap(4.0),
6981 )
6982 .with_animation(None);
6983 tooltip_options.layer = UiLayer::AppContent;
6984 tooltip_options.z_index = 0;
6985 widgets::tooltip_box(ui, body, "overlays.tooltip", tooltip, tooltip_options);
6986
6987 let tooltip_anchor = row(ui, body, "overlays.tooltip_anchor", 8.0);
6988 widgets::label(
6989 ui,
6990 tooltip_anchor,
6991 "overlays.tooltip_anchor.label",
6992 "Tooltip placement clamps to its viewport.",
6993 text(12.0, color(166, 176, 190)),
6994 LayoutStyle::new().with_width_percent(1.0),
6995 );
6996 let clamped_rect = widgets::tooltip::tooltip_rect(
6997 UiRect::new(328.0, 12.0, 54.0, 24.0),
6998 UiSize::new(176.0, 58.0),
6999 UiRect::new(0.0, 0.0, 420.0, 190.0),
7000 TooltipPlacement::Right,
7001 8.0,
7002 None,
7003 );
7004 let clamped_preview = ui.add_child(
7005 body,
7006 UiNode::container(
7007 "overlays.tooltip_rect.preview",
7008 LayoutStyle::new()
7009 .with_width_percent(1.0)
7010 .with_height(78.0)
7011 .with_flex_shrink(0.0),
7012 )
7013 .with_visual(UiVisual::panel(
7014 color(12, 16, 22),
7015 Some(StrokeStyle::new(color(52, 64, 80), 1.0)),
7016 4.0,
7017 )),
7018 );
7019 ui.add_child(
7020 clamped_preview,
7021 UiNode::scene(
7022 "overlays.tooltip_rect.scene",
7023 vec![
7024 ScenePrimitive::Rect(
7025 PaintRect::solid(UiRect::new(328.0, 12.0, 54.0, 24.0), color(48, 112, 184))
7026 .corner_radii(CornerRadii::uniform(3.0)),
7027 ),
7028 ScenePrimitive::Rect(
7029 PaintRect::solid(clamped_rect, color(24, 29, 38))
7030 .stroke(AlignedStroke::inside(StrokeStyle::new(
7031 color(92, 106, 128),
7032 1.0,
7033 )))
7034 .corner_radii(CornerRadii::uniform(4.0)),
7035 ),
7036 ],
7037 LayoutStyle::new()
7038 .with_width_percent(1.0)
7039 .with_height_percent(1.0),
7040 ),
7041 );
7042
7043 if state.overlay_popup_open {
7044 let popup = ext_widgets::popup_panel(
7045 ui,
7046 parent,
7047 "overlays.popup_panel",
7048 UiRect::new(18.0, 150.0, 220.0, 112.0),
7049 ext_widgets::PopupOptions {
7050 z_index: 20,
7051 portal: UiPortalTarget::Parent,
7052 accessibility: Some(
7053 AccessibilityMeta::new(AccessibilityRole::Dialog).label("Popup"),
7054 ),
7055 ..Default::default()
7056 },
7057 );
7058 let popup_body = ui.add_child(
7059 popup,
7060 UiNode::container(
7061 "overlays.popup_panel.body",
7062 LayoutStyle::column()
7063 .with_width_percent(1.0)
7064 .with_height_percent(1.0)
7065 .with_padding(10.0)
7066 .with_gap(6.0),
7067 ),
7068 );
7069 let popup_header = row(ui, popup_body, "overlays.popup_panel.header", 8.0);
7070 widgets::label(
7071 ui,
7072 popup_header,
7073 "overlays.popup_panel.label",
7074 "Popup panel",
7075 text(12.0, color(220, 228, 238)),
7076 LayoutStyle::new().with_width_percent(1.0),
7077 );
7078 let mut close = widgets::ButtonOptions::new(LayoutStyle::size(26.0, 22.0))
7079 .with_action("overlays.popup.close");
7080 close.visual = UiVisual::panel(color(28, 34, 43), None, 3.0);
7081 close.hovered_visual = Some(button_visual(54, 70, 92));
7082 close.text_style = text(12.0, color(220, 228, 238));
7083 widgets::button(ui, popup_header, "overlays.popup_panel.close", "x", close);
7084 widgets::label(
7085 ui,
7086 popup_body,
7087 "overlays.popup_panel.body_text",
7088 "Popup content is conditionally rendered.",
7089 text(11.0, color(196, 210, 230)),
7090 LayoutStyle::new().with_width_percent(1.0),
7091 );
7092 }
7093
7094 if state.overlay_modal_open {
7095 let modal = widgets::modal_dialog(
7096 ui,
7097 parent,
7098 "overlays.modal",
7099 "Modal dialog",
7100 widgets::ModalDialogOptions::default()
7101 .with_size(320.0, 180.0)
7102 .with_close_action("overlays.modal.close")
7103 .with_dismissal(ext_widgets::DialogDismissal::MODAL)
7104 .with_focus_restore(FocusRestoreTarget::Previous),
7105 );
7106 widgets::label(
7107 ui,
7108 modal.body,
7109 "overlays.modal.body.text",
7110 "Modal dialogs are portaled to the application overlay, include a scrim, and trap focus.",
7111 text(12.0, color(220, 228, 238)),
7112 LayoutStyle::new().with_width_percent(1.0),
7113 );
7114 button(
7115 ui,
7116 modal.body,
7117 "overlays.modal.body.close",
7118 "Close modal",
7119 "overlays.modal.close",
7120 button_visual(48, 112, 184),
7121 );
7122 }
7123}pub const fn with_focus_wrap(self, wrap: bool) -> Self
pub fn with_portal(self, portal: UiPortalTarget) -> Self
pub fn modeless(self) -> Self
Trait Implementations§
Source§impl Clone for ModalDialogOptions
impl Clone for ModalDialogOptions
Source§fn clone(&self) -> ModalDialogOptions
fn clone(&self) -> ModalDialogOptions
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 ModalDialogOptions
impl Debug for ModalDialogOptions
Auto Trait Implementations§
impl Freeze for ModalDialogOptions
impl RefUnwindSafe for ModalDialogOptions
impl !Send for ModalDialogOptions
impl !Sync for ModalDialogOptions
impl Unpin for ModalDialogOptions
impl UnsafeUnpin for ModalDialogOptions
impl UnwindSafe for ModalDialogOptions
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.