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

repoview: support drag and drop reordering of unapplied patches

Changeset faf83e25708a

Parent 8db65cfc4e1f

by Phil Currier

Changes to 3 files · Browse files at faf83e25708a Showing diff from parent 8db65cfc4e1f Diff from another changeset...

 
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
 
 
 
 
 
202
203
204
 
217
218
219
 
 
 
 
 
 
 
 
 
 
 
 
 
220
221
222
 
184
185
186
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
187
188
189
190
191
192
193
194
 
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
@@ -184,21 +184,11 @@
    def accept(self):   self._writesettings() - try: - self.repo.incrementBusyCount() - lines = [] - for i in xrange(self.alw.count()-1, -1, -1): - item = self.alw.item(i) - lines.append(item.patchname) - for i in xrange(self.ulw.count()-1, -1, -1): - item = self.ulw.item(i) - lines.append(item.patchname) - if lines: - fp = self.repo.mq.opener('series', 'wb') - fp.write('\n'.join(lines)) - fp.close() - finally: - self.repo.decrementBusyCount() + applied = [self.alw.item(x).patchname + for x in xrange(self.alw.count())] + unapplied = [self.ulw.item(x).patchname + for x in xrange(self.ulw.count())] + writeSeries(self.repo, applied, unapplied)   QDialog.accept(self)     def reject(self): @@ -217,6 +207,19 @@
  s = QSettings()   s.setValue('qreorder/geom', self.saveGeometry())   +def writeSeries(repo, applied, unapplied): + try: + repo.incrementBusyCount() + # The series file stores the oldest unapplied patch at the bottom, and + # the first applied patch at the top + lines = reversed(unapplied + applied) + if lines: + fp = repo.mq.opener('series', 'wb') + fp.write('\n'.join(lines)) + fp.close() + finally: + repo.decrementBusyCount() +  def run(ui, *pats, **opts):   repo = thgrepo.repository(None, paths.find_root())   if hasattr(repo, 'mq'):
 
21
22
23
 
24
25
26
 
29
30
31
 
 
32
33
34
 
459
460
461
462
463
464
465
466
467
468
469
 
 
 
 
 
470
471
472
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
473
474
475
 
21
22
23
24
25
26
27
 
30
31
32
33
34
35
36
37
 
462
463
464
 
 
465
466
467
468
469
470
471
472
473
474
475
476
477
 
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
@@ -21,6 +21,7 @@
 from tortoisehg.hgqt.graph import Graph  from tortoisehg.hgqt.graph import revision_grapher  from tortoisehg.hgqt import qtlib +from tortoisehg.hgqt.qreorder import writeSeries    from tortoisehg.hgqt.i18n import _   @@ -29,6 +30,8 @@
   nullvariant = QVariant()   +mqpatchmimetype = 'application/thg-mqunappliedpatch' +  # TODO: Remove these two when we adopt GTK author color scheme  COLORS = [ "blue", "darkgreen", "red", "green", "darkblue", "purple",   "cyan", Qt.darkYellow, "magenta", "darkred", "darkmagenta", @@ -459,17 +462,56 @@
  def flags(self, index):   if not index.isValid():   return Qt.ItemFlags(0) - if not self.revset: - return Qt.ItemIsSelectable | Qt.ItemIsEnabled     row = index.row()   self.ensureBuilt(row=row)   gnode = self.graph[row]   ctx = self.repo.changectx(gnode.rev)   + dragflags = Qt.ItemFlags(0) + if ctx.thgmqunappliedpatch(): + dragflags = Qt.ItemIsDragEnabled | Qt.ItemIsDropEnabled + if not self.revset: + return Qt.ItemIsSelectable | Qt.ItemIsEnabled | dragflags   if ctx.rev() not in self.revset:   return Qt.ItemFlags(0) - return Qt.ItemIsSelectable | Qt.ItemIsEnabled + return Qt.ItemIsSelectable | Qt.ItemIsEnabled | dragflags + + def mimeTypes(self): + return QStringList([mqpatchmimetype]) + + def supportedDropActions(self): + return Qt.MoveAction + + def mimeData(self, indexes): + data = set() + for index in indexes: + row = str(index.row()) + if row not in data: + data.add(row) + qmd = QMimeData() + bytearray = QByteArray(','.join(sorted(data, reverse=True))) + qmd.setData(mqpatchmimetype, bytearray) + return qmd + + def dropMimeData(self, data, action, row, column, parent): + if mqpatchmimetype not in data.formats(): + return False + dragrows = [int(r) for r in str(data.data(mqpatchmimetype)).split(',')] + destrow = parent.row() - len([r for r in dragrows if r < parent.row()]) + if destrow < 0: + return False + unapplied = self.repo.thgmqunappliedpatches[::-1] + applied = [p.name for p in self.repo.mq.applied[::-1]] + if max(dragrows) >= len(unapplied): + return False + dragpatches = [unapplied[d] for d in dragrows] + for i in dragrows: + unapplied.pop(i) + for p in dragpatches: + unapplied.insert(destrow, p) + writeSeries(self.repo, applied, unapplied) + return True     def headerData(self, section, orientation, role):   if orientation == Qt.Horizontal:
 
61
62
63
 
 
 
 
 
 
64
65
66
 
61
62
63
64
65
66
67
68
69
70
71
72
@@ -61,6 +61,12 @@
  self.standardDelegate = self.itemDelegate()   self.htmlDelegate = htmldelegate.HTMLDelegate(self)   + self.setAcceptDrops(True) + self.setDefaultDropAction(Qt.MoveAction) + self.setDragEnabled(True) + self.setDropIndicatorShown(True) + self.setDragDropMode(QAbstractItemView.InternalMove) +   self.setSelectionMode(QAbstractItemView.ExtendedSelection)   self.setSelectionBehavior(QAbstractItemView.SelectRows)