Changeset 224d0acd9ec6…
Parent 3092f7b071d8…
by
Changes to 2 files · Browse files at 224d0acd9ec6 Showing diff from parent 3092f7b071d8 Diff from another changeset...
|
|
@@ -0,0 +1,285 @@ + # -*- coding: iso-8859-1 -*-
+#!/usr/bin/env python
+# repowidget.py - TortoiseHg repository widget
+#
+# Copyright (C) 2007-2010 Logilab. All rights reserved.
+# Copyright (C) 2010 Adrian Buehlmann <adrian@cadifra.com>
+#
+# This software may be used and distributed according to the terms
+# of the GNU General Public License, incorporated herein by reference.
+
+from PyQt4 import QtCore, QtGui
+
+from mercurial import hg
+
+from tortoisehg.hgqt.i18n import _
+
+from tortoisehg.hgqt.config import HgConfig
+from tortoisehg.hgqt.filelistmodel import HgFileListModel
+
+from filelistview import HgFileListView
+from fileview import HgFileView
+from revpanelwidget import RevPanelWidget
+from revdisplay import RevMessage
+
+Qt = QtCore.Qt
+connect = QtCore.QObject.connect
+SIGNAL = QtCore.SIGNAL
+
+
+class RevDetailsWidget(QtGui.QWidget):
+
+ showMessageSignal = QtCore.pyqtSignal(str)
+
+ def __init__(self, repo, repoview):
+ self.repo = repo
+ self.repoview = repoview
+
+ # these are used to know where to go after a reload
+ self._reload_file = None
+
+ self.splitternames = []
+
+ QtGui.QWidget.__init__(self)
+
+ self.load_config()
+
+ self.setupUi()
+ self.disab_shortcuts = []
+
+ self.currentMessage = ''
+
+ self.createActions()
+
+ self.fileview.setFont(self._font)
+ connect(self.fileview, SIGNAL('showMessage'), self.showMessage)
+ connect(self.fileview, SIGNAL('fileDisplayed'), self.file_displayed)
+
+ self.restoreSettings()
+
+ def setupUi(self):
+ SP = QtGui.QSizePolicy
+
+ self.hbox = QtGui.QHBoxLayout(self)
+ self.hbox.setSpacing(0)
+ self.hbox.setMargin(0)
+
+ self.setupRevisionDetailsWidget()
+
+ self.hbox.addWidget(self.revisionDetailsWidget)
+
+ def setupRevisionDetailsWidget(self):
+ SP = QtGui.QSizePolicy
+
+ self.revisionDetailsWidget = QtGui.QFrame()
+ sp = SP(SP.Preferred, SP.Expanding)
+ sp.setHorizontalStretch(0)
+ sp.setVerticalStretch(0)
+ sp.setHeightForWidth(self.revisionDetailsWidget.sizePolicy().hasHeightForWidth())
+ self.revisionDetailsWidget.setSizePolicy(sp)
+ self.revisionDetailsWidget.setFrameShape(QtGui.QFrame.NoFrame)
+ self.revisionDetailsWidget.setFrameShadow(QtGui.QFrame.Plain)
+
+ revisiondetails_layout = QtGui.QVBoxLayout(self.revisionDetailsWidget)
+ revisiondetails_layout.setSpacing(0)
+ revisiondetails_layout.setMargin(0)
+
+ self.filelist_splitter = QtGui.QSplitter(self.revisionDetailsWidget)
+ self.splitternames.append('filelist_splitter')
+
+ sp = SP(SP.Expanding, SP.Expanding)
+ sp.setHorizontalStretch(0)
+ sp.setVerticalStretch(0)
+ sp.setHeightForWidth(self.filelist_splitter.sizePolicy().hasHeightForWidth())
+ self.filelist_splitter.setSizePolicy(sp)
+ self.filelist_splitter.setOrientation(QtCore.Qt.Horizontal)
+ self.filelist_splitter.setChildrenCollapsible(False)
+
+ self.tableView_filelist = HgFileListView(self.filelist_splitter)
+
+ self.cset_and_file_details_frame = QtGui.QFrame(self.filelist_splitter)
+ sp = SP(SP.Preferred, SP.Preferred)
+ sp.setHorizontalStretch(1)
+ sp.setVerticalStretch(0)
+ sp.setHeightForWidth(
+ self.cset_and_file_details_frame.sizePolicy().hasHeightForWidth())
+ self.cset_and_file_details_frame.setSizePolicy(sp)
+ self.cset_and_file_details_frame.setFrameShape(QtGui.QFrame.NoFrame)
+
+ vbox = QtGui.QVBoxLayout(self.cset_and_file_details_frame)
+ vbox.setSpacing(0)
+ vbox.setSizeConstraint(QtGui.QLayout.SetDefaultConstraint)
+ vbox.setMargin(0)
+ cset_and_file_details_layout = vbox
+
+ self.message_splitter = QtGui.QSplitter(self.cset_and_file_details_frame)
+ self.splitternames.append('message_splitter')
+ sp = SP(SP.Preferred, SP.Expanding)
+ sp.setHorizontalStretch(0)
+ sp.setVerticalStretch(0)
+ sp.setHeightForWidth(self.message_splitter.sizePolicy().hasHeightForWidth())
+ self.message_splitter.setSizePolicy(sp)
+ self.message_splitter.setMinimumSize(QtCore.QSize(50, 50))
+ self.message_splitter.setFrameShape(QtGui.QFrame.NoFrame)
+ self.message_splitter.setLineWidth(0)
+ self.message_splitter.setMidLineWidth(0)
+ self.message_splitter.setOrientation(Qt.Vertical)
+ self.message_splitter.setOpaqueResize(True)
+ self.message = RevMessage(self.message_splitter)
+
+ sp = SP(SP.Expanding, SP.Expanding)
+ sp.setHorizontalStretch(0)
+ sp.setVerticalStretch(0)
+ sp.setHeightForWidth(self.message.sizePolicy().hasHeightForWidth())
+ self.message.setSizePolicy(sp)
+ self.message.setMinimumSize(QtCore.QSize(0, 0))
+ font = QtGui.QFont()
+ font.setFamily("Courier")
+ font.setPointSize(9)
+ self.message.setFont(font)
+
+ self.fileview = HgFileView(self.message_splitter)
+ sp = SP(SP.Expanding, SP.Expanding)
+ sp.setHorizontalStretch(0)
+ sp.setVerticalStretch(1)
+ sp.setHeightForWidth(self.fileview.sizePolicy().hasHeightForWidth())
+ self.fileview.setSizePolicy(sp)
+ self.fileview.setMinimumSize(QtCore.QSize(0, 0))
+
+ self.revpanel = RevPanelWidget(self.repo, self.repoview)
+
+ cset_and_file_details_layout.addWidget(self.revpanel)
+ cset_and_file_details_layout.addWidget(self.message_splitter)
+
+ revisiondetails_layout.addWidget(self.filelist_splitter)
+
+ def load_config(self):
+ cfg = HgConfig(self.repo.ui)
+ fontstr = cfg.getFont()
+ font = QtGui.QFont()
+ try:
+ if not font.fromString(fontstr):
+ raise Exception
+ except:
+ print "bad font name '%s'" % fontstr
+ font.setFamily("Monospace")
+ font.setFixedPitch(True)
+ font.setPointSize(10)
+ self._font = font
+
+ self.rowheight = cfg.getRowHeight()
+ self.users, self.aliases = cfg.getUsers()
+ self.hidefinddelay = cfg.getHideFindDelay()
+ return cfg
+
+ def showMessage(self, msg):
+ self.currentMessage = msg
+ if self.isVisible():
+ self.showMessageSignal.emit(msg)
+
+ def showEvent(self, event):
+ QtGui.QWidget.showEvent(self, event)
+ self.showMessageSignal.emit(self.currentMessage)
+
+ def createActions(self):
+ # navigate in file viewer
+ self.actionNextLine = QtGui.QAction('Next line', self)
+ self.actionNextLine.setShortcut(Qt.SHIFT + Qt.Key_Down)
+ connect(self.actionNextLine, SIGNAL('triggered()'),
+ self.fileview.nextLine)
+ self.addAction(self.actionNextLine)
+ self.actionPrevLine = QtGui.QAction('Prev line', self)
+ self.actionPrevLine.setShortcut(Qt.SHIFT + Qt.Key_Up)
+ connect(self.actionPrevLine, SIGNAL('triggered()'),
+ self.fileview.prevLine)
+ self.addAction(self.actionPrevLine)
+ self.actionNextCol = QtGui.QAction('Next column', self)
+ self.actionNextCol.setShortcut(Qt.SHIFT + Qt.Key_Right)
+ connect(self.actionNextCol, SIGNAL('triggered()'),
+ self.fileview.nextCol)
+ self.addAction(self.actionNextCol)
+ self.actionPrevCol = QtGui.QAction('Prev column', self)
+ self.actionPrevCol.setShortcut(Qt.SHIFT + Qt.Key_Left)
+ connect(self.actionPrevCol, SIGNAL('triggered()'),
+ self.fileview.prevCol)
+ self.addAction(self.actionPrevCol)
+
+ # Activate file (file diff navigator)
+ self.actionActivateFile = QtGui.QAction('Activate file', self)
+
+ self.actionActivateFileAlt = QtGui.QAction('Activate alt. file', self)
+ self.actionActivateFileAlt.setShortcuts([Qt.ALT+Qt.Key_Return, Qt.ALT+Qt.Key_Enter])
+ connect(self.actionActivateFileAlt, SIGNAL('triggered()'),
+ lambda self=self:
+ self.tableView_filelist.fileActivated(self.tableView_filelist.currentIndex(),
+ alternate=True))
+
+ def setMode(self, mode):
+ self.fileview.setMode(mode)
+
+ def getMode(self):
+ return self.fileview.getMode()
+
+ def setAnnotate(self, ann):
+ self.fileview.setAnnotate(ann)
+
+ def getAnnotate(self):
+ return self.fileview.getAnnotate()
+
+ def nextDiff(self):
+ notlast = self.fileview.nextDiff()
+ self.actionNextDiff.setEnabled(self.fileview.fileMode() and notlast and self.fileview.nDiffs())
+ self.actionPrevDiff.setEnabled(self.fileview.fileMode() and self.fileview.nDiffs())
+
+ def prevDiff(self):
+ notfirst = self.fileview.prevDiff()
+ self.actionPrevDiff.setEnabled(self.fileview.fileMode() and notfirst and self.fileview.nDiffs())
+ self.actionNextDiff.setEnabled(self.fileview.fileMode() and self.fileview.nDiffs())
+
+ def create_models(self):
+ self.filelistmodel = HgFileListModel(self.repo)
+
+ def setupModels(self, repomodel):
+ self.repomodel = repomodel
+ self.create_models()
+ self.tableView_filelist.setModel(self.filelistmodel)
+ self.fileview.setModel(repomodel)
+ filetable = self.tableView_filelist
+ connect(filetable, SIGNAL('fileSelected'), self.fileview.displayFile)
+
+ def on_filled(self):
+ self.tableView_filelist.selectFile(self._reload_file)
+
+ def file_displayed(self, filename):
+ #self.actionPrevDiff.setEnabled(False)
+ pass
+
+ def revision_selected(self, rev):
+ ctx = self.repo[rev]
+ if len(self.filelistmodel):
+ self.tableView_filelist.selectRow(0)
+ if ctx.rev() is not None:
+ self.fileview.setContext(ctx)
+ self.revpanel.update(ctx.rev())
+ self.message.displayRevision(ctx, None)
+ self.filelistmodel.setSelectedRev(ctx)
+
+ def reload(self, rev=None):
+ self._reload_file = self.tableView_filelist.currentFile()
+ self.repo = hg.repository(self.repo.ui, self.repo.root)
+ self.setupModels(self.repomodel)
+
+ def storeSettings(self):
+ s = QtCore.QSettings()
+ wb = "RevDetailsWidget/"
+ for n in self.splitternames:
+ s.setValue(wb + n, getattr(self, n).saveState())
+ s.setValue(wb + 'revpanel.expanded', self.revpanel.is_expanded())
+
+ def restoreSettings(self):
+ s = QtCore.QSettings()
+ wb = "RevDetailsWidget/"
+ for n in self.splitternames:
+ getattr(self, n).restoreState(s.value(wb + n).toByteArray())
+ expanded = s.value(wb + 'revpanel.expanded', True).toBool()
+ self.revpanel.set_expanded(expanded)
|
Loading...