[meld] Prompt to force highlighting when we skip large chunks (bgo#697812)
- From: Kai Willadsen <kaiw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [meld] Prompt to force highlighting when we skip large chunks (bgo#697812)
- Date: Sat, 20 Apr 2013 20:36:53 +0000 (UTC)
commit 7ef3a8d4a065ae5f3acc7231c0509a7fa6c78063
Author: Kai Willadsen <kai willadsen gmail com>
Date: Sat Apr 20 07:34:23 2013 +1000
Prompt to force highlighting when we skip large chunks (bgo#697812)
meld/filediff.py | 55 ++++++++++++++++++++++++++++++++++++++++++++++---------
1 file changed, 46 insertions(+), 9 deletions(-)
---
diff --git a/meld/filediff.py b/meld/filediff.py
index de73765..ce07a73 100644
--- a/meld/filediff.py
+++ b/meld/filediff.py
@@ -146,7 +146,7 @@ class FileDiff(melddoc.MeldDoc, gnomeglade.Component):
gtk.keysyms.Control_R : MASK_CTRL}
# Identifiers for MsgArea messages
- (MSG_SAME,) = list(range(1))
+ (MSG_SAME, MSG_SLOW_HIGHLIGHT) = list(range(2))
__gsignals__ = {
'next-conflict-changed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (bool, bool)),
@@ -208,6 +208,7 @@ class FileDiff(melddoc.MeldDoc, gnomeglade.Component):
self._scroll_lock = False
self.linediffer = self.differ()
self.linediffer.ignore_blanks = self.prefs.ignore_blank_lines
+ self.force_highlight = False
self.syncpoints = []
self.in_nested_textview_gutter_expose = False
self._cached_match = CachedSequenceMatcher()
@@ -1187,8 +1188,10 @@ class FileDiff(melddoc.MeldDoc, gnomeglade.Component):
bufs = self.textbuffer[1], self.textbuffer[to_idx]
tags = alltags[1], alltags[to_idx]
- starts = [b.get_iter_at_line_or_eof(l) for b, l in zip(bufs, (c[1], c[3]))]
- ends = [b.get_iter_at_line_or_eof(l) for b, l in zip(bufs, (c[2], c[4]))]
+ starts = [b.get_iter_at_line_or_eof(l) for b, l in
+ zip(bufs, (c[1], c[3]))]
+ ends = [b.get_iter_at_line_or_eof(l) for b, l in
+ zip(bufs, (c[2], c[4]))]
bufs[0].remove_tag(tags[0], starts[0], ends[0])
bufs[1].remove_tag(tags[1], starts[1], ends[1])
@@ -1201,8 +1204,10 @@ class FileDiff(melddoc.MeldDoc, gnomeglade.Component):
bufs = self.textbuffer[1], self.textbuffer[to_idx]
tags = alltags[1], alltags[to_idx]
- starts = [b.get_iter_at_line_or_eof(l) for b, l in zip(bufs, (c[1], c[3]))]
- ends = [b.get_iter_at_line_or_eof(l) for b, l in zip(bufs, (c[2], c[4]))]
+ starts = [b.get_iter_at_line_or_eof(l) for b, l in
+ zip(bufs, (c[1], c[3]))]
+ ends = [b.get_iter_at_line_or_eof(l) for b, l in
+ zip(bufs, (c[2], c[4]))]
# We don't use self.buffer_texts here, as removing line
# breaks messes with inline highlighting in CRLF cases
@@ -1211,11 +1216,13 @@ class FileDiff(melddoc.MeldDoc, gnomeglade.Component):
textn = bufs[1].get_text(starts[1], ends[1], False)
textn = text_type(textn, 'utf8')
- # For very long sequences, bail rather than trying a very slow comparison
+ # Bail on long sequences, rather than try a slow comparison
inline_limit = 8000
- if len(text1) + len(textn) > inline_limit:
+ if len(text1) + len(textn) > inline_limit and \
+ not self.force_highlight:
for i in range(2):
bufs[i].apply_tag(tags[i], starts[i], ends[i])
+ self._prompt_long_highlighting()
continue
def apply_highlight(bufs, tags, starts, ends, texts, matches):
@@ -1231,10 +1238,11 @@ class FileDiff(melddoc.MeldDoc, gnomeglade.Component):
if texts != (text1, textn):
return
- # Remove equal matches of size greater than 3; highlight
+ # Remove equal matches of size less than 3; highlight
# the remainder.
matches = [m for m in matches if m.tag != "equal" or
- (m.end_a - m.start_a < 3) or (m.end_b - m.start_b < 3)]
+ (m.end_a - m.start_a < 3) or
+ (m.end_b - m.start_b < 3)]
for i in range(2):
start, end = starts[i].copy(), starts[i].copy()
@@ -1297,6 +1305,35 @@ class FileDiff(melddoc.MeldDoc, gnomeglade.Component):
if m.get_msg_id() == FileDiff.MSG_SAME:
m.clear()
+ def _prompt_long_highlighting(self):
+
+ def on_msgarea_highlighting_response(msgarea, respid):
+ for mgr in self.msgarea_mgr:
+ mgr.clear()
+ if respid == gtk.RESPONSE_OK:
+ self.force_highlight = True
+ self.refresh_comparison()
+
+ for index, mgr in enumerate(self.msgarea_mgr):
+ msgarea = mgr.new_from_text_and_icon(
+ gtk.STOCK_INFO,
+ _("Change highlighting incomplete"),
+ _("Some changes were not highlighted because they were too "
+ "large. You can force Meld to take longer to highlight "
+ "larger changes, though this may be slow."))
+ mgr.set_msg_id(FileDiff.MSG_SLOW_HIGHLIGHT)
+ button = msgarea.add_stock_button_with_text(
+ _("Hide"), gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE)
+ if index == 0:
+ button.props.label = _("Hi_de")
+ button = msgarea.add_button(
+ _("Keep highlighting"), gtk.RESPONSE_OK)
+ if index == 0:
+ button.props.label = _("_Keep highlighting")
+ msgarea.connect("response",
+ on_msgarea_highlighting_response)
+ msgarea.show_all()
+
def on_msgarea_identical_response(self, msgarea, respid):
for mgr in self.msgarea_mgr:
mgr.clear()
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]