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
# 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
RSS