Merge lp:~hid-iwata/qbzr/hlsearch into lp:qbzr

Proposed by IWATA Hidetaka
Status: Merged
Merged at revision: 1442
Proposed branch: lp:~hid-iwata/qbzr/hlsearch
Merge into: lp:qbzr
Diff against target: 220 lines (+69/-16)
5 files modified
lib/annotate.py (+2/-0)
lib/diffwindow.py (+6/-4)
lib/widgets/shelve.py (+2/-0)
lib/widgets/shelvelist.py (+6/-4)
lib/widgets/toolbars.py (+53/-8)
To merge this branch: bzr merge lp:~hid-iwata/qbzr/hlsearch
Reviewer Review Type Date Requested Status
Alexander Belchenko Approve
Review via email: mp+87007@code.launchpad.net

Description of the change

Implement search highlight.
This change affects to qdiff, qshelve, qunshelve, qannotate.

http://dl.dropbox.com/u/16802579/qbzr-hlsearch.png

To post a comment you must log in.
Revision history for this message
Alexander Belchenko (bialix) wrote :

W00t! So nice! Many thanks!

Could you please write some message to NEWS.txt next time for such nice and user-visible changes? I'll add the message right now to your patch while merging. But it will help me if you can provide some message with the patch. Thanks

review: Approve
Revision history for this message
IWATA Hidetaka (hid-iwata) wrote :

