Kiln » TortoiseHg » TortoiseHg
Clone URL:  
Pushed to one repository · View In Graph Contained in 2.1, 2.1.1, and 2.1.2

reporegistry: hoist context menu code into RepoRegistryView dock widget

Changeset 8f2f1ab727fc

Parent 95146b968419

by Steve Borho

Changes to 2 files · Browse files at 8f2f1ab727fc Showing diff from parent 95146b968419 Diff from another changeset...

 
24
25
26
27
28
 
29
30
31
32
33
 
34
 
35
36
37
 
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
 
66
67
68
 
76
77
78
79
 
 
80
81
82
 
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
 
 
 
 
170
171
172
 
175
176
177
178
179
180
181
182
183
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
184
185
186
187
188
189
190
191
192
193
194
195
196
197
 
 
 
 
 
 
 
 
 
 
 
 
198
199
200
201
202
203
204
 
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
 
221
222
223
224
225
226
 
239
240
241
242
243
244
245
 
 
 
 
 
246
247
 
 
 
248
249
250
 
 
 
 
251
252
253
 
 
254
255
256
257
258
 
 
259
260
261
262
263
264
 
 
 
 
 
 
 
 
 
 
 
 
 
 
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
 
24
25
26
 
 
27
28
29
30
31
 
32
33
34
35
36
37
 
45
46
47
 
 
 
48
49
50
 
 
 
 
 
 
 
 
 
 
 
 
51
52
53
54
 
62
63
64
 
65
66
67
68
69
 
84
85
86
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
87
88
89
90
91
92
93
 
96
97
98
 
 
 
99
 
 
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
 
 
 
 
 
 
 
 
 
 
 
 
 
203
204
205
206
207
208
209
210
211
212
213
214
215
216
 
 
217
218
219
 
221
222
223
 
 
224
225
226
227
 
 
228
229
230
 
231
232
 
 
233
234
235
 
248
249
250
 
 
 
 
251
252
253
254
255
256
 
