Skip to content

Commit 2091cf4

Browse files
committed
add finder functionality
1 parent 93c0434 commit 2091cf4

File tree

2 files changed

+96
-6
lines changed

2 files changed

+96
-6
lines changed

devdocs_desktop.py

100644100755
Lines changed: 75 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

ui/main.ui

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,9 @@
155155
<property name="primary_icon_activatable">False</property>
156156
<property name="primary_icon_sensitive">False</property>
157157
<property name="placeholder_text" translatable="yes">Find in page...</property>
158+
<signal name="key-release-event" handler="on_finder_search_entry_key_release_event" swapped="no"/>
159+
<signal name="map" handler="on_finder_search_entry_map" swapped="no"/>
160+
<signal name="search-changed" handler="on_finder_search_entry_search_changed" swapped="no"/>
158161
</object>
159162
<packing>
160163
<property name="expand">False</property>
@@ -198,8 +201,10 @@
198201
<child>
199202
<object class="GtkButton" id="finder_button_prev">
200203
<property name="visible">True</property>
204+
<property name="sensitive">False</property>
201205
<property name="can_focus">True</property>
202206
<property name="receives_default">True</property>
207+
<signal name="clicked" handler="on_finder_button_prev_clicked" swapped="no"/>
203208
<child>
204209
<object class="GtkImage">
205210
<property name="visible">True</property>
@@ -217,8 +222,10 @@
217222
<child>
218223
<object class="GtkButton" id="finder_button_next">
219224
<property name="visible">True</property>
225+
<property name="sensitive">False</property>
220226
<property name="can_focus">True</property>
221227
<property name="receives_default">True</property>
228+
<signal name="clicked" handler="on_finder_button_next_clicked" swapped="no"/>
222229
<child>
223230
<object class="GtkImage">
224231
<property name="visible">True</property>
@@ -250,6 +257,7 @@
250257
<property name="receives_default">True</property>
251258
<property name="relief">none</property>
252259
<property name="always_show_image">True</property>
260+
<signal name="clicked" handler="on_finder_button_close_clicked" swapped="no"/>
253261
<child>
254262
<object class="GtkImage">
255263
<property name="visible">True</property>
@@ -265,6 +273,19 @@
265273
<property name="position">2</property>
266274
</packing>
267275
</child>
276+
<child>
277+
<object class="GtkLabel" id="finder_label">
278+
<property name="visible">True</property>
279+
<property name="can_focus">False</property>
280+
<property name="margin_left">10</property>
281+
<property name="label" translatable="yes">0 matches</property>
282+
</object>
283+
<packing>
284+
<property name="expand">False</property>
285+
<property name="fill">True</property>
286+
<property name="position">3</property>
287+
</packing>
288+
</child>
268289
</object>
269290
</child>
270291
</object>

0 commit comments

Comments
 (0)