Qt 5.6 | Qt Assistant Manual | Simple Text Viewer Example | findfiledialog.cpp Example File

Qt 5.6.3 Reference Documentation

# findfiledialog.cpp Example File

simpletextviewer/findfiledialog.cpp

      /****************************************************************************
      **
      ** Copyright (C) 2015 The Qt Company Ltd.
      ** Contact: http://www.qt.io/licensing/
      **
      ** This file is part of the 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$
      **
      ****************************************************************************/

      #include <QtCore/QDir>
      #include <QtWidgets/QLayout>
      #include <QtWidgets/QComboBox>
      #include <QtWidgets/QTreeWidget>
      #include <QtWidgets/QLayout>
      #include <QtWidgets/QFileDialog>
      #include <QtWidgets/QDialogButtonBox>
      #include <QtWidgets/QToolButton>
      #include <QtWidgets/QPushButton>
      #include <QtWidgets/QLabel>

      #include "findfiledialog.h"
      #include "assistant.h"
      #include "textedit.h"

      FindFileDialog::FindFileDialog(TextEdit *editor, Assistant *assistant)
          : QDialog(editor)
      {
          currentAssistant = assistant;
          currentEditor = editor;

          createButtons();
          createComboBoxes();
          createFilesTree();
          createLabels();
          createLayout();

          directoryComboBox->addItem(QDir::toNativeSeparators(QDir::currentPath()));
          fileNameComboBox->addItem("*");
          findFiles();

          setWindowTitle(tr("Find File"));
      }

      void FindFileDialog::browse()
      {
          QString currentDirectory = directoryComboBox->currentText();
          QString newDirectory = QFileDialog::getExistingDirectory(this,
                                     tr("Select Directory"), currentDirectory);
          if (!newDirectory.isEmpty()) {
              directoryComboBox->addItem(QDir::toNativeSeparators(newDirectory));
              directoryComboBox->setCurrentIndex(directoryComboBox->count() - 1);
              update();
          }
      }

      void FindFileDialog::help()
      {
          currentAssistant->showDocumentation("filedialog.html");
      }

      void FindFileDialog::openFile(QTreeWidgetItem *item)
      {
          if (!item) {
              item = foundFilesTree->currentItem();
              if (!item)
                  return;
          }

          QString fileName = item->text(0);
          QString path = directoryComboBox->currentText() + QDir::separator();

          currentEditor->setContents(path + fileName);
          close();
      }

      void FindFileDialog::update()
      {
          findFiles();
          buttonBox->button(QDialogButtonBox::Open)->setEnabled(
                  foundFilesTree->topLevelItemCount() > 0);
      }

      void FindFileDialog::findFiles()
      {
          QRegExp filePattern(fileNameComboBox->currentText() + "*");
          filePattern.setPatternSyntax(QRegExp::Wildcard);

          QDir directory(directoryComboBox->currentText());

          QStringList allFiles = directory.entryList(QDir::Files | QDir::NoSymLinks);
          QStringList matchingFiles;

          foreach (QString file, allFiles) {
              if (filePattern.exactMatch(file))
                  matchingFiles << file;
          }
          showFiles(matchingFiles);
      }

      void FindFileDialog::showFiles(const QStringList &files)
      {
          foundFilesTree->clear();

          for (int i = 0; i < files.count(); ++i) {
              QTreeWidgetItem *item = new QTreeWidgetItem(foundFilesTree);
              item->setText(0, files[i]);
          }

          if (files.count() > 0)
              foundFilesTree->setCurrentItem(foundFilesTree->topLevelItem(0));
      }

      void FindFileDialog::createButtons()
      {
          browseButton = new QToolButton;
          browseButton->setText(tr("..."));
          connect(browseButton, SIGNAL(clicked()), this, SLOT(browse()));

          buttonBox = new QDialogButtonBox(QDialogButtonBox::Open
                                           | QDialogButtonBox::Cancel
                                           | QDialogButtonBox::Help);
          connect(buttonBox, SIGNAL(accepted()), this, SLOT(openFile()));
          connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
          connect(buttonBox, SIGNAL(helpRequested()), this, SLOT(help()));
      }

      void FindFileDialog::createComboBoxes()
      {
          directoryComboBox = new QComboBox;
          fileNameComboBox = new QComboBox;

          fileNameComboBox->setEditable(true);
          fileNameComboBox->setSizePolicy(QSizePolicy::Expanding,
                                          QSizePolicy::Preferred);

          directoryComboBox->setMinimumContentsLength(30);
          directoryComboBox->setSizeAdjustPolicy(
                  QComboBox::AdjustToMinimumContentsLength);
          directoryComboBox->setSizePolicy(QSizePolicy::Expanding,
                                           QSizePolicy::Preferred);

          connect(fileNameComboBox, SIGNAL(editTextChanged(QString)),
                  this, SLOT(update()));
          connect(directoryComboBox, SIGNAL(currentIndexChanged(QString)),
                  this, SLOT(update()));
      }

      void FindFileDialog::createFilesTree()
      {
          foundFilesTree = new QTreeWidget;
          foundFilesTree->setColumnCount(1);
          foundFilesTree->setHeaderLabels(QStringList(tr("Matching Files")));
          foundFilesTree->setRootIsDecorated(false);
          foundFilesTree->setSelectionMode(QAbstractItemView::SingleSelection);

          connect(foundFilesTree, SIGNAL(itemActivated(QTreeWidgetItem*,int)),
                  this, SLOT(openFile(QTreeWidgetItem*)));
      }

      void FindFileDialog::createLabels()
      {
          directoryLabel = new QLabel(tr("Search in:"));
          fileNameLabel = new QLabel(tr("File name (including wildcards):"));
      }

      void FindFileDialog::createLayout()
      {
          QHBoxLayout *fileLayout = new QHBoxLayout;
          fileLayout->addWidget(fileNameLabel);
          fileLayout->addWidget(fileNameComboBox);

          QHBoxLayout *directoryLayout = new QHBoxLayout;
          directoryLayout->addWidget(directoryLabel);
          directoryLayout->addWidget(directoryComboBox);
          directoryLayout->addWidget(browseButton);

          QVBoxLayout *mainLayout = new QVBoxLayout;
          mainLayout->addLayout(fileLayout);
          mainLayout->addLayout(directoryLayout);
          mainLayout->addWidget(foundFilesTree);
          mainLayout->addStretch();
          mainLayout->addWidget(buttonBox);
          setLayout(mainLayout);
      }