filedialog.py

FileDialog для Qtopia

В Qtopia на Sharp Zaurus отсутствует QFileDialog (есть, правда, другое средство, но гораздо менее удобное и практичное). Вот класс, который может заменить QFileDialog:

# filedialog.py
# Copyright (C) Dmitri Brechalov, 2005

from qt import *
import os.path

pics_path = '/usr/QtPalmtop.rom/pics'
file_pic_name = 'slUnknown.png'
dir_pic_name  = 'slfolder.png'
btnUp_pic_name = 'folderup.png'

class FileDialog(QDialog):
'''Simple replacement for QFileDialog on Zaurus
FileDialog(parent, name, caption, dirName, filter)
Example: d = FileDialog(name="FileDialog", dirName="/home/zaurus/", filter="*.txt")
'
''
def __init__(self, parent=None, name=None, caption=None, dirName=None, filter=None):
QDialog.__init__(self,parent,name,1)

self.__filename = None
if dirName is None:
dirName = '.'
self.__dirname = os.path.abspath(dirName)
if filter is None:
self.__filter = '*'
else:
self.__filter = filter
self.__init(parent, name, caption)
self.__refreshFileList()
self.__connect()

def __init(self, parent, name, caption):
if not name:
name = 'FileDialog'
if not caption:
caption = 'Open File'
self.__name = name
self.setName(name)
self.setCaption(caption)

self.btnUp_pic = QPixmap(QString(os.path.join(pics_path, btnUp_pic_name)))
self.dir_pic = QPixmap(QString(os.path.join(pics_path, dir_pic_name)))
self.file_pic = QPixmap(QString(os.path.join(pics_path, file_pic_name)))

self.setSizePolicy(QSizePolicy(7,7,self.sizePolicy().hasHeightForWidth()))
self.setBaseSize(QSize(640,480))

FileDialogLayout = QVBoxLayout(self,1,2,"FileDialogLayout")

self.topPanel = QFrame(self,"topPanel")
self.topPanel.setSizePolicy(QSizePolicy(7,7,self.topPanel.sizePolicy().hasHeightForWidth()))
self.topPanel.setFrameShape(QFrame.NoFrame)
self.topPanel.setFrameShadow(QFrame.Plain)
topPanelLayout = QHBoxLayout(self.topPanel,1,2,"topPanelLayout")

self.lblFile = QLabel(self.topPanel,"lblFile")
topPanelLayout.addWidget(self.lblFile)

self.fileEdit = QLineEdit(self.topPanel,"fileEdit")
self.fileEdit.setSizePolicy(QSizePolicy(7,0,self.fileEdit.sizePolicy().hasHeightForWidth()))
##         self.fileEdit.setEditable(1)
topPanelLayout.addWidget(self.fileEdit)

self.btnUp = QToolButton(self.topPanel, "btnUp")
self.btnUp.setPixmap(self.btnUp_pic)
self.btnUp.setMinimumSize(QSize(20,20))
##         self.btnUp.setMaximumSize(QSize(20,20))
topPanelLayout.addWidget(self.btnUp)
FileDialogLayout.addWidget(self.topPanel)

self.fileList = QListBox(self,"fileList")
FileDialogLayout.addWidget(self.fileList)

self.lblFile.setText(self.tr("File name:"))
self.fileList.clear()
##         self.fileList.insertItem(self.tr("New Item"))

if parent is not None:
self.resize(parent.size())
else:
self.resize(QSize(497,311).expandedTo(self.minimumSizeHint()))

def __connect(self):
self.connect(self.fileList,SIGNAL("highlighted(QListBoxItem*)"), self.fileListClicked)
self.connect(self.fileList,SIGNAL("selected(QListBoxItem*)"), self.fileListSelected)
self.connect(self.fileEdit,SIGNAL("textChanged(const QString &)"), self.fileEditChanged)
self.connect(self.btnUp,SIGNAL("clicked()"), self.btnUpClicked)

def __refreshFileList(self):
import glob
#### collect all folders
fldrlst = [ fname for fname in glob.glob1(self.__dirname, '*') if os.path.isdir(os.path.join(self.__dirname, fname)) ]
fldrlst.sort()
#### collect files matched the filter
filelst = []
filters = self.__filter.split('|')
for filt in filters:
for fname in glob.glob1(self.__dirname, filt):
if not os.path.isdir(os.path.join(self.__dirname, fname)):
filelst.append(fname)
filelst.sort()
#### fill the listbox
self.fileList.clear()
if self.__dirname != '/':
self.fileList.insertItem(self.dir_pic, '..')
for fname in fldrlst:
self.fileList.insertItem(self.dir_pic, fname)
for fname in filelst:
self.fileList.insertItem(self.file_pic, fname)

def setCaption(self, caption):
self.__title = caption
self.__updateCaption()

def __updateCaption(self):
QDialog.setCaption(self, '%s : %s' % (self.__title, self.__dirname))

def fileListClicked(self, item):
fname = str(item.text().utf8())
if os.path.isdir(os.path.join(self.__dirname, fname)):
self.fileEdit.setText('')
else:
self.fileEdit.setText(item.text())

def fileListSelected(self, item):
##         print item.text()
fname = str(item.text().utf8())
if fname == '..':
self.btnUpClicked()
return
new_dir = os.path.join(self.__dirname, fname)
if os.path.isdir(new_dir):
self.__dirname = new_dir
self.__refreshFileList()
self.__updateCaption()
else:
self.fileListClicked(item)

def btnUpClicked(self):
(new_dir, fname) = os.path.split(self.__dirname)
self.__dirname = new_dir
self.__refreshFileList()
self.__updateCaption()
item = self.fileList.findItem(QString(fname))
if item:
self.fileList.setCurrentItem(item)

def fileEditChanged(self, qstr):
self.__filename = str(qstr.utf8())

def selectedFile(self):
if self.__filename:
return os.path.join(self.__dirname, self.__filename)
else:
return None

# end of filedialog.py