@@ -56,12 +56,24 @@ def __init__(self):
5656 self .header_search .get_style_context ().remove_class ('search' )
5757 self .header_search .set_text (self .search )
5858
59+ self .revealer = self .main .get_object ('revealer_main' )
60+ self .finder_search = self .main .get_object ('finder_search_entry' )
61+ self .finder_next = self .main .get_object ('finder_button_next' )
62+ self .finder_prev = self .main .get_object ('finder_button_prev' )
63+ self .finder_label = self .main .get_object ('finder_label' )
64+
65+ self .finder = WebKit2 .FindController (web_view = self .webview )
66+ self .finder .connect ('counted-matches' , self .on_finder_counted_matches )
67+ self .finder .connect ('found-text' , self .on_finder_found_text )
68+ self .finder .connect ('failed-to-find-text' , self .on_finder_failed_to_find_text )
69+
5970 self .window = self .main .get_object ('window_main' )
6071 self .window .show_all ()
6172
6273 self .create_settings_path ()
6374 self .inject_custom_styles ()
6475 self .enable_persistent_cookies ()
76+ self .set_window_accel_groups ()
6577
6678 def run (self ):
6779 Gtk .main ()
@@ -85,6 +97,13 @@ def toggle_save_button(self, visible):
8597 self .header_save .set_visible (visible )
8698 self .header_search .set_visible (not visible )
8799
100+ def search_webview (self ):
101+ text = self .finder_search .get_text ()
102+ opts = WebKit2 .FindOptions .WRAP_AROUND | WebKit2 .FindOptions .CASE_INSENSITIVE
103+
104+ self .finder .count_matches (text , opts , 100 )
105+ self .finder .search (text , opts , 100 )
106+
88107 def create_settings_path (self ):
89108 if not os .path .exists (self .settings_path ()):
90109 os .makedirs (self .settings_path ())
@@ -105,23 +124,38 @@ def enable_persistent_cookies(self):
105124 self .cookies .set_accept_policy (policy )
106125 self .cookies .set_persistent_storage (filepath , storage )
107126
127+ def set_window_accel_groups (self ):
128+ group = Gtk .AccelGroup ()
129+ ctrl = Gdk .ModifierType .CONTROL_MASK
130+
131+ group .connect (Gdk .keyval_from_name ('f' ), ctrl , 0 , self .on_revealer_accel_pressed )
132+ self .window .add_accel_group (group )
133+
134+ def on_revealer_accel_pressed (self , _group , _widget , _code , _modifier ):
135+ self .revealer .set_reveal_child (True )
108136
109137 def on_window_main_destroy (self , _event ):
110138 self .quit ()
111139
112140 def on_window_main_key_release_event (self , _widget , event ):
113- kname = Gdk .keyval_name (event .keyval )
114- text = self .header_search .get_text ()
115- visible = self .header_search .get_visible ()
141+ kname = Gdk .keyval_name (event .keyval )
142+ text = self .header_search .get_text ()
143+ search = self .header_search .get_visible ()
144+ finder = self .finder_search .get_visible ()
145+
146+ if kname == 'Escape' and finder :
147+ self .revealer .set_reveal_child (False )
148+ self .finder .search_finish ()
149+ self .webview .grab_focus ()
116150
117- if kname == 'Escape' and visible :
151+ if kname == 'Escape' and search and not finder :
118152 self .header_search .set_text ('' )
119153 self .header_search .grab_focus ()
120154
121- if kname == 'Tab' and text and visible :
155+ if kname == 'Tab' and text and search :
122156 self .webview .grab_focus ()
123157
124- if kname == 'Down' and visible :
158+ if kname == 'Down' and search :
125159 self .webview .grab_focus ()
126160
127161 def on_header_search_entry_key_release_event (self , _widget , event ):
@@ -131,6 +165,12 @@ def on_header_search_entry_key_release_event(self, _widget, event):
131165 self .webview .grab_focus ()
132166 self .js_click_element ('._list-result.focus' )
133167
168+ def on_finder_search_entry_key_release_event (self , _widget , event ):
169+ kname = Gdk .keyval_name (event .keyval )
170+
171+ if kname == 'Return' :
172+ self .finder .search_next ()
173+
134174 def on_header_button_back_clicked (self , _widget ):
135175 self .webview .go_back ()
136176 self .header_search .set_text ('' )
@@ -159,6 +199,35 @@ def on_header_button_save_clicked(self, _widget):
159199 self .js_click_element ('._sidebar-footer ._settings-btn' )
160200 self .header_title .set_label ('Downloading...' )
161201
202+ def on_finder_search_entry_map (self , _widget ):
203+ self .finder_search .grab_focus ()
204+ self .search_webview ()
205+
206+ def on_finder_search_entry_search_changed (self , _widget ):
207+ self .search_webview ()
208+
209+ def on_finder_button_next_clicked (self , _widget ):
210+ self .finder .search_next ()
211+
212+ def on_finder_button_prev_clicked (self , _widget ):
213+ self .finder .search_previous ()
214+
215+ def on_finder_button_close_clicked (self , _widget ):
216+ self .revealer .set_reveal_child (False )
217+ self .finder .search_finish ()
218+
219+ def on_finder_counted_matches (self , _controller , count ):
220+ label = "%s matches found" % count
221+ self .finder_label .set_label (label )
222+
223+ def on_finder_found_text (self , _controller , count ):
224+ self .finder_next .set_sensitive (True )
225+ self .finder_prev .set_sensitive (True )
226+
227+ def on_finder_failed_to_find_text (self , _controller ):
228+ self .finder_next .set_sensitive (False )
229+ self .finder_prev .set_sensitive (False )
230+
162231 def on_webview_decide_policy (self , _widget , decision , dtype ):
163232 types = WebKit2 .PolicyDecisionType
164233
0 commit comments