mirror of
				https://github.com/johrpan/musicus.git
				synced 2025-10-26 11:47:25 +01:00 
			
		
		
		
	Add query signal to search entry
This commit is contained in:
		
							parent
							
								
									7eacfe21f4
								
							
						
					
					
						commit
						54f0088e61
					
				
					 3 changed files with 48 additions and 4 deletions
				
			
		|  | @ -22,9 +22,11 @@ template $MusicusSearchEntry : Gtk.Box { | ||||||
|       hexpand: true; |       hexpand: true; | ||||||
|       activate => $activate() swapped; |       activate => $activate() swapped; | ||||||
|       backspace => $backspace() swapped; |       backspace => $backspace() swapped; | ||||||
|  |       changed => $text_changed() swapped; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   Gtk.Image clear_icon { |   Gtk.Image clear_icon { | ||||||
|  |       visible: false; | ||||||
|       icon-name: "edit-clear-symbolic"; |       icon-name: "edit-clear-symbolic"; | ||||||
|       tooltip-text: _("Clear entry"); |       tooltip-text: _("Clear entry"); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | @ -53,6 +53,10 @@ mod imp { | ||||||
| 
 | 
 | ||||||
|             self.search_entry.set_key_capture_widget(&*self.obj()); |             self.search_entry.set_key_capture_widget(&*self.obj()); | ||||||
| 
 | 
 | ||||||
|  |             self.search_entry.connect_query_changed(|entry| { | ||||||
|  |                 log::info!("{}", entry.query()); | ||||||
|  |             }); | ||||||
|  | 
 | ||||||
|             self.player |             self.player | ||||||
|                 .borrow() |                 .borrow() | ||||||
|                 .bind_property("active", &self.play_button.get(), "visible") |                 .bind_property("active", &self.play_button.get(), "visible") | ||||||
|  |  | ||||||
|  | @ -1,7 +1,7 @@ | ||||||
| use crate::search_tag::MusicusSearchTag; | use crate::search_tag::MusicusSearchTag; | ||||||
| use adw::{gdk, glib, glib::clone, glib::subclass::Signal, prelude::*, subclass::prelude::*}; | use adw::{gdk, gio, glib, glib::clone, glib::subclass::Signal, prelude::*, subclass::prelude::*}; | ||||||
| use once_cell::sync::Lazy; | use once_cell::sync::Lazy; | ||||||
| use std::cell::RefCell; | use std::{cell::RefCell, time::Duration}; | ||||||
| 
 | 
 | ||||||
| mod imp { | mod imp { | ||||||
|     use super::*; |     use super::*; | ||||||
|  | @ -17,6 +17,7 @@ mod imp { | ||||||
|         pub clear_icon: TemplateChild<gtk::Image>, |         pub clear_icon: TemplateChild<gtk::Image>, | ||||||
| 
 | 
 | ||||||
|         pub tags: RefCell<Vec<MusicusSearchTag>>, |         pub tags: RefCell<Vec<MusicusSearchTag>>, | ||||||
|  |         pub query_changed: RefCell<Option<gio::Cancellable>>, | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     #[glib::object_subclass] |     #[glib::object_subclass] | ||||||
|  | @ -70,8 +71,12 @@ mod imp { | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         fn signals() -> &'static [Signal] { |         fn signals() -> &'static [Signal] { | ||||||
|             static SIGNALS: Lazy<Vec<Signal>> = |             static SIGNALS: Lazy<Vec<Signal>> = Lazy::new(|| { | ||||||
|                 Lazy::new(|| vec![Signal::builder("activate").build()]); |                 vec![ | ||||||
|  |                     Signal::builder("activate").build(), | ||||||
|  |                     Signal::builder("query-changed").build(), | ||||||
|  |                 ] | ||||||
|  |             }); | ||||||
| 
 | 
 | ||||||
|             SIGNALS.as_ref() |             SIGNALS.as_ref() | ||||||
|         } |         } | ||||||
|  | @ -97,6 +102,14 @@ impl MusicusSearchEntry { | ||||||
|         glib::Object::new() |         glib::Object::new() | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     pub fn connect_query_changed<F: Fn(&Self) + 'static>(&self, f: F) -> glib::SignalHandlerId { | ||||||
|  |         self.connect_local("query-changed", true, move |values| { | ||||||
|  |             let obj = values[0].get::<Self>().unwrap(); | ||||||
|  |             f(&obj); | ||||||
|  |             None | ||||||
|  |         }) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     pub fn set_key_capture_widget(&self, widget: &impl IsA<gtk::Widget>) { |     pub fn set_key_capture_widget(&self, widget: &impl IsA<gtk::Widget>) { | ||||||
|         let controller = gtk::EventControllerKey::new(); |         let controller = gtk::EventControllerKey::new(); | ||||||
| 
 | 
 | ||||||
|  | @ -134,6 +147,10 @@ impl MusicusSearchEntry { | ||||||
|         self.imp().tags.borrow_mut().push(tag); |         self.imp().tags.borrow_mut().push(tag); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     pub fn query(&self) -> String { | ||||||
|  |         self.imp().text.text().to_string() | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     #[template_callback] |     #[template_callback] | ||||||
|     fn activate(&self, _: >k::Text) { |     fn activate(&self, _: >k::Text) { | ||||||
|         self.emit_by_name::<()>("activate", &[]); |         self.emit_by_name::<()>("activate", &[]); | ||||||
|  | @ -147,4 +164,25 @@ impl MusicusSearchEntry { | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     #[template_callback] | ||||||
|  |     async fn text_changed(&self, text: >k::Text) { | ||||||
|  |         self.imp().clear_icon.set_visible(!text.text().is_empty()); | ||||||
|  | 
 | ||||||
|  |         if let Some(cancellable) = self.imp().query_changed.borrow_mut().take() { | ||||||
|  |             cancellable.cancel(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         let cancellable = gio::Cancellable::new(); | ||||||
|  |         self.imp().query_changed.replace(Some(cancellable.clone())); | ||||||
|  | 
 | ||||||
|  |         let _ = gio::CancellableFuture::new( | ||||||
|  |             async { | ||||||
|  |                 glib::timeout_future(Duration::from_millis(150)).await; | ||||||
|  |                 self.emit_by_name::<()>("query-changed", &[]); | ||||||
|  |             }, | ||||||
|  |             cancellable, | ||||||
|  |         ) | ||||||
|  |         .await; | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue