Kiln » TortoiseHg » TortoiseHg
Clone URL:  
Pushed to one repository · View In Graph Contained in 1.9, 1.9.1, and 1.9.2

persist the reporegistry

Writing it to the file 'thg-reporegistry.xml' in the same directory
where the settings file is written.

Introduced a new node class AllRepoGroupItem, so we don't have
translations of "All Repositories" in the xml.

Changeset ebf8dcd423d2

Parent 2217af787825

by Adrian Buehlmann

Changes to 2 files · Browse files at ebf8dcd423d2 Showing diff from parent 2217af787825 Diff from another changeset...

 
19
20
21
 
22
 
 
23
24
25
 
26
27
28
 
39
40
41
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
43
44
 
98
99
100
101
102
103
104
 
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
 
169
170
171
172
 
173
174
175
 
196
197
198
 
 
 
 
 
 
 
 
 
 
 
 
 
199
200
 
201
202
203
 
 
204
205
206
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
207
208
209
 
 
210
211
212
 
276
277
278
279
280
 
 
 
281
282
283
 
288
289
290
291
 
 
292
293
294
 
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
 
322
323
324
 
352
353
354
 
 
 
 
 
 
 
355
356
357
 
431
432
433
434
 
435
436
437
 
459
460
461
 
 
 
 
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
 
146
147
148
 
149
150
151
 
155
156
157
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
158
159
160
 
193
194
195
 
196
197
198
199
 
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
 
237
238
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
 
332
333
334
 
 
335
336
337
338
339
340
 
345
346
347
 
348
349
350
351
352
 
361
362
363
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
364
365
366
367
 
395
396
397
398
399
400
401
402
403
404
405
406
407
 
481
482
483
 
484
485
486
487
 
