From feab96f323189ebae070a5d025531f86e436e21f Mon Sep 17 00:00:00 2001
From: Héctor Ramón Jiménez <hector@hecrj.dev>
Date: Thu, 15 Feb 2024 02:38:07 +0100
Subject: Add `push_maybe` to `Column` and `Row`

---
 examples/pane_grid/src/main.rs  | 55 +++++++++++++-------------
 examples/qr_code/src/main.rs    | 16 ++++----
 examples/screenshot/src/main.rs | 88 +++++++++++++++++++++--------------------
 examples/toast/src/main.rs      |  9 ++---
 examples/tour/src/main.rs       | 22 +++++------
 5 files changed, 95 insertions(+), 95 deletions(-)

(limited to 'examples')

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),
-- 
cgit