feat: clickable images
This commit is contained in:
parent
7db44a3225
commit
b4d155808b
1 changed files with 23 additions and 15 deletions
|
|
@ -1,4 +1,4 @@
|
||||||
use std::{borrow::Cow, collections::HashMap, env, path::PathBuf};
|
use std::{borrow::Cow, collections::HashMap, env, path::PathBuf, process};
|
||||||
|
|
||||||
use iced::{Color, Element, Renderer, Task, Theme, application, theme, widget};
|
use iced::{Color, Element, Renderer, Task, Theme, application, theme, widget};
|
||||||
use ignore::{WalkBuilder, types::TypesBuilder};
|
use ignore::{WalkBuilder, types::TypesBuilder};
|
||||||
|
|
@ -10,18 +10,15 @@ use crate::SUPPORTED_TYPES;
|
||||||
enum Message {
|
enum Message {
|
||||||
LoadImage(PathBuf),
|
LoadImage(PathBuf),
|
||||||
UnloadImage(PathBuf),
|
UnloadImage(PathBuf),
|
||||||
|
|
||||||
|
OpenImage(PathBuf),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default)]
|
|
||||||
enum Mode {
|
|
||||||
Focused(PathBuf),
|
|
||||||
#[default]
|
|
||||||
Gallery,
|
|
||||||
}
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
struct State {
|
struct State {
|
||||||
mode: Mode,
|
|
||||||
images: HashMap<PathBuf, Option<widget::image::Handle>>,
|
images: HashMap<PathBuf, Option<widget::image::Handle>>,
|
||||||
|
|
||||||
|
error: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl State {
|
impl State {
|
||||||
|
|
@ -34,7 +31,7 @@ impl State {
|
||||||
builder.select("supportedImages");
|
builder.select("supportedImages");
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
mode: Mode::Gallery,
|
error: None,
|
||||||
images: WalkBuilder::new(
|
images: WalkBuilder::new(
|
||||||
env::args()
|
env::args()
|
||||||
.nth(1)
|
.nth(1)
|
||||||
|
|
@ -66,6 +63,14 @@ impl State {
|
||||||
Message::UnloadImage(path) => {
|
Message::UnloadImage(path) => {
|
||||||
self.images.entry(path).and_modify(|e| *e = None);
|
self.images.entry(path).and_modify(|e| *e = None);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Message::OpenImage(path) => {
|
||||||
|
self.error = process::Command::new("xdg-open")
|
||||||
|
.arg(path)
|
||||||
|
.spawn()
|
||||||
|
.map_err(|e| e.to_string())
|
||||||
|
.err()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Task::none()
|
Task::none()
|
||||||
|
|
@ -73,12 +78,15 @@ impl State {
|
||||||
fn view(&self) -> Element<'_, Message, Theme, Renderer> {
|
fn view(&self) -> Element<'_, Message, Theme, Renderer> {
|
||||||
widget::scrollable(
|
widget::scrollable(
|
||||||
widget::grid(self.images.iter().map(|(path, opt_handle)| {
|
widget::grid(self.images.iter().map(|(path, opt_handle)| {
|
||||||
widget::sensor(opt_handle.as_ref().map_or_else(
|
widget::mouse_area(
|
||||||
|| Element::from(widget::space()),
|
widget::sensor(opt_handle.as_ref().map_or_else(
|
||||||
|handle| widget::image(handle).into(),
|
|| Element::from(widget::space()),
|
||||||
))
|
|handle| widget::image(handle).into(),
|
||||||
.on_show(|_size| Message::LoadImage(path.clone()))
|
))
|
||||||
.on_hide(Message::UnloadImage(path.clone()))
|
.on_show(|_size| Message::LoadImage(path.clone()))
|
||||||
|
.on_hide(Message::UnloadImage(path.clone())),
|
||||||
|
)
|
||||||
|
.on_press(Message::OpenImage(path.clone()))
|
||||||
.into()
|
.into()
|
||||||
}))
|
}))
|
||||||
.fluid(500)
|
.fluid(500)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue