Compare commits

..
Author SHA1 Message Date
01f74bdf85
feat: filter method cycling
it doesn't work :(
2026-08-14 09:27:25 -07:00
da1e64d898
perf: use tokio
not sure how much this helps practically
2026-08-14 09:16:54 -07:00
3 changed files with 32 additions and 9 deletions

11
Cargo.lock generated
View file

@ -1429,6 +1429,7 @@ dependencies = [
"rayon",
"rfd",
"size",
"tokio",
"zip",
]
@ -1745,6 +1746,7 @@ dependencies = [
"iced_core",
"log",
"rustc-hash 2.1.3",
"tokio",
"wasm-bindgen-futures",
"wasmtimer",
]
@ -4259,6 +4261,15 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
name = "tokio"
version = "1.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed"
dependencies = [
"pin-project-lite",
]
[[package]]
name = "toml"
version = "1.1.4+spec-1.1.0"

View file

@ -10,11 +10,12 @@ kra-image-integration = "0.1.0"
rayon = "1.12.0"
rfd = "0.17.2"
size = "0.5.0"
tokio = "1.53.1"
zip = "8.6.0"
[dependencies.iced]
version = "0.14.0"
features = [ "image" ]
features = [ "image", "tokio" ]
[dependencies.image]
version = "0.25.10"

View file

@ -42,6 +42,8 @@ enum Message {
struct State {
images: BTreeMap<PathBuf, MaybeImage>,
filter: widget::image::FilterMethod,
columns: usize,
key: usize,
@ -53,10 +55,8 @@ impl State {
fn new() -> (Self, Task<Message>) {
(
Self {
images: BTreeMap::new(),
columns: 3,
key: 0,
error: None,
..Default::default()
},
Task::done(Message::OpenPath(Some(
env::args()
@ -75,9 +75,13 @@ impl State {
let size = 1000 / self.columns as u32;
let (task, handle) = Task::perform(
async move {
tokio::task::spawn_blocking(move || {
utils::load_thumbnail(&path, size)
.map(|img| (path, handle_from_image(img)))
.map_err(Arc::new)
})
.await
.unwrap()
},
Message::ImageLoaded,
)
@ -174,6 +178,13 @@ impl State {
self.columns = (self.columns - 1).clamp(1, 10)
}
keyboard::Key::Character("f") => {
self.filter = match self.filter {
widget::image::FilterMethod::Linear => widget::image::FilterMethod::Nearest,
widget::image::FilterMethod::Nearest => widget::image::FilterMethod::Linear,
}
}
keyboard::Key::Character("q") => {
return window::latest().and_then(window::close);
}
@ -191,10 +202,10 @@ impl State {
widget::container(
widget::sensor(maybe_image.handle().map_or_else(
|| Element::from(widget::space()),
|handle| widget::image(handle).into(),
|handle| widget::image(handle).filter_method(self.filter).into(),
))
.key(self.key)
.anticipate(2000)
.anticipate(500)
.on_show(|_size| Message::LoadImage(path.clone()))
.on_hide(Message::UnloadImage(path.clone())),
)