qtutils: add raise_logger, optional args to show_output
[ugit.git] / ugit / qtutils.py
blobfa70fb79218699c09ce774778460a92a439002f1
1 import os
2 from PyQt4 import QtCore
3 from PyQt4 import QtGui
4 from PyQt4.QtGui import QClipboard
5 from PyQt4.QtGui import QFileDialog
6 from PyQt4.QtGui import QIcon
7 from PyQt4.QtGui import QListWidgetItem
8 from PyQt4.QtGui import QMessageBox
10 from ugit import utils
12 LOGGER = None
14 def log(output, quiet=True, doraise=False):
15 if not LOGGER: return
16 LOGGER.log(output)
17 if quiet: return
18 LOGGER.show()
19 if not doraise: return
20 raise_logger()
22 def raise_logger():
23 LOGGER.raise_()
25 def input(msg, title=None):
26 if title is None:
27 title = msg
28 parent = QtGui.qApp.activeWindow()
29 result = QtGui.QInputDialog.getText(parent, msg, title)
30 return (unicode(result[0]), result[1])
32 def close_log_window():
33 LOGGER.hide()
34 LOGGER.done(0)
36 def show_output(output, **kwargs):
37 if not output: return
38 log(output, quiet=False)
40 def toggle_log_window():
41 if not LOGGER: return
42 if LOGGER.isVisible():
43 LOGGER.hide()
44 else:
45 LOGGER.show()
46 LOGGER.raise_()
48 def create_listwidget_item(text, filename):
49 icon = QIcon(filename)
50 item = QListWidgetItem()
51 item.setIcon(icon)
52 item.setText(text)
53 return item
55 def information(title, message=None):
56 '''Launches a QMessageBox information with the
57 provided title and message.'''
58 if message is None:
59 message = title
60 QMessageBox.information(QtGui.qApp.activeWindow(), title, message)
62 def get_selected_row(list_widget):
63 '''Returns a(row_number, is_selected) tuple for a QListWidget.'''
64 row = list_widget.currentRow()
65 item = list_widget.item(row)
66 selected = item is not None and item.isSelected()
67 return(row, selected)
69 def get_selection_list(listwidget, items):
70 '''Returns an array of model items that correspond to
71 the selected QListWidget indices.'''
72 selected = []
73 itemcount = listwidget.count()
74 widgetitems = [ listwidget.item(idx) for idx in range(itemcount) ]
76 for item, widgetitem in zip(items, widgetitems):
77 if widgetitem.isSelected():
78 selected.append(item)
79 return selected
81 def get_selected_item(list_widget, items):
82 row, selected = get_selected_row(list_widget)
83 if selected and row < len(items):
84 return items[row]
85 else:
86 return None
88 def open_dialog(parent, title, filename=None):
89 qstr = QFileDialog.getOpenFileName(
90 parent, parent.tr(title), filename)
91 return unicode(qstr)
93 def opendir_dialog(parent, title, directory):
94 qstr = QFileDialog.getExistingDirectory(
95 parent, directory, parent.tr(title),
96 QtGui.QFileDialog.ShowDirsOnly | QtGui.QFileDialog.DontResolveSymlinks)
97 return unicode(qstr)
99 def save_dialog(parent, title, filename=None):
100 qstr = QFileDialog.getSaveFileName(
101 parent, parent.tr(title), filename)
102 return unicode(qstr)
104 def dir_dialog(parent, title, directory):
105 directory = QFileDialog.getExistingDirectory(
106 parent, title, directory)
107 return unicode(directory)
109 def get_qicon(filename):
110 icon = utils.get_icon(filename)
111 return QIcon(icon)
113 def question(parent, title, message, default=True):
114 '''Launches a QMessageBox question with the provided title and message.
115 Passing "default=False" will make "No" the default choice.'''
116 yes = QMessageBox.Yes
117 no = QMessageBox.No
118 buttons = yes | no
119 if default:
120 default = yes
121 else:
122 default = no
123 result = QMessageBox.question(parent,
124 title, message, buttons, default)
125 return result == QMessageBox.Yes
127 def set_clipboard(text):
128 QtGui.qApp.clipboard().setText(text, QClipboard.Clipboard)
129 QtGui.qApp.clipboard().setText(text, QClipboard.Selection)
131 def add_items(widget, items):
132 for item in items: widget.addItem(item)
134 def set_items(widget, items):
135 widget.clear()
136 add_items(widget, items)
138 def tr(txt):
139 trtext = unicode(QtGui.qApp.tr(txt))
140 if trtext.endswith('@@verb'):
141 trtext = trtext.replace('@@verb','')
142 if trtext.endswith('@@noun'):
143 trtext = trtext.replace('@@noun','')
144 return trtext
146 def create_item(filename, staged, untracked=False):
147 '''Given a filename, return a QListWidgetItem suitable
148 for adding to a QListWidget. "staged" and "untracked"
149 controls whether to use the appropriate icons.'''
150 if staged:
151 if os.path.exists(filename):
152 icon_file = utils.get_icon('staged.png')
153 else:
154 icon_file = utils.get_icon('removed.png')
155 elif untracked:
156 icon_file = utils.get_icon('untracked.png')
157 else:
158 icon_file = utils.get_file_icon(filename)
159 return create_listwidget_item(filename, icon_file)
161 def create_txt_item(txt):
162 item = QListWidgetItem()
163 item.setText(txt)
164 return item
166 def update_listwidget(widget, items, staged=True,
167 untracked=False, append=False):
168 '''Populate a QListWidget with custom icon items.'''
169 if not append: widget.clear()
170 add_items( widget, [ create_item(i, staged, untracked) for i in items ])
172 def set_listwidget_strings(widget, items):
173 widget.clear()
174 add_items( widget, [ create_txt_item(i) for i in items ])