1 from PyQt4
import QtGui
2 from PyQt4
import QtCore
3 from PyQt4
.QtCore
import SIGNAL
6 from cola
import qtutils
7 from cola
import gitcmds
8 from cola
.widgets
import defs
12 """Launches 'git difftool' with args"""
13 difftool_args
= ['git', 'difftool', '--no-prompt']
14 difftool_args
.extend(args
)
15 utils
.fork(difftool_args
)
18 def diff_commits(parent
, a
, b
):
19 dlg
= FileDiffDialog(parent
, a
, b
)
22 return dlg
.exec_() == QtGui
.QDialog
.Accepted
25 class FileDiffDialog(QtGui
.QDialog
):
26 def __init__(self
, parent
, a
, b
):
27 QtGui
.QDialog
.__init
__(self
, parent
)
31 self
.setWindowTitle('Select File(s)')
32 self
._tree
= QtGui
.QTreeWidget(self
)
33 self
._tree
.setAlternatingRowColors(True)
34 self
._tree
.setRootIsDecorated(False)
35 self
._tree
.setSelectionMode(self
._tree
.ExtendedSelection
)
36 self
._tree
.setUniformRowHeights(True)
37 self
._tree
.setAllColumnsShowFocus(True)
38 self
._tree
.setHeaderHidden(True)
40 self
._diff
_btn
= QtGui
.QPushButton('Compare')
41 self
._diff
_btn
.setIcon(qtutils
.ok_icon())
42 self
._diff
_btn
.setEnabled(False)
44 self
._close
_btn
= QtGui
.QPushButton('Close')
45 self
._close
_btn
.setIcon(qtutils
.close_icon())
47 self
._button
_layt
= QtGui
.QHBoxLayout()
48 self
._button
_layt
.setMargin(0)
49 self
._button
_layt
.addStretch()
50 self
._button
_layt
.addWidget(self
._diff
_btn
)
51 self
._button
_layt
.addWidget(self
._close
_btn
)
53 self
._layt
= QtGui
.QVBoxLayout()
54 self
._layt
.setMargin(defs
.margin
)
55 self
._layt
.setSpacing(defs
.spacing
)
56 self
._layt
.addWidget(self
._tree
)
57 self
._layt
.addLayout(self
._button
_layt
)
58 self
.setLayout(self
._layt
)
60 qtutils
.add_close_action(self
)
62 self
.connect(self
._tree
, SIGNAL('itemSelectionChanged()'),
63 self
._tree
_selection
_changed
)
65 self
.connect(self
._tree
,
66 SIGNAL('itemDoubleClicked(QTreeWidgetItem*,int)'),
67 self
._tree
_double
_clicked
)
69 self
.connect(self
._diff
_btn
, SIGNAL('clicked()'), self
.diff
)
70 self
.connect(self
._close
_btn
, SIGNAL('clicked()'), self
.close
)
72 self
.diff_arg
= (self
.a
, self
.b
)
78 filenames
= gitcmds
.diff_filenames(*self
.diff_arg
)
80 details
= ('"git diff --name-only %s" returned an empty list' %
81 ' '.join(self
.diff_arg
))
83 qtutils
.information('git cola',
84 message
='No changes to diff',
89 icon
= qtutils
.file_icon()
91 for filename
in filenames
:
92 item
= QtGui
.QTreeWidgetItem()
94 item
.setText(0, filename
)
95 item
.setData(0, QtCore
.Qt
.UserRole
, QtCore
.QVariant(filename
))
97 self
._tree
.addTopLevelItems(items
)
99 return QtGui
.QDialog
.exec_(self
)
101 def _tree_selection_changed(self
):
102 self
._diff
_btn
.setEnabled(bool(self
._tree
.selectedItems()))
104 def _tree_double_clicked(self
, item
, column
):
105 path
= item
.data(0, QtCore
.Qt
.UserRole
).toPyObject()
106 launch(self
.diff_arg
+ ('--', unicode(path
)))
109 items
= self
._tree
.selectedItems()
112 paths
= [i
.data(0, QtCore
.Qt
.UserRole
).toPyObject() for i
in items
]
114 launch(self
.diff_arg
+ ('--', unicode(path
)))