1- use gdk:: Rectangle ;
1+ use gdk:: { Key , ModifierType , Rectangle } ;
22use gio:: prelude:: * ;
3+ use glib:: Propagation ;
34use gtk:: glib:: clone;
45use gtk:: prelude:: * ;
56
6- use log:: { debug , error, info} ;
7+ use log:: { error, info} ;
78use percent_encoding:: { utf8_percent_encode, NON_ALPHANUMERIC } ;
89use std:: cell:: RefCell ;
910use 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 |_: >k::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() {
0 commit comments