Kiln » TortoiseHg » TortoiseHg
Clone URL:  
Pushed to one repository · View In Graph Contained in 1.9.3, 2.0, and 2.0.1

stable grep: improve actions and behaviors

Build the actions and context menu at startup, disable actions as appropriate
when the selection changes. Set a default action for when a row is activated,
give each action a keyboard shortcut.

Remove a Python reference to the view's parent.

Changeset 3ee6224acd0d

Parent 87bd94211eaa

by Steve Borho

Changes to one file · Browse files at 3ee6224acd0d Showing diff from parent 87bd94211eaa Diff from another changeset...

 
123
124
125
126
127
128
129
130
 
447
448
449
 
450
 
 
 
451
452
453
454
455
456
457
458
459
460
461
462
463
 
 
 
 
 
 
 
 
 
 
 
 
 
 
464
465
466
 
 
 
467
468
469
470
 
471
472
473
 
506
507
508
 
 
 
 
 
 
509
510
511
512
 
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
 
 
 
538
539
 
 
 
 
 
 
 
 
540
541
542
543
 
544
545
546
 
548
549
550
551
 
552
553
554
555
556
 
 
557
558
559
560
 
561
562
563
564
 
565
566
567
 
575
576
577
578
 
 
579
580
581
 
592
593
594
595
596
597
598
599
600
601
 
123
124
125
 
 
126
127
128
 
445
446
447
448
449
450
451
452
453
454
455
456
457
458
 
459
460
461
 
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
 
521
522
523
524
525
526
527
528
529
530
531
532
 
533
534
535
536
537
538
539
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
540
541
542
543
 
544
545
546
547
548
549
550
551
552
553
554
 
555
556
557
558
 
560
561
562
 
563
564
565
566
 
 
567
568
569
570
571
 
572
573
574
575
 
576
577
578
579
 
587
588
589
 
590
591
592
593
594
 
605
606
607
 
 
 
 
608
609
610
@@ -123,8 +123,6 @@
  mainvbox.addWidget(frame)     tv = MatchTree(repo, self) - tm = MatchModel(self) - tv.setModel(tm)   tv.revisionSelected.connect(self.revisionSelected)   tv.setColumnHidden(COL_REVISION, True)   tv.setColumnHidden(COL_USER, True) @@ -447,27 +445,44 @@
    def __init__(self, repo, parent):   QTableView.__init__(self, parent) +   self.repo = repo + self.pattern = None + self.embedded = parent.parent() is not None +   self.delegate = htmldelegate.HTMLDelegate(self)   self.setItemDelegateForColumn(COL_TEXT, self.delegate)   self.setSelectionMode(QTableView.ExtendedSelection)   self.setSelectionBehavior(QAbstractItemView.SelectRows)   self.setContextMenuPolicy(Qt.CustomContextMenu)   self.setShowGrid(False) - self.embedded = parent.parent() is not None   vh = self.verticalHeader()   vh.hide()   vh.setDefaultSectionSize(20) -   self.horizontalHeader().setStretchLastSection(True)   + self.actions = {} + self.contextmenu = QMenu(self) + for key, name, func, shortcut in ( + ('edit', _('View file'), self.onViewFile, 'CTRL+E'), + ('ctx', _('View Changeset'), self.onViewChangeset, 'CTRL+V'), + ('vdiff', _('Visual Diff'), self.onVisualDiff, 'CTRL+D'), + ('ann', _('Annotate file'), self.onAnnotateFile, 'CTRL+F')): + action = QAction(name, self) + action.triggered.connect(func) + action.setShortcut(QKeySequence(shortcut)) + self.actions[key] = action + self.addAction(action) + self.contextmenu.addAction(action) + self.activated.connect(self.onRowActivated)   self.customContextMenuRequested.connect(self.menuRequest) - self.pattern = None - self.searchwidget = parent + + self.setModel(MatchModel(self)) + self.selectionModel().selectionChanged.connect(self.onSelectionChanged)     def dragObject(self):   snapshots = {} - for index in self.selectedRows(): + for index in self.selectionModel().selectedRows():   path, line, rev, user, text = self.model().getRow(index)   if rev not in snapshots:   snapshots[rev] = [path] @@ -506,41 +521,38 @@
  return QTableView.mouseMoveEvent(self, event)     def menuRequest(self, point): + if not self.selectionModel().selectedRows(): + return + point = self.mapToGlobal(point) + self.contextmenu.exec_(point) + + def onSelectionChanged(self, selected, deselected):   selrows = []   wctxonly = True   allhistory = False - for index in self.selectedRows(): + for index in self.selectionModel().selectedRows():   path, line, rev, user, text = self.model().getRow(index)   if rev is not None:   wctxonly = False   if user is not None:   allhistory = True   selrows.append((rev, path, line)) - if not selrows: - return - point = self.mapToGlobal(point) - menus = [(_('View file'), self.view), (_('Annotate file'), self.ann)] - if not wctxonly and self.embedded: - menus.append((_('View Changeset'), self.ctx)) - if allhistory: - # need to know files were modified at specified revision - menus.append((_('Visual Diff'), self.vdiff)) - if self.contextmenu: - self.contextmenu.clear() - else: - self.contextmenu = QMenu(self) - for name, func in menus: - def add(name, func): - action = self.contextmenu.addAction(name) - action.triggered.connect(lambda: func(selrows)) - add(name, func) - self.contextmenu.exec_(point) + self.selectedRows = selrows + self.actions['ctx'].setEnabled(not wctxonly and self.embedded) + self.actions['vdiff'].setEnabled(allhistory)   - def ann(self, rows): + def onRowActivated(self, index): + saved = self.selectedRows + path, line, rev, user, text = self.model().getRow(index) + self.selectedRows = [(rev, path, line)] + self.onAnnotateFile() + self.selectedRows = saved + + def onAnnotateFile(self):   from tortoisehg.hgqt import annotate   repo, ui, pattern = self.repo, self.repo.ui, self.pattern   seen = set() - for rev, path, line in rows: + for rev, path, line in self.selectedRows:   # Only open one annotate instance per file   if path in seen:   continue @@ -548,20 +560,20 @@
  seen.add(path)   dlg = annotate.AnnotateDialog(path, rev=rev, line=line,   pattern=pattern, parent=self, - searchwidget=self.searchwidget, + searchwidget=self.parent(),   root=repo.root)   dlg.show()   - def ctx(self, rows): - for rev, path, line in rows: + def onViewChangeset(self): + for rev, path, line in self.selectedRows:   self.revisionSelected.emit(int(rev))   return   - def view(self, rows): + def onViewFile(self):   from tortoisehg.hgqt import wctxactions   repo, ui, pattern = self.repo, self.repo.ui, self.pattern   seen = set() - for rev, path, line in rows: + for rev, path, line in self.selectedRows:   # Only open one editor instance per file   if path in seen:   continue @@ -575,7 +587,8 @@
  files = [os.path.join(base, path)]   wctxactions.edit(self, ui, repo, files, line, pattern)   - def vdiff(self, rows): + def onVisualDiff(self): + rows = self.selectedRows[:]   repo, ui = self.repo, self.repo.ui   while rows:   defer = [] @@ -592,10 +605,6 @@
  dlg.exec_()   rows = defer   - def selectedRows(self): - return self.selectionModel().selectedRows() - -    class MatchModel(QAbstractTableModel):   def __init__(self, parent):