diff --git a/app/pdf-viewer/buffer.py b/app/pdf-viewer/buffer.py index 4ecfc9e..edd13e8 100755 --- a/app/pdf-viewer/buffer.py +++ b/app/pdf-viewer/buffer.py @@ -46,6 +46,9 @@ class AppBuffer(Buffer): self.buffer_widget.jump_to_link(str(result_content)) elif result_type == "local_search_text": self.buffer_widget.local_search_text(str(result_content)) + elif result_type == "global_search_text": + self.buffer_widget.global_search_text(str(result_content)) + def scroll(self, scroll_direction, scroll_type): if scroll_type == "page": @@ -131,6 +134,20 @@ class AppBuffer(Buffer): else: self.buffer_widget.send_input_message("Search text: ", "local_search_text") + def global_search_text(self): + if self.buffer_widget.is_global_search_text: + self.buffer_widget.delete_all_mark_global_search_text() + else: + self.buffer_widget.send_input_message("Search text: ", "global_search_text") + + def global_search_text_next(self): + if self.buffer_widget.is_global_search_text: + self.buffer_widget.global_search_text_next() + + def global_search_text_last(self): + if self.buffer_widget.is_global_search_text: + self.buffer_widget.global_search_text_last() + class PdfViewerWidget(QWidget): translate_double_click_word = QtCore.pyqtSignal(str) @@ -169,6 +186,10 @@ class PdfViewerWidget(QWidget): self.is_local_search_text = False self.local_search_text_annot_cache_dict = {} + #global search text + self.is_global_search_text = False + self.global_search_text_offset_list = [] + # Init scroll attributes. self.scroll_step = 20 self.scroll_offset = 0 @@ -557,6 +578,39 @@ class PdfViewerWidget(QWidget): self.page_cache_pixmap_dict.clear() self.update() + def global_search_text(self, text): + self.is_global_search_text = True + self.local_search_text(text) + + search_text_index = 0 + self.global_search_text_index = 0 + for page_index in range(self.page_total_number): + quads_list = self.document.searchPageFor(page_index, text, hit_max=999, quads=True) + if quads_list: + for quad in quads_list: + search_text_offset = (page_index * self.page_height + quad.ul.y) * self.scale + + self.global_search_text_offset_list.append(search_text_offset) + if search_text_offset > self.scroll_offset and search_text_offset < (self.scroll_offset + self.rect().height()): + self.global_search_text_index = search_text_index + search_text_index += 1 + + def global_search_text_next(self): + if len(self.global_search_text_offset_list) > 0: + self.global_search_text_index = (self.global_search_text_index + 1) % len(self.global_search_text_offset_list) + self.update_scroll_offset(self.global_search_text_offset_list[self.global_search_text_index]) + + def global_search_text_last(self): + if len(self.global_search_text_offset_list) > 0: + self.global_search_text_index = (self.global_search_text_index - 1) % len(self.global_search_text_offset_list) + self.update_scroll_offset(self.global_search_text_offset_list[self.global_search_text_index]) + + def delete_all_mark_global_search_text(self): + self.is_global_search_text = False + self.is_local_search_text = False + self.delete_all_mark_local_search_text() + self.global_search_text_offset_list.clear() + def jump_to_page(self, page_num): self.update_scroll_offset(min(max(self.scale * (int(page_num) - 1) * self.page_height, 0), self.max_scroll_offset())) diff --git a/eaf.el b/eaf.el index 5aced5d..6b844ac 100644 --- a/eaf.el +++ b/eaf.el @@ -238,7 +238,10 @@ Try not to modify this alist directly. Use `eaf-setq' to modify instead." ("i" . "toggle_inverted_mode") ("m" . "toggle_mark_link") ("f" . "jump_to_link") - ("s" . "local_search_text")) + ("s" . "local_search_text") + ("S" . "global_search_text") + ("n" . "global_search_text_next") + ("N" . "global_search_text_last")) "The keybinding of EAF PDF Viewer." :type 'cons)