|
|
|
#!/usr/bin/env python
|
|
|
|
|
|
|
|
"""**************************************************************************
|
|
|
|
** $Id: dirview.py,v 1.7 2005/11/14 17:21:26 phil Exp $
|
|
|
|
**
|
|
|
|
** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
|
|
|
|
** Some corrections by M. Biermaier (http://www.office-m.at)
|
|
|
|
**
|
|
|
|
** This file is part of an example program for TQt. This example
|
|
|
|
** program may be used, distributed and modified without limitation.
|
|
|
|
**
|
|
|
|
***************************************************************************"""
|
|
|
|
|
|
|
|
import sys
|
|
|
|
from qt import *
|
|
|
|
|
|
|
|
folder_closed_xpm = [
|
|
|
|
"16 16 9 1",
|
|
|
|
"g c #808080",
|
|
|
|
"b c #c0c000",
|
|
|
|
"e c #c0c0c0",
|
|
|
|
"# c #000000",
|
|
|
|
"c c #ffff00",
|
|
|
|
". c None",
|
|
|
|
"a c #585858",
|
|
|
|
"f c #a0a0a4",
|
|
|
|
"d c #ffffff",
|
|
|
|
"..###...........",
|
|
|
|
".#abc##.........",
|
|
|
|
".#daabc#####....",
|
|
|
|
".#ddeaabbccc#...",
|
|
|
|
".#dedeeabbbba...",
|
|
|
|
".#edeeeeaaaab#..",
|
|
|
|
".#deeeeeeefe#ba.",
|
|
|
|
".#eeeeeeefef#ba.",
|
|
|
|
".#eeeeeefeff#ba.",
|
|
|
|
".#eeeeefefff#ba.",
|
|
|
|
".##geefeffff#ba.",
|
|
|
|
"...##gefffff#ba.",
|
|
|
|
".....##fffff#ba.",
|
|
|
|
".......##fff#b##",
|
|
|
|
".........##f#b##",
|
|
|
|
"...........####."
|
|
|
|
]
|
|
|
|
|
|
|
|
folder_open_xpm = [
|
|
|
|
"16 16 11 1",
|
|
|
|
"# c #000000",
|
|
|
|
"g c #c0c0c0",
|
|
|
|
"e c #303030",
|
|
|
|
"a c #ffa858",
|
|
|
|
"b c #808080",
|
|
|
|
"d c #a0a0a4",
|
|
|
|
"f c #585858",
|
|
|
|
"c c #ffdca8",
|
|
|
|
"h c #dcdcdc",
|
|
|
|
"i c #ffffff",
|
|
|
|
". c None",
|
|
|
|
"....###.........",
|
|
|
|
"....#ab##.......",
|
|
|
|
"....#acab####...",
|
|
|
|
"###.#acccccca#..",
|
|
|
|
"#ddefaaaccccca#.",
|
|
|
|
"#bdddbaaaacccab#",
|
|
|
|
".eddddbbaaaacab#",
|
|
|
|
".#bddggdbbaaaab#",
|
|
|
|
"..edgdggggbbaab#",
|
|
|
|
"..#bgggghghdaab#",
|
|
|
|
"...ebhggghicfab#",
|
|
|
|
"....#edhhiiidab#",
|
|
|
|
"......#egiiicfb#",
|
|
|
|
"........#egiibb#",
|
|
|
|
"..........#egib#",
|
|
|
|
"............#ee#"
|
|
|
|
]
|
|
|
|
|
|
|
|
folder_locked = [
|
|
|
|
"16 16 10 1",
|
|
|
|
"h c #808080",
|
|
|
|
"b c #ffa858",
|
|
|
|
"f c #c0c0c0",
|
|
|
|
"e c #c05800",
|
|
|
|
"# c #000000",
|
|
|
|
"c c #ffdca8",
|
|
|
|
". c None",
|
|
|
|
"a c #585858",
|
|
|
|
"g c #a0a0a4",
|
|
|
|
"d c #ffffff",
|
|
|
|
"..#a#...........",
|
|
|
|
".#abc####.......",
|
|
|
|
".#daa#eee#......",
|
|
|
|
".#ddf#e##b#.....",
|
|
|
|
".#dfd#e#bcb##...",
|
|
|
|
".#fdccc#daaab#..",
|
|
|
|
".#dfbbbccgfg#ba.",
|
|
|
|
".#ffb#ebbfgg#ba.",
|
|
|
|
".#ffbbe#bggg#ba.",
|
|
|
|
".#fffbbebggg#ba.",
|
|
|
|
".##hf#ebbggg#ba.",
|
|
|
|
"...###e#gggg#ba.",
|
|
|
|
".....#e#gggg#ba.",
|
|
|
|
"......###ggg#b##",
|
|
|
|
".........##g#b##",
|
|
|
|
"...........####."
|
|
|
|
]
|
|
|
|
|
|
|
|
pix_file = [
|
|
|
|
"16 16 7 1",
|
|
|
|
"# c #000000",
|
|
|
|
"b c #ffffff",
|
|
|
|
"e c #000000",
|
|
|
|
"d c #404000",
|
|
|
|
"c c #c0c000",
|
|
|
|
"a c #ffffc0",
|
|
|
|
". c None",
|
|
|
|
"................",
|
|
|
|
".........#......",
|
|
|
|
"......#.#a##....",
|
|
|
|
".....#b#bbba##..",
|
|
|
|
"....#b#bbbabbb#.",
|
|
|
|
"...#b#bba##bb#..",
|
|
|
|
"..#b#abb#bb##...",
|
|
|
|
".#a#aab#bbbab##.",
|
|
|
|
"#a#aaa#bcbbbbbb#",
|
|
|
|
"#ccdc#bcbbcbbb#.",
|
|
|
|
".##c#bcbbcabb#..",
|
|
|
|
"...#acbacbbbe...",
|
|
|
|
"..#aaaacaba#....",
|
|
|
|
"...##aaaaa#.....",
|
|
|
|
".....##aa#......",
|
|
|
|
".......##......."
|
|
|
|
]
|
|
|
|
|
|
|
|
folderLocked = None
|
|
|
|
folderClosed = None
|
|
|
|
folderOpened = None
|
|
|
|
fileNormal = None
|
|
|
|
|
|
|
|
class FileItem( TQListViewItem ) :
|
|
|
|
def __init__( self, parent=None, s1=TQString.null, s2=TQString.null ):
|
|
|
|
TQListViewItem.__init__( self, parent, s1, s2 )
|
|
|
|
self.pix = None
|
|
|
|
|
|
|
|
def setPixmap( self, p ) :
|
|
|
|
self.pix = p
|
|
|
|
self.setup()
|
|
|
|
self.widthChanged( 0 )
|
|
|
|
self.invalidateHeight()
|
|
|
|
self.repaint()
|
|
|
|
|
|
|
|
def pixmap( self, i ) :
|
|
|
|
if i : return None
|
|
|
|
else : return self.pix;
|
|
|
|
|
|
|
|
# Class Directory
|
|
|
|
class Directory( TQListViewItem ) :
|
|
|
|
def __init__( self, parent=None, filename=TQString.null, col2=TQString.null ):
|
|
|
|
TQListViewItem.__init__( self, parent, filename, col2 )
|
|
|
|
self.pix = None
|
|
|
|
global folderLocked, folderClosed, folderOpened, fileNormal
|
|
|
|
self.showDirsOnly = False
|
|
|
|
if isinstance(parent, TQListView):
|
|
|
|
self.p = None
|
|
|
|
self.showDirsOnly = parent.showDirsOnly()
|
|
|
|
self.f = TQFile( TQString('/') )
|
|
|
|
else:
|
|
|
|
self.p = parent
|
|
|
|
self.showDirsOnly = parent.showDirsOnly
|
|
|
|
self.f = TQFile( TQString(filename) )
|
|
|
|
|
|
|
|
self.readable = TQDir( self.fullName() ).isReadable()
|
|
|
|
if not self.readable : self.setPixmap( folderLocked )
|
|
|
|
else : self.setPixmap( folderClosed )
|
|
|
|
|
|
|
|
def setPixmap( self, px ) :
|
|
|
|
self.pix = px
|
|
|
|
self.setup()
|
|
|
|
self.widthChanged( 0 )
|
|
|
|
self.invalidateHeight()
|
|
|
|
self.repaint()
|
|
|
|
|
|
|
|
def pixmap( self, i ) :
|
|
|
|
if i : return None
|
|
|
|
else : return self.pix
|
|
|
|
|
|
|
|
def setOpen( self, o ) :
|
|
|
|
if o : self.setPixmap( folderOpened )
|
|
|
|
else : self.setPixmap( folderClosed )
|
|
|
|
|
|
|
|
if o and not self.childCount() :
|
|
|
|
s = TQString( self.fullName() )
|
|
|
|
thisDir = TQDir( s )
|
|
|
|
if not thisDir.isReadable() :
|
|
|
|
self.readable = False
|
|
|
|
self.setExpandable( False )
|
|
|
|
return
|
|
|
|
|
|
|
|
self.listView().setUpdatesEnabled( False )
|
|
|
|
files = thisDir.entryInfoList()
|
|
|
|
if files :
|
|
|
|
fi = TQFileInfo()
|
|
|
|
for it in files:
|
|
|
|
fi = it
|
|
|
|
if str(fi.fileName()) == "." or str(fi.fileName()) == ".." :
|
|
|
|
continue # nothing
|
|
|
|
elif fi.isSymLink() and not self.showDirsOnly :
|
|
|
|
item = FileItem( self, fi.fileName(), "Symbolic Link" )
|
|
|
|
item.setPixmap( fileNormal )
|
|
|
|
elif fi.isDir() :
|
|
|
|
Directory( self, fi.fileName() )
|
|
|
|
elif not self.showDirsOnly :
|
|
|
|
if fi.isFile() : item = FileItem( self, fi.fileName(), "File" )
|
|
|
|
else : item = FileItem( self, fi.fileName(), "Special" )
|
|
|
|
item.setPixmap( fileNormal )
|
|
|
|
|
|
|
|
self.listView().setUpdatesEnabled( True )
|
|
|
|
TQListViewItem.setOpen( self, o )
|
|
|
|
|
|
|
|
def setup( self ):
|
|
|
|
self.setExpandable( True )
|
|
|
|
TQListViewItem.setup( self )
|
|
|
|
|
|
|
|
def fullName( self ):
|
|
|
|
s = TQString()
|
|
|
|
if self.p :
|
|
|
|
s = self.p.fullName()
|
|
|
|
s.append( self.f.name() )
|
|
|
|
s.append( "/" )
|
|
|
|
else :
|
|
|
|
s = self.f.name()
|
|
|
|
return s
|
|
|
|
|
|
|
|
def text( self, column ) :
|
|
|
|
if column == 0 : return self.f.name()
|
|
|
|
elif self.readable : return "Directory"
|
|
|
|
else : return "Unreadable Directory"
|
|
|
|
|
|
|
|
# Class DirectoryView
|
|
|
|
|
|
|
|
class DirectoryView( TQListView ):
|
|
|
|
def __init__( self, parent=None, name=None, sdo=False ):
|
|
|
|
TQListView.__init__( self, parent, name )
|
|
|
|
self.dirsOnly = sdo
|
|
|
|
self.oldCurrent = 0
|
|
|
|
self.dropItem = 0
|
|
|
|
self.presspos = TQPoint(0,0)
|
|
|
|
self.mousePressed = False
|
|
|
|
global folderLocked, folderClosed, folderOpened, fileNormal #= TQPixmap()
|
|
|
|
self.autoopenTime = 750
|
|
|
|
|
|
|
|
self.autoopen_timer = TQTimer( self )
|
|
|
|
if not folderLocked :
|
|
|
|
folderLocked = TQPixmap( folder_locked )
|
|
|
|
folderClosed = TQPixmap( folder_closed_xpm )
|
|
|
|
folderOpened = TQPixmap( folder_open_xpm )
|
|
|
|
fileNormal = TQPixmap( pix_file )
|
|
|
|
|
|
|
|
self.connect( self, SIGNAL("doubleClicked(TQListViewItem *)"),
|
|
|
|
self.slotFolderSelected )
|
|
|
|
self.connect( self, SIGNAL("returnPressed(TQListViewItem *)"),
|
|
|
|
self.slotFolderSelected )
|
|
|
|
|
|
|
|
self.setAcceptDrops( True )
|
|
|
|
self.viewport().setAcceptDrops( True )
|
|
|
|
|
|
|
|
self.connect( self.autoopen_timer, SIGNAL("timeout()"), self.openFolder )
|
|
|
|
|
|
|
|
def showDirsOnly( self ):
|
|
|
|
return self.dirsOnly
|
|
|
|
|
|
|
|
def slotFolderSelected( self, i ):
|
|
|
|
if not i or not self.showDirsOnly():
|
|
|
|
return
|
|
|
|
dir = i
|
|
|
|
self.emit( PYSIGNAL("folderSelected(const TQString &)"), (dir.fullName(), ) )
|
|
|
|
|
|
|
|
def openFolder( self ):
|
|
|
|
self.autoopen_timer.stop()
|
|
|
|
if self.dropItem and not self.dropItem.isOpen():
|
|
|
|
self.dropItem.setOpen( True )
|
|
|
|
self.dropItem.repaint()
|
|
|
|
|
|
|
|
def contentsDragEnterEvent( self, e ):
|
|
|
|
if not TQUriDrag.canDecode(e) :
|
|
|
|
e.ignore()
|
|
|
|
return
|
|
|
|
self.oldCurrent = self.currentItem()
|
|
|
|
i = self.itemAt( self.contentsToViewport(e.pos()) )
|
|
|
|
if i :
|
|
|
|
self.dropItem = i
|
|
|
|
self.autoopen_timer.start( self.autoopenTime )
|
|
|
|
|
|
|
|
def contentsDragMoveEvent( self, e ) :
|
|
|
|
if not TQUriDrag.canDecode(e) :
|
|
|
|
e.ignore()
|
|
|
|
return
|
|
|
|
vp = self.contentsToViewport( e.pos() )
|
|
|
|
i = self.itemAt( vp )
|
|
|
|
if i :
|
|
|
|
self.setSelected( i, True )
|
|
|
|
e.accept()
|
|
|
|
if i != self.dropItem :
|
|
|
|
self.autoopen_timer.stop()
|
|
|
|
self.dropItem = i
|
|
|
|
self.autoopen_timer.start( self.autoopenTime )
|
|
|
|
|
|
|
|
if e.action() == TQDropEvent.Copy:
|
|
|
|
pass
|
|
|
|
elif e.action() == TQDropEvent.Move:
|
|
|
|
e.acceptAction()
|
|
|
|
elif e.action() == TQDropEvent.Link:
|
|
|
|
e.acceptAction()
|
|
|
|
else:
|
|
|
|
pass
|
|
|
|
else :
|
|
|
|
e.ignore()
|
|
|
|
self.autoopen_timer.stop()
|
|
|
|
self.dropItem = 0
|
|
|
|
|
|
|
|
def contentsDragLeaveEvent( self, TQDragLeaveEvent ) :
|
|
|
|
self.autoopen_timer.stop()
|
|
|
|
self.dropItem = 0
|
|
|
|
|
|
|
|
self.setCurrentItem( self.oldCurrent )
|
|
|
|
self.setSelected( self.oldCurrent, True )
|
|
|
|
|
|
|
|
def contentsDropEvent( self, e ):
|
|
|
|
self.autoopen_timer.stop()
|
|
|
|
if not TQUriDrag.canDecode(e) :
|
|
|
|
e.ignore()
|
|
|
|
return
|
|
|
|
item = self.itemAt( self.contentsToViewport(e.pos()) )
|
|
|
|
if item :
|
|
|
|
lst = TQStringList()
|
|
|
|
TQUriDrag.decodeLocalFiles( e, lst )
|
|
|
|
if e.action() == TQDropEvent.Copy:
|
|
|
|
s = TQString("Copy")
|
|
|
|
elif e.action() == TQDropEvent.Move:
|
|
|
|
s = TQString("Move")
|
|
|
|
e.acceptAction()
|
|
|
|
elif e.action() == TQDropEvent.Link:
|
|
|
|
s = TQString("Link")
|
|
|
|
e.acceptAction()
|
|
|
|
else:
|
|
|
|
s = TQString("Unknown")
|
|
|
|
|
|
|
|
s += "\n\n"
|
|
|
|
e.accept()
|
|
|
|
|
|
|
|
for filename in lst:
|
|
|
|
s += filename
|
|
|
|
s += "\n"
|
|
|
|
|
|
|
|
s += "\nTo\n\n "
|
|
|
|
s += self.fullPath(item)
|
|
|
|
TQMessageBox.information( self, "Drop target", s, "Not implemented" )
|
|
|
|
else :
|
|
|
|
e.ignore()
|
|
|
|
|
|
|
|
def fullPath( self, item ):
|
|
|
|
fullpath = TQString( item.text(0) )
|
|
|
|
item = item.parent()
|
|
|
|
while item:
|
|
|
|
newpath = item.text(0)
|
|
|
|
|
|
|
|
if item.parent():
|
|
|
|
newpath += "/"
|
|
|
|
|
|
|
|
newpath += fullpath
|
|
|
|
fullpath = newpath
|
|
|
|
item = item.parent()
|
|
|
|
|
|
|
|
return fullpath
|
|
|
|
|
|
|
|
def contentsMousePressEvent( self, e ) :
|
|
|
|
TQListView.contentsMousePressEvent( self, e )
|
|
|
|
p = TQPoint( self.contentsToViewport( e.pos() ) )
|
|
|
|
i = self.itemAt( p )
|
|
|
|
if i :
|
|
|
|
# if the user clicked into the root decoration of the item, don't try to start a drag!
|
|
|
|
if self.rootIsDecorated(): isdecorated = 1
|
|
|
|
else : isdecorated = 0
|
|
|
|
if p.x() > self.header().sectionPos( self.header().mapToIndex( 0 )) + self.treeStepSize() * ( i.depth() + isdecorated + self.itemMargin() or
|
|
|
|
p.x() < self.header().sectionPos( self.header().mapToIndex( 0 ) ) ) :
|
|
|
|
self.presspos.setX(e.pos().x())
|
|
|
|
self.presspos.setY(e.pos().y())
|
|
|
|
self.mousePressed = True
|
|
|
|
|
|
|
|
def contentsMouseMoveEvent( self, e ):
|
|
|
|
offset = TQPoint( self.presspos.x() - e.pos().x(),
|
|
|
|
self.presspos.y() - e.pos().y() )
|
|
|
|
if self.mousePressed and (offset).manhattanLength() > TQApplication.startDragDistance() :
|
|
|
|
self.mousePressed = False
|
|
|
|
item = self.itemAt( self.contentsToViewport(self.presspos) )
|
|
|
|
if item :
|
|
|
|
source = self.fullPath(item)
|
|
|
|
if TQFile.exists(source) :
|
|
|
|
ud = TQUriDrag(self.viewport())
|
|
|
|
ud.setFileNames( TQStringList (source) )
|
|
|
|
if ud.drag() :
|
|
|
|
TQMessageBox.information( self, "Drag source",
|
|
|
|
TQString("Delete ")+source, "Not implemented" )
|
|
|
|
|
|
|
|
def contentsMouseReleaseEvent( self, TQMouseEvent ):
|
|
|
|
self.mousePressed = False
|
|
|
|
|
|
|
|
def setDir( self, s ):
|
|
|
|
it = TQListViewItem( self )
|
|
|
|
it.setOpen(False)
|
|
|
|
thisDir = TQDir( s )
|
|
|
|
it = TQListViewItem( self )
|
|
|
|
it.setOpen(False)
|
|
|
|
lst = TQStringList( TQStringList.split( "/", s ) )
|
|
|
|
listview2 = []
|
|
|
|
listview2.extend( lst )
|
|
|
|
|
|
|
|
item = self.firstChild()
|
|
|
|
for it2 in listview2 :
|
|
|
|
while item :
|
|
|
|
if item.text( 0 ) == it2 :
|
|
|
|
item.setOpen( True )
|
|
|
|
break
|
|
|
|
item = item.itemBelow()
|
|
|
|
if item:
|
|
|
|
self.setCurrentItem( item )
|
|
|
|
|
|
|
|
def main( args ):
|
|
|
|
a = TQApplication( args )
|
|
|
|
|
|
|
|
mw = DirectoryView()
|
|
|
|
mw.addColumn( "Name" )
|
|
|
|
mw.addColumn( "Type" )
|
|
|
|
mw.setTreeStepSize( 20 )
|
|
|
|
|
|
|
|
roots = TQDir.drives()
|
|
|
|
if roots :
|
|
|
|
for it in roots:
|
|
|
|
fi = it
|
|
|
|
root = Directory( mw, fi.filePath() )
|
|
|
|
if roots.count(it) <= 1 :
|
|
|
|
root.setOpen( True ) # be interesting
|
|
|
|
|
|
|
|
mw.resize( 400, 400 )
|
|
|
|
mw.setCaption( "TQt Example - Directory Browser" )
|
|
|
|
mw.setAllColumnsShowFocus( True )
|
|
|
|
a.setMainWidget( mw )
|
|
|
|
mw.show()
|
|
|
|
|
|
|
|
a.exec_loop()
|
|
|
|
|
|
|
|
if __name__=="__main__":
|
|
|
|
main(sys.argv)
|