257
258
259
260
 
 
261
262
263
264
265
 
 
266
267
268
 
 
 
 
269
270
271
 
 
 
 
 
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
@@ -24,14 +24,14 @@
 class RepoTreeView(QTreeView):   showMessage = pyqtSignal(QString)   openRepo = pyqtSignal(QString, bool) - - contextmenu = None + menuRequested = pyqtSignal(object, object)     def __init__(self, parent):   QTreeView.__init__(self, parent, allColumnsShowFocus=True)   self.selitem = None - self.msg = '' + self.msg = ''   + self.setHeaderHidden(True)   self.setExpandsOnDoubleClick(False)   self.setMouseTracking(True)   @@ -45,24 +45,10 @@
  self.setEditTriggers(QAbstractItemView.DoubleClicked)   self.setSelectionBehavior(QAbstractItemView.SelectRows)   - self.createActions() - self.setHeaderHidden(True) -   def contextMenuEvent(self, event):   if not self.selitem:   return - menulist = self.selitem.internalPointer().menulist() - if len(menulist) > 0: - if not self.contextmenu: - self.contextmenu = QMenu(self) - else: - self.contextmenu.clear() - for act in menulist: - if act: - self.contextmenu.addAction(self._actions[act]) - else: - self.contextmenu.addSeparator() - self.contextmenu.exec_(event.globalPos()) + self.menuRequested.emit(event.globalPos(), self.selitem)     def mouseMoveEvent(self, event):   self.msg = '' @@ -76,7 +62,8 @@
    def keyPressEvent(self, event):   if event.key() in (Qt.Key_Enter, Qt.Key_Return): - self.showFirstTabOrOpen() + if self.selitem and self.selitem.internalPointer().details(): + self.showFirstTabOrOpen()   else:   super(RepoTreeView, self).keyPressEvent(event)   @@ -97,76 +84,10 @@
  else:   self.selitem = selection[0]   - def _action_defs(self): - a = [("open", _("Open"), 'thg-repository-open', - _("Open the repository in a new tab"), None, self.open), - ("openAll", _("Open All"), 'thg-repository-open', - _("Open all repositories in new tabs"), None, self.openAll), - ("newGroup", _("New Group"), 'new-group', - _("Create a new group"), None, self.newGroup), - ("rename", _("Rename"), None, - _("Rename the entry"), None, self.startRename), - ("settings", _("Settings..."), 'settings_user', - _("View the repository's settings"), None, self.startSettings), - ("remove", _("Remove from registry"), 'menudelete', - _("Remove the node and all its subnodes." - " Repositories are not deleted from disk."), - None, self.removeSelected), - ("clone", _("Clone..."), 'hg-clone', - _("Clone Repository"), None, self.cloneRepo), - ("explore", _("Explore"), 'system-file-manager', - _("Open the repository in Windows Explorer"), None, self.explore), - ("terminal", _("Terminal"), 'utilities-terminal', - _("Open a shell terminal in repository root"), None, self.terminal), - ("add", _("Add repository..."), 'hg', - _("Add a repository to this group"), None, self.addRepo), - ] - return a - - def createActions(self): - self._actions = {} - for name, desc, icon, tip, key, cb in self._action_defs(): - self._actions[name] = QAction(desc, self) - QTimer.singleShot(0, self.configureActions) - - def configureActions(self): - for name, desc, icon, tip, key, cb in self._action_defs(): - act = self._actions[name] - if icon: - act.setIcon(qtlib.getmenuicon(icon)) - if tip: - act.setStatusTip(tip) - if key: - act.setShortcut(key) - if cb: - act.triggered.connect(cb) - self.addAction(act) - - def startSettings(self): - if not self.selitem: - return - root = self.selitem.internalPointer().rootpath() - sd = settings.SettingsDialog(configrepo=True, focus='web.name', - parent=self, root=root) - sd.exec_() - - def startRename(self): - if not self.selitem: - return - self.edit(self.selitem) - - def openAll(self): - if not self.selitem: - return - for root in self.selitem.internalPointer().childRoots(): - self.openRepo.emit(hglib.tounicode(root), False) - - def open(self): - 'open context menu action, open repowidget unconditionally' - if not self.selitem: - return - root = self.selitem.internalPointer().rootpath() - self.openRepo.emit(hglib.tounicode(root), False) + def sizeHint(self): + size = super(RepoTreeView, self).sizeHint() + size.setWidth(QFontMetrics(self.font()).width('M') * 15) + return size     def showFirstTabOrOpen(self):   'Enter or double click events, show existing or open a new repowidget' @@ -175,30 +96,124 @@
  root = self.selitem.internalPointer().rootpath()   self.openRepo.emit(hglib.tounicode(root), True)   - def newGroup(self): - m = self.model() - m.addGroup(_('New Group'))   - def removeSelected(self): - if not self.selitem: +class RepoRegistryView(QDockWidget): + + showMessage = pyqtSignal(QString) + openRepo = pyqtSignal(QString, bool) + + def __init__(self, parent): + QDockWidget.__init__(self, parent) + + self.setFeatures(QDockWidget.DockWidgetClosable | + QDockWidget.DockWidgetMovable | + QDockWidget.DockWidgetFloatable) + self.setWindowTitle(_('Repository Registry')) + + mainframe = QFrame() + mainframe.setLayout(QVBoxLayout()) + self.setWidget(mainframe) + mainframe.layout().setContentsMargins(0, 0, 0, 0) + + self.contextmenu = QMenu(self) + self.tview = tv = RepoTreeView(self) + tv.setModel(repotreemodel.RepoTreeModel(settingsfilename(), self)) + mainframe.layout().addWidget(tv) + + tv.setIndentation(10) + tv.setFirstColumnSpanned(0, QModelIndex(), True) + tv.setColumnHidden(1, True) + + tv.showMessage.connect(self.showMessage) + tv.openRepo.connect(self.openRepo) + tv.menuRequested.connect(self.onMenuRequest) + + self.createActions() + QTimer.singleShot(0, self.expand) + + def expand(self): + self.tview.expandToDepth(0) + + def addRepo(self, repo): + 'workbench has opened a new repowidget, ensure its in the registry' + m = self.tview.model() + it = m.getRepoItem(repo.root) + if it == None: + m.addRepo(None, repo) + else: + # ensure the registry item has a thgrepo instance + it.ensureRepoLoaded() + + def showPaths(self, show): + self.tview.setColumnHidden(1, not show) + if show: + self.tview.resizeColumnToContents(0) + self.tview.resizeColumnToContents(1) + + def close(self): + self.tview.model().write(settingsfilename()) + + def _action_defs(self): + a = [("open", _("Open"), 'thg-repository-open', + _("Open the repository in a new tab"), self.open), + ("openAll", _("Open All"), 'thg-repository-open', + _("Open all repositories in new tabs"), self.openAll), + ("newGroup", _("New Group"), 'new-group', + _("Create a new group"), self.newGroup), + ("rename", _("Rename"), None, + _("Rename the entry"), self.startRename), + ("settings", _("Settings..."), 'settings_user', + _("View the repository's settings"), self.startSettings), + ("remove", _("Remove from registry"), 'menudelete', + _("Remove the node and all its subnodes." + " Repositories are not deleted from disk."), + self.removeSelected), + ("clone", _("Clone..."), 'hg-clone', + _("Clone Repository"), self.cloneRepo), + ("explore", _("Explore"), 'system-file-manager', + _("Open the repository in Windows Explorer"), self.explore), + ("terminal", _("Terminal"), 'utilities-terminal', + _("Open a shell terminal in repository root"), self.terminal), + ("add", _("Add repository..."), 'hg', + _("Add a repository to this group"), self.addNewRepo), + ] + return a + + def createActions(self): + self._actions = {} + for name, desc, icon, tip, cb in self._action_defs(): + self._actions[name] = QAction(desc, self) + QTimer.singleShot(0, self.configureActions) + + def configureActions(self): + for name, desc, icon, tip, cb in self._action_defs(): + act = self._actions[name] + if icon: + act.setIcon(qtlib.getmenuicon(icon)) + if tip: + act.setStatusTip(tip) + if cb: + act.triggered.connect(cb) + self.addAction(act) + + def onMenuRequest(self, point, selitem): + menulist = selitem.internalPointer().menulist() + if not menulist:   return - s = self.selitem - if not s.internalPointer().okToDelete(self): - labels = [(QMessageBox.Yes, _('&Delete')), - (QMessageBox.No, _('Cancel'))] - if not qtlib.QuestionMsgBox(_('Confirm Delete'), - _("Delete Group '%s' and all its entries?")% - self.name, labels=labels, parent=self): - return - m = self.model() - row = s.row() - parent = s.parent() - m.removeRows(row, 1, parent) - self.selectionChanged(None, None) + self.contextmenu.clear() + for act in menulist: + if act: + self.contextmenu.addAction(self._actions[act]) + else: + self.contextmenu.addSeparator() + self.selitem = selitem + self.contextmenu.exec_(point) + + # + ## Menu action handlers + #     def cloneRepo(self): - if not self.selitem: - return   root = self.selitem.internalPointer().rootpath()   d = clone.CloneDialog(args=[root, root + '-clone'], parent=self)   d.finished.connect(d.deleteLater) @@ -206,21 +221,15 @@
  d.show()     def explore(self): - if not self.selitem: - return   root = self.selitem.internalPointer().rootpath()   QDesktopServices.openUrl(QUrl.fromLocalFile(root))     def terminal(self): - if not self.selitem: - return   root = self.selitem.internalPointer().rootpath()   qtlib.openshell(root)   - def addRepo(self): + def addNewRepo(self):   'menu action handler for adding a new repository' - if not self.selitem: - return   caption = _('Select repository directory to add')   FD = QFileDialog   path = FD.getExistingDirectory(caption=caption, @@ -239,64 +248,39 @@
  _('%s is not a valid repository') % path)   return   - def sizeHint(self): - size = super(RepoTreeView, self).sizeHint() - size.setWidth(QFontMetrics(self.font()).width('M') * 15) - return size + def startSettings(self): + root = self.selitem.internalPointer().rootpath() + sd = settings.SettingsDialog(configrepo=True, focus='web.name', + parent=self, root=root) + sd.exec_()   -class RepoRegistryView(QDockWidget): + def openAll(self): + for root in self.selitem.internalPointer().childRoots(): + self.openRepo.emit(hglib.tounicode(root), False)   - showMessage = pyqtSignal(QString) - openRepoSignal = pyqtSignal(QString, bool) + def open(self): + 'open context menu action, open repowidget unconditionally' + root = self.selitem.internalPointer().rootpath() + self.openRepo.emit(hglib.tounicode(root), False)   - def __init__(self, parent): - QDockWidget.__init__(self, parent) + def startRename(self): + self.tview.edit(self.selitem)   - self.setFeatures(QDockWidget.DockWidgetClosable | - QDockWidget.DockWidgetMovable | - QDockWidget.DockWidgetFloatable) - self.setWindowTitle(_('Repository Registry')) + def newGroup(self): + self.tview.model().addGroup(_('New Group'))   - mainframe = QFrame() - lay = QVBoxLayout() - lay.setContentsMargins(0, 0, 0, 0) - mainframe.setLayout(lay) - self.setWidget(mainframe) + def removeSelected(self): + s = self.selitem + if not s.internalPointer().okToDelete(): + labels = [(QMessageBox.Yes, _('&Delete')), + (QMessageBox.No, _('Cancel'))] + if not qtlib.QuestionMsgBox(_('Confirm Delete'), + _("Delete Group '%s' and all its entries?")% + self.name, labels=labels, parent=self): + return + m = self.tview.model() + row = s.row() + parent = s.parent() + m.removeRows(row, 1, parent) + self.tview.selectionChanged(None, None)   - self.tmodel = m = repotreemodel.RepoTreeModel(settingsfilename(), self) - self.tview = tv = RepoTreeView(self) - tv.setModel(m) - lay.addWidget(tv) - - tv.setIndentation(10) - tv.setFirstColumnSpanned(0, QModelIndex(), True) - tv.openRepo.connect(self.openRepo) - tv.showMessage.connect(self.showMessage) - - self.tview.setColumnHidden(1, True) - QTimer.singleShot(0, self.expand) - - def expand(self): - self.tview.expandToDepth(0) - - def addRepo(self, repo): - 'workbench has opened a new repowidget, ensure its in the registry' - m = self.tmodel - it = m.getRepoItem(repo.root) - if it == None: - m.addRepo(None, repo) - else: - # ensure the registry item has a thgrepo instance - it.ensureRepoLoaded() - - def openRepo(self, path, reuse=False): - self.openRepoSignal.emit(path, reuse) - - def showPaths(self, show): - self.tview.setColumnHidden(1, not show) - if show: - self.tview.resizeColumnToContents(0) - self.tview.resizeColumnToContents(1) - - def close(self): - self.tmodel.write(settingsfilename())
 
47
48
49
50
 
51
52
53
 
47
48
49
 
50
51
52
53
@@ -47,7 +47,7 @@
  self.reporegistry = rr = RepoRegistryView(self)   rr.setObjectName('RepoRegistryView')   rr.showMessage.connect(self.showMessage) - rr.openRepoSignal.connect(self.openRepo) + rr.openRepo.connect(self.openRepo)   rr.hide()   self.addDockWidget(Qt.LeftDockWidgetArea, rr)