1 """Provides widgets related to bookmarks"""
5 from PyQt4
import QtGui
6 from PyQt4
.QtCore
import Qt
7 from PyQt4
.QtCore
import SIGNAL
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())
28 class BookmarksDialog(standard
.Dialog
):
29 def __init__(self
, parent
):
30 standard
.Dialog
.__init
__(self
, parent
=parent
)
31 self
.model
= settings
.Settings()
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
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
)
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
)
101 """Saves the bookmarks settings and exits"""
103 self
.save_button
.setEnabled(False)
106 path
, ok
= qtutils
.prompt(N_('Path to git repository'),
107 title
=N_('Enter Git Repository'),
111 self
.model
.bookmarks
.append(path
)
112 self
.update_bookmarks()
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
])
121 """Removes a bookmark from the bookmarks list"""
122 selection
= self
.selection()
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
):
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
,
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
)
220 settings
= Settings()
222 icon
= qtutils
.dir_icon()
223 recents
= set(settings
.recent
)
224 for path
in settings
.recent
:
225 item
= BookmarksTreeWidgetItem(path
, icon
)
227 for path
in settings
.bookmarks
:
228 if path
in recents
: # avoid duplicates
230 item
= BookmarksTreeWidgetItem(path
, icon
)
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
)
240 menu
.addAction(self
.launch_editor_action
)
241 menu
.addAction(self
.launch_terminal_action
)
242 menu
.exec_(self
.mapToGlobal(event
.pos()))
245 item
= self
.selected_item()
248 qtutils
.set_clipboard(item
.path
)
250 def open_default(self
):
251 item
= self
.selected_item()
254 cmds
.do(cmds
.OpenDefaultApp
, [item
.path
])
257 item
= self
.selected_item()
260 cmds
.do(cmds
.OpenRepo
, item
.path
)
262 def launch_editor(self
):
263 item
= self
.selected_item()
266 cmds
.do(cmds
.Edit
, [item
.path
])
268 def launch_terminal(self
):
269 item
= self
.selected_item()
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
)
291 self
.setIcon(0, icon
)
292 self
.setText(0, os
.path
.basename(path
))
293 self
.setToolTip(0, path
)