Changeset 12da60da0b10…
Parent e7e80b1e5ca3…
by
Changes to 7 files · Browse files at 12da60da0b10 Showing diff from parent e7e80b1e5ca3 Diff from another changeset...
@@ -154,6 +154,32 @@ hglib.tounicode(str(e))))
return False
+_user_shell = None
+def openshell(root):
+ global _user_shell
+ if _user_shell:
+ cwd = os.getcwd()
+ try:
+ os.chdir(repo.root)
+ QProcess.startDetached(_user_shell)
+ finally:
+ os.chdir(cwd)
+ else:
+ InfoMsgBox(_('No shell configured'),
+ _('A terminal shell must be configured'))
+
+def configureshell(ui):
+ global _user_shell
+ _user_shell = ui.config('tortoisehg', 'shell')
+ if _user_shell:
+ return
+ if sys.platform == 'darwin':
+ return # Terminal.App does not support open-to-folder
+ elif os.name == 'nt':
+ _user_shell = 'cmd.exe'
+ else:
+ _user_shell = 'xterm'
+
# _styles maps from ui labels to effects
# _effects maps an effect to font style properties. We define a limited
# set of _effects, since we convert color effect names to font style
@@ -184,6 +210,8 @@thgstylesheet = '* { white-space: pre; font-family: monospace; font-size: 9pt; }'
def configstyles(ui):
+ configureshell(ui)
+
# extensions may provide more labels and default effects
for name, ext in extensions.extensions():
_styles.update(getattr(ext, 'colortable', {}))
|
|
|
@@ -9,9 +9,7 @@
from tortoisehg.util import hglib
from tortoisehg.hgqt.i18n import _
-from tortoisehg.hgqt import qtlib, thgrepo
-from tortoisehg.hgqt.repotreemodel import RepoTreeModel
-from tortoisehg.hgqt.clone import CloneDialog
+from tortoisehg.hgqt import qtlib, repotreemodel, clone, settings
from PyQt4.QtCore import *
from PyQt4.QtGui import *
@@ -24,12 +22,13 @@
class RepoTreeView(QTreeView):
+ showMessage = pyqtSignal(QString)
+ openRepo = pyqtSignal(QString, bool)
contextmenu = None
- def __init__(self, parent, workbench):
+ def __init__(self, parent):
QTreeView.__init__(self, parent, allColumnsShowFocus=True)
- self.workbench = workbench
self.selitem = None
self.msg = ''
@@ -72,7 +71,7 @@ if idx.isValid():
item = idx.internalPointer()
self.msg = item.details()
- self.workbench.showMessage(self.msg)
+ self.showMessage.emit(self.msg)
super(RepoTreeView, self).mouseMoveEvent(event)
def keyPressEvent(self, event):
@@ -80,9 +79,10 @@ self.showFirstTabOrOpen()
else:
super(RepoTreeView, self).keyPressEvent(event)
+
def leaveEvent(self, event):
if self.msg != '':
- self.workbench.showMessage('')
+ self.showMessage.emit('')
def mouseDoubleClickEvent(self, event):
if self.selitem and self.selitem.internalPointer().details():
@@ -145,27 +145,34 @@ def startSettings(self):
if not self.selitem:
return
- self.selitem.internalPointer().startSettings(self.parent())
+ root = self.selitem.internalPointer().rootpath()
+ sd = settings.SettingsDialog(configrepo=True, focus='web.name',
+ parent=self, root=root)
+ sd.exec_()
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 openAll(self):
if not self.selitem:
return
self.selitem.internalPointer().openAll()
- def showFirstTabOrOpen(self):
+ def open(self):
+ 'open context menu action, open repowidget unconditionally'
if not self.selitem:
return
- self.selitem.internalPointer().showFirstTabOrOpen(workbench=self.workbench)
+ root = self.selitem.internalPointer().rootpath()
+ self.openRepo.emit(hglib.tounicode(root), False)
+
+ def showFirstTabOrOpen(self):
+ 'Enter or double click events, show existing or open a new repowidget'
+ if not self.selitem:
+ return
+ root = self.selitem.internalPointer().rootpath()
+ self.openRepo.emit(hglib.tounicode(root), True)
def newGroup(self):
m = self.model()
@@ -187,23 +194,22 @@ if not self.selitem:
return
root = self.selitem.internalPointer().rootpath()
- d = CloneDialog(args=[root, root + '-clone'], parent=self)
+ d = clone.CloneDialog(args=[root, root + '-clone'], parent=self)
d.finished.connect(d.deleteLater)
- d.clonedRepository.connect(self.workbench.showRepo)
+ d.clonedRepository.connect(self.open)
d.show()
def explore(self):
if not self.selitem:
return
root = self.selitem.internalPointer().rootpath()
- self.workbench.launchExplorer(root)
+ QDesktopServices.openUrl(QUrl.fromLocalFile(root))
def terminal(self):
if not self.selitem:
return
root = self.selitem.internalPointer().rootpath()
- repo = thgrepo.repository(path=root)
- self.workbench.launchTerminal(repo)
+ qtlib.openshell(root)
def addRepo(self):
if not self.selitem:
@@ -218,10 +224,11 @@
class RepoRegistryView(QDockWidget):
+ showMessage = pyqtSignal(QString)
openRepoSignal = pyqtSignal(QString, bool)
- def __init__(self, workbench):
- QDockWidget.__init__(self, workbench)
+ def __init__(self, parent):
+ QDockWidget.__init__(self, parent)
self.setFeatures(QDockWidget.DockWidgetClosable |
QDockWidget.DockWidgetMovable |
@@ -234,15 +241,15 @@ mainframe.setLayout(lay)
self.setWidget(mainframe)
- self.tmodel = m = RepoTreeModel(self.openrepo, settingsfilename(),
- parent=self)
-
- self.tview = tv = RepoTreeView(self, workbench)
+ self.tmodel = m = repotreemodel.RepoTreeModel(settingsfilename(), self)
+ self.tview = tv = RepoTreeView(self)
+ tv.setModel(m)
lay.addWidget(tv)
- tv.setModel(m)
tv.setIndentation(10)
tv.setFirstColumnSpanned(0, QModelIndex(), True)
+ tv.openRepo.connect(self.openRepo)
+ tv.showMessage.connect(self.showMessage)
self.tview.setColumnHidden(1, True)
QTimer.singleShot(0, self.expand)
@@ -258,8 +265,8 @@ else:
it.ensureRepoLoaded()
- def openrepo(self, path, reuse=False):
- self.openRepoSignal.emit(hglib.tounicode(path), reuse)
+ def openRepo(self, path, reuse=False):
+ self.openRepoSignal.emit(path, reuse)
def showPaths(self, show):
self.tview.setColumnHidden(1, not show)
|
@@ -60,11 +60,10 @@ yield undumpObject(xr, model)
class RepoTreeModel(QAbstractItemModel):
- def __init__(self, openrepofunc, filename=None, parent=None):
+
+ def __init__(self, filename, parent):
QAbstractItemModel.__init__(self, parent)
- self.openrepofunc = openrepofunc
-
root = None
all = None
|
@@ -370,7 +370,8 @@ 'See <a href="%s">OpenAtLine</a>'
% 'http://bitbucket.org/tortoisehg/thg/wiki/OpenAtLine')),
_fi(_('Shell'), 'tortoisehg.shell', genEditCombo,
- _('Specify your preferred terminal shell application')),
+ _('Specify your preferred terminal shell application'),
+ globalonly=True),
_fi(_('Immediate Operations'), 'tortoisehg.immediate', genEditCombo,
_('Space separated list of shell operations you would like '
'to be performed immediately, without user interaction. '
|
@@ -518,20 +518,8 @@ qtlib.InfoMsgBox(_('Repository not local'),
_('A terminal shell cannot be opened for remote'))
return
- shell = self.repo.shell()
- if shell:
- cwd = os.getcwd()
- try:
- os.chdir(folder)
- QProcess.startDetached(shell)
- except EnvironmentError, e:
- qtlib.InfoMsgBox(_('Repository not found'),
- hglib.tounicode(str(e)))
- finally:
- os.chdir(cwd)
- else:
- qtlib.InfoMsgBox(_('No shell configured'),
- _('A terminal shell must be configured'))
+ qtlib.openshell(folder)
+
def removeurl(self):
if qtlib.QuestionMsgBox(_('Confirm path delete'),
_('Delete %s from your repo configuration file?') % self.menualias,
|
@@ -249,7 +249,7 @@ except (EnvironmentError, ValueError):
pass
-_uiprops = '''_uifiles _uimtime _shell postpull tabwidth maxdiff
+_uiprops = '''_uifiles _uimtime postpull tabwidth maxdiff
deadbranches _exts _thghiddentags displayname summarylen
shortname mergetools namedbranches'''.split()
@@ -324,18 +324,6 @@ return n
@propertycache
- def _shell(self):
- s = self.ui.config('tortoisehg', 'shell')
- if s:
- return s
- if sys.platform == 'darwin':
- return None # Terminal.App does not support open-to-folder
- elif os.name == 'nt':
- return 'cmd.exe'
- else:
- return 'xterm'
-
- @propertycache
def _uifiles(self):
cfg = self.ui._ucfg
files = set()
@@ -459,10 +447,6 @@ heads.extend(nodes)
return heads
- def shell(self):
- 'Returns terminal shell configured for this repo'
- return self._shell
-
def uifiles(self):
'Returns latest mtime and complete list of config files'
return self._uimtime, self._uifiles
|
|
|
@@ -46,6 +46,8 @@
self.reporegistry = rr = RepoRegistryView(self)
rr.setObjectName('RepoRegistryView')
+ rr.showMessage.connect(self.showMessage)
+ rr.openRepoSignal.connect(self.openRepo)
rr.hide()
self.addDockWidget(Qt.LeftDockWidgetArea, rr)
@@ -57,8 +59,6 @@
self._setupActions()
- rr.openRepoSignal.connect(self.openRepo)
-
self.repoTabChanged()
self.restoreSettings()
self.setAcceptDrops(True)
@@ -335,11 +335,11 @@ if rw:
rw.switchToNamedTaskTab(str(action.data().toString()))
- def openRepo(self, repopath, reuse=False):
- """ Open repo by openRepoSignal from reporegistry """
- if isinstance(repopath, (unicode, QString)): # as Qt slot
- repopath = hglib.fromunicode(repopath)
- self._openRepo(path=repopath, reuse=reuse)
+ @pyqtSlot(QString, bool)
+ def openRepo(self, root, reuse):
+ """ Open repo by openRepoSignal from reporegistry [unicode] """
+ root = hglib.fromunicode(root)
+ self._openRepo(root, reuse)
@pyqtSlot(QString)
def openLinkedRepo(self, path):
@@ -349,13 +349,15 @@ rw.taskTabsWidget.setCurrentIndex(rw.commitTabIndex)
@pyqtSlot(QString)
- def showRepo(self, path):
+ def showRepo(self, root):
"""Activate the repo tab or open it if not available [unicode]"""
+ root = hglib.fromunicode(root)
for i in xrange(self.repoTabsWidget.count()):
w = self.repoTabsWidget.widget(i)
- if hglib.tounicode(w.repo.root) == path:
- return self.repoTabsWidget.setCurrentIndex(i)
- self.openRepo(path)
+ if hglib.tounicode(w.repo.root) == root:
+ self.repoTabsWidget.setCurrentIndex(i)
+ return
+ self._openRepo(root, False)
@pyqtSlot(unicode, QString)
def setRevsetFilter(self, path, filter):
@@ -553,7 +555,7 @@ dlg.finished.connect(dlg.deleteLater)
if dlg.exec_():
path = dlg.getPath()
- self.openRepo(path)
+ self._openRepo(path, False)
def cloneRepository(self):
""" Run clone dialog """
@@ -581,25 +583,22 @@ FD = QFileDialog
path = FD.getExistingDirectory(self, caption, cwd,
FD.ShowDirsOnly | FD.ReadOnly)
- self._openRepo(path=hglib.fromunicode(path))
+ self._openRepo(hglib.fromunicode(path), False)
- def _openRepo(self, path, reuse=False):
- if path and not path.startswith('ssh://'):
+ def _openRepo(self, root, reuse):
+ if root and not root.startswith('ssh://'):
if reuse:
- for rw in self._findrepowidget(path):
+ for rw in self._findrepowidget(root):
+ self.repoTabsWidget.setCurrentWidget(rw)
return
try:
- repo = thgrepo.repository(path=path)
+ repo = thgrepo.repository(path=root)
self.addRepoTab(repo)
except RepoError:
- upath = hglib.tounicode(path)
+ upath = hglib.tounicode(root)
qtlib.WarningMsgBox(_('Failed to open repository'),
_('%s is not a valid repository') % upath)
- def goto(self, root, rev):
- for rw in self._findrepowidget(root):
- rw.goto(rev)
-
def _findrepowidget(self, root):
"""Iterates RepoWidget for the specified root"""
tw = self.repoTabsWidget
@@ -642,7 +641,7 @@ save = s.value(wb + 'saveRepos').toBool()
self.actionSaveRepos.setChecked(save)
for path in hglib.fromunicode(s.value(wb + 'openrepos').toString()).split(','):
- self._openRepo(path)
+ self._openRepo(path, False)
# Allow repo registry to assemble itself before toggling path state
sp = s.value(wb + 'showPaths').toBool()
QTimer.singleShot(0, lambda: self.actionShowPaths.setChecked(sp))
@@ -673,29 +672,12 @@ def explore(self):
w = self.repoTabsWidget.currentWidget()
if w:
- self.launchExplorer(w.repo.root)
+ QDesktopServices.openUrl(QUrl.fromLocalFile(w.repo.root))
def terminal(self):
w = self.repoTabsWidget.currentWidget()
if w:
- self.launchTerminal(w.repo)
-
- def launchExplorer(self, root):
- """open Windows Explorer at the repo root"""
- QDesktopServices.openUrl(QUrl.fromLocalFile(root))
-
- def launchTerminal(self, repo):
- shell = repo.shell()
- if shell:
- cwd = os.getcwd()
- try:
- os.chdir(repo.root)
- QProcess.startDetached(shell)
- finally:
- os.chdir(cwd)
- else:
- qtlib.InfoMsgBox(_('No shell configured'),
- _('A terminal shell must be configured'))
+ qtlib.openshell(w.repo.root)
def editSettings(self):
tw = self.repoTabsWidget
|
Loading...