Kiln » TortoiseHg » TortoiseHg
Clone URL:  
Pushed to one repository · View In Graph Contained in 0.9, 0.9.1, and 0.9.1.1

status: introduce tabs for "Text Diff" and "Hunk Selection" views

The new tabs are implemented by using gtk.Notebook.

The text diff view allows to select and copy text, for example for pasting
into the commit message.

Before this change, there was only the hunk selection view (for non-merge
changes), which does not allow to select and copy text. The hunk selection
view cannot be "upgraded" to provide text selection, as it is implemented by
using gtk.TreeViewColumn, which does not (and cannot) provide text selection.
The smallest possible selection unit in hunk selection view is a hunk, so
there is no clean way to provide character level selection.

Text diff view is implemented by simply using gtk.TextView.
Text diff view is always available, also on merge commits.

Hunk selection view is only available on non-merge changes (that is, if
the working directory has exactly one parent revision).

Previously, there was only one view, that was implicitly switched to text

Changeset bb2b2e4ebfb2

Parent 492c2ba74d3b

by Adrian Buehlmann

Changes to one file · Browse files at bb2b2e4ebfb2 Showing diff from parent 492c2ba74d3b Diff from another changeset...

Change 1 of 6 Show Entire File hggtk/​status.py Stacked
 
275
276
277
 
 
 
 
 
 
 
 
 
 
 
278
279
 
 
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
 
295
296
297
 
339
340
341
 
 
342
343
 
 
344
345
346
347
348
 
349
350
351
 
355
356
357
 
 
 
 
 
 
 
 
 
 
 
358
359
360
 
562
563
564
565
566
567
 
 
568
569
570
 
755
756
757
758
759
760
 
 
761
762
763
764
765
 
 
 
766
767
768
 
797
798
799
800
 
801
802
803
804
 
805
806
807
 
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
 
 
 
 
 
 
 
 
 
 
 
 
 
 
294
295
296
297
 
339
340
341
342
343
344
 
345
346
347
 
 
 
 
348
349
350
351
 
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
 
573
574
575
 
 
 
576
577
578
579
580
 
765
766
767
 
 
 
768
769
770
771
772
773
 
774
775
776
777
778
779
 
808
809
810
 
811
812
813
814
815
816
817
818
819
@@ -275,23 +275,23 @@
    diff_frame = gtk.Frame()   diff_frame.set_shadow_type(gtk.SHADOW_ETCHED_IN) + + self.diff_notebook = gtk.Notebook() + self.diff_notebook.set_tab_pos(gtk.POS_BOTTOM) + + self.difffont = pango.FontDescription(self.fontlist) + + self.clipboard = None + self.diff_text = gtk.TextView() + self.diff_text.set_wrap_mode(gtk.WRAP_NONE) + self.diff_text.set_editable(False) + self.diff_text.modify_font(self.difffont)   scroller = gtk.ScrolledWindow()   scroller.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) + scroller.add(self.diff_text) + self.diff_notebook.append_page(scroller, gtk.Label(_('Text Diff')))   - self.difffont = pango.FontDescription(self.fontlist) - if self.merging: - # display merge diffs in simple text view - self.clipboard = None - self.merge_diff_text = gtk.TextView() - self.merge_diff_text.set_wrap_mode(gtk.WRAP_NONE) - self.merge_diff_text.set_editable(False) - self.merge_diff_text.modify_font(self.difffont) - sel = self.filetree.get_selection() - sel.set_mode(gtk.SELECTION_SINGLE) - self.treeselid = sel.connect('changed', self.merge_sel_changed) - scroller.add(self.merge_diff_text) - diff_frame.add(scroller) - else: + if not self.merging:   # use treeview to show selectable diff hunks   sel = (os.name == 'nt') and 'CLIPBOARD' or 'PRIMARY'   self.clipboard = gtk.Clipboard(selection=sel) @@ -339,13 +339,13 @@
  diffcol.add_attribute(cell, 'background-set', DM_REJECTED)   diffcol.add_attribute(cell, 'foreground-set', DM_REJECTED)   difftree.append_column(diffcol) + scroller = gtk.ScrolledWindow() + scroller.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)   scroller.add(difftree) - diff_frame.add(scroller) + self.diff_notebook.append_page( + scroller, gtk.Label(_('Hunk Selection')))   - sel = self.filetree.get_selection() - sel.set_mode(gtk.SELECTION_MULTIPLE) - self.treeselid = sel.connect('changed', - self.tree_sel_changed, difftree) + diff_frame.add(self.diff_notebook)     if self.diffbottom:   self.diffpane = gtk.VPaned() @@ -355,6 +355,17 @@
  self.diffpane.pack1(tree_frame, True, False)   self.diffpane.pack2(diff_frame, True, True)   self.filetree.set_headers_clickable(True) + + sel = self.filetree.get_selection() + if self.merging: + sel.set_mode(gtk.SELECTION_SINGLE) + self.treeselid = sel.connect( + 'changed', self.difftext_sel_changed) + else: + sel.set_mode(gtk.SELECTION_MULTIPLE) + self.treeselid = sel.connect( + 'changed', self.tree_sel_changed, difftree) +   return self.diffpane     @@ -562,9 +573,8 @@
  selection.select_path((firstrow or 0,))   else:   # clear diff pane if no files - if self.merging: - self.merge_diff_text.set_buffer(gtk.TextBuffer()) - else: + self.diff_text.set_buffer(gtk.TextBuffer()) + if not self.merging:   self.diffmodel.clear()     self.filetree.show() @@ -755,14 +765,15 @@
  if success:   self.reload_status()   - def merge_sel_changed(self, selection): - 'Selected row in file tree activated changed (merge mode)' - # Update the diff text with merge diff to both parents + def difftext_sel_changed(self, selection): + 'Selected row in file tree changed, update text diff'   model, paths = selection.get_selected_rows()   if not paths:   return   wfile = self.filemodel[paths[0]][FM_PATH] - difftext = [_('===== Diff to first parent =====\n')] + difftext = [] + if self.merging: + difftext = [_('===== Diff to first parent =====\n')]   wctx = self.repo[None]   pctxs = wctx.parents()   matcher = cmdutil.matchfiles(self.repo, [wfile]) @@ -797,11 +808,12 @@
  else:   line = hglib.diffexpand(line)   buf.insert(bufiter, line) - self.merge_diff_text.set_buffer(buf) + self.diff_text.set_buffer(buf)       def tree_sel_changed(self, selection, tree):   'Selected row in file tree activated changed' + self.difftext_sel_changed(selection)   # Read this file's diffs into diff model   model, paths = selection.get_selected_rows()   if not paths: