summaryrefslogtreecommitdiffstats
path: root/examples/screenshot/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'examples/screenshot/src/main.rs')
-rw-r--r--examples/screenshot/src/main.rs103
1 files changed, 51 insertions, 52 deletions
diff --git a/examples/screenshot/src/main.rs b/examples/screenshot/src/main.rs
index acde8367..5c105f6c 100644
--- a/examples/screenshot/src/main.rs
+++ b/examples/screenshot/src/main.rs
@@ -1,10 +1,10 @@
-use iced::alignment;
use iced::keyboard;
use iced::widget::{button, column, container, image, row, text, text_input};
use iced::window;
use iced::window::screenshot::{self, Screenshot};
use iced::{
- Alignment, ContentFit, Element, Length, Rectangle, Subscription, Task,
+ Center, ContentFit, Element, Fill, FillPortion, Rectangle, Subscription,
+ Task,
};
use ::image as img;
@@ -20,7 +20,7 @@ fn main() -> iced::Result {
#[derive(Default)]
struct Example {
- screenshot: Option<Screenshot>,
+ screenshot: Option<(Screenshot, image::Handle)>,
saved_png_path: Option<Result<String, PngError>>,
png_saving: bool,
crop_error: Option<screenshot::CropError>,
@@ -52,10 +52,17 @@ impl Example {
.map(Message::Screenshotted);
}
Message::Screenshotted(screenshot) => {
- self.screenshot = Some(screenshot);
+ self.screenshot = Some((
+ screenshot.clone(),
+ image::Handle::from_rgba(
+ screenshot.size.width,
+ screenshot.size.height,
+ screenshot.bytes,
+ ),
+ ));
}
Message::Png => {
- if let Some(screenshot) = &self.screenshot {
+ if let Some((screenshot, _handle)) = &self.screenshot {
self.png_saving = true;
return Task::perform(
@@ -81,7 +88,7 @@ impl Example {
self.height_input_value = new_value;
}
Message::Crop => {
- if let Some(screenshot) = &self.screenshot {
+ if let Some((screenshot, _handle)) = &self.screenshot {
let cropped = screenshot.crop(Rectangle::<u32> {
x: self.x_input_value.unwrap_or(0),
y: self.y_input_value.unwrap_or(0),
@@ -91,7 +98,14 @@ impl Example {
match cropped {
Ok(screenshot) => {
- self.screenshot = Some(screenshot);
+ self.screenshot = Some((
+ screenshot.clone(),
+ image::Handle::from_rgba(
+ screenshot.size.width,
+ screenshot.size.height,
+ screenshot.bytes,
+ ),
+ ));
self.crop_error = None;
}
Err(crop_error) => {
@@ -106,53 +120,41 @@ impl Example {
}
fn view(&self) -> Element<'_, Message> {
- let image: Element<Message> = if let Some(screenshot) = &self.screenshot
- {
- image(image::Handle::from_rgba(
- screenshot.size.width,
- screenshot.size.height,
- screenshot.clone(),
- ))
- .content_fit(ContentFit::Contain)
- .width(Length::Fill)
- .height(Length::Fill)
- .into()
- } else {
- text("Press the button to take a screenshot!").into()
- };
+ let image: Element<Message> =
+ if let Some((_screenshot, handle)) = &self.screenshot {
+ image(handle)
+ .content_fit(ContentFit::Contain)
+ .width(Fill)
+ .height(Fill)
+ .into()
+ } else {
+ text("Press the button to take a screenshot!").into()
+ };
let image = container(image)
- .center_y(Length::FillPortion(2))
+ .center_y(FillPortion(2))
.padding(10)
.style(container::rounded_box);
let crop_origin_controls = row![
- text("X:")
- .vertical_alignment(alignment::Vertical::Center)
- .width(30),
+ text("X:").width(30),
numeric_input("0", self.x_input_value).map(Message::XInputChanged),
- text("Y:")
- .vertical_alignment(alignment::Vertical::Center)
- .width(30),
+ text("Y:").width(30),
numeric_input("0", self.y_input_value).map(Message::YInputChanged)
]
.spacing(10)
- .align_items(Alignment::Center);
+ .align_y(Center);
let crop_dimension_controls = row![
- text("W:")
- .vertical_alignment(alignment::Vertical::Center)
- .width(30),
+ text("W:").width(30),
numeric_input("0", self.width_input_value)
.map(Message::WidthInputChanged),
- text("H:")
- .vertical_alignment(alignment::Vertical::Center)
- .width(30),
+ text("H:").width(30),
numeric_input("0", self.height_input_value)
.map(Message::HeightInputChanged)
]
.spacing(10)
- .align_items(Alignment::Center);
+ .align_y(Center);
let crop_controls =
column![crop_origin_controls, crop_dimension_controls]
@@ -162,7 +164,7 @@ impl Example {
.map(|error| text!("Crop error! \n{error}")),
)
.spacing(10)
- .align_items(Alignment::Center);
+ .align_x(Center);
let controls = {
let save_result =
@@ -178,8 +180,8 @@ impl Example {
column![
column![
button(centered_text("Screenshot!"))
- .padding([10, 20, 10, 20])
- .width(Length::Fill)
+ .padding([10, 20])
+ .width(Fill)
.on_press(Message::Screenshot),
if !self.png_saving {
button(centered_text("Save as png")).on_press_maybe(
@@ -190,8 +192,8 @@ impl Example {
.style(button::secondary)
}
.style(button::secondary)
- .padding([10, 20, 10, 20])
- .width(Length::Fill)
+ .padding([10, 20])
+ .width(Fill)
]
.spacing(10),
column![
@@ -199,23 +201,23 @@ impl Example {
button(centered_text("Crop"))
.on_press(Message::Crop)
.style(button::danger)
- .padding([10, 20, 10, 20])
- .width(Length::Fill),
+ .padding([10, 20])
+ .width(Fill),
]
.spacing(10)
- .align_items(Alignment::Center),
+ .align_x(Center),
]
.push_maybe(save_result.map(text))
.spacing(40)
};
- let side_content = container(controls).center_y(Length::Fill);
+ let side_content = container(controls).center_y(Fill);
let content = row![side_content, image]
.spacing(10)
- .width(Length::Fill)
- .height(Length::Fill)
- .align_items(Alignment::Center);
+ .width(Fill)
+ .height(Fill)
+ .align_y(Center);
container(content).padding(10).into()
}
@@ -276,8 +278,5 @@ fn numeric_input(
}
fn centered_text(content: &str) -> Element<'_, Message> {
- text(content)
- .width(Length::Fill)
- .horizontal_alignment(alignment::Horizontal::Center)
- .into()
+ text(content).width(Fill).align_x(Center).into()
}