Skip to content

Commit 853f101

Browse files
committed
Move back history menu key binding-related code to "context_menu.rs", correctly handle Ctrl+C when caps lock is not set
1 parent aa893b6 commit 853f101

File tree

2 files changed

+64
-52
lines changed

2 files changed

+64
-52
lines changed

src/gui/context_menu.rs

Lines changed: 58 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use glib::Propagation;
44
use gtk::glib::clone;
55
use gtk::prelude::*;
66

7-
use log::{error, info};
7+
use log::{debug, error, info};
88
use percent_encoding::{utf8_percent_encode, NON_ALPHANUMERIC};
99
use std::cell::RefCell;
1010
use std::rc::Rc;
@@ -17,7 +17,62 @@ use crate::gui::song_history_interface::{RecognitionHistoryInterface, SongRecord
1717
pub struct ContextMenuUtil;
1818

1919
impl ContextMenuUtil {
20-
pub fn connect_menu(
20+
pub fn connect_menu_mouse_actions(
21+
builder: gtk::Builder,
22+
cell: gtk::ColumnViewCell,
23+
label: gtk::Label,
24+
popover_menu: gtk::PopoverMenu,
25+
ctx_selected_item: Rc<RefCell<Option<HistoryEntry>>>,
26+
favorites: Rc<RefCell<FavoritesInterface>>,
27+
) {
28+
let touch_closure = clone!(
29+
#[weak]
30+
cell,
31+
#[weak]
32+
label,
33+
#[weak]
34+
popover_menu,
35+
move |_: &gtk::GestureClick, _n_press, x, y| {
36+
let entry = cell.item();
37+
// gesture.set_state(gtk::EventSequenceState::Claimed);
38+
debug!("Selected item: {:?}", entry);
39+
if let Some(record) = entry {
40+
let record = record.downcast::<HistoryEntry>().unwrap();
41+
debug!(" => {}", record.song_name());
42+
43+
*ctx_selected_item.borrow_mut() = Some(record.clone());
44+
45+
let unfaved_model: gio::Menu = builder.object("history_context_model").unwrap();
46+
let faved_model: gio::Menu =
47+
builder.object("history_context_model_faved").unwrap();
48+
if favorites.borrow().is_favorite(record.get_song()) {
49+
popover_menu.set_menu_model(Some(&faved_model));
50+
} else {
51+
popover_menu.set_menu_model(Some(&unfaved_model));
52+
}
53+
54+
popover_menu.unparent();
55+
popover_menu.set_has_arrow(true);
56+
popover_menu.set_parent(&label);
57+
popover_menu.set_pointing_to(Some(&Rectangle::new(x as i32, y as i32, 1, 1)));
58+
popover_menu.popup();
59+
}
60+
}
61+
);
62+
63+
let touch_handler = gtk::GestureClick::new();
64+
touch_handler.set_button(1);
65+
touch_handler.set_touch_only(true);
66+
touch_handler.connect_pressed(touch_closure.clone());
67+
label.add_controller(touch_handler);
68+
69+
let click_handler = gtk::GestureClick::new();
70+
click_handler.set_button(3);
71+
click_handler.connect_pressed(touch_closure);
72+
label.add_controller(click_handler);
73+
}
74+
75+
pub fn connect_menu_key_actions(
2176
builder: gtk::Builder,
2277
column_view: gtk::ColumnView,
2378
popover_menu: gtk::PopoverMenu,
@@ -71,7 +126,7 @@ impl ContextMenuUtil {
71126
popover_menu.popup();
72127
}
73128
Propagation::Stop
74-
} else if key_val == Key::C
129+
} else if (key_val == Key::C || key_val == Key::c)
75130
&& (modifier.contains(ModifierType::CONTROL_MASK)
76131
|| modifier.contains(ModifierType::META_MASK))
77132
{

src/gui/main_window.rs

Lines changed: 6 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
11
use adw::prelude::*;
2-
use gdk::Rectangle;
3-
use glib::clone;
4-
52
use chrono::Local;
63
use gettextrs::gettext;
74
use log::{debug, error, info, trace};
@@ -343,15 +340,15 @@ impl App {
343340
}
344341

345342
fn setup_context_menus(&self) {
346-
ContextMenuUtil::connect_menu(
343+
ContextMenuUtil::connect_menu_key_actions(
347344
self.builder.clone(),
348345
self.builder.object("history_view").unwrap(),
349346
self.builder.object("history_context_menu").unwrap(),
350347
self.ctx_selected_item.clone(),
351348
self.favorites_interface.clone(),
352349
);
353350

354-
ContextMenuUtil::connect_menu(
351+
ContextMenuUtil::connect_menu_key_actions(
355352
self.builder.clone(),
356353
self.builder.object("favorites_view").unwrap(),
357354
self.builder.object("history_context_menu").unwrap(),
@@ -402,55 +399,15 @@ impl App {
402399
label.add_css_class("cell_label");
403400
cell.set_child(Some(&label));
404401

405-
let touch_closure = clone!(
406-
#[weak]
402+
ContextMenuUtil::connect_menu_mouse_actions(
403+
builder,
407404
cell,
408-
#[weak]
409405
label,
410-
#[weak]
411406
popover_menu,
412-
move |_: &gtk::GestureClick, _n_press, x, y| {
413-
let entry = cell.item();
414-
// gesture.set_state(gtk::EventSequenceState::Claimed);
415-
debug!("Selected item: {:?}", entry);
416-
if let Some(record) = entry {
417-
let record = record.downcast::<HistoryEntry>().unwrap();
418-
debug!(" => {}", record.song_name());
419-
420-
*ctx_selected_item.borrow_mut() = Some(record.clone());
421-
422-
// TODO select/focus the item in UI here?
423-
424-
let unfaved_model: gio::Menu =
425-
builder.object("history_context_model").unwrap();
426-
let faved_model: gio::Menu =
427-
builder.object("history_context_model_faved").unwrap();
428-
if favorites.borrow().is_favorite(record.get_song()) {
429-
popover_menu.set_menu_model(Some(&faved_model));
430-
} else {
431-
popover_menu.set_menu_model(Some(&unfaved_model));
432-
}
433-
434-
popover_menu.unparent();
435-
popover_menu.set_has_arrow(true);
436-
popover_menu.set_parent(&label);
437-
popover_menu
438-
.set_pointing_to(Some(&Rectangle::new(x as i32, y as i32, 1, 1)));
439-
popover_menu.popup();
440-
}
441-
}
407+
ctx_selected_item,
408+
favorites,
442409
);
443410

444-
let touch_handler = gtk::GestureClick::new();
445-
touch_handler.set_button(1);
446-
touch_handler.set_touch_only(true);
447-
touch_handler.connect_pressed(touch_closure.clone());
448-
label.add_controller(touch_handler);
449-
450-
let click_handler = gtk::GestureClick::new();
451-
click_handler.set_button(3);
452-
click_handler.connect_pressed(touch_closure);
453-
label.add_controller(click_handler);
454411
None
455412
});
456413

0 commit comments

Comments
 (0)