You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
325 lines
10 KiB
325 lines
10 KiB
#!/usr/bin/env python
|
|
#
|
|
# 2005-02-12 initial version hp
|
|
|
|
from __future__ import print_function
|
|
import os
|
|
import pickle
|
|
from PyTQt.tqt import *
|
|
from dirview import Directory, DirectoryView
|
|
|
|
bookmarks = [
|
|
"22 14 8 1",
|
|
"# c #000080",
|
|
"a c #585858",
|
|
"b c #000000",
|
|
"c c #ffffff",
|
|
"d c #ffffff",
|
|
"e c #ffffff",
|
|
"f c #000000",
|
|
". c None",
|
|
"...bb.................",
|
|
"..bacb....bbb.........",
|
|
"..badcb.bbccbab.......",
|
|
"..bacccbadccbab.......",
|
|
"..baecdbcccdbab.......",
|
|
"..bacccbacccbab.......",
|
|
"..badcdbcecdfab.......",
|
|
"..bacecbacccbab.......",
|
|
"..baccdbcccdbab.......",
|
|
"...badcbacdbbab.......",
|
|
"....bacbcbbccab.......",
|
|
".....babbaaaaab.......",
|
|
".....bbabbbbbbb.......",
|
|
"......bb.............."
|
|
]
|
|
|
|
home = [
|
|
"16 15 4 1",
|
|
"# c #000000",
|
|
"a c #ffffff",
|
|
"b c #c0c0c0",
|
|
". c None",
|
|
".......##.......",
|
|
"..#...####......",
|
|
"..#..#aabb#.....",
|
|
"..#.#aaaabb#....",
|
|
"..##aaaaaabb#...",
|
|
"..#aaaaaaaabb#..",
|
|
".#aaaaaaaaabbb#.",
|
|
"###aaaaaaaabb###",
|
|
"..#aaaaaaaabb#..",
|
|
"..#aaa###aabb#..",
|
|
"..#aaa#.#aabb#..",
|
|
"..#aaa#.#aabb#..",
|
|
"..#aaa#.#aabb#..",
|
|
"..#aaa#.#aabb#..",
|
|
"..#####.######.."
|
|
]
|
|
|
|
|
|
class PixmapView(TQScrollView):
|
|
def __init__(self, parent):
|
|
TQScrollView.__init__(self, parent)
|
|
self.pixmap = None
|
|
self.viewport().setBackgroundMode(self.PaletteBase)
|
|
|
|
def setPixmap(self, pix):
|
|
self.pixmap = pix
|
|
self.resizeContents(pix.size().width(), pix.size().height())
|
|
self.viewport().repaint(False)
|
|
|
|
def drawContents(self, p, cx, cy, cw, ch):
|
|
p.fillRect(cx, cy, cw, ch, self.colorGroup().brush(TQColorGroup.Base))
|
|
p.drawPixmap(0, 0, self.pixmap)
|
|
|
|
|
|
class Preview(TQWidgetStack):
|
|
def __init__(self, parent):
|
|
TQWidgetStack.__init__(self, parent)
|
|
self.normalText = TQMultiLineEdit(self)
|
|
self.normalText.setReadOnly(True)
|
|
self.html = TQTextView(self)
|
|
self.pixmap = PixmapView(self)
|
|
self.raiseWidget(self.normalText)
|
|
|
|
def showPreview(self, url, size):
|
|
if url.isLocalFile():
|
|
path = url.path()
|
|
fi = TQFileInfo(path)
|
|
if fi.isFile() and fi.size() > size * 1000:
|
|
self.normalText.setText(
|
|
"The File\n%s\nis too large, so I don't show it!" % path)
|
|
self.raiseWidget(self.normalText)
|
|
return
|
|
pix = TQPixmap(path)
|
|
if pix.isNull():
|
|
if fi.isFile():
|
|
err = False
|
|
try:
|
|
text = open(path.latin1(), "r").read()
|
|
except IOError as msg:
|
|
text = TQString(str(msg))
|
|
err = True
|
|
if not err and fi.extension().lower().contains("htm"):
|
|
url = self.html.mimeSourceFactory().makeAbsolute(
|
|
path, self.html.context())
|
|
self.html.setText(text, url)
|
|
self.raiseWidget(self.html)
|
|
return
|
|
else:
|
|
self.normalText.setText(text)
|
|
self.raiseWidget(self.normalText)
|
|
return
|
|
else:
|
|
self.normalText.setText("")
|
|
self.raiseWidget(self.normalText)
|
|
else:
|
|
self.pixmap.setPixmap(pix)
|
|
self.raiseWidget(self.pixmap)
|
|
else:
|
|
self.normalText.setText("I only show local files!")
|
|
self.raiseWidget(self.normalText)
|
|
|
|
|
|
# We can't instantiate TQFilePreview directly because it is abstract. Note that
|
|
# the previewUrl() abstract is patched in later to work around the fact that
|
|
# you can't multiply inherit from more than one wrapped class.
|
|
class FilePreview(TQFilePreview):
|
|
pass
|
|
|
|
|
|
class PreviewWidget(TQVBox):
|
|
def __init__(self, parent):
|
|
TQVBox.__init__(self, parent)
|
|
self.setSpacing( 5 )
|
|
self.setMargin( 5 )
|
|
row = TQHBox(self)
|
|
row.setSpacing(5)
|
|
TQLabel("Only show files smaller than: ", row)
|
|
self.sizeSpinBox = TQSpinBox(1, 10000, 1, row)
|
|
self.sizeSpinBox.setSuffix(" KB")
|
|
self.sizeSpinBox.setValue(128)
|
|
row.setFixedHeight(10 + self.sizeSpinBox.sizeHint().height())
|
|
self.__preview = Preview(self)
|
|
# workaround sip inability of multiple inheritance
|
|
# create a local TQFilePreview instance and redirect
|
|
# the method, which is called on preview, to us
|
|
self.preview = FilePreview()
|
|
self.preview.previewUrl = self.previewUrl
|
|
|
|
def previewUrl(self, url):
|
|
self.__preview.showPreview(url, self.sizeSpinBox.value())
|
|
|
|
|
|
class CustomFileDialog(TQFileDialog):
|
|
def __init__(self, preview = False):
|
|
TQFileDialog.__init__(self, None, None, True)
|
|
self.bookmarkFile = ".pybookmarks"
|
|
self.bookmarkList = []
|
|
if os.path.exists(self.bookmarkFile):
|
|
try:
|
|
self.bookmarkList = pickle.loads(open(self.bookmarkFile, "rb").read())
|
|
except IOError as msg:
|
|
print(msg)
|
|
self.setDir("/")
|
|
self.dirView = DirectoryView(self, None, True)
|
|
self.dirView.addColumn("")
|
|
self.dirView.header().hide()
|
|
root = Directory(self.dirView, "/")
|
|
root.setOpen(True)
|
|
self.dirView.setFixedWidth(200)
|
|
self.addLeftWidget(self.dirView)
|
|
p = TQPushButton(self)
|
|
p.setPixmap(TQPixmap(bookmarks))
|
|
TQToolTip.add(p, "Bookmarks")
|
|
self.bookmarkMenu = TQPopupMenu(self)
|
|
self.connect(self.bookmarkMenu, TQ_SIGNAL("activated(int)"),
|
|
self.bookmarkChosen)
|
|
self.addId = self.bookmarkMenu.insertItem("Add bookmark")
|
|
self.bookmarkMenu.insertSeparator()
|
|
for l in self.bookmarkList:
|
|
self.bookmarkMenu.insertItem(l)
|
|
p.setPopup(self.bookmarkMenu)
|
|
self.addToolButton(p, True)
|
|
self.connect(self.dirView, PYSIGNAL("folderSelected(const TQString &)"),
|
|
self.setDir2)
|
|
self.connect(self, TQ_SIGNAL("dirEntered(const TQString &)"),
|
|
self.dirView.setDir)
|
|
b = TQToolButton(self)
|
|
TQToolTip.add(b, "Go Home!")
|
|
b.setPixmap(TQPixmap(home))
|
|
self.connect(b, TQ_SIGNAL("clicked()"), self.goHome)
|
|
self.addToolButton(b)
|
|
|
|
if preview:
|
|
self.setContentsPreviewEnabled(True)
|
|
pw = PreviewWidget(self)
|
|
self.setContentsPreview(pw, pw.preview)
|
|
self.setViewMode(TQFileDialog.List)
|
|
self.setPreviewMode(TQFileDialog.Contents)
|
|
|
|
w = self.width()
|
|
h = self.height()
|
|
if preview:
|
|
self.resize(w + w / 2, h + h / 3)
|
|
else:
|
|
self.resize(w + w / 3, h + h / 4)
|
|
|
|
def done(self, r):
|
|
if self.bookmarkList:
|
|
try:
|
|
open(self.bookmarkFile, "wb").write(pickle.dumps(self.bookmarkList))
|
|
except IOError as msg:
|
|
print(msg)
|
|
return TQFileDialog.done(self, r)
|
|
|
|
def showEvent(self, e):
|
|
TQFileDialog.showEvent(self, e)
|
|
self.dirView.setDir(self.dirPath())
|
|
|
|
def setDir2(self, path):
|
|
self.blockSignals(True)
|
|
self.setDir(path)
|
|
self.blockSignals(False)
|
|
|
|
def bookmarkChosen(self, i):
|
|
if i == self.addId:
|
|
# keep bookmarks pythonic
|
|
dp = self.dirPath().latin1()
|
|
if dp not in self.bookmarkList:
|
|
self.bookmarkList.append(dp)
|
|
self.bookmarkMenu.insertItem(dp)
|
|
else:
|
|
self.setDir(self.bookmarkMenu.text(i))
|
|
|
|
def goHome(self):
|
|
if os.getenv("HOME"):
|
|
self.setDir(os.getenv("HOME"))
|
|
else:
|
|
self.setDir("/")
|
|
|
|
|
|
if __name__ == '__main__':
|
|
import sys
|
|
import getopt
|
|
|
|
def usage(msg = None):
|
|
if msg:
|
|
print(msg, file=sys.stderr)
|
|
print("""\
|
|
usage: tqdir [--any | --dir | --custom] [--preview] [--default f] {--filter f} [caption ...]
|
|
--any Get any filename, need not exist.
|
|
--dir Return a directory rather than a file.
|
|
--custom Opens a customized TQFileDialog with
|
|
dir browser, bookmark menu, etc.
|
|
--preview Show a preview widget.
|
|
--default f Start from directory/file f.
|
|
--filter f eg. '*.gif' '*.bmp'
|
|
caption ... Caption for dialog.
|
|
""", file=sys.stderr)
|
|
sys.exit(1)
|
|
|
|
def main():
|
|
options = ["help", "any", "dir", "custom", "preview", "default=", "filter="]
|
|
mode = TQFileDialog.ExistingFile
|
|
preview = False
|
|
custom = False
|
|
start = None
|
|
filter = TQString.null
|
|
app = TQApplication(sys.argv)
|
|
|
|
try:
|
|
optlist, args = getopt.getopt(sys.argv[1:], "h", options)
|
|
except getopt.error as msg:
|
|
usage(msg)
|
|
|
|
for opt, par in optlist:
|
|
if opt in ("-h", "--help"):
|
|
usage()
|
|
elif opt == "--any":
|
|
mode = TQFileDialog.AnyFile
|
|
elif opt == "--dir":
|
|
mode = TQFileDialog.Directory
|
|
elif opt == "--default":
|
|
start = par
|
|
elif opt == "--filter":
|
|
filter = par
|
|
elif opt == "--preview":
|
|
preview = True
|
|
elif opt == "--custom":
|
|
custom = True
|
|
if args:
|
|
caption = " ".join(args)
|
|
elif mode == TQFileDialog.Directory:
|
|
caption = "Choose directory..."
|
|
else:
|
|
caption = "Choose file..."
|
|
if not start:
|
|
start = TQDir.currentDirPath()
|
|
if not custom:
|
|
fd = TQFileDialog(TQString.null, filter, None, None, True)
|
|
fd.setMode(mode)
|
|
if preview:
|
|
fd.setContentsPreviewEnabled(True)
|
|
pw = PreviewWidget(fd)
|
|
fd.setContentsPreview(pw, pw.preview)
|
|
fd.setViewMode(TQFileDialog.List)
|
|
fd.setPreviewMode(TQFileDialog.Contents)
|
|
w = fd.width()
|
|
h = fd.height()
|
|
fd.resize(w + w / 3, h + h / 4)
|
|
fd.setCaption(caption)
|
|
fd.setSelection(start)
|
|
if fd.exec_loop() == TQDialog.Accepted:
|
|
print("%s\n" % fd.selectedFile().latin1())
|
|
return 0
|
|
else:
|
|
return 1
|
|
else:
|
|
fd = CustomFileDialog(preview)
|
|
fd.exec_loop()
|
|
return 1
|
|
|
|
sys.exit(main())
|