examples/sctk_subsurface_img: Toggle image/subsurface with key

This commit is contained in:
Ian Douglas Scott 2025-05-09 15:55:50 -07:00 • committed by Ashley Wulber
parent 58f6ea3f08
commit 7a1f8b3472
No known key found for this signature in database
GPG key ID: 5216D4F46A90A820

View file

@ -4,7 +4,7 @@ use iced::{
self, Shmbuf, SubsurfaceBuffer, self, Shmbuf, SubsurfaceBuffer,
}, },
window::{self, Id, Settings}, window::{self, Id, Settings},
Element, Length, Subscription, Task, Element, Subscription, Task,
}; };
use image::{ImageReader, Pixel}; use image::{ImageReader, Pixel};
use rustix::{io::Errno, shm::ShmOFlags}; use rustix::{io::Errno, shm::ShmOFlags};
@ -41,11 +41,13 @@ fn main() -> iced::Result {
struct SubsurfaceApp { struct SubsurfaceApp {
path: String, path: String,
buffer: SubsurfaceBuffer, buffer: SubsurfaceBuffer,
use_subsurface: bool,
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub enum Message { pub enum Message {
Id(Id), Id(Id),
Toggle,
} }
impl SubsurfaceApp { impl SubsurfaceApp {
@ -71,7 +73,11 @@ impl SubsurfaceApp {
let buffer = SubsurfaceBuffer::new(Arc::new(shmbuf.into())).0; let buffer = SubsurfaceBuffer::new(Arc::new(shmbuf.into())).0;
( (
SubsurfaceApp { path, buffer }, SubsurfaceApp {
path,
buffer,
use_subsurface: true,
},
iced::window::open(Settings { iced::window::open(Settings {
..Default::default() ..Default::default()
}) })
@ -87,23 +93,44 @@ impl SubsurfaceApp {
fn update(&mut self, message: Message) -> Task<Message> { fn update(&mut self, message: Message) -> Task<Message> {
match message { match message {
Message::Id(_) => {} Message::Id(_) => {}
Message::Toggle => {
self.use_subsurface = !self.use_subsurface;
if self.use_subsurface {
println!("Using subsurface");
} else {
println!("Using image widget");
}
}
} }
Task::none() Task::none()
} }
fn view(&self, _id: window::Id) -> Element<Message> { fn view(&self, _id: window::Id) -> Element<Message> {
// TODO compare side-by-side with image widget; key bind to toggle? let image: Element<_> = if self.use_subsurface {
let image = subsurface_widget::Subsurface::new(self.buffer.clone()) subsurface_widget::Subsurface::new(self.buffer.clone())
.content_fit(iced::ContentFit::None); .content_fit(iced::ContentFit::None)
/* .into()
let image = iced::widget::image::Image::new(&self.path) } else {
.content_fit(iced::ContentFit::None); iced::widget::image::Image::new(&self.path)
*/ .content_fit(iced::ContentFit::None)
.into()
};
iced::widget::scrollable(image).into() iced::widget::scrollable(image).into()
} }
fn subscription(&self) -> Subscription<Message> { fn subscription(&self) -> Subscription<Message> {
Subscription::none() iced::event::listen_with(|evt, _status, _id| match evt {
iced::Event::Keyboard(iced::keyboard::Event::KeyReleased {
key,
..
}) => match key {
iced::keyboard::Key::Named(
iced::keyboard::key::Named::Space,
) => Some(Message::Toggle),
_ => None,
},
_ => None,
})
} }
} }