Sorry. I found the regression by this code.
I've fixed it and merged it to trunk now.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/annotate.py'
2--- lib/annotate.py 2011-05-11 14:22:57 +0000
3+++ lib/annotate.py 2011-12-28 12:16:24 +0000
4@@ -480,6 +480,8 @@
5 self.annotate_bar.annotate = annotate
6 self.text_edit.annotate = annotate
7 self.annotate_bar.show_current_line = False
8+
9+ self.text_edit.emit(QtCore.SIGNAL("documentChangeFinished()"))
10
11 self.processEvents()
12
13
14=== modified file 'lib/diffwindow.py'
15--- lib/diffwindow.py 2011-09-06 21:53:08 +0000
16+++ lib/diffwindow.py 2011-12-28 12:16:24 +0000
17@@ -340,7 +340,7 @@
18
19 self.create_main_toolbar(allow_refresh)
20 self.addToolBarBreak()
21- self.find_toolbar = FindToolbar(self, self.diffview.browsers[0],
22+ self.find_toolbar = FindToolbar(self, self.diffview.browsers,
23 self.show_find)
24 self.find_toolbar.hide()
25 self.addToolBar(self.find_toolbar)
26@@ -523,7 +523,7 @@
27 def eventFilter(self, object, event):
28 if event.type() == QtCore.QEvent.FocusIn:
29 if object in self.diffview.browsers:
30- self.find_toolbar.text_edit = object
31+ self.find_toolbar.set_text_edit(object)
32 return QBzrWindow.eventFilter(self, object, event)
33 # Why doesn't this work?
34 #return super(DiffWindow, self).eventFilter(object, event)
35@@ -666,18 +666,20 @@
36 QtGui.QMessageBox.information(self, gettext('Diff'),
37 gettext('No changes found.'),
38 gettext('&OK'))
39+ for t in self.views[0].browsers + (self.views[1],):
40+ t.emit(QtCore.SIGNAL("documentChangeFinished()"))
41 self.view_refresh.setEnabled(self.can_refresh())
42
43 def click_toggle_view_mode(self, checked):
44 if checked:
45 view = self.sdiffview
46- self.find_toolbar.text_edit = view
47+ self.find_toolbar.set_text_edits([view])
48 self.tab_width_selector_left.menuAction().setVisible(False)
49 self.tab_width_selector_right.menuAction().setVisible(False)
50 self.tab_width_selector_unidiff.menuAction().setVisible(True)
51 else:
52 view = self.diffview
53- self.find_toolbar.text_edit = view.browsers[0]
54+ self.find_toolbar.set_text_edits(view.browsers)
55 self.tab_width_selector_left.menuAction().setVisible(True)
56 self.tab_width_selector_right.menuAction().setVisible(True)
57 self.tab_width_selector_unidiff.menuAction().setVisible(False)
58
59=== modified file 'lib/widgets/shelve.py'
60--- lib/widgets/shelve.py 2011-09-06 15:31:11 +0000
61+++ lib/widgets/shelve.py 2011-12-28 12:16:24 +0000
62@@ -992,6 +992,7 @@
63 if self.hunk_list:
64 self._set_focused_hunk(0)
65
66+ self.emit(QtCore.SIGNAL("documentChangeFinished()"))
67 self.update()
68
69 def update(self):
70@@ -1002,6 +1003,7 @@
71 QtGui.QTextBrowser.clear(self)
72 del(self.hunk_list[:])
73 self._set_focused_hunk(-1)
74+ self.emit(QtCore.SIGNAL("documentChangeFinished()"))
75
76 def paintEvent(self, event):
77 if not self.hunk_list:
78
79=== modified file 'lib/widgets/shelvelist.py'
80--- lib/widgets/shelvelist.py 2011-10-04 15:23:49 +0000
81+++ lib/widgets/shelvelist.py 2011-12-28 12:16:24 +0000
82@@ -128,7 +128,7 @@
83 N_("&View Options"), view_menu, icon_name="document-properties",
84 shortcut="Alt+V")
85
86- self.find_toolbar = FindToolbar(self, self.diffviews[0].browsers[0], show_find)
87+ self.find_toolbar = FindToolbar(self, self.diffviews[0].browsers, show_find)
88 diff_panel.add_widget(self.find_toolbar)
89 diff_panel.add_widget(self.stack)
90 self.find_toolbar.hide()
91@@ -405,6 +405,8 @@
92 break
93 finally:
94 self._interrupt_switch = False
95+ for view in self.diffviews[0].browsers + (self.diffviews[1],):
96+ view.emit(QtCore.SIGNAL("documentChangeFinished()"))
97
98 def selected_shelve_changed(self):
99 self._change_current_shelve()
100@@ -453,9 +455,9 @@
101 self.diffviews[index].rewind()
102 self.stack.setCurrentIndex(index)
103 if index == 0:
104- self.find_toolbar.text_edit = self.diffviews[0].browsers[0]
105+ self.find_toolbar.set_text_edits(self.diffviews[0].browsers)
106 else:
107- self.find_toolbar.text_edit = self.diffviews[1]
108+ self.find_toolbar.set_text_edits([self.diffviews[1]])
109
110 def complete_toggled(self, state):
111 self.complete = state
112@@ -520,7 +522,7 @@
113 def eventFilter(self, object, event):
114 if event.type() == QtCore.QEvent.FocusIn:
115 if object in self.diffviews[0].browsers:
116- self.find_toolbar.text_edit = object
117+ self.find_toolbar.set_text_edit(object)
118 return ToolbarPanel.eventFilter(self, object, event)
119
120 def load_settings(self):
121
122=== modified file 'lib/widgets/toolbars.py'
123--- lib/widgets/toolbars.py 2011-05-17 04:51:07 +0000
124+++ lib/widgets/toolbars.py 2011-12-28 12:16:24 +0000
125@@ -16,7 +16,6 @@
126 # You should have received a copy of the GNU General Public License
127 # along with this program; if not, write to the Free Software
128 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
129-
130 from bzrlib.plugins.qbzr.lib.util import (
131 get_icon,
132 show_shortcut_hint
133@@ -24,6 +23,7 @@
134
135 from PyQt4 import QtCore, QtGui
136 from bzrlib.plugins.qbzr.lib.i18n import gettext, N_
137+from bzrlib.plugins.qbzr.lib.decorators import lazy_call
138
139 def create_toolbar_button(text, parent=None, icon_name=None, icon_size=22,
140 enabled=True, checkable=False, checked=False,
141@@ -61,8 +61,11 @@
142
143 def __init__(self, window, text_edit, show_action):
144 QtGui.QToolBar.__init__(self, gettext("Find"), window)
145- self.text_edit = text_edit
146- if 0: self.text_edit = QtGui.QTextEdit()
147+ self.text_edits = []
148+ if isinstance(text_edit, list) or isinstance(text_edit, tuple):
149+ self.set_text_edits(text_edit)
150+ else:
151+ self.set_text_edits([text_edit])
152 self.show_action = show_action
153
154 self.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon)
155@@ -141,6 +144,7 @@
156
157 def find_text_changed(self, text):
158 self.find_avoid_moving()
159+ self.highlight()
160
161 def find_get_flags(self):
162 flags = QtGui.QTextDocument.FindFlags()
163@@ -183,11 +187,52 @@
164 self.text_edit.setTextCursor(cursor)
165 self.find_text.setPalette(self.found_palette)
166
167- def set_text_edit(self, new_text_edit):
168- if self.text_edit:
169- self.text_edit.setTextCursor(QtGui.QTextCursor())
170- self.text_edit = new_text_edit
171-
172+ def set_text_edits(self, text_edits):
173+ if len(text_edits) == 0:
174+ raise ValueError('text_edits is empty.')
175+
176+ for t in self.text_edits:
177+ self.disconnect(t, QtCore.SIGNAL("documentChangeFinished()"),
178+ self.highlight)
179+ t.setExtraSelections([])
180+
181+ for t in text_edits:
182+ self.connect(t, QtCore.SIGNAL("documentChangeFinished()"),
183+ self.highlight)
184+
185+ self.text_edits = text_edits
186+ self.text_edit = text_edits[0]
187+ self.highlight()
188+
189+ def set_text_edit(self, text_edit):
190+ if text_edit in self.text_edits:
191+ self.text_edit = text_edit
192+ else:
193+ raise ValueError('Invalid text_edit instance.')
194+
195+ @lazy_call(200, per_instance=True)
196+ def highlight(self):
197+ """Highlight matched words in the text edits."""
198+ text = self.find_text.text()
199+ flags = self.find_get_flags()
200+ for text_edit in self.text_edits:
201+ selections = []
202+ if text:
203+ find = text_edit.document().find
204+ pos = 0
205+ fmt = QtGui.QTextCharFormat()
206+ fmt.setBackground(QtCore.Qt.yellow)
207+ while True:
208+ cursor = find(text, pos, flags)
209+ if cursor.isNull():
210+ break
211+
212+ sel = QtGui.QTextEdit.ExtraSelection()
213+ sel.cursor, sel.format = cursor, fmt
214+ selections.append(sel)
215+ pos = cursor.selectionEnd()
216+
217+ text_edit.setExtraSelections(selections)
218
219 class ToolbarPanel(QtGui.QWidget):
220 def __init__(self, slender=True, icon_size=16, parent=None):

Subscribers

People subscribed via source and target branches