Skip to content

Commit aa893b6

Browse files
committed
Accessibility/UX: bind the Context and Ctrl+C key bindings to the history and favorites menus (issues #245 and #200)
1 parent 2cb4b89 commit aa893b6

File tree

2 files changed

+57
-33
lines changed

2 files changed

+57
-33
lines changed

src/gui/context_menu.rs

Lines changed: 49 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
use gdk::Rectangle;
1+
use gdk::{Key, ModifierType, Rectangle};
22
use gio::prelude::*;
3+
use glib::Propagation;
34
use gtk::glib::clone;
45
use gtk::prelude::*;
56

6-
use log::{debug, error, info};
7+
use log::{error, info};
78
use percent_encoding::{utf8_percent_encode, NON_ALPHANUMERIC};
89
use std::cell::RefCell;
910
use std::rc::Rc;
@@ -23,50 +24,70 @@ impl ContextMenuUtil {
2324
ctx_selected_item: Rc<RefCell<Option<HistoryEntry>>>,
2425
favorites: Rc<RefCell<FavoritesInterface>>,
2526
) {
26-
// TODO BIND THE CONTEXT KEY + CTRL+C CLOSURES
27+
// WIP BIND THE CONTEXT KEY + CTRL+C CLOSURES
2728

28-
// (Use Gtk.ShortcutManager perhaps?)
29+
let controller = gtk::EventControllerKey::new();
2930

30-
/*
3131
let selection: gtk::SingleSelection = column_view
3232
.model()
3333
.unwrap()
3434
.downcast::<gtk::SingleSelection>()
3535
.unwrap();
3636

37-
let context_key_closure = clone!(
37+
controller.connect_key_pressed(clone!(
3838
#[weak]
3939
column_view,
4040
#[weak]
4141
popover_menu,
4242
#[weak]
4343
selection,
44-
move |_: &gtk::GestureClick, _n_press, x, y| {
44+
#[upgrade_or]
45+
Propagation::Proceed,
46+
move |_event, key_val, _key_code, modifier| {
4547
// gesture.set_state(gtk::EventSequenceState::Claimed);
46-
debug!("Selected item: {:?}", selection.selected_item());
47-
if let Some(record) = selection.selected_item() {
48-
let record = record.downcast::<HistoryEntry>().unwrap();
49-
debug!(" => {}", record.song_name());
50-
51-
*ctx_selected_item.borrow_mut() = Some(record.clone());
52-
53-
let unfaved_model: gio::Menu = builder.object("history_context_model").unwrap();
54-
let faved_model: gio::Menu =
55-
builder.object("history_context_model_faved").unwrap();
56-
if favorites.borrow().is_favorite(record.get_song()) {
57-
popover_menu.set_menu_model(Some(&faved_model));
58-
} else {
59-
popover_menu.set_menu_model(Some(&unfaved_model));
60-
}
48+
if key_val == Key::Menu {
49+
if let Some(record) = selection.selected_item() {
50+
let record = record.downcast::<HistoryEntry>().unwrap();
51+
52+
*ctx_selected_item.borrow_mut() = Some(record.clone());
53+
54+
let unfaved_model: gio::Menu =
55+
builder.object("history_context_model").unwrap();
56+
let faved_model: gio::Menu =
57+
builder.object("history_context_model_faved").unwrap();
58+
if favorites.borrow().is_favorite(record.get_song()) {
59+
popover_menu.set_menu_model(Some(&faved_model));
60+
} else {
61+
popover_menu.set_menu_model(Some(&unfaved_model));
62+
}
6163

62-
popover_menu.unparent();
63-
popover_menu.set_parent(&column_view);
64-
popover_menu.set_pointing_to(Some(&Rectangle::new(x as i32, y as i32, 1, 1)));
65-
popover_menu.popup();
64+
popover_menu.unparent();
65+
popover_menu.set_has_arrow(false);
66+
popover_menu.set_parent(&column_view);
67+
popover_menu.set_pointing_to(Some(&Rectangle::new(
68+
0, // popover_menu.size(gtk::Orientation::Horizontal) as i32,
69+
0, 1, 1,
70+
)));
71+
popover_menu.popup();
72+
}
73+
Propagation::Stop
74+
} else if key_val == Key::C
75+
&& (modifier.contains(ModifierType::CONTROL_MASK)
76+
|| modifier.contains(ModifierType::META_MASK))
77+
{
78+
if let Some(display) = gdk::Display::default() {
79+
if let Some(record) = selection.selected_item() {
80+
let record = record.downcast::<HistoryEntry>().unwrap();
81+
display.clipboard().set(&record.song_name());
82+
}
83+
}
84+
Propagation::Stop
85+
} else {
86+
Propagation::Proceed
6687
}
6788
}
68-
);
69-
*/
89+
));
90+
column_view.add_controller(controller);
7091

7192
/* selection.connect_selection_changed(move |selection, _, _| {
7293
if let Some(item) = selection.selected_item() {

src/gui/main_window.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -391,11 +391,11 @@ impl App {
391391
let ctx_selected_item = ctx_selected_item.clone();
392392

393393
let cell = values[1].get::<gtk::ColumnViewCell>().unwrap();
394-
let column_view = values[0]
395-
.get::<gtk::ColumnViewColumn>()
396-
.unwrap()
397-
.column_view()
398-
.unwrap();
394+
/* let column_view = values[0]
395+
.get::<gtk::ColumnViewColumn>()
396+
.unwrap()
397+
.column_view()
398+
.unwrap(); */
399399

400400
let label = gtk::Label::new(None);
401401
label.set_xalign(0.0);
@@ -419,6 +419,8 @@ impl App {
419419

420420
*ctx_selected_item.borrow_mut() = Some(record.clone());
421421

422+
// TODO select/focus the item in UI here?
423+
422424
let unfaved_model: gio::Menu =
423425
builder.object("history_context_model").unwrap();
424426
let faved_model: gio::Menu =
@@ -430,6 +432,7 @@ impl App {
430432
}
431433

432434
popover_menu.unparent();
435+
popover_menu.set_has_arrow(true);
433436
popover_menu.set_parent(&label);
434437
popover_menu
435438
.set_pointing_to(Some(&Rectangle::new(x as i32, y as i32, 1, 1)));

0 commit comments

Comments
 (0)