#!/usr/bin/env python
#
# 2005-02-12 initial version hp
import os
import pickle
from python_tqt . qt 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 \n is 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 , 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 , 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 , 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 , SIGNAL ( " dirEntered(const TQString &) " ) ,
self . dirView . setDir )
b = TQToolButton ( self )
TQToolTip . add ( b , " Go Home! " )
b . setPixmap ( TQPixmap ( home ) )
self . connect ( b , 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 , 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 >> sys . stderr , msg
print >> sys . stderr , """ \
usage : qdir [ - - 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 .
"""
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 , 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 ( ) )