diff options
Diffstat (limited to '')
-rw-r--r-- | examples/pane_grid/src/main.rs | 55 | ||||
-rw-r--r-- | examples/qr_code/src/main.rs | 16 | ||||
-rw-r--r-- | examples/screenshot/src/main.rs | 88 | ||||
-rw-r--r-- | examples/toast/src/main.rs | 9 | ||||
-rw-r--r-- | examples/tour/src/main.rs | 22 | ||||
-rw-r--r-- | widget/src/column.rs | 12 | ||||
-rw-r--r-- | widget/src/helpers.rs | 12 | ||||
-rw-r--r-- | widget/src/keyed/column.rs | 13 | ||||
-rw-r--r-- | widget/src/row.rs | 12 |
9 files changed, 144 insertions, 95 deletions
diff --git a/examples/pane_grid/src/main.rs b/examples/pane_grid/src/main.rs index 742dc344..39719420 100644 --- a/examples/pane_grid/src/main.rs +++ b/examples/pane_grid/src/main.rs @@ -276,7 +276,7 @@ fn view_content<'a>( .on_press(message) }; - let mut controls = column![ + let controls = column![ button( "Split horizontally", Message::Split(pane_grid::Axis::Horizontal, pane), @@ -286,15 +286,16 @@ fn view_content<'a>( Message::Split(pane_grid::Axis::Vertical, pane), ) ] - .spacing(5) - .max_width(160); - - if total_panes > 1 && !is_pinned { - controls = controls.push( + .push_maybe(if total_panes > 1 && !is_pinned { + Some( button("Close", Message::Close(pane)) .style(theme::Button::Destructive), - ); - } + ) + } else { + None + }) + .spacing(5) + .max_width(160); let content = column![ text(format!("{}x{}", size.width, size.height)).size(24), @@ -317,31 +318,31 @@ fn view_controls<'a>( is_pinned: bool, is_maximized: bool, ) -> Element<'a, Message> { - let mut row = row![].spacing(5); + let row = row![].spacing(5).push_maybe(if total_panes > 1 { + let (content, message) = if is_maximized { + ("Restore", Message::Restore) + } else { + ("Maximize", Message::Maximize(pane)) + }; - if total_panes > 1 { - let toggle = { - let (content, message) = if is_maximized { - ("Restore", Message::Restore) - } else { - ("Maximize", Message::Maximize(pane)) - }; + Some( button(text(content).size(14)) .style(theme::Button::Secondary) .padding(3) - .on_press(message) - }; - - row = row.push(toggle); - } + .on_press(message), + ) + } else { + None + }); - let mut close = button(text("Close").size(14)) + let close = button(text("Close").size(14)) .style(theme::Button::Destructive) - .padding(3); - - if total_panes > 1 && !is_pinned { - close = close.on_press(Message::Close(pane)); - } + .padding(3) + .on_press_maybe(if total_panes > 1 && !is_pinned { + Some(Message::Close(pane)) + } else { + None + }); row.push(close).into() } diff --git a/examples/qr_code/src/main.rs b/examples/qr_code/src/main.rs index 9f75eaf6..36f79a31 100644 --- a/examples/qr_code/src/main.rs +++ b/examples/qr_code/src/main.rs @@ -1,5 +1,6 @@ -use iced::widget::qr_code::{self, QRCode}; -use iced::widget::{column, container, pick_list, row, text, text_input}; +use iced::widget::{ + column, container, pick_list, qr_code, row, text, text_input, +}; use iced::{Alignment, Element, Length, Sandbox, Settings, Theme}; pub fn main() -> iced::Result { @@ -65,15 +66,16 @@ impl Sandbox for QRGenerator { .spacing(10) .align_items(Alignment::Center); - let mut content = column![title, input, choose_theme] + let content = column![title, input, choose_theme] + .push_maybe( + self.qr_code + .as_ref() + .map(|data| qr_code(data).cell_size(10)), + ) .width(700) .spacing(20) .align_items(Alignment::Center); - if let Some(qr_code) = self.qr_code.as_ref() { - content = content.push(QRCode::new(qr_code).cell_size(10)); - } - container(content) .width(Length::Fill) .height(Length::Fill) diff --git a/examples/screenshot/src/main.rs b/examples/screenshot/src/main.rs index 64aa1a7a..79749956 100644 --- a/examples/screenshot/src/main.rs +++ b/examples/screenshot/src/main.rs @@ -183,58 +183,60 @@ impl Application for Example { .spacing(10) .align_items(Alignment::Center); - let mut crop_controls = + let crop_controls = column![crop_origin_controls, crop_dimension_controls] + .push_maybe( + self.crop_error + .as_ref() + .map(|error| text(format!("Crop error! \n{error}"))), + ) .spacing(10) .align_items(Alignment::Center); - if let Some(crop_error) = &self.crop_error { - crop_controls = - crop_controls.push(text(format!("Crop error! \n{crop_error}"))); - } + let controls = { + let save_result = + self.saved_png_path.as_ref().map( + |png_result| match png_result { + Ok(path) => format!("Png saved as: {path:?}!"), + Err(PngError(error)) => { + format!("Png could not be saved due to:\n{}", error) + } + }, + ); - let mut controls = column![ column![ - button(centered_text("Screenshot!")) + column![ + button(centered_text("Screenshot!")) + .padding([10, 20, 10, 20]) + .width(Length::Fill) + .on_press(Message::Screenshot), + if !self.png_saving { + button(centered_text("Save as png")).on_press_maybe( + self.screenshot.is_some().then(|| Message::Png), + ) + } else { + button(centered_text("Saving...")) + .style(theme::Button::Secondary) + } + .style(theme::Button::Secondary) .padding([10, 20, 10, 20]) .width(Length::Fill) - .on_press(Message::Screenshot), - if !self.png_saving { - button(centered_text("Save as png")).on_press_maybe( - self.screenshot.is_some().then(|| Message::Png), - ) - } else { - button(centered_text("Saving...")) - .style(theme::Button::Secondary) - } - .style(theme::Button::Secondary) - .padding([10, 20, 10, 20]) - .width(Length::Fill) - ] - .spacing(10), - column![ - crop_controls, - button(centered_text("Crop")) - .on_press(Message::Crop) - .style(theme::Button::Destructive) - .padding([10, 20, 10, 20]) - .width(Length::Fill), + ] + .spacing(10), + column![ + crop_controls, + button(centered_text("Crop")) + .on_press(Message::Crop) + .style(theme::Button::Destructive) + .padding([10, 20, 10, 20]) + .width(Length::Fill), + ] + .spacing(10) + .align_items(Alignment::Center), ] - .spacing(10) - .align_items(Alignment::Center), - ] - .spacing(40); - - if let Some(png_result) = &self.saved_png_path { - let msg = match png_result { - Ok(path) => format!("Png saved as: {path:?}!"), - Err(PngError(error)) => { - format!("Png could not be saved due to:\n{}", error) - } - }; - - controls = controls.push(text(msg)); - } + .push_maybe(save_result.map(text)) + .spacing(40) + }; let side_content = container(controls) .align_x(alignment::Horizontal::Center) diff --git a/examples/toast/src/main.rs b/examples/toast/src/main.rs index ae947acb..c1d29193 100644 --- a/examples/toast/src/main.rs +++ b/examples/toast/src/main.rs @@ -111,11 +111,10 @@ impl Application for App { column![text(title).size(14), content].spacing(5) }; - let mut add_toast = button("Add Toast"); - - if !self.editing.body.is_empty() && !self.editing.title.is_empty() { - add_toast = add_toast.on_press(Message::Add); - } + let add_toast = button("Add Toast").on_press_maybe( + (!self.editing.body.is_empty() && !self.editing.title.is_empty()) + .then_some(Message::Add), + ); let content = container( column![ diff --git a/examples/tour/src/main.rs b/examples/tour/src/main.rs index 509f46e7..588abbe8 100644 --- a/examples/tour/src/main.rs +++ b/examples/tour/src/main.rs @@ -56,22 +56,18 @@ impl Sandbox for Tour { fn view(&self) -> Element<Message> { let Tour { steps, .. } = self; - let mut controls = row![]; - - if steps.has_previous() { - controls = controls.push( + let controls = row![] + .push_maybe(steps.has_previous().then(|| { button("Back") .on_press(Message::BackPressed) - .style(theme::Button::Secondary), + .style(theme::Button::Secondary) + })) + .push(horizontal_space()) + .push_maybe( + steps + .can_continue() + .then(|| button("Next").on_press(Message::NextPressed)), ); - } - - controls = controls.push(horizontal_space()); - - if steps.can_continue() { - controls = - controls.push(button("Next").on_press(Message::NextPressed)); - } let content: Element<_> = column![ steps.view(self.debug).map(Message::StepMessage), diff --git a/widget/src/column.rs b/widget/src/column.rs index 8154ad85..b9eb5d93 100644 --- a/widget/src/column.rs +++ b/widget/src/column.rs @@ -115,6 +115,18 @@ where self.children.push(child); self } + + /// Adds an element to the [`Column`], if `Some`. + pub fn push_maybe( + self, + child: Option<impl Into<Element<'a, Message, Theme, Renderer>>>, + ) -> Self { + if let Some(child) = child { + self.push(child) + } else { + self + } + } } impl<'a, Message, Renderer> Default for Column<'a, Message, Renderer> diff --git a/widget/src/helpers.rs b/widget/src/helpers.rs index 400fced5..6ae35aee 100644 --- a/widget/src/helpers.rs +++ b/widget/src/helpers.rs @@ -387,6 +387,18 @@ where crate::Canvas::new(program) } +/// Creates a new [`QRCode`] widget from the given [`Data`]. +/// +/// [`Svg`]: crate::QRCode +/// [`Data`]: crate::qr_code::Data +#[cfg(feature = "qr_code")] +pub fn qr_code<Theme>(data: &crate::qr_code::Data) -> crate::QRCode<'_, Theme> +where + Theme: crate::qr_code::StyleSheet, +{ + crate::QRCode::new(data) +} + /// Creates a new [`Shader`]. /// /// [`Shader`]: crate::Shader diff --git a/widget/src/keyed/column.rs b/widget/src/keyed/column.rs index 88a6e503..ce74e701 100644 --- a/widget/src/keyed/column.rs +++ b/widget/src/keyed/column.rs @@ -124,6 +124,19 @@ where self.children.push(child); self } + + /// Adds an element to the [`Column`], if `Some`. + pub fn push_maybe( + self, + key: Key, + child: Option<impl Into<Element<'a, Message, Theme, Renderer>>>, + ) -> Self { + if let Some(child) = child { + self.push(key, child) + } else { + self + } + } } impl<'a, Key, Message, Renderer> Default for Column<'a, Key, Message, Renderer> diff --git a/widget/src/row.rs b/widget/src/row.rs index 735fbbc0..20b47a41 100644 --- a/widget/src/row.rs +++ b/widget/src/row.rs @@ -106,6 +106,18 @@ where self.children.push(child); self } + + /// Adds an element to the [`Row`], if `Some`. + pub fn push_maybe( + self, + child: Option<impl Into<Element<'a, Message, Theme, Renderer>>>, + ) -> Self { + if let Some(child) = child { + self.push(child) + } else { + self + } + } } impl<'a, Message, Renderer> Default for Row<'a, Message, Renderer> |