/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz

« back to all changes in this revision

Viewing changes to diff.py

  • Committer: Curtis Hovey
  • Date: 2012-01-23 21:48:33 UTC
  • mfrom: (771.1.7 precise-diff-0)
  • Revision ID: sinzui.is@verizon.net-20120123214833-quehn8fpzszfyr6d
Do not update the diff_view when the treeview is being destroyed.

Show diffs side-by-side

added added

removed removed

Lines of Context:
5
5
"""
6
6
 
7
7
__copyright__ = "Copyright 2005 Canonical Ltd."
8
 
__author__    = "Scott James Remnant <scott@ubuntu.com>"
 
8
__author__ = "Scott James Remnant <scott@ubuntu.com>"
9
9
 
10
10
 
11
11
from cStringIO import StringIO
12
12
 
13
 
from gi.repository import Gtk
14
 
from gi.repository import Pango
15
13
import os
16
14
import re
17
15
import sys
18
16
import inspect
19
17
try:
20
 
    from xml.etree.ElementTree import Element, SubElement, tostring
 
18
    from xml.etree.ElementTree import (
 
19
        Element,
 
20
        SubElement,
 
21
        tostring,
 
22
        )
 
23
    Element, SubElement, tostring  # Hush PEP8 redefinition.
21
24
except ImportError:
22
 
    from elementtree.ElementTree import Element, SubElement, tostring
 
25
    from elementtree.ElementTree import (
 
26
        Element,
 
27
        SubElement,
 
28
        tostring,
 
29
        )
23
30
 
 
31
from gi.repository import Gtk
 
32
from gi.repository import Pango
24
33
try:
25
34
    from gi.repository import GtkSource
26
35
    have_gtksourceview = True
38
47
    osutils,
39
48
    urlutils,
40
49
    workingtree,
41
 
)
 
50
    )
42
51
from bzrlib.diff import show_diff_trees
43
52
from bzrlib.patches import parse_patches
44
53
from bzrlib.trace import warning
112
121
        if style_scheme_name is not None:
113
122
            style_scheme_mgr = GtkSource.StyleSchemeManager()
114
123
            style_scheme_mgr.append_search_path(GEDIT_USER_STYLES_PATH)
115
 
            
 
124
 
116
125
            style_scheme = style_scheme_mgr.get_scheme(style_scheme_name)
117
 
            
 
126
 
118
127
            if style_scheme is not None:
119
128
                buf.set_style_scheme(style_scheme)
120
129
 
128
137
        """
129
138
        scheme_manager = GtkSource.StyleSchemeManager()
130
139
        style_scheme = scheme_manager.get_scheme('colordiff')
131
 
        
 
140
 
132
141
        # if style scheme not found, we'll generate it from colordiffrc
133
142
        # TODO: reload if colordiffrc has changed.
134
143
        if style_scheme is None:
148
157
            if not colors:
149
158
                # ~/.colordiffrc does not exist
150
159
                return
151
 
            
 
160
 
152
161
            mapping = {
153
162
                # map GtkSourceView2 scheme styles to colordiff names
154
163
                # since GSV is richer, accept new names for extra bits,
159
168
                'diff:file': ['file', 'diffstuff'],
160
169
                'diff:special-case': ['specialcase', 'diffstuff'],
161
170
            }
162
 
            
 
171
 
163
172
            converted_colors = {}
164
173
            for name, values in mapping.items():
165
174
                color = None
170
179
                if color is None:
171
180
                    continue
172
181
                converted_colors[name] = color
173
 
            
 
182
 
174
183
            # some xml magic to produce needed style scheme description
175
184
            e_style_scheme = Element('style-scheme')
176
185
            e_style_scheme.set('id', 'colordiff')
180
189
                style = SubElement(e_style_scheme, 'style')
181
190
                style.set('name', name)
182
191
                style.set('foreground', '#%s' % color)
183
 
            
 
192
 
184
193
            scheme_xml = tostring(e_style_scheme, 'UTF-8')
