Support some key bindings in dialog
This commit is contained in:
parent
c82cda6ac6
commit
dabb3749f0
2 changed files with 29 additions and 3 deletions
|
|
@ -11,7 +11,7 @@ use cosmic::{
|
||||||
iced::{
|
iced::{
|
||||||
event,
|
event,
|
||||||
futures::{self, SinkExt},
|
futures::{self, SinkExt},
|
||||||
keyboard::{Event as KeyEvent, Modifiers},
|
keyboard::{Event as KeyEvent, Key, Modifiers},
|
||||||
subscription::{self, Subscription},
|
subscription::{self, Subscription},
|
||||||
window, Alignment, Event, Length, Size,
|
window, Alignment, Event, Length, Size,
|
||||||
},
|
},
|
||||||
|
|
@ -42,6 +42,7 @@ use crate::{
|
||||||
app::{Action, ContextPage, Message as AppMessage, PreviewItem, PreviewKind},
|
app::{Action, ContextPage, Message as AppMessage, PreviewItem, PreviewKind},
|
||||||
config::{Config, Favorite, IconSizes, TabConfig},
|
config::{Config, Favorite, IconSizes, TabConfig},
|
||||||
fl, home_dir,
|
fl, home_dir,
|
||||||
|
key_bind::key_binds,
|
||||||
localize::LANGUAGE_SORTER,
|
localize::LANGUAGE_SORTER,
|
||||||
menu,
|
menu,
|
||||||
mounter::{mounters, MounterItem, MounterItems, MounterKey, MounterMessage, Mounters},
|
mounter::{mounters, MounterItem, MounterItems, MounterKey, MounterMessage, Mounters},
|
||||||
|
|
@ -309,6 +310,7 @@ enum Message {
|
||||||
DialogUpdate(DialogPage),
|
DialogUpdate(DialogPage),
|
||||||
Filename(String),
|
Filename(String),
|
||||||
Filter(usize),
|
Filter(usize),
|
||||||
|
Key(Modifiers, Key),
|
||||||
Modifiers(Modifiers),
|
Modifiers(Modifiers),
|
||||||
MounterItems(MounterKey, MounterItems),
|
MounterItems(MounterKey, MounterItems),
|
||||||
NewFolder,
|
NewFolder,
|
||||||
|
|
@ -322,12 +324,14 @@ enum Message {
|
||||||
SearchSubmit,
|
SearchSubmit,
|
||||||
TabMessage(tab::Message),
|
TabMessage(tab::Message),
|
||||||
TabRescan(Vec<tab::Item>),
|
TabRescan(Vec<tab::Item>),
|
||||||
|
ToggleShowDetails,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<AppMessage> for Message {
|
impl From<AppMessage> for Message {
|
||||||
fn from(app_message: AppMessage) -> Message {
|
fn from(app_message: AppMessage) -> Message {
|
||||||
match app_message {
|
match app_message {
|
||||||
AppMessage::TabMessage(_entity_opt, tab_message) => Message::TabMessage(tab_message),
|
AppMessage::TabMessage(_entity_opt, tab_message) => Message::TabMessage(tab_message),
|
||||||
|
AppMessage::ToggleShowDetails => Message::ToggleShowDetails,
|
||||||
unsupported => {
|
unsupported => {
|
||||||
log::warn!("{unsupported:?} not supported in dialog mode");
|
log::warn!("{unsupported:?} not supported in dialog mode");
|
||||||
Message::None
|
Message::None
|
||||||
|
|
@ -725,7 +729,7 @@ impl Application for App {
|
||||||
search_id: widget::Id::unique(),
|
search_id: widget::Id::unique(),
|
||||||
search_input: String::new(),
|
search_input: String::new(),
|
||||||
tab,
|
tab,
|
||||||
key_binds: HashMap::new(),
|
key_binds: key_binds(),
|
||||||
watcher_opt: None,
|
watcher_opt: None,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -1056,6 +1060,13 @@ impl Application for App {
|
||||||
}
|
}
|
||||||
return self.rescan_tab();
|
return self.rescan_tab();
|
||||||
}
|
}
|
||||||
|
Message::Key(modifiers, key) => {
|
||||||
|
for (key_bind, action) in self.key_binds.iter() {
|
||||||
|
if key_bind.matches(modifiers, &key) {
|
||||||
|
return self.update(Message::from(action.message()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Message::Modifiers(modifiers) => {
|
Message::Modifiers(modifiers) => {
|
||||||
self.modifiers = modifiers;
|
self.modifiers = modifiers;
|
||||||
}
|
}
|
||||||
|
|
@ -1412,6 +1423,15 @@ impl Application for App {
|
||||||
// Reset focus on location change
|
// Reset focus on location change
|
||||||
return widget::text_input::focus(self.filename_id.clone());
|
return widget::text_input::focus(self.filename_id.clone());
|
||||||
}
|
}
|
||||||
|
Message::ToggleShowDetails => match self.context_page {
|
||||||
|
ContextPage::Preview(_, _) => {
|
||||||
|
self.core.window.show_context = !self.core.window.show_context;
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
self.context_page = ContextPage::Preview(None, PreviewKind::Selected);
|
||||||
|
self.core.window.show_context = true;
|
||||||
|
}
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
Command::none()
|
Command::none()
|
||||||
|
|
@ -1440,7 +1460,11 @@ impl Application for App {
|
||||||
fn subscription(&self) -> Subscription<Message> {
|
fn subscription(&self) -> Subscription<Message> {
|
||||||
struct WatcherSubscription;
|
struct WatcherSubscription;
|
||||||
let mut subscriptions = vec![
|
let mut subscriptions = vec![
|
||||||
event::listen_with(|event, _status| match event {
|
event::listen_with(|event, status| match event {
|
||||||
|
Event::Keyboard(KeyEvent::KeyPressed { key, modifiers, .. }) => match status {
|
||||||
|
event::Status::Ignored => Some(Message::Key(modifiers, key)),
|
||||||
|
event::Status::Captured => None,
|
||||||
|
},
|
||||||
Event::Keyboard(KeyEvent::ModifiersChanged(modifiers)) => {
|
Event::Keyboard(KeyEvent::ModifiersChanged(modifiers)) => {
|
||||||
Some(Message::Modifiers(modifiers))
|
Some(Message::Modifiers(modifiers))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -186,6 +186,8 @@ pub fn context_menu<'a>(
|
||||||
menu_item(fl!("open-item-location"), Action::OpenItemLocation).into(),
|
menu_item(fl!("open-item-location"), Action::OpenItemLocation).into(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
children.push(divider::horizontal::light().into());
|
||||||
|
children.push(menu_item(fl!("show-details"), Action::Preview).into());
|
||||||
} else {
|
} else {
|
||||||
if dialog_kind.save() {
|
if dialog_kind.save() {
|
||||||
children.push(menu_item(fl!("new-folder"), Action::NewFolder).into());
|
children.push(menu_item(fl!("new-folder"), Action::NewFolder).into());
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue