Add push_maybe to Column and Row
This commit is contained in:
parent
e57668d677
commit
feab96f323
9 changed files with 144 additions and 95 deletions
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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![
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue