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