Changeset 8bc88bffb8fb…
Parent e3fdbb14ca5b…
by
Changes to one file · Browse files at 8bc88bffb8fb Showing diff from parent e3fdbb14ca5b Diff from another changeset...
@@ -304,6 +304,10 @@
if self.count_revs() == 2 or len(self.repo.changectx(None).parents()) == 1:
# use treeview to diff hunks
+
+ sel = (os.name == 'nt') and 'CLIPBOARD' or 'PRIMARY'
+ self.clipboard = gtk.Clipboard(selection=sel)
+
self.diff_model = gtk.ListStore(bool, bool, str, bool, int)
self.diff_tree = gtk.TreeView(self.diff_model)
self.diff_tree.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
@@ -314,6 +318,8 @@ self._diff_tree_row_act)
self.diff_tree.set_enable_search(False)
self.diff_tree.set_headers_visible(False)
+ self.diff_tree.connect('button-release-event',
+ self._patch_button_release)
diff_hunk_cell = gtk.CellRendererText()
diff_hunk_cell.set_property('cell-background', '#EEEEEE')
@@ -334,6 +340,7 @@ diff_frame.add(vbox)
else:
# 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)
@@ -357,6 +364,38 @@ self.tree.set_headers_clickable(True)
return self._diffpane
+ def _patch_button_release(self, widget, event):
+ '''Detect release of right mouse button on diff tree'''
+ if event.button == 3 and not (event.state & gtk.gdk.CONTROL_MASK):
+ self._diff_popup_menu(widget, event)
+ return False
+
+ def _diff_popup_menu(self, tree, event):
+ sel = tree.get_selection()
+ model, paths = sel.get_selected_rows()
+ path = tree.get_path_at_pos(int(event.x), int(event.y))[0]
+ if path not in paths:
+ sel.unselect_all()
+ sel.select_path(path)
+ paths = [path]
+ if not self.clipboard:
+ return
+
+ menu = gtk.Menu()
+ menuitem = gtk.MenuItem('Copy to Clipboard', True)
+ menuitem.connect('activate', self.copy_to_clipboard, paths)
+ menuitem.set_border_width(1)
+ menu.append(menuitem)
+ menu.show_all()
+ menu.popup(None, None, None, 0, 0)
+
+ def copy_to_clipboard(self, menu, paths):
+ fp = cStringIO.StringIO()
+ for row, in paths:
+ chunkid = self.diff_model[row][DM_CHUNK_ID]
+ self._shelve_chunks[chunkid].write(fp)
+ fp.seek(0)
+ self.clipboard.set_text(fp.read())
def _toggle_rejects(self, widget, diffcol, cell):
diffcol.clear_attributes(cell)
|
Loading...