aboutsummaryrefslogtreecommitdiffstats
path: root/examples/widgets/dialogs/findfiles.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/widgets/dialogs/findfiles.py')
-rwxr-xr-xexamples/widgets/dialogs/findfiles.py211
1 files changed, 211 insertions, 0 deletions
diff --git a/examples/widgets/dialogs/findfiles.py b/examples/widgets/dialogs/findfiles.py
new file mode 100755
index 000000000..cc410335f
--- /dev/null
+++ b/examples/widgets/dialogs/findfiles.py
@@ -0,0 +1,211 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## Copyright (C) 2013 Riverbank Computing Limited.
+## Copyright (C) 2016 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the PySide examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+"""PySide2 port of the widgets/dialogs/findfiles example from Qt v5.x"""
+
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+class Window(QtWidgets.QDialog):
+ def __init__(self, parent=None):
+ super(Window, self).__init__(parent)
+
+ self.browseButton = self.createButton("&Browse...", self.browse)
+ self.findButton = self.createButton("&Find", self.find)
+
+ self.fileComboBox = self.createComboBox("*")
+ self.textComboBox = self.createComboBox()
+ self.directoryComboBox = self.createComboBox(QtCore.QDir.currentPath())
+
+ fileLabel = QtWidgets.QLabel("Named:")
+ textLabel = QtWidgets.QLabel("Containing text:")
+ directoryLabel = QtWidgets.QLabel("In directory:")
+ self.filesFoundLabel = QtWidgets.QLabel()
+
+ self.createFilesTable()
+
+ buttonsLayout = QtWidgets.QHBoxLayout()
+ buttonsLayout.addStretch()
+ buttonsLayout.addWidget(self.findButton)
+
+ mainLayout = QtWidgets.QGridLayout()
+ mainLayout.addWidget(fileLabel, 0, 0)
+ mainLayout.addWidget(self.fileComboBox, 0, 1, 1, 2)
+ mainLayout.addWidget(textLabel, 1, 0)
+ mainLayout.addWidget(self.textComboBox, 1, 1, 1, 2)
+ mainLayout.addWidget(directoryLabel, 2, 0)
+ mainLayout.addWidget(self.directoryComboBox, 2, 1)
+ mainLayout.addWidget(self.browseButton, 2, 2)
+ mainLayout.addWidget(self.filesTable, 3, 0, 1, 3)
+ mainLayout.addWidget(self.filesFoundLabel, 4, 0)
+ mainLayout.addLayout(buttonsLayout, 5, 0, 1, 3)
+ self.setLayout(mainLayout)
+
+ self.setWindowTitle("Find Files")
+ self.resize(500, 300)
+
+ def browse(self):
+ directory = QtWidgets.QFileDialog.getExistingDirectory(self, "Find Files",
+ QtCore.QDir.currentPath())
+
+ if directory:
+ if self.directoryComboBox.findText(directory) == -1:
+ self.directoryComboBox.addItem(directory)
+
+ self.directoryComboBox.setCurrentIndex(self.directoryComboBox.findText(directory))
+
+ @staticmethod
+ def updateComboBox(comboBox):
+ if comboBox.findText(comboBox.currentText()) == -1:
+ comboBox.addItem(comboBox.currentText())
+
+ def find(self):
+ self.filesTable.setRowCount(0)
+
+ fileName = self.fileComboBox.currentText()
+ text = self.textComboBox.currentText()
+ path = self.directoryComboBox.currentText()
+
+ self.updateComboBox(self.fileComboBox)
+ self.updateComboBox(self.textComboBox)
+ self.updateComboBox(self.directoryComboBox)
+
+ self.currentDir = QtCore.QDir(path)
+ if not fileName:
+ fileName = "*"
+ files = self.currentDir.entryList([fileName],
+ QtCore.QDir.Files | QtCore.QDir.NoSymLinks)
+
+ if text:
+ files = self.findFiles(files, text)
+ self.showFiles(files)
+
+ def findFiles(self, files, text):
+ progressDialog = QtWidgets.QProgressDialog(self)
+
+ progressDialog.setCancelButtonText("&Cancel")
+ progressDialog.setRange(0, len(files))
+ progressDialog.setWindowTitle("Find Files")
+
+ foundFiles = []
+
+ for i in range(len(files)):
+ progressDialog.setValue(i)
+ progressDialog.setLabelText("Searching file number %d of %d..." % (i, len(files)))
+ QtCore.qApp.processEvents()
+
+ if progressDialog.wasCanceled():
+ break
+
+ inFile = QtCore.QFile(self.currentDir.absoluteFilePath(files[i]))
+
+ if inFile.open(QtCore.QIODevice.ReadOnly):
+ stream = QtCore.QTextStream(inFile)
+ while not stream.atEnd():
+ if progressDialog.wasCanceled():
+ break
+ line = stream.readLine()
+ if text in line:
+ foundFiles.append(files[i])
+ break
+
+ progressDialog.close()
+
+ return foundFiles
+
+ def showFiles(self, files):
+ for fn in files:
+ file = QtCore.QFile(self.currentDir.absoluteFilePath(fn))
+ size = QtCore.QFileInfo(file).size()
+
+ fileNameItem = QtWidgets.QTableWidgetItem(fn)
+ fileNameItem.setFlags(fileNameItem.flags() ^ QtCore.Qt.ItemIsEditable)
+ sizeItem = QtWidgets.QTableWidgetItem("%d KB" % (int((size + 1023) / 1024)))
+ sizeItem.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight)
+ sizeItem.setFlags(sizeItem.flags() ^ QtCore.Qt.ItemIsEditable)
+
+ row = self.filesTable.rowCount()
+ self.filesTable.insertRow(row)
+ self.filesTable.setItem(row, 0, fileNameItem)
+ self.filesTable.setItem(row, 1, sizeItem)
+
+ self.filesFoundLabel.setText("%d file(s) found (Double click on a file to open it)" % len(files))
+
+ def createButton(self, text, member):
+ button = QtWidgets.QPushButton(text)
+ button.clicked.connect(member)
+ return button
+
+ def createComboBox(self, text=""):
+ comboBox = QtWidgets.QComboBox()
+ comboBox.setEditable(True)
+ comboBox.addItem(text)
+ comboBox.setSizePolicy(QtWidgets.QSizePolicy.Expanding,
+ QtWidgets.QSizePolicy.Preferred)
+ return comboBox
+
+ def createFilesTable(self):
+ self.filesTable = QtWidgets.QTableWidget(0, 2)
+ self.filesTable.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
+
+ self.filesTable.setHorizontalHeaderLabels(("File Name", "Size"))
+ self.filesTable.horizontalHeader().setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch)
+ self.filesTable.verticalHeader().hide()
+ self.filesTable.setShowGrid(False)
+
+ self.filesTable.cellActivated.connect(self.openFileOfItem)
+
+ def openFileOfItem(self, row, column):
+ item = self.filesTable.item(row, 0)
+
+ QtGui.QDesktopServices.openUrl(QtCore.QUrl(self.currentDir.absoluteFilePath(item.text())))
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QtWidgets.QApplication(sys.argv)
+ window = Window()
+ window.show()
+ sys.exit(app.exec_())