1 from PyQt4
import QtGui
2 from PyQt4
import QtCore
3 from PyQt4
.QtCore
import Qt
4 from PyQt4
.QtCore
import SIGNAL
9 from cola
import qtutils
10 from cola
import gitcmds
11 from cola
.i18n
import N_
12 from cola
.widgets
import completion
13 from cola
.widgets
import defs
14 from cola
.widgets
import standard
22 selection
= s
.unmerged
24 selection
= s
.modified
26 selection
= s
.untracked
30 launch_with_head(selection
, bool(s
.staged
), model
.head
)
33 def launch_with_head(filenames
, staged
, head
):
36 args
.append('--cached')
40 args
.extend(filenames
)
45 """Launches 'git difftool' with args"""
46 difftool_args
= ['git', 'difftool', '--no-prompt']
47 difftool_args
.extend(args
)
48 core
.fork(difftool_args
)
51 def diff_commits(parent
, a
, b
):
52 dlg
= FileDiffDialog(parent
, a
=a
, b
=b
)
55 return dlg
.exec_() == QtGui
.QDialog
.Accepted
58 def diff_expression(parent
, expr
,
59 create_widget
=False, hide_expr
=False):
60 dlg
= FileDiffDialog(parent
, expr
=expr
, hide_expr
=hide_expr
)
65 return dlg
.exec_() == QtGui
.QDialog
.Accepted
68 class FileDiffDialog(QtGui
.QDialog
):
70 def __init__(self
, parent
, a
=None, b
=None, expr
=None, title
=None,
72 QtGui
.QDialog
.__init
__(self
, parent
)
73 self
.setAttribute(Qt
.WA_MacMetalStyle
)
80 title
= N_('git-cola diff')
82 self
.setWindowTitle(title
)
83 self
.setWindowModality(QtCore
.Qt
.WindowModal
)
85 self
._expr
= completion
.GitRefLineEdit(parent
=self
)
87 self
._expr
.setText(expr
)
89 if expr
is None or hide_expr
:
92 self
._tree
= standard
.TreeWidget(self
)
93 self
._tree
.setSelectionMode(self
._tree
.ExtendedSelection
)
94 self
._tree
.setHeaderHidden(True)
96 self
._diff
_btn
= QtGui
.QPushButton(N_('Compare'))
97 self
._diff
_btn
.setIcon(qtutils
.ok_icon())
98 self
._diff
_btn
.setEnabled(False)
100 self
._close
_btn
= QtGui
.QPushButton(N_('Close'))
101 self
._close
_btn
.setIcon(qtutils
.close_icon())
103 self
._button
_layt
= QtGui
.QHBoxLayout()
104 self
._button
_layt
.setMargin(0)
105 self
._button
_layt
.addStretch()
106 self
._button
_layt
.addWidget(self
._diff
_btn
)
107 self
._button
_layt
.addWidget(self
._close
_btn
)
109 self
._layt
= QtGui
.QVBoxLayout()
110 self
._layt
.setMargin(defs
.margin
)
111 self
._layt
.setSpacing(defs
.spacing
)
113 self
._layt
.addWidget(self
._expr
)
114 self
._layt
.addWidget(self
._tree
)
115 self
._layt
.addLayout(self
._button
_layt
)
116 self
.setLayout(self
._layt
)
118 self
.connect(self
._tree
, SIGNAL('itemSelectionChanged()'),
119 self
._tree
_selection
_changed
)
121 self
.connect(self
._tree
,
122 SIGNAL('itemDoubleClicked(QTreeWidgetItem*,int)'),
123 self
._tree
_double
_clicked
)
125 self
.connect(self
._expr
, SIGNAL('textChanged(QString)'),
128 self
.connect(self
._expr
, SIGNAL('returnPressed()'),
131 qtutils
.connect_button(self
._diff
_btn
, self
.diff
)
132 qtutils
.connect_button(self
._close
_btn
, self
.close
)
133 qtutils
.add_close_action(self
)
135 self
.resize(720, 420)
138 def text_changed(self
, txt
):
139 self
.expr
= unicode(txt
)
143 if self
.expr
is not None:
144 self
.diff_arg
= utils
.shell_split(self
.expr
)
146 self
.diff_arg
= [self
.a
]
148 self
.diff_arg
= [self
.a
, self
.b
]
149 self
.refresh_filenames()
151 def refresh_filenames(self
):
154 if self
.a
and self
.b
is None:
155 filenames
= gitcmds
.diff_index_filenames(self
.a
)
157 filenames
= gitcmds
.diff(self
.diff_arg
)
161 icon
= qtutils
.file_icon()
163 for filename
in filenames
:
164 item
= QtGui
.QTreeWidgetItem()
165 item
.setIcon(0, icon
)
166 item
.setText(0, filename
)
167 item
.setData(0, QtCore
.Qt
.UserRole
, QtCore
.QVariant(filename
))
169 self
._tree
.addTopLevelItems(items
)
171 def _tree_selection_changed(self
):
172 self
._diff
_btn
.setEnabled(bool(self
._tree
.selectedItems()))
174 def _tree_double_clicked(self
, item
, column
):
175 path
= item
.data(0, QtCore
.Qt
.UserRole
).toPyObject()
176 launch(self
.diff_arg
+ ['--', unicode(path
)])
179 items
= self
._tree
.selectedItems()
182 paths
= [i
.data(0, QtCore
.Qt
.UserRole
).toPyObject() for i
in items
]
184 launch(self
.diff_arg
+ ['--', unicode(path
)])