bookmarks: add "Open in New Window" action and hotkeys
[git-cola.git] / cola / widgets / startup.py
blob6ca7b8e0453066d135100f16ed7e6ce2bd515d17
1 """
2 Provides the git-cola startup dialog
4 The startup dialog is presented when no repositories can be
5 found at startup.
7 """
8 import os
10 from PyQt4 import QtGui
11 from PyQt4.QtCore import Qt
12 from PyQt4.QtCore import SIGNAL
14 from cola import guicmds
15 from cola import settings
16 from cola import qtutils
17 from cola.i18n import N_
18 from cola.widgets import defs
21 class StartupDialog(QtGui.QDialog):
22 """Provides a GUI to Open or Clone a git repository."""
24 def __init__(self, parent=None):
25 QtGui.QDialog.__init__(self, parent)
26 self.setWindowTitle(N_('git-cola'))
27 self._gitdir = None
29 self._layt = QtGui.QHBoxLayout()
30 self._layt.setMargin(defs.margin)
31 self._layt.setSpacing(defs.spacing)
33 self._new_btn = QtGui.QPushButton(N_('New...'))
34 self._new_btn.setIcon(qtutils.new_icon())
36 self._open_btn = QtGui.QPushButton(N_('Open...'))
37 self._open_btn.setIcon(qtutils.open_icon())
39 self._clone_btn = QtGui.QPushButton(N_('Clone...'))
40 self._clone_btn.setIcon(qtutils.git_icon())
42 self._close_btn = QtGui.QPushButton(N_('Close'))
44 self._layt.addWidget(self._open_btn)
45 self._layt.addWidget(self._clone_btn)
46 self._layt.addWidget(self._new_btn)
47 self._layt.addStretch()
48 self._layt.addWidget(self._close_btn)
50 self.model = settings.Settings()
52 self._vlayt = QtGui.QVBoxLayout()
53 self._vlayt.setMargin(defs.margin)
54 self._vlayt.setSpacing(defs.margin)
56 self._bookmark_label = QtGui.QLabel(N_('Select Repository...'))
57 self._bookmark_label.setAlignment(Qt.AlignCenter)
59 self._bookmark_model = QtGui.QStandardItemModel()
61 item = QtGui.QStandardItem(N_('Select manually...'))
62 item.setEditable(False)
63 self._bookmark_model.appendRow(item)
65 added = set()
66 all_repos = self.model.bookmarks + self.model.recent
68 for repo in all_repos:
69 if repo in added:
70 continue
71 added.add(repo)
72 item = QtGui.QStandardItem(repo)
73 item.setEditable(False)
74 self._bookmark_model.appendRow(item)
76 selection_mode = QtGui.QAbstractItemView.SingleSelection
78 self._bookmark_list = QtGui.QListView()
79 self._bookmark_list.setSelectionMode(selection_mode)
80 self._bookmark_list.setAlternatingRowColors(True)
81 self._bookmark_list.setModel(self._bookmark_model)
83 if not all_repos:
84 self._bookmark_label.setMinimumHeight(1)
85 self._bookmark_list.setMinimumHeight(1)
86 self._bookmark_label.hide()
87 self._bookmark_list.hide()
89 self._vlayt.addWidget(self._bookmark_label)
90 self._vlayt.addWidget(self._bookmark_list)
91 self._vlayt.addLayout(self._layt)
93 self.setLayout(self._vlayt)
95 qtutils.connect_button(self._open_btn, self._open)
96 qtutils.connect_button(self._clone_btn, self._clone)
97 qtutils.connect_button(self._new_btn, self._new)
98 qtutils.connect_button(self._close_btn, self.reject)
100 self.connect(self._bookmark_list,
101 SIGNAL('activated(const QModelIndex &)'),
102 self._open_bookmark)
105 def find_git_repo(self):
107 Return a path to a git repository
109 This is the entry point for external callers.
110 This method finds a git repository by allowing the
111 user to browse to one on the filesystem or by creating
112 a new one with git-clone.
115 self.show()
116 self.raise_()
117 if self.exec_() == QtGui.QDialog.Accepted:
118 return self._gitdir
119 return None
121 def _open(self):
122 self._gitdir = self._get_selected_bookmark()
123 if not self._gitdir:
124 self._gitdir = qtutils.opendir_dialog(N_('Open Git Repository...'),
125 os.getcwd())
126 if self._gitdir:
127 self.accept()
129 def _clone(self):
130 gitdir = guicmds.clone_repo(spawn=False)
131 if gitdir:
132 self._gitdir = gitdir
133 self.accept()
135 def _new(self):
136 gitdir = guicmds.new_repo()
137 if gitdir:
138 self._gitdir = gitdir
139 self.accept()
141 def _open_bookmark(self, index):
142 if(index.row() == 0):
143 self._open()
144 else:
145 self._gitdir = unicode(self._bookmark_model.data(index).toString())
146 if self._gitdir:
147 self.accept()
149 def _get_selected_bookmark(self):
150 selected = self._bookmark_list.selectedIndexes()
151 if(len(selected) > 0 and selected[0].row() != 0):
152 return unicode(self._bookmark_model.data(selected[0]).toString())
153 return None