qt: Make the 'text' field optional in create_button()
[git-cola.git] / cola / difftool.py
blobe604f9ca59706c123ad5cd36efa08ca994cdcf53
1 from PyQt4 import QtGui
2 from PyQt4 import QtCore
3 from PyQt4.QtCore import SIGNAL
5 from cola import utils
6 from cola import qtutils
7 from cola import gitcmds
8 from cola.widgets import defs
11 def launch(args):
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)
20 dlg.show()
21 dlg.raise_()
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)
28 self.a = a
29 self.b = b
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)
74 self.resize(720, 420)
77 def exec_(self):
78 filenames = gitcmds.diff_filenames(*self.diff_arg)
79 if not filenames:
80 details = ('"git diff --name-only %s" returned an empty list' %
81 ' '.join(self.diff_arg))
82 self.hide()
83 qtutils.information('git cola',
84 message='No changes to diff',
85 details=details)
86 self.close()
87 return self.Accepted
89 icon = qtutils.file_icon()
90 items = []
91 for filename in filenames:
92 item = QtGui.QTreeWidgetItem()
93 item.setIcon(0, icon)
94 item.setText(0, filename)
95 item.setData(0, QtCore.Qt.UserRole, QtCore.QVariant(filename))
96 items.append(item)
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)))
108 def diff(self):
109 items = self._tree.selectedItems()
110 if not items:
111 return
112 paths = [i.data(0, QtCore.Qt.UserRole).toPyObject() for i in items]
113 for path in paths:
114 launch(self.diff_arg + ('--', unicode(path)))