509
510
511
512
513
514
@@ -19,10 +19,14 @@
   connect = QtCore.QObject.connect   +  extractXmlElementName = 'reporegextract' +reporegistryXmlElementName = 'reporegistry' +  repoRegMimeType = 'application/thg-reporegistry'    xmlClassMap = { + 'allgroup': 'AllRepoGroupItem',   'group': 'RepoGroupItem',   'repo': 'RepoItem',   'treeitem': 'RepoTreeItem', @@ -39,6 +43,50 @@
  inverseXmlClassMap[v] = k   return inverseXmlClassMap[classname]   +def settingsfilename(): + s = QtCore.QSettings() + dir = os.path.dirname(str(s.fileName())) + return dir + '/' + 'thg-reporegistry.xml' + +def writeXml(target, item, rootElementName): + xw = QtCore.QXmlStreamWriter(target) + xw.setAutoFormatting(True) + xw.setAutoFormattingIndent(2) + xw.writeStartDocument() + xw.writeStartElement(rootElementName) + item.dumpObject(xw) + xw.writeEndElement() + xw.writeEndDocument() + +def readXml(source, rootElementName): + itemread = None + xr = QtCore.QXmlStreamReader(source) + if xr.readNextStartElement(): + ele = str(xr.name().toString()) + if ele != rootElementName: + print "unexpected xml element '%s' "\ + "(was looking for %s)" % (ele, rootElementName) + return + if xr.hasError(): + print str(xr.errorString()) + if xr.readNextStartElement(): + itemread = undumpObject(xr) + xr.skipCurrentElement() + if xr.hasError(): + print str(xr.errorString()) + + print "itemread = %s" % itemread + return itemread + +def undumpObject(xr): + print "undumpObject()" + classname = xmlToClass(str(xr.name().toString())) + print "classname = %s" % classname + class_ = getattr(sys.modules[RepoTreeItem.__module__], classname) + obj = class_() + obj.undump(xr) + return obj +    class RepoTreeItem:   def __init__(self, parent=None): @@ -98,7 +146,6 @@
  if xr.isStartElement():   item = undumpObject(xr)   self.appendChild(item) - xr.skipCurrentElement()   elif xr.isEndElement():   break   @@ -108,29 +155,6 @@
  xw.writeEndElement()     -def encodeToXml(item, rootElementName): - buf = QtCore.QByteArray() - xw = QtCore.QXmlStreamWriter(buf) - xw.setAutoFormatting(True) - xw.setAutoFormattingIndent(2) - xw.writeStartDocument() - xw.writeStartElement(rootElementName) - item.dumpObject(xw) - xw.writeEndElement() - xw.writeEndDocument() - return buf - - -def undumpObject(xr): - print "undumpObject()" - classname = xmlToClass(str(xr.name().toString())) - print "classname = %s" % classname - class_ = getattr(sys.modules[RepoTreeItem.__module__], classname) - obj = class_() - obj.undump(xr) - return obj - -  class RepoItem(RepoTreeItem):   def __init__(self, rootpath='', parent=None):   RepoTreeItem.__init__(self, parent) @@ -169,7 +193,7 @@
     class RepoGroupItem(RepoTreeItem): - def __init__(self, name, parent=None): + def __init__(self, name='', parent=None):   RepoTreeItem.__init__(self, parent)   self.name = name   @@ -196,17 +220,49 @@
  RepoTreeItem.undump(self, xr)     +class AllRepoGroupItem(RepoGroupItem): + def __init__(self, parent=None): + RepoGroupItem.__init__(self, parent) + self.name = _('All Repositories') + + def dump(self, xw): + RepoTreeItem.dump(self, xw) + + def undump(self, xr): + print "AllRepoGroupItem.undump()" + RepoTreeItem.undump(self, xr) + +  class RepoTreeModel(QtCore.QAbstractItemModel): - def __init__(self, parent=None): + def __init__(self, fn=None, parent=None):   QtCore.QAbstractItemModel.__init__(self, parent)   - self.rootItem = root = RepoTreeItem() + root = None + all = None   - self.allrepos = all = RepoGroupItem(_('All Repositories')) - root.appendChild(all) + if fn: + f = QtCore.QFile(settingsfilename()) + if f.open(QtCore.QIODevice.ReadOnly): + root = readXml(f, reporegistryXmlElementName) + f.close() + if root: + for c in root.childs: + if isinstance(c, AllRepoGroupItem): + all = c + break + + if not root: + root = RepoTreeItem() + all = AllRepoGroupItem() + root.appendChild(all) + + self.rootItem = root + self.allrepos = all     # see http://doc.qt.nokia.com/4.6/model-view-model-subclassing.html   + # overrides from QAbstractItemModel +   def index(self, row, column, parent):   if not self.hasIndex(row, column, parent):   return QModelIndex() @@ -276,8 +332,9 @@
  self.endRemoveRows()     # dump everything for debug purposes - all = encodeToXml(self.rootItem, 'reporegistry') - print all + buf = QtCore.QByteArray() + writeXml(buf, self.rootItem, reporegistryXmlElementName) + print buf     return res   @@ -288,7 +345,8 @@
  print "mimeData()"   i = indexes[0]   item = i.internalPointer() - buf = encodeToXml(item, extractXmlElementName) + buf = QtCore.QByteArray() + writeXml(buf, item, extractXmlElementName)   print str(buf)   d = QtCore.QMimeData()   d.setData(repoRegMimeType, buf) @@ -303,22 +361,7 @@
  d = str(data.data(repoRegMimeType))   print "d = %s" % d   - xr = QtCore.QXmlStreamReader(d) - if xr.readNextStartElement(): - ele = str(xr.name().toString()) - if ele != extractXmlElementName: - print "unexpected xml element '%s' "\ - "(was looking for %s)" % (ele, extractXmlElementName) - return - if xr.hasError(): - print str(xr.errorString()) - if xr.readNextStartElement(): - itemread = undumpObject(xr) - xr.skipCurrentElement() - if xr.hasError(): - print str(xr.errorString()) - - print "itemread = %s" % itemread + itemread = readXml(d, extractXmlElementName)     group = parent.internalPointer()   cc = group.childCount() @@ -352,6 +395,13 @@
  ri.appendChild(RepoGroupItem(name, ri))   self.endInsertRows()   + def write(self, fn): + print "RepoTreeModel.write(%s)" % fn + f = QtCore.QFile(fn) + f.open(QtCore.QIODevice.WriteOnly) + writeXml(f, self.rootItem, reporegistryXmlElementName) + f.close() +    class RepoTreeView(QtGui.QTreeView):   def __init__(self, parent): @@ -431,7 +481,7 @@
  lay.setContentsMargins(0, 0, 0, 0)   self.setLayout(lay)   - self.tmodel = m = RepoTreeModel() + self.tmodel = m = RepoTreeModel(settingsfilename())     self.tview = tv = RepoTreeView(self)   lay.addWidget(tv) @@ -459,3 +509,6 @@
  if show:   self.tview.resizeColumnToContents(0)   self.tview.resizeColumnToContents(1) + + def close(self): + self.tmodel.write(settingsfilename())
 
461
462
463
464
 
465
466
467
468
 
 
 
469
470
471
 
461
462
463
 
464
465
 
 
 
466
467
468
469
470
471
@@ -461,11 +461,11 @@
  getattr(self, n).restoreState(s.value(wb + n).toByteArray())     def closeEvent(self, event): - if not self.okToContinue(): + if not self.okToContinue() or not self.closeRepoTabs():   event.ignore() - self.storeSettings() - if not self.closeRepoTabs(): - event.ignore() + else: + self.storeSettings() + self.reporegistry.close()     def closeRepoTabs(self):   '''returns False if close should be aborted'''