Changeset f6a57d3621e7…
Parent d23c56219b38…
by
Changes to 7 files · Browse files at f6a57d3621e7 Showing diff from parent d23c56219b38 Diff from another changeset...
|
|
@@ -0,0 +1,440 @@ + # -*- 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.
+
+import sys, os
+import re
+
+from PyQt4 import QtCore, QtGui, Qsci
+
+from mercurial import ui, hg
+from mercurial import util
+
+from tortoisehg.util.util import tounicode, has_closed_branch_support
+from tortoisehg.util.util import rootpath, find_repository
+
+from tortoisehg.hgqt.graph import diff as revdiff
+from tortoisehg.hgqt.decorators import timeit
+
+from tortoisehg.hgqt import icon as geticon
+from tortoisehg.hgqt.repomodel import HgRepoListModel
+from tortoisehg.hgqt.filelistmodel import HgFileListModel
+from tortoisehg.hgqt.filedialogs import FileLogDialog, FileDiffDialog
+from tortoisehg.hgqt.manifestdialog import ManifestDialog
+from tortoisehg.hgqt.widgetmixin import WidgetMixin
+from tortoisehg.hgqt.update import UpdateDialog
+from tortoisehg.hgqt import cmdui
+
+from tortoisehg.util import paths
+
+from mercurial.error import RepoError
+
+Qt = QtCore.Qt
+bold = QtGui.QFont.Bold
+connect = QtCore.QObject.connect
+SIGNAL = QtCore.SIGNAL
+
+
+class RepoWidget(QtGui.QWidget, WidgetMixin):
+ _uifile = 'repowidget.ui'
+ def __init__(self, repo, fromhead=None):
+ self.repo = repo
+ self._closed_branch_supp = has_closed_branch_support(self.repo)
+
+ # these are used to know where to go after a reload
+ self._reload_rev = None
+ self._reload_file = None
+ self._loading = True
+ self._scanForRepoChanges = True
+
+ QtGui.QWidget.__init__(self)
+ WidgetMixin.__init__(self)
+
+ self.createActions()
+
+ self.textview_status.setFont(self._font)
+ #connect(self.textview_status, SIGNAL('showMessage'),
+ # self.statusBar().showMessage)
+ #connect(self.tableView_revisions, SIGNAL('showMessage'),
+ # self.statusBar().showMessage)
+
+ self.textview_header.setMessageWidget(self.message)
+
+ self.textview_header.commitsignal.connect(self.commit)
+
+ # setup tables and views
+ self.setupHeaderTextview()
+ connect(self.textview_status, SIGNAL('fileDisplayed'),
+ self.file_displayed)
+ self.setupBranchCombo()
+ self.setupModels(fromhead)
+ if fromhead:
+ self.startrev_entry.setText(str(fromhead))
+ self.setupRevisionTable()
+
+ self._repodate = self._getrepomtime()
+ self._watchrepotimer = self.startTimer(500)
+
+ def commit(self):
+ args = ['commit']
+ args += ['-v', '-m', self.message.text()]
+ dlg = cmdui.Dialog(args)
+ dlg.show()
+ self._commitdlg = dlg
+
+ def timerEvent(self, event):
+ if event.timerId() == self._watchrepotimer:
+ if not self._scanForRepoChanges or self.loading():
+ return
+ mtime = self._getrepomtime()
+ if mtime > self._repodate:
+ self.statusBar().showMessage("Repository has been modified "
+ "(reloading is recommended)")
+
+ def loading(self):
+ return self._loading
+
+ def loaded(self):
+ print "loaded()"
+ self._repodate = self._getrepomtime()
+ self._loading = False
+
+ def setupBranchCombo(self, *args):
+ pass
+
+ def createActions(self):
+ #connect(self.actionRefresh, SIGNAL('triggered()'),
+ # self.reload)
+ #connect(self.actionQuit, SIGNAL('triggered()'),
+ # self.close)
+ #self.actionQuit.setIcon(geticon('quit'))
+ #self.actionRefresh.setIcon(geticon('reload'))
+
+ #self.actionDiffMode = QtGui.QAction('Diff mode', self)
+ #self.actionDiffMode.setCheckable(True)
+ #connect(self.actionDiffMode, SIGNAL('toggled(bool)'),
+ # self.setMode)
+
+ #self.actionAnnMode = QtGui.QAction('Annotate', self)
+ #self.actionAnnMode.setCheckable(True)
+ #connect(self.actionAnnMode, SIGNAL('toggled(bool)'),
+ # self.textview_status.setAnnotate)
+
+ # Next/Prev diff (in full file mode)
+ '''
+ self.actionNextDiff = QtGui.QAction(geticon('down'), 'Next diff', self)
+ self.actionNextDiff.setShortcut('Alt+Down')
+ def filled():
+ self.actionNextDiff.setEnabled(
+ self.textview_status.fileMode() and self.textview_status.nDiffs())
+ connect(self.textview_status, SIGNAL('filled'), filled)
+ self.actionPrevDiff = QtGui.QAction(geticon('up'), 'Previous diff', self)
+ self.actionPrevDiff.setShortcut('Alt+Up')
+ connect(self.actionNextDiff, SIGNAL('triggered()'),
+ self.nextDiff)
+ connect(self.actionPrevDiff, SIGNAL('triggered()'),
+ self.prevDiff)
+ self.actionDiffMode.setChecked(True)
+ '''
+
+ # Next/Prev file
+ '''
+ self.actionNextFile = QtGui.QAction('Next file', self)
+ self.actionNextFile.setShortcut('Right')
+ connect(self.actionNextFile, SIGNAL('triggered()'),
+ self.tableView_filelist.nextFile)
+ self.actionPrevFile = QtGui.QAction('Prev file', self)
+ self.actionPrevFile.setShortcut('Left')
+ connect(self.actionPrevFile, SIGNAL('triggered()'),
+ self.tableView_filelist.prevFile)
+ self.addAction(self.actionNextFile)
+ self.addAction(self.actionPrevFile)
+ self.disab_shortcuts.append(self.actionNextFile)
+ self.disab_shortcuts.append(self.actionPrevFile)
+ '''
+
+ # Next/Prev rev
+ '''
+ self.actionNextRev = QtGui.QAction('Next revision', self)
+ self.actionNextRev.setShortcut('Down')
+ connect(self.actionNextRev, SIGNAL('triggered()'),
+ self.tableView_revisions.nextRev)
+ self.actionPrevRev = QtGui.QAction('Prev revision', self)
+ self.actionPrevRev.setShortcut('Up')
+ connect(self.actionPrevRev, SIGNAL('triggered()'),
+ self.tableView_revisions.prevRev)
+ self.addAction(self.actionNextRev)
+ self.addAction(self.actionPrevRev)
+ self.disab_shortcuts.append(self.actionNextRev)
+ self.disab_shortcuts.append(self.actionPrevRev)
+ '''
+
+ # 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.textview_status.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.textview_status.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.textview_status.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.textview_status.prevCol)
+ self.addAction(self.actionPrevCol)
+
+ # Activate file (file diff navigator)
+ self.actionActivateFile = QtGui.QAction('Activate file', self)
+ self.actionActivateFile.setShortcuts([Qt.Key_Return, Qt.Key_Enter])
+ def enterkeypressed():
+ w = QtGui.QApplication.focusWidget()
+ if not isinstance(w, QtGui.QLineEdit):
+ self.tableView_filelist.fileActivated(self.tableView_filelist.currentIndex(),)
+ else:
+ w.emit(SIGNAL('editingFinished()'))
+ connect(self.actionActivateFile, SIGNAL('triggered()'),
+ enterkeypressed)
+
+ 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))
+ self.actionActivateRev = QtGui.QAction('Activate rev.', self)
+ self.actionActivateRev.setShortcuts([Qt.SHIFT+Qt.Key_Return, Qt.SHIFT+Qt.Key_Enter])
+ connect(self.actionActivateRev, SIGNAL('triggered()'),
+ self.revision_activated)
+ self.addAction(self.actionActivateFile)
+ self.addAction(self.actionActivateFileAlt)
+ self.addAction(self.actionActivateRev)
+ self.disab_shortcuts.append(self.actionActivateFile)
+ self.disab_shortcuts.append(self.actionActivateRev)
+
+ self.actionStartAtRev = QtGui.QAction('Start at rev.', self)
+ self.actionStartAtRev.setShortcuts([Qt.Key_Backspace,])
+ connect(self.actionStartAtRev, SIGNAL('triggered()'),
+ self.startAtCurrentRev)
+ self.addAction(self.actionStartAtRev)
+
+ self.actionClearStartAtRev = QtGui.QAction('Clear start at rev.', self)
+ self.actionClearStartAtRev.setShortcuts([Qt.SHIFT + Qt.Key_Backspace,])
+ connect(self.actionClearStartAtRev, SIGNAL('triggered()'),
+ self.clearStartAtRev)
+ self.addAction(self.actionClearStartAtRev)
+
+ def startAtCurrentRev(self):
+ crev = self.tableView_revisions.current_rev
+ if crev:
+ self.startrev_entry.setText(str(crev))
+ # XXX workaround: see refreshRevisionTable method
+ self.refreshRevisionTable(sender=self)
+
+ def clearStartAtRev(self):
+ self.startrev_entry.setText("")
+ self._reload_rev = self.tableView_revisions.current_rev
+ self._reload_file = self.tableView_filelist.currentFile()
+ # XXX workaround: see refreshRevisionTable method
+ self.refreshRevisionTable(sender=self)
+
+ def setMode(self, mode):
+ self.textview_status.setMode(mode)
+ self.actionAnnMode.setEnabled(not mode)
+ self.actionNextDiff.setEnabled(not mode)
+ self.actionPrevDiff.setEnabled(not mode)
+
+ def nextDiff(self):
+ notlast = self.textview_status.nextDiff()
+ self.actionNextDiff.setEnabled(self.textview_status.fileMode() and notlast and self.textview_status.nDiffs())
+ self.actionPrevDiff.setEnabled(self.textview_status.fileMode() and self.textview_status.nDiffs())
+
+ def prevDiff(self):
+ notfirst = self.textview_status.prevDiff()
+ self.actionPrevDiff.setEnabled(self.textview_status.fileMode() and notfirst and self.textview_status.nDiffs())
+ self.actionNextDiff.setEnabled(self.textview_status.fileMode() and self.textview_status.nDiffs())
+
+ def load_config(self):
+ cfg = WidgetMixin.load_config(self)
+ self.hidefinddelay = cfg.getHideFindDelay()
+
+ def create_models(self, fromhead=None):
+ self.repomodel = HgRepoListModel(self.repo, fromhead=fromhead)
+ connect(self.repomodel, SIGNAL('filled'),
+ self.on_filled)
+ connect(self.repomodel, SIGNAL('loaded'),
+ self.loaded)
+ #connect(self.repomodel, SIGNAL('showMessage'),
+ # self.statusBar().showMessage,
+ # Qt.QueuedConnection)
+
+ self.filelistmodel = HgFileListModel(self.repo)
+
+ def setupModels(self, fromhead=None):
+ self.create_models(fromhead)
+ self.tableView_revisions.setModel(self.repomodel)
+ self.tableView_filelist.setModel(self.filelistmodel)
+ self.textview_status.setModel(self.repomodel)
+ #self.find_toolbar.setModel(self.repomodel)
+
+ filetable = self.tableView_filelist
+ connect(filetable, SIGNAL('fileSelected'),
+ self.textview_status.displayFile)
+ connect(self.textview_status, SIGNAL('revForDiffChanged'),
+ self.textview_header.setDiffRevision)
+
+ def setupRevisionTable(self):
+ view = self.tableView_revisions
+ view.installEventFilter(self)
+ connect(view, SIGNAL('revisionSelected'), self.revision_selected)
+ connect(view, SIGNAL('revisionActivated'), self.revision_activated)
+ connect(view, SIGNAL('updateToRevision'), self.updateToRevision)
+ connect(self.textview_header, SIGNAL('revisionSelected'), view.goto)
+ connect(self.textview_header, SIGNAL('parentRevisionSelected'), self.textview_status.displayDiff)
+ self.attachQuickBar(view.goto_toolbar)
+ gotoaction = view.goto_toolbar.toggleViewAction()
+ gotoaction.setIcon(geticon('goto'))
+ #self.toolBar_edit.addAction(gotoaction)
+
+ def _setup_table(self, table):
+ table.setTabKeyNavigation(False)
+ table.verticalHeader().setDefaultSectionSize(self.rowheight)
+ table.setShowGrid(False)
+ table.verticalHeader().hide()
+ table.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
+ table.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
+ table.setAlternatingRowColors(True)
+
+ def setupHeaderTextview(self):
+ self.header_diff_format = QtGui.QTextCharFormat()
+ self.header_diff_format.setFont(self._font)
+ self.header_diff_format.setFontWeight(bold)
+ self.header_diff_format.setForeground(Qt.black)
+ self.header_diff_format.setBackground(Qt.gray)
+
+ def on_filled(self):
+ tv = self.tableView_revisions
+ if self._reload_rev is not None:
+ try:
+ tv.goto(self._reload_rev)
+ self.tableView_filelist.selectFile(self._reload_file)
+ return
+ except IndexError:
+ pass
+ else:
+ tv.setCurrentIndex(tv.model().index(0, 0))
+
+ def revision_activated(self, rev=None):
+ """
+ Callback called when a revision is double-clicked in the revisions table
+ """
+ if rev is None:
+ rev = self.tableView_revisions.current_rev
+ self._manifestdlg = ManifestDialog(self.repo, rev)
+ self._manifestdlg.show()
+
+ def setScanForRepoChanges(self, enable):
+ saved = self._scanForRepoChanges
+ self._scanForRepoChanges = enable
+ return saved
+
+ def updateToRevision(self, rev):
+ saved = self.setScanForRepoChanges(False)
+ opts = { 'clean':False }
+ dlg = UpdateDialog(rev, self.repo, self, opts=opts)
+ self._updatedlg = dlg
+ def quit(status):
+ if status == 0:
+ self.reload() # TODO: implement something less drastic than a full reload
+ self.setScanForRepoChanges(saved)
+ dlg.quitsignal.connect(quit)
+ dlg.show()
+
+ def file_displayed(self, filename):
+ #self.actionPrevDiff.setEnabled(False)
+ pass
+
+ def revision_selected(self, rev):
+ """
+ Callback called when a revision is selected in the revisions table
+ """
+ if self.repomodel.graph:
+ ctx = self.repomodel.repo.changectx(rev)
+ self.textview_status.setContext(ctx)
+ self.textview_header.displayRevision(ctx)
+ self.filelistmodel.setSelectedRev(ctx)
+ if len(self.filelistmodel):
+ self.tableView_filelist.selectRow(0)
+
+ def goto(self, rev):
+ if len(self.tableView_revisions.model().graph):
+ self.tableView_revisions.goto(rev)
+ else:
+ # store rev to show once it's available (when graph
+ # filling is still running)
+ self._reload_rev = rev
+
+ def _getrepomtime(self):
+ """Return the last modification time for the repo"""
+ watchedfiles = [(self.repo.root, ".hg", "store", "00changelog.i"),
+ (self.repo.root, ".hg", "dirstate")]
+ watchedfiles = [os.path.join(*wf) for wf in watchedfiles]
+ mtime = [os.path.getmtime(wf) for wf in watchedfiles \
+ if os.path.isfile(wf)]
+ if mtime:
+ return max(mtime)
+ # humm, directory has probably been deleted, exiting...
+ self.close()
+
+ def reload(self):
+ """Reload the repository"""
+ print "reload() called"
+ self._reload_rev = self.tableView_revisions.current_rev
+ self._loading = True
+ self._reload_file = self.tableView_filelist.currentFile()
+ self.repo = hg.repository(self.repo.ui, self.repo.root)
+ self._repodate = self._getrepomtime()
+ self.setupBranchCombo()
+ self.setupModels()
+
+ #@timeit
+ def refreshRevisionTable(self, *args, **kw):
+ """Starts the process of filling the HgModel"""
+ branch = self.branch_comboBox.currentText()
+ branch = str(branch)
+ startrev = str(self.startrev_entry.text()).strip()
+ if not startrev:
+ startrev = None
+ # XXX workaround: self.sender() may provoque a core dump if
+ # this method is called directly (not via a connected signal);
+ # the 'sender' keyword is a way to discrimimne that the method
+ # has been called directly (thus caller MUST set this kw arg)
+ sender = kw.get('sender') or self.sender()
+ if sender is self.startrev_follow_action and startrev is None:
+ return
+ startrev = self.repo.changectx(startrev).rev()
+ follow = self.startrev_follow_action.isChecked()
+ self.revscompl_model.setStringList(self.repo.tags().keys())
+
+ self.repomodel.setRepo(self.repo, branch=branch, fromhead=startrev,
+ follow=follow)
+
+def run(ui, *pats, **opts):
+ repo = None
+ root = paths.find_root()
+ if root:
+ repo = hg.repository(ui, path=root)
+ return Workbench(repo)
|
|
|
@@ -0,0 +1,221 @@ + <?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Form</class>
+ <widget class="QWidget" name="Form">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>510</width>
+ <height>506</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QSplitter" name="revisions_splitter">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <widget class="HgRepoView" name="tableView_revisions">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>1</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_maincontent">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Plain</enum>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QSplitter" name="filelist_splitter">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="childrenCollapsible">
+ <bool>false</bool>
+ </property>
+ <widget class="HgFileListView" name="tableView_filelist"/>
+ <widget class="QFrame" name="frame">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="sizeConstraint">
+ <enum>QLayout::SetDefaultConstraint</enum>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="RevDisplay" name="textview_header" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>8</pointsize>
+ </font>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSplitter" name="message_splitter">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>50</width>
+ <height>50</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="lineWidth">
+ <number>0</number>
+ </property>
+ <property name="midLineWidth">
+ <number>0</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="opaqueResize">
+ <bool>true</bool>
+ </property>
+ <widget class="RevMessage" name="message" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <family>Courier</family>
+ <pointsize>9</pointsize>
+ </font>
+ </property>
+ </widget>
+ <widget class="HgFileView" name="textview_status" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>1</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>HgRepoView</class>
+ <extends>QTableView</extends>
+ <header>repoview.h</header>
+ </customwidget>
+ <customwidget>
+ <class>RevDisplay</class>
+ <extends>QWidget</extends>
+ <header>changeset.h</header>
+ </customwidget>
+ <customwidget>
+ <class>HgFileListView</class>
+ <extends>QTableView</extends>
+ <header>filelistview.h</header>
+ </customwidget>
+ <customwidget>
+ <class>HgFileView</class>
+ <extends>QWidget</extends>
+ <header>fileview.h</header>
+ <container>1</container>
+ </customwidget>
+ <customwidget>
+ <class>RevMessage</class>
+ <extends>QWidget</extends>
+ <header>changeset.h</header>
+ <container>1</container>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
|
|
|
@@ -0,0 +1,126 @@ + # -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'C:\Users\adi\hgrepos\thg-qt\tortoisehg\hgqt\repowidget.ui'
+#
+# Created: Tue May 11 16:08:13 2010
+# by: PyQt4 UI code generator 4.7.3
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+class Ui_Form(object):
+ def setupUi(self, Form):
+ Form.setObjectName("Form")
+ Form.resize(510, 506)
+ self.horizontalLayout = QtGui.QHBoxLayout(Form)
+ self.horizontalLayout.setSpacing(0)
+ self.horizontalLayout.setMargin(0)
+ self.horizontalLayout.setObjectName("horizontalLayout")
+ self.revisions_splitter = QtGui.QSplitter(Form)
+ self.revisions_splitter.setOrientation(QtCore.Qt.Vertical)
+ self.revisions_splitter.setObjectName("revisions_splitter")
+ self.tableView_revisions = HgRepoView(self.revisions_splitter)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(1)
+ sizePolicy.setHeightForWidth(self.tableView_revisions.sizePolicy().hasHeightForWidth())
+ self.tableView_revisions.setSizePolicy(sizePolicy)
+ self.tableView_revisions.setFrameShape(QtGui.QFrame.StyledPanel)
+ self.tableView_revisions.setObjectName("tableView_revisions")
+ self.frame_maincontent = QtGui.QFrame(self.revisions_splitter)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.frame_maincontent.sizePolicy().hasHeightForWidth())
+ self.frame_maincontent.setSizePolicy(sizePolicy)
+ self.frame_maincontent.setFrameShape(QtGui.QFrame.NoFrame)
+ self.frame_maincontent.setFrameShadow(QtGui.QFrame.Plain)
+ self.frame_maincontent.setObjectName("frame_maincontent")
+ self.verticalLayout_2 = QtGui.QVBoxLayout(self.frame_maincontent)
+ self.verticalLayout_2.setSpacing(0)
+ self.verticalLayout_2.setMargin(0)
+ self.verticalLayout_2.setObjectName("verticalLayout_2")
+ self.filelist_splitter = QtGui.QSplitter(self.frame_maincontent)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.filelist_splitter.sizePolicy().hasHeightForWidth())
+ self.filelist_splitter.setSizePolicy(sizePolicy)
+ self.filelist_splitter.setOrientation(QtCore.Qt.Horizontal)
+ self.filelist_splitter.setChildrenCollapsible(False)
+ self.filelist_splitter.setObjectName("filelist_splitter")
+ self.tableView_filelist = HgFileListView(self.filelist_splitter)
+ self.tableView_filelist.setObjectName("tableView_filelist")
+ self.frame = QtGui.QFrame(self.filelist_splitter)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(1)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.frame.sizePolicy().hasHeightForWidth())
+ self.frame.setSizePolicy(sizePolicy)
+ self.frame.setFrameShape(QtGui.QFrame.NoFrame)
+ self.frame.setObjectName("frame")
+ self.verticalLayout = QtGui.QVBoxLayout(self.frame)
+ self.verticalLayout.setSpacing(0)
+ self.verticalLayout.setSizeConstraint(QtGui.QLayout.SetDefaultConstraint)
+ self.verticalLayout.setMargin(0)
+ self.verticalLayout.setObjectName("verticalLayout")
+ self.textview_header = RevDisplay(self.frame)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.textview_header.sizePolicy().hasHeightForWidth())
+ self.textview_header.setSizePolicy(sizePolicy)
+ self.textview_header.setMinimumSize(QtCore.QSize(0, 0))
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ self.textview_header.setFont(font)
+ self.textview_header.setObjectName("textview_header")
+ self.verticalLayout.addWidget(self.textview_header)
+ self.message_splitter = QtGui.QSplitter(self.frame)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.message_splitter.sizePolicy().hasHeightForWidth())
+ self.message_splitter.setSizePolicy(sizePolicy)
+ 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(QtCore.Qt.Vertical)
+ self.message_splitter.setOpaqueResize(True)
+ self.message_splitter.setObjectName("message_splitter")
+ self.message = RevMessage(self.message_splitter)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.message.sizePolicy().hasHeightForWidth())
+ self.message.setSizePolicy(sizePolicy)
+ self.message.setMinimumSize(QtCore.QSize(0, 0))
+ font = QtGui.QFont()
+ font.setFamily("Courier")
+ font.setPointSize(9)
+ self.message.setFont(font)
+ self.message.setObjectName("message")
+ self.textview_status = HgFileView(self.message_splitter)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(1)
+ sizePolicy.setHeightForWidth(self.textview_status.sizePolicy().hasHeightForWidth())
+ self.textview_status.setSizePolicy(sizePolicy)
+ self.textview_status.setMinimumSize(QtCore.QSize(0, 0))
+ self.textview_status.setObjectName("textview_status")
+ self.verticalLayout.addWidget(self.message_splitter)
+ self.verticalLayout_2.addWidget(self.filelist_splitter)
+ self.horizontalLayout.addWidget(self.revisions_splitter)
+
+ self.retranslateUi(Form)
+ QtCore.QMetaObject.connectSlotsByName(Form)
+
+ def retranslateUi(self, Form):
+ Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtGui.QApplication.UnicodeUTF8))
+
+from changeset import RevDisplay, RevMessage
+from filelistview import HgFileListView
+from fileview import HgFileView
+from repoview import HgRepoView
|
|
|
@@ -0,0 +1,127 @@ + # -*- coding: utf-8 -*-
+# Copyright (c) 2003-2010 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+import os
+import os.path as osp
+import sys
+
+from PyQt4 import QtCore
+from PyQt4 import QtGui, uic
+connect = QtCore.QObject.connect
+SIGNAL = QtCore.SIGNAL
+Qt = QtCore.Qt
+
+from tortoisehg.hgqt.config import HgConfig
+from tortoisehg.hgqt import should_rebuild
+
+class WidgetMixin(object):
+ def __init__(self):
+ # self.repo must be defined in actual class before calling __init__
+ assert self.repo is not None
+ self.load_config()
+
+ _path = osp.dirname(__file__)
+ uifile = osp.join(_path, self._uifile)
+ pyfile = uifile.replace(".ui", "_ui.py")
+ if should_rebuild(uifile, pyfile):
+ os.system('pyuic4 %s -o %s' % (uifile, pyfile))
+ try:
+ modname = osp.splitext(osp.basename(uifile))[0] + "_ui"
+ modname = "tortoisehg.hgqt.%s" % modname
+ mod = __import__(modname, fromlist=['*'])
+ classnames = [x for x in dir(mod) if x.startswith('Ui_')]
+ if len(classnames) == 1:
+ ui_class = getattr(mod, classnames[0])
+ elif 'Ui_MainWindow' in classnames:
+ ui_class = getattr(mod, 'Ui_MainWindow')
+ else:
+ raise ValueError("Can't determine which main class to use in %s" % modname)
+ except ImportError:
+ ui_class, base_class = uic.loadUiType(uifile)
+
+ if ui_class not in self.__class__.__bases__:
+ # hacking by adding the form class from ui file or pyuic4
+ # generated module because we cannot use metaclass here,
+ # due to "QObject" not being a subclass of "object"
+ self.__class__.__bases__ = self.__class__.__bases__ + (ui_class,)
+ self.setupUi(self)
+ self.load_ui()
+ self.disab_shortcuts = []
+
+ def load_ui(self):
+ # we explicitely create a QShortcut so we can disable it
+ # when a "helper context toolbar" is activated (which can be
+ # closed hitting the Esc shortcut)
+ self.esc_shortcut = QtGui.QShortcut(self)
+ self.esc_shortcut.setKey(Qt.Key_Escape)
+ connect(self.esc_shortcut, SIGNAL('activated()'),
+ self.maybeClose)
+ self._quickbars = []
+
+ def attachQuickBar(self, qbar):
+ '''
+ qbar.setParent(self)
+ self._quickbars.append(qbar)
+ connect(qbar, SIGNAL('escShortcutDisabled(bool)'),
+ self.setShortcutsEnabled)
+ self.addToolBar(Qt.BottomToolBarArea, qbar)
+ connect(qbar, SIGNAL('visible'),
+ self.ensureOneQuickBar)
+ '''
+
+ def setShortcutsEnabled(self, enabled=True):
+ for sh in self.disab_shortcuts:
+ sh.setEnabled(enabled)
+
+ def ensureOneQuickBar(self):
+ tb = self.sender()
+ for w in self._quickbars:
+ if w is not tb:
+ w.hide()
+
+ def maybeClose(self):
+ for w in self._quickbars:
+ if w.isVisible():
+ w.cancel()
+ break
+ else:
+ self.close()
+
+ 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()
+ return cfg
+
+ def accept(self):
+ self.close()
+ def reject(self):
+ self.close()
+
+
|
|
|
@@ -20,19 +20,13 @@ from tortoisehg.util.util import tounicode, has_closed_branch_support
from tortoisehg.util.util import rootpath, find_repository
-from tortoisehg.hgqt.graph import diff as revdiff
from tortoisehg.hgqt.decorators import timeit
from tortoisehg.hgqt import icon as geticon
-from tortoisehg.hgqt.repomodel import HgRepoListModel
-from tortoisehg.hgqt.filelistmodel import HgFileListModel
-from tortoisehg.hgqt.filedialogs import FileLogDialog, FileDiffDialog
-from tortoisehg.hgqt.manifestdialog import ManifestDialog
from tortoisehg.hgqt.dialogmixin import HgDialogMixin
-from tortoisehg.hgqt.update import UpdateDialog
from tortoisehg.hgqt.quickbar import FindInGraphlogQuickBar
from tortoisehg.hgqt.helpdialog import HelpDialog
-from tortoisehg.hgqt import cmdui
+from tortoisehg.hgqt.repowidget import RepoWidget
from tortoisehg.util import paths
@@ -66,33 +60,35 @@ self.createActions()
self.createToolbars()
- self.textview_status.setFont(self._font)
- connect(self.textview_status, SIGNAL('showMessage'),
- self.statusBar().showMessage)
- connect(self.tableView_revisions, SIGNAL('showMessage'),
- self.statusBar().showMessage)
+ #self.textview_status.setFont(self._font)
+ #connect(self.textview_status, SIGNAL('showMessage'),
+ # self.statusBar().showMessage)
+ #connect(self.tableView_revisions, SIGNAL('showMessage'),
+ # self.statusBar().showMessage)
- self.textview_header.setMessageWidget(self.message)
+ #self.textview_header.setMessageWidget(self.message)
- self.textview_header.commitsignal.connect(self.commit)
+ #self.textview_header.commitsignal.connect(self.commit)
- # set name of current tab to repo name
+ tw = self.repoTabsWidget
reponame = os.path.basename(self.repo.root)
- tw = self.repoTabsWidget
- idx = tw.currentIndex()
- tw.setTabText(idx, reponame)
+ self.repowidget = rw = RepoWidget(repo, fromhead)
+ tw.setCurrentWidget(rw)
+ tw.addTab(rw, reponame)
+ tw.removeTab(0)
# setup tables and views
- self.setupHeaderTextview()
- connect(self.textview_status, SIGNAL('fileDisplayed'),
- self.file_displayed)
+ #self.setupHeaderTextview()
+ #connect(self.textview_status, SIGNAL('fileDisplayed'),
+ # self.file_displayed)
self.setupBranchCombo()
- self.setupModels(fromhead)
+ # self.setupModels(fromhead)
if fromhead:
self.startrev_entry.setText(str(fromhead))
- self.setupRevisionTable()
+ #self.setupRevisionTable()
# restore settings
+ '''
s = QtCore.QSettings()
wb = "Workbench/"
self.restoreGeometry(s.value(wb + 'geometry').toByteArray())
@@ -103,33 +99,7 @@ n += '_splitter'
self.splitternames.append(n)
getattr(self, n).restoreState(s.value(wb + n).toByteArray())
-
- self._repodate = self._getrepomtime()
- self._watchrepotimer = self.startTimer(500)
-
- def commit(self):
- args = ['commit']
- args += ['-v', '-m', self.message.text()]
- dlg = cmdui.Dialog(args)
- dlg.show()
- self._commitdlg = dlg
-
- def timerEvent(self, event):
- if event.timerId() == self._watchrepotimer:
- if not self._scanForRepoChanges or self.loading():
- return
- mtime = self._getrepomtime()
- if mtime > self._repodate:
- self.statusBar().showMessage("Repository has been modified "
- "(reloading is recommended)")
-
- def loading(self):
- return self._loading
-
- def loaded(self):
- print "loaded()"
- self._repodate = self._getrepomtime()
- self._loading = False
+ '''
def setupBranchCombo(self, *args):
allbranches = sorted(self.repo.branchtags().items())
@@ -157,18 +127,18 @@ # find quickbar
self.find_toolbar = tb = FindInGraphlogQuickBar(self)
tb.setObjectName("find_toolbar")
- tb.attachFileView(self.textview_status)
- tb.attachHeaderView(self.textview_header)
- connect(tb, SIGNAL('revisionSelected'), self.tableView_revisions.goto)
- connect(tb, SIGNAL('fileSelected'), self.tableView_filelist.selectFile)
+ #tb.attachFileView(self.textview_status)
+ #tb.attachHeaderView(self.textview_header)
+ #connect(tb, SIGNAL('revisionSelected'), self.tableView_revisions.goto)
+ #connect(tb, SIGNAL('fileSelected'), self.tableView_filelist.selectFile)
connect(tb, SIGNAL('showMessage'), self.statusBar().showMessage,
Qt.QueuedConnection)
self.attachQuickBar(tb)
# navigation toolbar
- self.toolBar_edit.addAction(self.tableView_revisions._actions['back'])
- self.toolBar_edit.addAction(self.tableView_revisions._actions['forward'])
+ #self.toolBar_edit.addAction(self.tableView_revisions._actions['back'])
+ #self.toolBar_edit.addAction(self.tableView_revisions._actions['forward'])
findaction = self.find_toolbar.toggleViewAction()
findaction.setIcon(geticon('find'))
@@ -244,8 +214,8 @@
self.actionAnnMode = QtGui.QAction('Annotate', self)
self.actionAnnMode.setCheckable(True)
- connect(self.actionAnnMode, SIGNAL('toggled(bool)'),
- self.textview_status.setAnnotate)
+ #connect(self.actionAnnMode, SIGNAL('toggled(bool)'),
+ # self.textview_status.setAnnotate)
self.actionHelp.setShortcut(Qt.Key_F1)
self.actionHelp.setIcon(geticon('help'))
@@ -258,7 +228,7 @@ def filled():
self.actionNextDiff.setEnabled(
self.textview_status.fileMode() and self.textview_status.nDiffs())
- connect(self.textview_status, SIGNAL('filled'), filled)
+ #connect(self.textview_status, SIGNAL('filled'), filled)
self.actionPrevDiff = QtGui.QAction(geticon('up'), 'Previous diff', self)
self.actionPrevDiff.setShortcut('Alt+Up')
connect(self.actionNextDiff, SIGNAL('triggered()'),
@@ -270,12 +240,12 @@ # Next/Prev file
self.actionNextFile = QtGui.QAction('Next file', self)
self.actionNextFile.setShortcut('Right')
- connect(self.actionNextFile, SIGNAL('triggered()'),
- self.tableView_filelist.nextFile)
+ #connect(self.actionNextFile, SIGNAL('triggered()'),
+ # self.tableView_filelist.nextFile)
self.actionPrevFile = QtGui.QAction('Prev file', self)
self.actionPrevFile.setShortcut('Left')
- connect(self.actionPrevFile, SIGNAL('triggered()'),
- self.tableView_filelist.prevFile)
+ #connect(self.actionPrevFile, SIGNAL('triggered()'),
+ # self.tableView_filelist.prevFile)
self.addAction(self.actionNextFile)
self.addAction(self.actionPrevFile)
self.disab_shortcuts.append(self.actionNextFile)
@@ -284,12 +254,12 @@ # Next/Prev rev
self.actionNextRev = QtGui.QAction('Next revision', self)
self.actionNextRev.setShortcut('Down')
- connect(self.actionNextRev, SIGNAL('triggered()'),
- self.tableView_revisions.nextRev)
+ #connect(self.actionNextRev, SIGNAL('triggered()'),
+ # self.tableView_revisions.nextRev)
self.actionPrevRev = QtGui.QAction('Prev revision', self)
self.actionPrevRev.setShortcut('Up')
- connect(self.actionPrevRev, SIGNAL('triggered()'),
- self.tableView_revisions.prevRev)
+ #connect(self.actionPrevRev, SIGNAL('triggered()'),
+ # self.tableView_revisions.prevRev)
self.addAction(self.actionNextRev)
self.addAction(self.actionPrevRev)
self.disab_shortcuts.append(self.actionNextRev)
@@ -298,53 +268,25 @@ # 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.textview_status.nextLine)
+ #connect(self.actionNextLine, SIGNAL('triggered()'),
+ # self.textview_status.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.textview_status.prevLine)
+ #connect(self.actionPrevLine, SIGNAL('triggered()'),
+ # self.textview_status.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.textview_status.nextCol)
+ #connect(self.actionNextCol, SIGNAL('triggered()'),
+ # self.textview_status.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.textview_status.prevCol)
+ #connect(self.actionPrevCol, SIGNAL('triggered()'),
+ # self.textview_status.prevCol)
self.addAction(self.actionPrevCol)
- # Activate file (file diff navigator)
- self.actionActivateFile = QtGui.QAction('Activate file', self)
- self.actionActivateFile.setShortcuts([Qt.Key_Return, Qt.Key_Enter])
- def enterkeypressed():
- w = QtGui.QApplication.focusWidget()
- if not isinstance(w, QtGui.QLineEdit):
- self.tableView_filelist.fileActivated(self.tableView_filelist.currentIndex(),)
- else:
- w.emit(SIGNAL('editingFinished()'))
- connect(self.actionActivateFile, SIGNAL('triggered()'),
- enterkeypressed)
-
- 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))
- self.actionActivateRev = QtGui.QAction('Activate rev.', self)
- self.actionActivateRev.setShortcuts([Qt.SHIFT+Qt.Key_Return, Qt.SHIFT+Qt.Key_Enter])
- connect(self.actionActivateRev, SIGNAL('triggered()'),
- self.revision_activated)
- self.addAction(self.actionActivateFile)
- self.addAction(self.actionActivateFileAlt)
- self.addAction(self.actionActivateRev)
- self.disab_shortcuts.append(self.actionActivateFile)
- self.disab_shortcuts.append(self.actionActivateRev)
-
self.actionStartAtRev = QtGui.QAction('Start at rev.', self)
self.actionStartAtRev.setShortcuts([Qt.Key_Backspace,])
connect(self.actionStartAtRev, SIGNAL('triggered()'),
@@ -358,198 +300,36 @@ self.addAction(self.actionClearStartAtRev)
def startAtCurrentRev(self):
- crev = self.tableView_revisions.current_rev
- if crev:
- self.startrev_entry.setText(str(crev))
- # XXX workaround: see refreshRevisionTable method
- self.refreshRevisionTable(sender=self)
+ pass
def clearStartAtRev(self):
- self.startrev_entry.setText("")
- self._reload_rev = self.tableView_revisions.current_rev
- self._reload_file = self.tableView_filelist.currentFile()
- # XXX workaround: see refreshRevisionTable method
- self.refreshRevisionTable(sender=self)
+ pass
def setMode(self, mode):
- self.textview_status.setMode(mode)
- self.actionAnnMode.setEnabled(not mode)
- self.actionNextDiff.setEnabled(not mode)
- self.actionPrevDiff.setEnabled(not mode)
+ pass
def nextDiff(self):
- notlast = self.textview_status.nextDiff()
- self.actionNextDiff.setEnabled(self.textview_status.fileMode() and notlast and self.textview_status.nDiffs())
- self.actionPrevDiff.setEnabled(self.textview_status.fileMode() and self.textview_status.nDiffs())
+ pass
def prevDiff(self):
- notfirst = self.textview_status.prevDiff()
- self.actionPrevDiff.setEnabled(self.textview_status.fileMode() and notfirst and self.textview_status.nDiffs())
- self.actionNextDiff.setEnabled(self.textview_status.fileMode() and self.textview_status.nDiffs())
+ pass
def load_config(self):
cfg = HgDialogMixin.load_config(self)
self.hidefinddelay = cfg.getHideFindDelay()
- def create_models(self, fromhead=None):
- self.repomodel = HgRepoListModel(self.repo, fromhead=fromhead)
- connect(self.repomodel, SIGNAL('filled'),
- self.on_filled)
- connect(self.repomodel, SIGNAL('loaded'),
- self.loaded)
- connect(self.repomodel, SIGNAL('showMessage'),
- self.statusBar().showMessage,
- Qt.QueuedConnection)
-
- self.filelistmodel = HgFileListModel(self.repo)
-
- def setupModels(self, fromhead=None):
- self.create_models(fromhead)
- self.tableView_revisions.setModel(self.repomodel)
- self.tableView_filelist.setModel(self.filelistmodel)
- self.textview_status.setModel(self.repomodel)
- self.find_toolbar.setModel(self.repomodel)
-
- filetable = self.tableView_filelist
- connect(filetable, SIGNAL('fileSelected'),
- self.textview_status.displayFile)
- connect(self.textview_status, SIGNAL('revForDiffChanged'),
- self.textview_header.setDiffRevision)
-
- def setupRevisionTable(self):
- view = self.tableView_revisions
- view.installEventFilter(self)
- connect(view, SIGNAL('revisionSelected'), self.revision_selected)
- connect(view, SIGNAL('revisionActivated'), self.revision_activated)
- connect(view, SIGNAL('updateToRevision'), self.updateToRevision)
- connect(self.textview_header, SIGNAL('revisionSelected'), view.goto)
- connect(self.textview_header, SIGNAL('parentRevisionSelected'), self.textview_status.displayDiff)
- self.attachQuickBar(view.goto_toolbar)
- gotoaction = view.goto_toolbar.toggleViewAction()
- gotoaction.setIcon(geticon('goto'))
- self.toolBar_edit.addAction(gotoaction)
-
- def _setup_table(self, table):
- table.setTabKeyNavigation(False)
- table.verticalHeader().setDefaultSectionSize(self.rowheight)
- table.setShowGrid(False)
- table.verticalHeader().hide()
- table.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
- table.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
- table.setAlternatingRowColors(True)
-
- def setupHeaderTextview(self):
- self.header_diff_format = QtGui.QTextCharFormat()
- self.header_diff_format.setFont(self._font)
- self.header_diff_format.setFontWeight(bold)
- self.header_diff_format.setForeground(Qt.black)
- self.header_diff_format.setBackground(Qt.gray)
-
- def on_filled(self):
- tv = self.tableView_revisions
- if self._reload_rev is not None:
- try:
- tv.goto(self._reload_rev)
- self.tableView_filelist.selectFile(self._reload_file)
- return
- except IndexError:
- pass
- else:
- tv.setCurrentIndex(tv.model().index(0, 0))
-
- def revision_activated(self, rev=None):
- """
- Callback called when a revision is double-clicked in the revisions table
- """
- if rev is None:
- rev = self.tableView_revisions.current_rev
- self._manifestdlg = ManifestDialog(self.repo, rev)
- self._manifestdlg.show()
-
- def setScanForRepoChanges(self, enable):
- saved = self._scanForRepoChanges
- self._scanForRepoChanges = enable
- return saved
-
- def updateToRevision(self, rev):
- saved = self.setScanForRepoChanges(False)
- opts = { 'clean':False }
- dlg = UpdateDialog(rev, self.repo, self, opts=opts)
- self._updatedlg = dlg
- def quit(status):
- if status == 0:
- self.reload() # TODO: implement something less drastic than a full reload
- self.setScanForRepoChanges(saved)
- dlg.quitsignal.connect(quit)
- dlg.show()
-
def file_displayed(self, filename):
- self.actionPrevDiff.setEnabled(False)
-
- def revision_selected(self, rev):
- """
- Callback called when a revision is selected in the revisions table
- """
- if self.repomodel.graph:
- ctx = self.repomodel.repo.changectx(rev)
- self.textview_status.setContext(ctx)
- self.textview_header.displayRevision(ctx)
- self.filelistmodel.setSelectedRev(ctx)
- if len(self.filelistmodel):
- self.tableView_filelist.selectRow(0)
-
- def goto(self, rev):
- if len(self.tableView_revisions.model().graph):
- self.tableView_revisions.goto(rev)
- else:
- # store rev to show once it's available (when graph
- # filling is still running)
- self._reload_rev = rev
-
- def _getrepomtime(self):
- """Return the last modification time for the repo"""
- watchedfiles = [(self.repo.root, ".hg", "store", "00changelog.i"),
- (self.repo.root, ".hg", "dirstate")]
- watchedfiles = [os.path.join(*wf) for wf in watchedfiles]
- mtime = [os.path.getmtime(wf) for wf in watchedfiles \
- if os.path.isfile(wf)]
- if mtime:
- return max(mtime)
- # humm, directory has probably been deleted, exiting...
- self.close()
+ # self.actionPrevDiff.setEnabled(False)
+ pass
def reload(self):
"""Reload the repository"""
print "reload() called"
- self._reload_rev = self.tableView_revisions.current_rev
- self._loading = True
- self._reload_file = self.tableView_filelist.currentFile()
- self.repo = hg.repository(self.repo.ui, self.repo.root)
- self._repodate = self._getrepomtime()
- self.setupBranchCombo()
- self.setupModels()
+ self.repowidget.reload()
#@timeit
def refreshRevisionTable(self, *args, **kw):
- """Starts the process of filling the HgModel"""
- branch = self.branch_comboBox.currentText()
- branch = str(branch)
- startrev = str(self.startrev_entry.text()).strip()
- if not startrev:
- startrev = None
- # XXX workaround: self.sender() may provoque a core dump if
- # this method is called directly (not via a connected signal);
- # the 'sender' keyword is a way to discrimimne that the method
- # has been called directly (thus caller MUST set this kw arg)
- sender = kw.get('sender') or self.sender()
- if sender is self.startrev_follow_action and startrev is None:
- return
- startrev = self.repo.changectx(startrev).rev()
- follow = self.startrev_follow_action.isChecked()
- self.revscompl_model.setStringList(self.repo.tags().keys())
-
- self.repomodel.setRepo(self.repo, branch=branch, fromhead=startrev,
- follow=follow)
+ pass
def on_about(self, *args):
""" Display about dialog """
@@ -584,12 +364,14 @@ def closeEvent(self, event):
if not self.okToContinue():
event.ignore()
+ '''
s = QtCore.QSettings()
wb = "Workbench/"
s.setValue(wb + 'geometry', self.saveGeometry())
s.setValue(wb + 'windowState', self.saveState())
for n in self.splitternames:
s.setValue(wb + n, getattr(self, n).saveState())
+ '''
def run(ui, *pats, **opts):
repo = None
|
|
@@ -6,8 +6,8 @@ <rect>
<x>0</x>
<y>0</y>
- <width>698</width>
- <height>642</height>
+ <width>671</width>
+ <height>669</height>
</rect>
</property>
<property name="windowTitle">
@@ -39,179 +39,6 @@ <attribute name="title">
<string>repo1</string>
</attribute>
- <layout class="QVBoxLayout" name="verticalLayout_3">
- <property name="spacing">
- <number>0</number>
- </property>
- <property name="margin">
- <number>0</number>
- </property>
- <item>
- <widget class="QSplitter" name="revisions_splitter">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <widget class="HgRepoView" name="tableView_revisions">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>1</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- </widget>
- <widget class="QFrame" name="frame_maincontent">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Plain</enum>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_2">
- <property name="spacing">
- <number>0</number>
- </property>
- <property name="margin">
- <number>0</number>
- </property>
- <item>
- <widget class="QSplitter" name="filelist_splitter">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="childrenCollapsible">
- <bool>false</bool>
- </property>
- <widget class="HgFileListView" name="tableView_filelist"/>
- <widget class="QFrame" name="frame">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
- <horstretch>1</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <property name="spacing">
- <number>0</number>
- </property>
- <property name="sizeConstraint">
- <enum>QLayout::SetDefaultConstraint</enum>
- </property>
- <property name="margin">
- <number>0</number>
- </property>
- <item>
- <widget class="RevDisplay" name="textview_header" native="true">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Minimum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>0</height>
- </size>
- </property>
- <property name="font">
- <font>
- <pointsize>8</pointsize>
- </font>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QSplitter" name="message_splitter">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>50</width>
- <height>50</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="lineWidth">
- <number>0</number>
- </property>
- <property name="midLineWidth">
- <number>0</number>
- </property>
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="opaqueResize">
- <bool>true</bool>
- </property>
- <widget class="RevMessage" name="message" native="true">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>0</height>
- </size>
- </property>
- <property name="font">
- <font>
- <family>Courier</family>
- <pointsize>9</pointsize>
- </font>
- </property>
- </widget>
- <widget class="HgFileView" name="textview_status" native="true">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>1</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>0</height>
- </size>
- </property>
- </widget>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- </layout>
</widget>
</widget>
</item>
@@ -222,7 +49,7 @@ <rect>
<x>0</x>
<y>0</y>
- <width>698</width>
+ <width>671</width>
<height>19</height>
</rect>
</property>
@@ -359,35 +186,6 @@ </property>
</action>
</widget>
- <customwidgets>
- <customwidget>
- <class>HgRepoView</class>
- <extends>QTableView</extends>
- <header>repoview.h</header>
- </customwidget>
- <customwidget>
- <class>RevDisplay</class>
- <extends>QWidget</extends>
- <header>changeset.h</header>
- </customwidget>
- <customwidget>
- <class>HgFileListView</class>
- <extends>QTableView</extends>
- <header>filelistview.h</header>
- </customwidget>
- <customwidget>
- <class>HgFileView</class>
- <extends>QWidget</extends>
- <header>fileview.h</header>
- <container>1</container>
- </customwidget>
- <customwidget>
- <class>RevMessage</class>
- <extends>QWidget</extends>
- <header>changeset.h</header>
- <container>1</container>
- </customwidget>
- </customwidgets>
<resources>
<include location="workbench.qrc"/>
</resources>
|
|
@@ -2,7 +2,7 @@
# Form implementation generated from reading ui file 'C:\Users\adi\hgrepos\thg-qt\tortoisehg\hgqt\workbench.ui'
#
-# Created: Tue May 11 11:55:26 2010
+# Created: Tue May 11 15:17:48 2010
# by: PyQt4 UI code generator 4.7.3
#
# WARNING! All changes made in this file will be lost!
@@ -12,7 +12,7 @@class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
- MainWindow.resize(698, 642)
+ MainWindow.resize(671, 669)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.horizontalLayout = QtGui.QHBoxLayout(self.centralwidget)
@@ -26,111 +26,11 @@ self.repoTabsWidget.setObjectName("repoTabsWidget")
self.firstRepoTab = QtGui.QWidget()
self.firstRepoTab.setObjectName("firstRepoTab")
- self.verticalLayout_3 = QtGui.QVBoxLayout(self.firstRepoTab)
- self.verticalLayout_3.setSpacing(0)
- self.verticalLayout_3.setMargin(0)
- self.verticalLayout_3.setObjectName("verticalLayout_3")
- self.revisions_splitter = QtGui.QSplitter(self.firstRepoTab)
- self.revisions_splitter.setOrientation(QtCore.Qt.Vertical)
- self.revisions_splitter.setObjectName("revisions_splitter")
- self.tableView_revisions = HgRepoView(self.revisions_splitter)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(1)
- sizePolicy.setHeightForWidth(self.tableView_revisions.sizePolicy().hasHeightForWidth())
- self.tableView_revisions.setSizePolicy(sizePolicy)
- self.tableView_revisions.setFrameShape(QtGui.QFrame.StyledPanel)
- self.tableView_revisions.setObjectName("tableView_revisions")
- self.frame_maincontent = QtGui.QFrame(self.revisions_splitter)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.frame_maincontent.sizePolicy().hasHeightForWidth())
- self.frame_maincontent.setSizePolicy(sizePolicy)
- self.frame_maincontent.setFrameShape(QtGui.QFrame.NoFrame)
- self.frame_maincontent.setFrameShadow(QtGui.QFrame.Plain)
- self.frame_maincontent.setObjectName("frame_maincontent")
- self.verticalLayout_2 = QtGui.QVBoxLayout(self.frame_maincontent)
- self.verticalLayout_2.setSpacing(0)
- self.verticalLayout_2.setMargin(0)
- self.verticalLayout_2.setObjectName("verticalLayout_2")
- self.filelist_splitter = QtGui.QSplitter(self.frame_maincontent)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.filelist_splitter.sizePolicy().hasHeightForWidth())
- self.filelist_splitter.setSizePolicy(sizePolicy)
- self.filelist_splitter.setOrientation(QtCore.Qt.Horizontal)
- self.filelist_splitter.setChildrenCollapsible(False)
- self.filelist_splitter.setObjectName("filelist_splitter")
- self.tableView_filelist = HgFileListView(self.filelist_splitter)
- self.tableView_filelist.setObjectName("tableView_filelist")
- self.frame = QtGui.QFrame(self.filelist_splitter)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
- sizePolicy.setHorizontalStretch(1)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.frame.sizePolicy().hasHeightForWidth())
- self.frame.setSizePolicy(sizePolicy)
- self.frame.setFrameShape(QtGui.QFrame.NoFrame)
- self.frame.setObjectName("frame")
- self.verticalLayout = QtGui.QVBoxLayout(self.frame)
- self.verticalLayout.setSpacing(0)
- self.verticalLayout.setSizeConstraint(QtGui.QLayout.SetDefaultConstraint)
- self.verticalLayout.setMargin(0)
- self.verticalLayout.setObjectName("verticalLayout")
- self.textview_header = RevDisplay(self.frame)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.textview_header.sizePolicy().hasHeightForWidth())
- self.textview_header.setSizePolicy(sizePolicy)
- self.textview_header.setMinimumSize(QtCore.QSize(0, 0))
- font = QtGui.QFont()
- font.setPointSize(8)
- self.textview_header.setFont(font)
- self.textview_header.setObjectName("textview_header")
- self.verticalLayout.addWidget(self.textview_header)
- self.message_splitter = QtGui.QSplitter(self.frame)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.message_splitter.sizePolicy().hasHeightForWidth())
- self.message_splitter.setSizePolicy(sizePolicy)
- 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(QtCore.Qt.Vertical)
- self.message_splitter.setOpaqueResize(True)
- self.message_splitter.setObjectName("message_splitter")
- self.message = RevMessage(self.message_splitter)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.message.sizePolicy().hasHeightForWidth())
- self.message.setSizePolicy(sizePolicy)
- self.message.setMinimumSize(QtCore.QSize(0, 0))
- font = QtGui.QFont()
- font.setFamily("Courier")
- font.setPointSize(9)
- self.message.setFont(font)
- self.message.setObjectName("message")
- self.textview_status = HgFileView(self.message_splitter)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(1)
- sizePolicy.setHeightForWidth(self.textview_status.sizePolicy().hasHeightForWidth())
- self.textview_status.setSizePolicy(sizePolicy)
- self.textview_status.setMinimumSize(QtCore.QSize(0, 0))
- self.textview_status.setObjectName("textview_status")
- self.verticalLayout.addWidget(self.message_splitter)
- self.verticalLayout_2.addWidget(self.filelist_splitter)
- self.verticalLayout_3.addWidget(self.revisions_splitter)
self.repoTabsWidget.addTab(self.firstRepoTab, "")
self.horizontalLayout.addWidget(self.repoTabsWidget)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
- self.menubar.setGeometry(QtCore.QRect(0, 0, 698, 19))
+ self.menubar.setGeometry(QtCore.QRect(0, 0, 671, 19))
self.menubar.setObjectName("menubar")
self.menuFile = QtGui.QMenu(self.menubar)
self.menuFile.setObjectName("menuFile")
@@ -210,8 +110,4 @@ self.actionDisplayAllBranches.setText(QtGui.QApplication.translate("MainWindow", "displayAllBranches", None, QtGui.QApplication.UnicodeUTF8))
self.actionHelp.setText(QtGui.QApplication.translate("MainWindow", "Help", None, QtGui.QApplication.UnicodeUTF8))
-from changeset import RevDisplay, RevMessage
-from filelistview import HgFileListView
-from fileview import HgFileView
-from repoview import HgRepoView
import workbench_rc
|
Loading...