Add push_maybe to Column and Row

This commit is contained in:
Héctor Ramón Jiménez 2024-02-15 02:38:07 +01:00
parent e57668d677
commit feab96f323
No known key found for this signature in database
GPG key ID: 7CC46565708259A7
9 changed files with 144 additions and 95 deletions

View file

@ -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)
};
.on_press(message),
)
} else {
None
});
row = row.push(toggle);
}
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()
}

View file

@ -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)

View file

@ -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)
.align_items(Alignment::Center),
]
.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(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)

View file

@ -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![

View file

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

View file

@ -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>

View file

@ -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

View file

@ -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>

View file

@ -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>