refactor: map only used keybinds in subscription

this should improve efficiency

this is also largely motivated by all the `path.clone()` calls in view,
which concern me a lot.

reducing the number of used subscriptions should trigger view less,
but it's very far from a perfect solution
This commit is contained in:
electria 2026-11-03 12:08:24 -08:00
commit 8d1f93011e
Signed by: electria
SSH key fingerprint: SHA256:8LlB3ucPbBHqozqkhsNbaV5oG3SlzzqUj8FZDL6IPQs

View file

@ -33,9 +33,20 @@ enum Message {
OpenImage(PathBuf),
PickPath,
OpenPath(Option<PathBuf>),
KeyPressed(keyboard::Key, keyboard::Modifiers),
FocusNext,
FocusPrevious,
ScrollBy(f32),
CycleFilter,
IncreaseColumns,
DecreaseColumns,
Quit,
}
#[derive(Default)]
@ -129,67 +140,36 @@ impl State {
}
}
Message::KeyPressed(key, modifiers) => match key.as_ref() {
// input field cycling
keyboard::Key::Named(keyboard::key::Named::Tab) => {
return if modifiers.shift() {
widget::operation::focus_previous()
} else {
widget::operation::focus_next()
};
}
Message::FocusNext => return widget::operation::focus_next(),
Message::FocusPrevious => return widget::operation::focus_next(),
keyboard::Key::Character("o") => {
return Task::perform(
async { AsyncFileDialog::new().pick_folder().await.map(Into::into) },
Message::OpenPath,
);
}
Message::PickPath => {
return Task::perform(
async { AsyncFileDialog::new().pick_folder().await.map(Into::into) },
Message::OpenPath,
);
}
keyboard::Key::Character("j")
| keyboard::Key::Named(
keyboard::key::Named::ArrowDown | keyboard::key::Named::PageDown,
) => {
return widget::operation::scroll_by(
"main",
widget::operation::AbsoluteOffset {
x: 0.,
y: if modifiers.shift() { 500. } else { 100. },
},
);
}
keyboard::Key::Character("k")
| keyboard::Key::Named(
keyboard::key::Named::ArrowUp | keyboard::key::Named::PageUp,
) => {
return widget::operation::scroll_by(
"main",
widget::operation::AbsoluteOffset {
x: 0.,
y: if modifiers.shift() { -500. } else { -100. },
},
);
}
Message::ScrollBy(offset) => {
return widget::operation::scroll_by(
"main",
widget::operation::AbsoluteOffset { x: 0., y: offset },
);
}
keyboard::Key::Character("=" | "+") => {
self.columns = (self.columns + 1).clamp(1, 10)
}
keyboard::Key::Character("-" | "_") => {
self.columns = (self.columns - 1).clamp(1, 10)
}
Message::IncreaseColumns => self.columns = (self.columns + 1).clamp(1, 10),
Message::DecreaseColumns => 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,
}
Message::CycleFilter => {
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);
}
_ => {}
},
Message::Quit => {
return window::latest().and_then(window::close);
}
}
Task::none()
@ -240,7 +220,40 @@ impl State {
fn subscription(&self) -> Subscription<Message> {
event::listen().filter_map(|event| match event {
Event::Keyboard(keyboard::Event::KeyPressed { key, modifiers, .. }) => {
Some(Message::KeyPressed(key, modifiers))
match key.as_ref() {
// input field cycling
keyboard::Key::Named(keyboard::key::Named::Tab) => Some(if modifiers.shift() {
Message::FocusPrevious
} else {
Message::FocusNext
}),
keyboard::Key::Character("o") => Some(Message::PickPath),
keyboard::Key::Character("j")
| keyboard::Key::Named(
keyboard::key::Named::ArrowDown | keyboard::key::Named::PageDown,
) => Some(Message::ScrollBy(match modifiers.shift() {
false => 100.,
true => 500.,
})),
keyboard::Key::Character("k")
| keyboard::Key::Named(
keyboard::key::Named::ArrowUp | keyboard::key::Named::PageUp,
) => Some(Message::ScrollBy(match modifiers.shift() {
false => -100.,
true => -500.,
})),
keyboard::Key::Character("=" | "+") => Some(Message::IncreaseColumns),
keyboard::Key::Character("-" | "_") => Some(Message::DecreaseColumns),
keyboard::Key::Character("f") => Some(Message::CycleFilter),
keyboard::Key::Character("q") => Some(Message::Quit),
_ => None,
}
}
_ => None,
})