diff --git a/src/app/mod.rs b/src/app/mod.rs index a3ccbf1..4a1154e 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -33,9 +33,20 @@ enum Message { OpenImage(PathBuf), + PickPath, OpenPath(Option), - 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 { 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, })