@@ -4,7 +4,7 @@ use glib::Propagation;
44use gtk:: glib:: clone;
55use gtk:: prelude:: * ;
66
7- use log:: { error, info} ;
7+ use log:: { debug , error, info} ;
88use percent_encoding:: { utf8_percent_encode, NON_ALPHANUMERIC } ;
99use std:: cell:: RefCell ;
1010use std:: rc:: Rc ;
@@ -17,7 +17,62 @@ use crate::gui::song_history_interface::{RecognitionHistoryInterface, SongRecord
1717pub struct ContextMenuUtil ;
1818
1919impl 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 {
0 commit comments