|
# reporegistry.py - registry for a user's repositories
#
# Copyright 2010 Adrian Buehlmann <adrian@cadifra.com>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
import os
from mercurial import url
from tortoisehg.hgqt.i18n import _
from tortoisehg.hgqt import cmdui, qtlib
from tortoisehg.hgqt.repotreemodel import RepoTreeModel
from tortoisehg.hgqt.pathedit import PathEditDialog
from PyQt4.QtCore import *
from PyQt4.QtGui import *
connect = QObject.connect
def settingsfilename():
s = QSettings()
dir = os.path.dirname(str(s.fileName()))
return dir + '/' + 'thg-reporegistry.xml'
class RepoTreeView(QTreeView):
def __init__(self, parent, workbench):
QTreeView.__init__(self)
self.parent = parent
self.workbench = workbench
self.selitem = None
self.msg = ''
self.setExpandsOnDoubleClick(False)
self.setMouseTracking(True)
# enable drag and drop
# (see http://doc.qt.nokia.com/4.6/model-view-dnd.html)
self.setDragEnabled(True)
self.setAcceptDrops(True)
self.setDragDropMode(QAbstractItemView.DragDrop)
self.setDropIndicatorShown(True)
self.createActions()
def contextMenuEvent(self, event):
menulist = self.selitem.internalPointer().menulist()
if len(menulist) > 0:
menu = QMenu(self)
for act in menulist:
if act:
menu.addAction(self._actions[act])
else:
menu.addSeparator()
menu.exec_(event.globalPos())
def mouseMoveEvent(self, event):
self.msg = ''
pos = event.pos()
idx = self.indexAt(pos)
if idx.isValid():
item = idx.internalPointer()
self.msg = item.details()
self.workbench.showMessage(self.msg)
super(RepoTreeView, self).mouseMoveEvent(event)
def leaveEvent(self, event):
if self.msg != '':
self.workbench.showMessage('')
def mouseDoubleClickEvent(self, event):
self.open()
def selectionChanged(self, selected, deselected):
selection = self.selectedIndexes()
if len(selection) == 0:
self.selitem = None
else:
self.selitem = selection[0]
def _action_defs(self):
a = [("open", _("Open"), None,
_("Opens the repository in a new tab"), None, self.open),
("newGroup", _("New Group"), None,
_("Create a new group"), None, self.newGroup),
("rename", _("Rename"), None,
_("Rename the entry"), None, self.startRename),
("settings", _("Settings"), None,
_("View the repository's settings"), None, self.startSettings),
("remove", _("Delete"), None,
_("Delete the node and all its subnodes"), None, self.removeSelected),
("pull", _("Pull"), None,
_("Pull from remote"), None, self.pull),
("editpath", _("Edit URL"), None,
_("Edit Repository URL"), None, self.editPath),
]
return a
def createActions(self):
self._actions = {}
for name, desc, icon, tip, key, cb in self._action_defs():
self._actions[name] = QAction(desc, self)
QTimer.singleShot(0, self.configureActions)
def configureActions(self):
for name, desc, icon, tip, key, cb in self._action_defs():
act = self._actions[name]
'''
if icon:
act.setIcon(qtlib.geticon(icon))
'''
if tip:
act.setStatusTip(tip)
if key:
act.setShortcut(key)
if cb:
connect(act, SIGNAL('triggered()'), cb)
self.addAction(act)
def startSettings(self):
if not self.selitem:
return
self.selitem.internalPointer().startSettings(self.parent)
def startRename(self):
if not self.selitem:
return
self.edit(self.selitem)
def open(self):
if not self.selitem:
return
self.selitem.internalPointer().open()
def pull(self):
if not self.selitem:
return
pathitem = self.selitem.internalPointer()
url_ = pathitem.url()
reporoot = pathitem.parent().parent().rootpath()
def finished():
self.workbench.reloadRepository(reporoot)
args = ['pull', '-R', reporoot, url_]
cmd = cmdui.Dialog(args, parent=self, finishfunc=finished)
what = _('Pulling from %s') % url.hidepassword(url_)
self.workbench.showMessage(what)
cmd.setWindowTitle(what)
cmd.show_output(False)
cmd.exec_()
def editPath(self):
if not self.selitem:
return
pathitem = self.selitem.internalPointer()
d = PathEditDialog(self, pathitem.alias(), pathitem.url())
d.show()
if d.exec_():
pathitem.setUrl(d.url())
i = self.selitem
self.model().dataChanged.emit(i, i)
def newGroup(self):
m = self.model()
m.addGroup(_('New Group'))
def removeSelected(self):
if not self.selitem:
return
labels = [(QMessageBox.Yes, _('&Delete')),
(QMessageBox.No, _('Cancel'))]
if not qtlib.QuestionMsgBox(_('Confirm Delete'),
_('Delete the node and all its children?'),
labels=labels, parent=self):
return
m = self.model()
s = self.selitem
row = s.row()
parent = s.parent()
m.removeRows(row, 1, parent)
class RepoRegistryView(QDockWidget):
openRepoSignal = pyqtSignal(QString)
visibilityChanged = pyqtSignal(bool)
def __init__(self, ui, workbench):
QDockWidget.__init__(self, workbench)
self.setFeatures(QDockWidget.DockWidgetClosable |
QDockWidget.DockWidgetMovable |
QDockWidget.DockWidgetFloatable)
self.setWindowTitle(_('Repository Registry'))
mainframe = QFrame()
lay = QVBoxLayout()
lay.setContentsMargins(0, 0, 0, 0)
mainframe.setLayout(lay)
self.setWidget(mainframe)
self.tmodel = m = RepoTreeModel(self.openrepo, ui, settingsfilename())
self.tview = tv = RepoTreeView(self, workbench)
lay.addWidget(tv)
tv.setModel(m)
tv.setIndentation(10)
tv.setFirstColumnSpanned(0, QModelIndex(), True)
self.tview.setColumnHidden(1, True)
QTimer.singleShot(0, self.expand)
def expand(self):
self.tview.expandToDepth(0)
def addRepo(self, reporoot):
m = self.tmodel
if m.getRepoItem(reporoot) == None:
m.addRepo(reporoot)
def openrepo(self, path):
self.openRepoSignal.emit(path)
def showPaths(self, show):
self.tview.setColumnHidden(1, not show)
if show:
self.tview.resizeColumnToContents(0)
self.tview.resizeColumnToContents(1)
def close(self):
self.tmodel.write(settingsfilename())
def showEvent(self, event):
self.visibilityChanged.emit(True)
def hideEvent(self, event):
self.visibilityChanged.emit(False)
|
Loading...