qtutils: improve create_action_button()
[git-cola.git] / cola / widgets / bookmarks.py
blobf62e19e739b9088cd18778f0ce752c008efbf15a
1 """Provides widgets related to bookmarks"""
2 import os
3 import sys
5 from PyQt4 import QtGui
6 from PyQt4.QtCore import Qt
7 from PyQt4.QtCore import SIGNAL
10 from cola import cmds
11 from cola import core
12 from cola import qtutils
13 from cola import settings
14 from cola.compat import set
15 from cola.i18n import N_
16 from cola.settings import Settings
17 from cola.widgets import defs
18 from cola.widgets import standard
21 def manage_bookmarks():
22 dlg = BookmarksDialog(qtutils.active_window())
23 dlg.show()
24 dlg.exec_()
25 return dlg
28 class BookmarksDialog(standard.Dialog):
29 def __init__(self, parent):
30 standard.Dialog.__init__(self, parent=parent)
31 self.model = settings.Settings()
33 self.resize(494, 238)
34 self.setWindowTitle(N_('Bookmarks'))
35 if parent is not None:
36 self.setWindowModality(Qt.WindowModal)
37 self.layt = QtGui.QVBoxLayout(self)
38 self.layt.setMargin(defs.margin)
39 self.layt.setSpacing(defs.spacing)
41 self.bookmarks = QtGui.QListWidget(self)
42 self.bookmarks.setAlternatingRowColors(True)
43 self.bookmarks.setSelectionMode(QtGui.QAbstractItemView
44 .ExtendedSelection)
46 self.layt.addWidget(self.bookmarks)
47 self.button_layout = QtGui.QHBoxLayout()
49 self.open_button = qtutils.create_button(text=N_('Open'),
50 icon=qtutils.open_icon())
51 self.open_button.setEnabled(False)
52 self.button_layout.addWidget(self.open_button)
54 self.add_button = qtutils.create_button(text=N_('Add'),
55 icon=qtutils.add_icon())
56 self.button_layout.addWidget(self.add_button)
58 self.delete_button = QtGui.QPushButton(self)
59 self.delete_button.setText(N_('Delete'))
60 self.delete_button.setIcon(qtutils.discard_icon())
61 self.delete_button.setEnabled(False)
62 self.button_layout.addWidget(self.delete_button)
63 self.button_layout.addStretch()
65 self.save_button = QtGui.QPushButton(self)
66 self.save_button.setText(N_('Save'))
67 self.save_button.setIcon(qtutils.save_icon())
68 self.save_button.setEnabled(False)
69 self.button_layout.addWidget(self.save_button)
71 self.close_button = QtGui.QPushButton(self)
72 self.close_button.setText(N_('Close'))
73 self.button_layout.addWidget(self.close_button)
75 self.layt.addLayout(self.button_layout)
77 self.connect(self.bookmarks, SIGNAL('itemSelectionChanged()'),
78 self.item_selection_changed)
80 qtutils.connect_button(self.open_button, self.open_repo)
81 qtutils.connect_button(self.add_button, self.add)
82 qtutils.connect_button(self.delete_button, self.delete)
83 qtutils.connect_button(self.save_button, self.save)
84 qtutils.connect_button(self.close_button, self.accept)
86 self.update_bookmarks()
88 def update_bookmarks(self):
89 self.bookmarks.clear()
90 self.bookmarks.addItems(self.model.bookmarks)
92 def selection(self):
93 return qtutils.selection_list(self.bookmarks, self.model.bookmarks)
95 def item_selection_changed(self):
96 has_selection = bool(self.selection())
97 self.open_button.setEnabled(has_selection)
98 self.delete_button.setEnabled(has_selection)
100 def save(self):
101 """Saves the bookmarks settings and exits"""
102 self.model.save()
103 self.save_button.setEnabled(False)
105 def add(self):
106 path, ok = qtutils.prompt(N_('Path to git repository'),
107 title=N_('Enter Git Repository'),
108 text=core.getcwd())
109 if not ok:
110 return
111 self.model.bookmarks.append(path)
112 self.update_bookmarks()
113 self.save()
115 def open_repo(self):
116 """Opens a new git-cola session on a bookmark"""
117 for repo in self.selection():
118 core.fork([sys.executable, sys.argv[0], '--repo', repo])
120 def delete(self):
121 """Removes a bookmark from the bookmarks list"""
122 selection = self.selection()
123 if not selection:
124 return
125 for repo in selection:
126 self.model.remove_bookmark(repo)
127 self.update_bookmarks()
128 self.save_button.setEnabled(True)
131 class BookmarksWidget(QtGui.QWidget):
133 def __init__(self, parent=None):
134 QtGui.QWidget.__init__(self, parent)
136 self.tree = BookmarksTreeWidget(parent=self)
137 self.open_button = qtutils.create_action_button(
138 tooltip=N_('Open'), icon=qtutils.open_icon())
139 self.open_button.setEnabled(False)
141 self.edit_button = qtutils.create_action_button(
142 tooltip=N_('Bookmarks...'), icon=qtutils.add_icon())
144 qtutils.connect_button(self.open_button, self.tree.open_repo)
145 qtutils.connect_button(self.edit_button, self.manage_bookmarks)
147 self.connect(self.tree, SIGNAL('itemSelectionChanged()'),
148 self._tree_selection_changed)
150 self.button_layout = QtGui.QHBoxLayout()
151 self.button_layout.setMargin(defs.no_margin)
152 self.button_layout.setSpacing(defs.spacing)
153 self.button_layout.addWidget(self.open_button)
154 self.button_layout.addWidget(self.edit_button)
156 self.layout = QtGui.QVBoxLayout()
157 self.layout.setMargin(defs.no_margin)
158 self.layout.setSpacing(defs.spacing)
159 self.layout.addWidget(self.tree)
160 self.setLayout(self.layout)
162 self.corner_widget = QtGui.QWidget(self)
163 self.corner_widget.setLayout(self.button_layout)
164 titlebar = parent.titleBarWidget()
165 titlebar.add_corner_widget(self.corner_widget)
166 self.setFocusProxy(self.tree)
168 def _tree_selection_changed(self):
169 enabled = bool(self.tree.selected_item())
170 self.open_button.setEnabled(enabled)
172 def manage_bookmarks(self):
173 manage_bookmarks()
174 self.refresh()
176 def refresh(self):
177 self.tree.refresh()
180 class BookmarksTreeWidget(standard.TreeWidget):
182 def __init__(self, parent=None):
183 standard.TreeWidget.__init__(self, parent=parent)
184 self.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
185 self.setHeaderHidden(True)
187 self.open_action = qtutils.add_action(self,
188 N_('Open'), self.open_repo, 'Return')
189 self.open_action.setEnabled(False)
191 self.open_default_action = qtutils.add_action(self,
192 cmds.OpenDefaultApp.name(), self.open_default,
193 cmds.OpenDefaultApp.SHORTCUT)
194 self.open_default_action.setEnabled(False)
196 self.launch_editor_action = qtutils.add_action(self,
197 cmds.Edit.name(), self.launch_editor,
198 cmds.Edit.SHORTCUT)
199 self.launch_editor_action.setEnabled(False)
201 self.launch_terminal_action = qtutils.add_action(self,
202 cmds.LaunchTerminal.name(), self.launch_terminal,
203 cmds.LaunchTerminal.SHORTCUT)
204 self.launch_terminal_action.setEnabled(False)
206 self.copy_action = qtutils.add_action(self,
207 N_('Copy'), self.copy, QtGui.QKeySequence.Copy)
208 self.copy_action.setEnabled(False)
210 self.connect(self, SIGNAL('itemSelectionChanged()'),
211 self._tree_selection_changed)
213 self.connect(self, SIGNAL('itemDoubleClicked(QTreeWidgetItem*,int)'),
214 self._tree_double_clicked)
216 self.refresh()
218 def refresh(self):
219 self.clear()
220 settings = Settings()
221 items = []
222 icon = qtutils.dir_icon()
223 recents = set(settings.recent)
224 for path in settings.recent:
225 item = BookmarksTreeWidgetItem(path, icon)
226 items.append(item)
227 for path in settings.bookmarks:
228 if path in recents: # avoid duplicates
229 continue
230 item = BookmarksTreeWidgetItem(path, icon)
231 items.append(item)
232 self.addTopLevelItems(items)
234 def contextMenuEvent(self, event):
235 menu = QtGui.QMenu(self)
236 menu.addAction(self.copy_action)
237 menu.addAction(self.open_action)
238 menu.addAction(self.open_default_action)
239 menu.addSeparator()
240 menu.addAction(self.launch_editor_action)
241 menu.addAction(self.launch_terminal_action)
242 menu.exec_(self.mapToGlobal(event.pos()))
244 def copy(self):
245 item = self.selected_item()
246 if not item:
247 return
248 qtutils.set_clipboard(item.path)
250 def open_default(self):
251 item = self.selected_item()
252 if not item:
253 return
254 cmds.do(cmds.OpenDefaultApp, [item.path])
256 def open_repo(self):
257 item = self.selected_item()
258 if not item:
259 return
260 cmds.do(cmds.OpenRepo, item.path)
262 def launch_editor(self):
263 item = self.selected_item()
264 if not item:
265 return
266 cmds.do(cmds.Edit, [item.path])
268 def launch_terminal(self):
269 item = self.selected_item()
270 if not item:
271 return
272 cmds.do(cmds.LaunchTerminal, item.path)
274 def _tree_selection_changed(self):
275 enabled = bool(self.selected_item())
276 self.open_action.setEnabled(enabled)
277 self.copy_action.setEnabled(enabled)
278 self.launch_editor_action.setEnabled(enabled)
279 self.launch_terminal_action.setEnabled(enabled)
280 self.open_default_action.setEnabled(enabled)
282 def _tree_double_clicked(self, item, column):
283 cmds.do(cmds.OpenRepo, item.path)
286 class BookmarksTreeWidgetItem(QtGui.QTreeWidgetItem):
288 def __init__(self, path, icon):
289 QtGui.QTreeWidgetItem.__init__(self)
290 self.path = path
291 self.setIcon(0, icon)
292 self.setText(0, os.path.basename(path))
293 self.setToolTip(0, path)