1 # Copyright (c) 2008 David Aguilar
3 from PyQt4
import QtCore
4 from PyQt4
import QtGui
5 from PyQt4
.QtCore
import Qt
6 from PyQt4
.QtGui
import QClipboard
7 from PyQt4
.QtGui
import QFileDialog
8 from PyQt4
.QtGui
import QIcon
9 from PyQt4
.QtGui
import QTreeWidget
10 from PyQt4
.QtGui
import QListWidgetItem
11 from PyQt4
.QtGui
import QTreeWidgetItem
12 from PyQt4
.QtGui
import QMessageBox
14 from cola
import utils
18 def log(output
, quiet
=True, doraise
=False):
32 def input(msg
, title
=None):
35 parent
= QtGui
.qApp
.activeWindow()
36 result
= QtGui
.QInputDialog
.getText(parent
, msg
, title
)
37 return (unicode(result
[0]), result
[1])
39 def close_log_window():
43 def show_output(output
, **kwargs
):
45 log(output
, quiet
=False)
47 def toggle_log_window():
49 if LOGGER
.isVisible():
55 def create_listwidget_item(text
, filename
):
56 icon
= QIcon(filename
)
57 item
= QListWidgetItem()
62 def create_treewidget_item(text
, filename
):
63 icon
= QIcon(filename
)
64 item
= QTreeWidgetItem()
69 def information(title
, message
=None):
70 """Launches a QMessageBox information with the
71 provided title and message."""
74 QMessageBox
.information(QtGui
.qApp
.activeWindow(), title
, message
)
76 def get_selected_treeitem(tree_widget
):
77 """Returns a(id_number, is_selected) for a QTreeWidget."""
80 item
= tree_widget
.currentItem()
82 id_number
= item
.data(0, Qt
.UserRole
).toInt()[0]
84 return(id_number
, selected
)
86 def get_selected_row(list_widget
):
87 """Returns a(row_number, is_selected) tuple for a QListWidget."""
88 row
= list_widget
.currentRow()
89 item
= list_widget
.item(row
)
90 selected
= item
is not None and item
.isSelected()
93 def get_selection_list(listwidget
, items
):
94 """Returns an array of model items that correspond to
95 the selected QListWidget indices."""
97 itemcount
= listwidget
.count()
98 widgetitems
= [ listwidget
.item(idx
) for idx
in range(itemcount
) ]
100 for item
, widgetitem
in zip(items
, widgetitems
):
101 if widgetitem
.isSelected():
102 selected
.append(item
)
105 def get_tree_selection(treeitem
, items
):
106 """Returns an array of model items that correspond to
107 the selected QListWidget indices."""
109 itemcount
= treeitem
.childCount()
110 widgetitems
= [ treeitem
.child(idx
) for idx
in range(itemcount
) ]
112 for item
, widgetitem
in zip(items
[:len(widgetitems
)], widgetitems
):
113 if widgetitem
.isSelected():
114 selected
.append(item
)
117 def get_selected_item(list_widget
, items
):
118 row
, selected
= get_selected_row(list_widget
)
119 if selected
and row
< len(items
):
124 def open_dialog(parent
, title
, filename
=None):
125 qstr
= QFileDialog
.getOpenFileName(parent
, parent
.tr(title
), filename
)
128 def opendir_dialog(parent
, title
, directory
):
129 flags
= QtGui
.QFileDialog
.ShowDirsOnly | QtGui
.QFileDialog
.DontResolveSymlinks
130 qstr
= QFileDialog
.getExistingDirectory(parent
, parent
.tr(title
),
135 def save_dialog(parent
, title
, filename
=''):
136 return unicode(QFileDialog
.getSaveFileName(parent
,
140 def new_dir_dialog(parent
, title
, filename
=''):
141 return unicode(QFileDialog
.getSaveFileName(parent
,
145 parent
.tr('New Directory ()')))
147 def dir_dialog(parent
, title
, directory
):
148 directory
= QFileDialog
.getExistingDirectory(parent
, parent
.tr(title
), directory
)
149 return unicode(directory
)
151 def get_icon(filename
):
152 icon
= utils
.get_icon(filename
)
155 def question(parent
, title
, message
, default
=True):
156 """Launches a QMessageBox question with the provided title and message.
157 Passing "default=False" will make "No" the default choice."""
158 yes
= QMessageBox
.Yes
165 result
= QMessageBox
.question(parent
, title
, message
, buttons
, default
)
166 return result
== QMessageBox
.Yes
168 def set_clipboard(text
):
169 QtGui
.qApp
.clipboard().setText(text
, QClipboard
.Clipboard
)
170 QtGui
.qApp
.clipboard().setText(text
, QClipboard
.Selection
)
172 def set_selected_item(widget
, idx
):
173 if type(widget
) is QTreeWidget
:
174 item
= widget
.topLevelItem(idx
)
176 widget
.setItemSelected(item
, True)
177 widget
.setCurrentItem(item
)
179 def add_items(widget
, items
):
180 for item
in items
: widget
.addItem(item
)
182 def set_items(widget
, items
):
184 add_items(widget
, items
)
187 return unicode(QtGui
.qApp
.translate('', txt
))
189 def get_icon_file(filename
, staged
=False, untracked
=False):
191 if os
.path
.exists(filename
.encode('utf-8')):
192 icon_file
= utils
.get_icon('staged.png')
194 icon_file
= utils
.get_icon('removed.png')
196 icon_file
= utils
.get_icon('untracked.png')
198 icon_file
= utils
.get_file_icon(filename
)
201 def get_icon_for_file(filename
, staged
=False, untracked
=False):
202 icon_file
= get_icon_file(filename
, staged
=staged
, untracked
=untracked
)
203 return get_icon(icon_file
)
205 def create_listitem(filename
, staged
=False, untracked
=False):
206 """Given a filename, return a QListWidgetItem suitable
207 for adding to a QListWidget. "staged" and "untracked"
208 controls whether to use the appropriate icons."""
209 icon_file
= get_icon_file(filename
, staged
, untracked
)
210 return create_listwidget_item(filename
, icon_file
)
212 def create_treeitem(filename
, staged
=False, untracked
=False):
213 """Given a filename, return a QListWidgetItem suitable
214 for adding to a QListWidget. "staged" and "untracked"
215 controls whether to use the appropriate icons."""
216 icon_file
= get_icon_file(filename
, staged
=staged
, untracked
=untracked
)
217 return create_treewidget_item(filename
, icon_file
)
220 def create_txt_item(txt
):
221 item
= QListWidgetItem()
225 def update_file_icons(widget
, items
, staged
=True,
226 untracked
=False, offset
=0):
227 """Populate a QListWidget with custom icon items."""
228 for idx
, model_item
in enumerate(items
):
229 item
= widget
.item(idx
+offset
)
231 item
.setIcon(get_icon_for_file(model_item
, staged
, untracked
))
233 def update_listwidget(widget
, items
, staged
=True,
234 untracked
=False, append
=False):
235 """Populate a QListWidget with custom icon items."""
238 add_items(widget
, [ create_listitem(i
, staged
, untracked
) for i
in items
])
240 def set_listwidget_strings(widget
, items
):
242 add_items(widget
, [ create_txt_item(i
) for i
in items
])