185
 
            if not os.path.exists(os.path.expanduser('~/.local/share/gtksourceview-2.0/styles')):
186
 
                os.makedirs(os.path.expanduser('~/.local/share/gtksourceview-2.0/styles'))
187
 
            file(os.path.expanduser('~/.local/share/gtksourceview-2.0/styles/colordiff.xml'), 'w').write(scheme_xml)
188
 
            
 
194
            if not os.path.exists(os.path.expanduser(
 
195
                '~/.local/share/gtksourceview-2.0/styles')):
 
196
                os.makedirs(os.path.expanduser(
 
197
                    '~/.local/share/gtksourceview-2.0/styles'))
 
198
            file(os.path.expanduser(
 
199
                '~/.local/share/gtksourceview-2.0/styles/colordiff.xml'),
 
200
                'w').write(scheme_xml)
 
201
 
189
202
            scheme_manager.force_rescan()
190
203
            style_scheme = scheme_manager.get_scheme('colordiff')
191
 
        
 
204
 
192
205
        buf.set_style_scheme(style_scheme)
193
206
 
194
207
    @staticmethod
216
229
#        self.parent_tree.lock_read()
217
230
#        self.rev_tree.lock_read()
218
231
#        try:
219
 
#            self.delta = iter_changes_to_status(self.parent_tree, self.rev_tree)
 
232
#            self.delta = iter_changes_to_status(
 
233
#               self.parent_tree, self.rev_tree)
220
234
#            self.path_to_status = {}
221
235
#            self.path_to_diff = {}
222
236
#            source_inv = self.parent_tree.inventory
223
237
#            target_inv = self.rev_tree.inventory
224
238
#            for (file_id, real_path, change_type, display_path) in self.delta:
225
 
#                self.path_to_status[real_path] = u'=== %s %s' % (change_type, display_path)
 
239
#                self.path_to_status[real_path] = u'=== %s %s' % (
 
240
#                    change_type, display_path)
226
241
#                if change_type in ('modified', 'renamed and modified'):
227
242
#                    source_ie = source_inv[file_id]
228
243
#                    target_ie = target_inv[file_id]
230
245
#                    source_ie.diff(internal_diff, *old path, *old_tree,
231
246
#                                   *new_path, target_ie, self.rev_tree,
232
247
#                                   sio)
233
 
#                    self.path_to_diff[real_path] = 
 
248
#                    self.path_to_diff[real_path] =
234
249
#
235
250
#        finally:
236
251
#            self.rev_tree.unlock()
284
299
    """Diff widget
285
300
 
286
301
    """
 
302
 
 
303
    SHOW_WIDGETS = True
 
304
 
287
305
    def __init__(self):
288
306
        super(DiffWidget, self).__init__()
289
307
 
292
310
        scrollwin.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC)
293
311
        scrollwin.set_shadow_type(Gtk.ShadowType.IN)
294
312
        self.pack1(scrollwin)
295
 
        scrollwin.show()
296
 
        
 
313
        if self.SHOW_WIDGETS:
 
314
            scrollwin.show()
 
315
 
297
316
        self.model = Gtk.TreeStore(str, str)
298
317
        self.treeview = Gtk.TreeView(model=self.model)
299
318
        self.treeview.set_headers_visible(False)
300
319
        self.treeview.set_search_column(1)
301
320
        self.treeview.connect("cursor-changed", self._treeview_cursor_cb)
302
321
        scrollwin.add(self.treeview)
303
 
        self.treeview.show()
 
322
        if self.SHOW_WIDGETS:
 
323
            self.treeview.show()
304
324
 
305
325
        cell = Gtk.CellRendererText()
306
326
        cell.set_property("width-chars", 20)
321
341
        if getattr(self, 'diff_view', None) is None:
322
342
            self.diff_view = DiffFileView()
323
343
            self.pack2(self.diff_view)
324
 
        self.diff_view.show()
 
344
        if self.SHOW_WIDGETS:
 
345
            self.diff_view.show()
325
346
        for oldname, newname, patch in sections:
326
347
            self.diff_view._diffs[newname] = str(patch)
