by
Changes to 5 files · Browse files at cb60f632d185 Showing diff from parent 4582ce8cabac ef7cc78eb71a Diff from another changeset...
@@ -1,6 +1,6 @@ [py2exe]
excludes=pywin, pywin.dialogs, pywin.dialogs.list
-includes=cairo, pango, pangocairo, atk, gobject, dbhash, gtk.keysyms, gio
+includes=cairo, pango, pangocairo, atk, gobject, dbhash, gtk.keysyms, gio, sip
packages=ctypes, email, hgext, hgext.convert, encodings, tortoisehg.hgtk, tortoisehg.hgtk.logview, tortoisehg.util, iniparse, pygments, dulwich
dll_excludes=iconv.dll, intl.dll, libatk-1.0-0.dll, libgdk_pixbuf-2.0-0.dll, libgdk-win32-2.0-0.dll, libglib-2.0-0.dll, libgmodule-2.0-0.dll, libgobject-2.0-0.dll, libgthread-2.0-0.dll, libgtk-win32-2.0-0.dll, libpango-1.0-0.dll, libpangowin32-1.0-0.dll, libcairo-2.dll, libglade-2.0-0.dll, libpangocairo-1.0-0.dll, libpangoft2-1.0-0.dll, libgio-2.0-0.dll, mswsock.dll, powrprof.dll, shfolder.dll, credui.dll, msvcp60.dll, secur32.dll
|
@@ -25,6 +25,7 @@ import pygtk
pygtk.require('2.0')
import gtk
+import PyQt4
from mercurial import demandimport
demandimport.ignore.append('win32com.shell')
@@ -36,7 +37,7 @@import traceback
try:
- import tortoisehg.hgtk.hgtk
+ import tortoisehg.hgqt.hgtk
except ImportError:
sys.stderr.write("abort: couldn't find hgtk libraries in [%s]\n" %
';'.join(sys.path))
@@ -52,21 +53,21 @@ sys.exit(1)
if not capt or 'THGDEBUG' in os.environ or '--profile' in sys.argv:
- sys.exit(tortoisehg.hgtk.hgtk.dispatch(sys.argv[1:]))
+ sys.exit(tortoisehg.hgqt.hgtk.dispatch(sys.argv[1:]))
else:
mystderr = cStringIO.StringIO()
origstderr = sys.stderr
sys.stderr = mystderr
ret = 0
try:
- ret = tortoisehg.hgtk.hgtk.dispatch(sys.argv[1:])
+ ret = tortoisehg.hgqt.hgtk.dispatch(sys.argv[1:])
sys.stderr = origstderr
mystderr.seek(0)
for l in mystderr.readlines():
if l.startswith('Traceback') or l.startswith('TypeError') or \
l.startswith('NameError'):
from tortoisehg.hgtk.bugreport import run
- from tortoisehg.hgtk.hgtk import gtkrun
+ from tortoisehg.hgqt.hgtk import gtkrun
error = 'Recoverable runtime error (stderr):\n'
error += mystderr.getvalue()
opts = {}
|
@@ -57,6 +57,7 @@ _scripts = []
_data_files = []
_packages = ['tortoisehg.hgtk', 'tortoisehg.hgtk.logview',
+ 'tortoisehg.hgqt',
'tortoisehg.util', 'tortoisehg']
extra = {}
hgextmods = []
|
Change 1 of 1
Show Entire File
tortoisehg/hgqt/hgtk.py
Stacked
copied from tortoisehg/hgtk/hgtk.py
|
||
---|---|---|
@@ -394,8 +394,12 @@
def shellconfig(ui, *pats, **opts):
"""Explorer extension configuration editor"""
- from tortoisehg.hgtk.shellconf import run
- gtkrun(run, ui, *pats, **opts)
+ from PyQt4 import QtGui
+ from tortoisehg.hgqt.shellconf import ShellConfigWindow
+ app = QtGui.QApplication(sys.argv)
+ form = ShellConfigWindow()
+ form.show()
+ app.exec_()
def rename(ui, *pats, **opts):
"""rename a single file or directory"""
|
|
|
@@ -0,0 +1,290 @@ + # shellconf.py - User interface for the TortoiseHg shell extension settings
+#
+# Copyright 2009 Steve Borho <steve@borho.org>
+# 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 sys
+
+from PyQt4 import QtCore, QtGui
+from PyQt4.QtCore import SIGNAL, SLOT
+
+from tortoisehg.util.i18n import _
+from tortoisehg.util import menuthg
+
+from _winreg import (HKEY_CURRENT_USER, REG_SZ, REG_DWORD,
+ OpenKey, CreateKey, QueryValueEx, SetValueEx)
+
+THGKEY = 'TortoiseHg'
+OVLKEY = 'TortoiseOverlays'
+PROMOTEDITEMS = 'PromotedItems'
+
+# reading functions
+def is_true(x): return x in ('1', 'True')
+def nonzero(x): return x != 0
+
+# writing functions
+def one_str(x):
+ if x: return '1'
+ return '0'
+def one_int(x):
+ if x: return 1
+ return 0
+
+def noop(x): return x
+
+vars = {
+ # name:
+ # default, regkey, regtype, evalfunc, wrfunc, checkbuttonattribute
+ 'EnableOverlays':
+ [True, THGKEY, REG_SZ, is_true, one_str, 'ovenable'],
+ 'LocalDisksOnly':
+ [False, THGKEY, REG_SZ, is_true, one_str, 'localonly'],
+ 'ShowTaskbarIcon':
+ [True, THGKEY, REG_SZ, is_true, one_str, 'show_taskbaricon'],
+ 'HighlightTaskbarIcon':
+ [True, THGKEY, REG_SZ, is_true, one_str, 'highlight_taskbaricon'],
+ PROMOTEDITEMS:
+ ['commit', THGKEY, REG_SZ, noop, noop, None],
+ 'ShowUnversionedOverlay':
+ [True, OVLKEY, REG_DWORD, nonzero, one_int, 'enableUnversionedHandler'],
+ 'ShowIgnoredOverlay':
+ [True, OVLKEY, REG_DWORD, nonzero, one_int, 'enableIgnoredHandler'],
+ 'ShowLockedOverlay':
+ [True, OVLKEY, REG_DWORD, nonzero, one_int, 'enableLockedHandler'],
+ 'ShowReadonlyOverlay':
+ [True, OVLKEY, REG_DWORD, nonzero, one_int, 'enableReadonlyHandler'],
+ 'ShowDeletedOverlay':
+ [True, OVLKEY, REG_DWORD, nonzero, one_int, 'enableDeletedHandler'],
+ 'ShowAddedOverlay':
+ [True, OVLKEY, REG_DWORD, nonzero, one_int, 'enableAddedHandler']
+}
+
+
+class ShellConfigWindow(QtGui.QDialog):
+
+ def __init__(self, parent=None):
+ super(ShellConfigWindow, self).__init__(parent)
+
+ self.menu_cmds = {}
+ self.dirty = False
+
+ layout = QtGui.QVBoxLayout()
+
+ tw = QtGui.QTabWidget()
+ layout.addWidget(tw)
+
+ # cmenu tab
+ cmenuwidget = QtGui.QWidget()
+ grid = QtGui.QGridLayout()
+ cmenuwidget.setLayout(grid)
+ tw.addTab(cmenuwidget, _("Contex Menu"))
+
+ w = QtGui.QLabel(_("Top menu items:"))
+ grid.addWidget(w, 0, 0)
+ self.topmenulist = w = QtGui.QListWidget()
+ grid.addWidget(w, 1, 0, 4, 1)
+ self.connect(w, SIGNAL("itemClicked(QListWidgetItem*)"),
+ self.listItemClicked)
+
+ w = QtGui.QLabel(_("Sub menu items:"))
+ grid.addWidget(w, 0, 2)
+ self.submenulist = w = QtGui.QListWidget()
+ grid.addWidget(w, 1, 2, 4, 1)
+ self.connect(w, SIGNAL("itemClicked(QListWidgetItem*)"),
+ self.listItemClicked)
+
+ style = QtGui.QApplication.style()
+ icon = style.standardIcon(QtGui.QStyle.SP_ArrowLeft)
+ self.top_button = w = QtGui.QPushButton(icon, '')
+ grid.addWidget(w, 2, 1)
+ self.connect(w, SIGNAL("clicked()"), self.top_clicked)
+ icon = style.standardIcon(QtGui.QStyle.SP_ArrowRight)
+ self.sub_button = w = QtGui.QPushButton(icon, '')
+ grid.addWidget(w, 3, 1)
+ self.connect(w, SIGNAL("clicked()"), self.sub_clicked)
+
+ grid.setRowStretch(1, 10)
+ grid.setRowStretch(4, 10)
+
+ # Icons tab
+ iconswidget = QtGui.QWidget()
+ iconslayout = QtGui.QVBoxLayout()
+ iconswidget.setLayout(iconslayout)
+ tw.addTab(iconswidget, _("Icons"))
+
+ def checkbox(label):
+ cb = QtGui.QCheckBox(label)
+ self.connect(cb, SIGNAL("stateChanged(int)"), self.stateChanged)
+ return cb
+
+ # Overlays group
+ gbox = QtGui.QGroupBox(_("Overlays"))
+ iconslayout.addWidget(gbox)
+ hb = QtGui.QHBoxLayout()
+ gbox.setLayout(hb)
+ self.ovenable = cb = checkbox(_("Enabled overlays"))
+ hb.addWidget(cb)
+ self.localonly = checkbox(_("Local disks only"))
+ hb.addWidget(self.localonly)
+ hb.addStretch()
+
+ # Enabled Overlay Handlers group
+ gbox = QtGui.QGroupBox(_("Enabled Overlay Handlers"))
+ iconslayout.addWidget(gbox)
+ grid = QtGui.QGridLayout()
+ gbox.setLayout(grid)
+ grid.setColumnStretch(3, 10)
+ w = QtGui.QLabel(_("Warning: affects all Tortoises, logoff required after change"))
+ grid.addWidget(w, 0, 0, 1, 3)
+ self.enableAddedHandler = w = checkbox(_("Added"))
+ grid.addWidget(w, 1, 0)
+ self.enableLockedHandler = w = checkbox(_("Locked*"))
+ grid.addWidget(w, 1, 1)
+ self.enableIgnoredHandler = w = checkbox(_("Ignored*"))
+ grid.addWidget(w, 1, 2)
+ self.enableUnversionedHandler = w = checkbox(_("Unversioned"))
+ grid.addWidget(w, 2, 0)
+ self.enableReadonlyHandler = w = checkbox(_("Readonly*"))
+ grid.addWidget(w, 2, 1)
+ self.enableDeletedHandler = w = checkbox(_("Deleted*"))
+ grid.addWidget(w, 2, 2)
+ w = QtGui.QLabel(_("*: not used by TortoiseHg"))
+ grid.addWidget(w, 3, 0, 1, 3)
+
+ # Taskbar group
+ gbox = QtGui.QGroupBox(_("Taskbar"))
+ iconslayout.addWidget(gbox)
+ hb = QtGui.QHBoxLayout()
+ gbox.setLayout(hb)
+ self.show_taskbaricon = cb = checkbox(_("Show Icon"))
+ hb.addWidget(cb)
+ self.highlight_taskbaricon = cb = checkbox(_("Highlight Icon"))
+ hb.addWidget(cb)
+ hb.addStretch()
+
+ iconslayout.addStretch()
+
+ # dialog buttons
+ BB = QtGui.QDialogButtonBox
+ bb = QtGui.QDialogButtonBox(BB.Ok|BB.Cancel|BB.Apply)
+ self.apply_button = bb.button(BB.Apply)
+ self.connect(bb, SIGNAL("accepted()"), self, SLOT("accept()"))
+ self.connect(bb, SIGNAL("rejected()"), self, SLOT("reject()"))
+ self.connect(bb.button(BB.Apply), SIGNAL("clicked()"), self.apply)
+ bb.button(BB.Ok).setDefault(True)
+ layout.addWidget(bb)
+
+ self.setLayout(layout)
+ self.setWindowTitle(_("TortoiseHg Shell Configuration"))
+
+ self.load_shell_configs()
+
+ def load_shell_configs(self):
+ for name, info in vars.iteritems():
+ default, regkey, regtype, evalfunc, wrfunc, cbattr = info
+ try:
+ hkey = OpenKey(HKEY_CURRENT_USER, 'Software\\' + regkey)
+ v = QueryValueEx(hkey, name)[0]
+ vars[name][0] = evalfunc(v)
+ except (WindowsError, EnvironmentError):
+ pass
+ if cbattr != None:
+ checkbutton = getattr(self, cbattr)
+ checkbutton.setChecked(vars[name][0])
+
+ promoteditems = vars[PROMOTEDITEMS][0]
+ self.set_menulists(promoteditems)
+
+ self.dirty = False
+ self.update_states()
+
+ def set_menulists(self, promoteditems):
+ for list in (self.topmenulist, self.submenulist):
+ list.clear()
+ list.setSortingEnabled(True)
+ promoted = [pi.strip() for pi in promoteditems.split(',')]
+ for cmd, info in menuthg.thgcmenu.items():
+ label = info['label']['str']
+ self.menu_cmds[label] = cmd
+ if cmd in promoted:
+ self.topmenulist.addItem(label)
+ else:
+ self.submenulist.addItem(label)
+
+ def store_shell_configs(self):
+ if not self.dirty:
+ return
+
+ promoted = []
+ list = self.topmenulist
+ for row in range(list.count()):
+ label = str(list.item(row).text())
+ cmd = self.menu_cmds[label]
+ promoted.append(cmd)
+
+ hkey = CreateKey(HKEY_CURRENT_USER, "Software\\" + THGKEY)
+ SetValueEx(hkey, PROMOTEDITEMS, 0, REG_SZ, ','.join(promoted))
+
+ for name, info in vars.iteritems():
+ default, regkey, regtype, evalfunc, wrfunc, cbattr = info
+ if cbattr == None:
+ continue
+ checkbutton = getattr(self, cbattr)
+ v = wrfunc(checkbutton.isChecked())
+ hkey = CreateKey(HKEY_CURRENT_USER, 'Software\\' + regkey)
+ SetValueEx(hkey, name, 0, regtype, v)
+
+ self.dirty = False
+ self.update_states()
+
+ def accept(self):
+ self.store_shell_configs()
+ QtGui.QDialog.accept(self)
+
+ def reject(self):
+ QtGui.QDialog.reject(self)
+
+ def apply(self):
+ self.store_shell_configs()
+
+ def top_clicked(self):
+ self.move_selected(self.submenulist, self.topmenulist)
+
+ def sub_clicked(self):
+ self.move_selected(self.topmenulist, self.submenulist)
+
+ def move_selected(self, fromlist, tolist):
+ row = fromlist.currentRow()
+ if row < 0:
+ return
+ item = fromlist.takeItem(row)
+ tolist.addItem(item)
+ tolist.setCurrentItem(item)
+ fromlist.setCurrentItem(None)
+ self.dirty = True
+ self.update_states()
+
+ def update_states(self):
+ self.top_button.setEnabled(len(self.submenulist.selectedItems()) > 0)
+ self.sub_button.setEnabled(len(self.topmenulist.selectedItems()) > 0)
+ self.apply_button.setEnabled(self.dirty)
+
+ def stateChanged(self, state):
+ self.dirty = True
+ self.update_states()
+
+ def listItemClicked(self, item):
+ itemlist = item.listWidget()
+ for list in (self.topmenulist, self.submenulist):
+ if list != itemlist:
+ list.setCurrentItem(None)
+ self.update_states()
+
+if __name__ == "__main__":
+ app = QtGui.QApplication(sys.argv)
+ form = ShellConfigWindow()
+ form.show()
+ app.exec_()
|
Loading...