diff --git a/src/main.rs b/src/main.rs index b6b17b5..01d452d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,7 +5,13 @@ use cosmic::{ app::{message, Command, Core, Settings}, cosmic_config::{self, CosmicConfigEntry}, cosmic_theme, executor, - iced::{subscription::Subscription, widget::row, window, Alignment, Length, Point}, + iced::{ + event, + keyboard::{Event as KeyEvent, KeyCode, Modifiers}, + subscription::Subscription, + widget::row, + window, Alignment, Event, Length, Point, + }, style, widget::{self, segmented_button}, Application, ApplicationExt, Element, @@ -135,6 +141,7 @@ pub enum Message { AppTheme(AppTheme), Config(Config), Copy(Option), + KeyModifiers(Modifiers), MoveToTrash(Option), NewFile(Option), NewFolder(Option), @@ -176,6 +183,7 @@ pub struct App { config: Config, app_themes: Vec, context_page: ContextPage, + modifiers: Modifiers, } impl App { @@ -345,6 +353,7 @@ impl Application for App { config: flags.config, app_themes, context_page: ContextPage::Settings, + modifiers: Modifiers::empty(), }; let mut commands = Vec::new(); @@ -425,6 +434,9 @@ impl Application for App { Message::Copy(entity_opt) => { log::warn!("TODO: COPY"); } + Message::KeyModifiers(modifiers) => { + self.modifiers = modifiers; + } Message::MoveToTrash(entity_opt) => { log::warn!("TODO: MOVE TO TRASH"); } @@ -510,7 +522,7 @@ impl Application for App { let mut update_opt = None; match self.tab_model.data_mut::(entity) { Some(tab) => { - if tab.update(tab_message) { + if tab.update(tab_message, self.modifiers) { update_opt = Some((tab.title(), tab.location.clone())); } } @@ -682,6 +694,62 @@ impl Application for App { struct ThemeSubscription; Subscription::batch([ + event::listen_with(|event, _status| match event { + Event::Keyboard(KeyEvent::KeyPressed { + key_code: KeyCode::A, + modifiers, + }) => { + if modifiers == Modifiers::CTRL { + Some(Message::SelectAll(None)) + } else { + None + } + } + Event::Keyboard(KeyEvent::KeyPressed { + key_code: KeyCode::C, + modifiers, + }) => { + if modifiers == Modifiers::CTRL { + Some(Message::Copy(None)) + } else { + None + } + } + Event::Keyboard(KeyEvent::KeyPressed { + key_code: KeyCode::X, + modifiers, + }) => { + if modifiers == Modifiers::CTRL { + Some(Message::Copy(None)) + } else { + None + } + } + Event::Keyboard(KeyEvent::KeyPressed { + key_code: KeyCode::T, + modifiers, + }) => { + if modifiers == Modifiers::CTRL { + Some(Message::TabNew) + } else { + None + } + } + Event::Keyboard(KeyEvent::KeyPressed { + key_code: KeyCode::V, + modifiers, + }) => { + if modifiers == Modifiers::CTRL { + Some(Message::Paste(None)) + } else { + None + } + } + Event::Keyboard(KeyEvent::ModifiersChanged(modifiers)) => { + Some(Message::KeyModifiers(modifiers)) + } + _ => None, + }), cosmic_config::config_subscription( TypeId::of::(), Self::APP_ID.into(), diff --git a/src/tab.rs b/src/tab.rs index 95e33b5..a54a5a0 100644 --- a/src/tab.rs +++ b/src/tab.rs @@ -3,6 +3,7 @@ use cosmic::{ cosmic_theme, iced::{ alignment::{Horizontal, Vertical}, + keyboard::Modifiers, Alignment, Length, Point, }, theme, widget, Element, @@ -505,7 +506,7 @@ impl Tab { } } - pub fn update(&mut self, message: Message) -> bool { + pub fn update(&mut self, message: Message, modifiers: Modifiers) -> bool { let mut cd = None; match message { Message::Click(click_i_opt) => { @@ -541,6 +542,9 @@ impl Tab { } //TODO: prevent triple-click and beyond from opening file? item.click_time = Some(Instant::now()); + } else if modifiers.contains(Modifiers::CTRL) { + // Holding control allows multiple selection + item.click_time = None; } else { item.selected = false; item.click_time = None; @@ -564,7 +568,14 @@ impl Tab { if !items.get(click_i).map_or(false, |x| x.selected) { // If item not selected, clear selection on other items for (i, item) in items.iter_mut().enumerate() { - item.selected = i == click_i; + if i == click_i { + item.selected = true; + } else if modifiers.contains(Modifiers::CTRL) { + // Holding control allows multiple selection + } else { + item.selected = false; + } + item.click_time = None; } } }