327
348
            if newname is None:
338
359
        if getattr(self, 'diff_view', None) is None:
339
360
            self.diff_view = DiffView()
340
361
            self.pack2(self.diff_view)
341
 
        self.diff_view.show()
 
362
        if self.SHOW_WIDGETS:
 
363
            self.diff_view.show()
342
364
        self.diff_view.set_trees(rev_tree, parent_tree)
343
365
        self.rev_tree = rev_tree
344
366
        self.parent_tree = parent_tree
346
368
        self.model.clear()
347
369
        delta = self.rev_tree.changes_from(self.parent_tree)
348
370
 
349
 
        self.model.append(None, [ "Complete Diff", "" ])
 
371
        self.model.append(None, ["Complete Diff", ""])
350
372
 
351
373
        if len(delta.added):
352
 
            titer = self.model.append(None, [ "Added", None ])
 
374
            titer = self.model.append(None, ["Added", None])
353
375
            for path, id, kind in delta.added:
354
 
                self.model.append(titer, [ path, path ])
 
376
                self.model.append(titer, [path, path])
355
377
 
356
378
        if len(delta.removed):
357
 
            titer = self.model.append(None, [ "Removed", None ])
 
379
            titer = self.model.append(None, ["Removed", None])
358
380
            for path, id, kind in delta.removed:
359
 
                self.model.append(titer, [ path, path ])
 
381
                self.model.append(titer, [path, path])
360
382
 
361
383
        if len(delta.renamed):
362
 
            titer = self.model.append(None, [ "Renamed", None ])
 
384
            titer = self.model.append(None, ["Renamed", None])
363
385
            for oldpath, newpath, id, kind, text_modified, meta_modified \
364
386
                    in delta.renamed:
365
 
                self.model.append(titer, [ oldpath, newpath ])
 
387
                self.model.append(titer, [oldpath, newpath])
366
388
 
367
389
        if len(delta.modified):
368
 
            titer = self.model.append(None, [ "Modified", None ])
 
390
            titer = self.model.append(None, ["Modified", None])
369
391
            for path, id, kind, text_modified, meta_modified in delta.modified:
370
 
                self.model.append(titer, [ path, path ])
 
392
                self.model.append(titer, [path, path])
371
393
 
372
394
        self.treeview.expand_all()
373
395
        self.diff_view.show_diff(None)
388
410
    def _treeview_cursor_cb(self, *args):
389
411
        """Callback for when the treeview cursor changes."""
390
412
        (path, col) = self.treeview.get_cursor()
391
 
        specific_files = [ self.model[path][1] ]
392
 
        if specific_files == [ None ]:
393
 
            return
394
 
        elif specific_files == [ "" ]:
 
413
        if path is None:
 
414
            return
 
415
        specific_files = [self.model[path][1]]
 
416
        if specific_files == [None]:
 
417
            return
 
418
        elif specific_files == [""]:
395
419
            specific_files = None
396
 
        
 
420
 
397
421
        self.diff_view.show_diff(specific_files)
398
 
    
 
422
 
399
423
    def _on_wraplines_toggled(self, widget=None, wrap=False):
400
424
        """Callback for when the wrap lines checkbutton is toggled"""
401
425
        if wrap or widget.get_active():
403
427
        else:
404
428
            self.diff_view.sourceview.set_wrap_mode(Gtk.WrapMode.NONE)
405
429
 
 
430
 
406
431
class DiffWindow(Window):
407
432
    """Diff window.
408
433
 
437
462
        hbox = self._get_button_bar(operations)
438
463
        if hbox is not None:
439
464
            self.vbox.pack_start(hbox, False, True, 0)
440
 
        
441
 
    
 
465
 
442
466
    def _get_menu_bar(self):
443
467
        menubar = Gtk.MenuBar()
444
468
        # View menu
455
479
        menubar.append(mb_view)
456
480
        menubar.show()
457
481
        return menubar
458
 
    
 
482
 
459
483
    def _get_button_bar(self, operations):
460
484
        """Return a button bar to use.
461
485