Allow multiple selection when holding ctrl

This commit is contained in:
Jeremy Soller 2024-01-10 10:47:12 -07:00
parent 0708c0eb39
commit 35c08f469e
No known key found for this signature in database
GPG key ID: DCFCA852D3906975
2 changed files with 83 additions and 4 deletions

View file

@ -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<segmented_button::Entity>),
KeyModifiers(Modifiers),
MoveToTrash(Option<segmented_button::Entity>),
NewFile(Option<segmented_button::Entity>),
NewFolder(Option<segmented_button::Entity>),
@ -176,6 +183,7 @@ pub struct App {
config: Config,
app_themes: Vec<String>,
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::<Tab>(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::<ConfigSubscription>(),
Self::APP_ID.into(),

View file

@ -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;
}
}
}