Revision control

Copy as Markdown

// Copyright (C) 2017 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include "assistant.h"
#include "findfiledialog.h"
#include "textedit.h"
#include <QComboBox>
#include <QDialogButtonBox>
#include <QDir>
#include <QFileDialog>
#include <QHBoxLayout>
#include <QLabel>
#include <QPushButton>
#include <QRegularExpression>
#include <QToolButton>
#include <QTreeWidget>
#include <QTreeWidgetItem>
//! [0]
FindFileDialog::FindFileDialog(TextEdit *editor, Assistant *assistant)
: QDialog(editor)
, currentEditor(editor)
, currentAssistant(assistant)
{
//! [0]
createButtons();
createComboBoxes();
createFilesTree();
createLabels();
createLayout();
directoryComboBox->addItem(QDir::toNativeSeparators(QDir::currentPath()));
fileNameComboBox->addItem("*");
findFiles();
setWindowTitle(tr("Find File"));
//! [1]
}
//! [1]
void FindFileDialog::browse()
{
const QString currentDirectory = directoryComboBox->currentText();
const QString newDirectory = QFileDialog::getExistingDirectory(this,
tr("Select Directory"), currentDirectory);
if (!newDirectory.isEmpty()) {
directoryComboBox->addItem(QDir::toNativeSeparators(newDirectory));
directoryComboBox->setCurrentIndex(directoryComboBox->count() - 1);
update();
}
}
//! [2]
void FindFileDialog::help()
{
currentAssistant->showDocumentation("filedialog.html");
}
//! [2]
void FindFileDialog::openFile()
{
QTreeWidgetItem *item = foundFilesTree->currentItem();
if (!item)
return;
const QString fileName = item->text(0);
const QString path = QDir(directoryComboBox->currentText()).filePath(fileName);
currentEditor->setContents(path);
close();
}
void FindFileDialog::update()
{
findFiles();
buttonBox->button(QDialogButtonBox::Open)->setEnabled(foundFilesTree->topLevelItemCount() > 0);
}
void FindFileDialog::findFiles()
{
QString wildCard = fileNameComboBox->currentText();
if (!wildCard.endsWith('*'))
wildCard += '*';
const QRegularExpression filePattern(QRegularExpression::wildcardToRegularExpression(wildCard));
const QDir directory(directoryComboBox->currentText());
const QStringList allFiles = directory.entryList(QDir::Files | QDir::NoSymLinks);
QStringList matchingFiles;
for (const QString &file : allFiles) {
if (filePattern.match(file).hasMatch())
matchingFiles << file;
}
showFiles(matchingFiles);
}
void FindFileDialog::showFiles(const QStringList &files)
{
foundFilesTree->clear();
for (const QString &file : files)
new QTreeWidgetItem(foundFilesTree, {file});
if (files.count() > 0)
foundFilesTree->setCurrentItem(foundFilesTree->topLevelItem(0));
}
void FindFileDialog::createButtons()
{
browseButton = new QToolButton;
browseButton->setText(tr("..."));
connect(browseButton, &QAbstractButton::clicked, this, &FindFileDialog::browse);
buttonBox = new QDialogButtonBox(QDialogButtonBox::Open
| QDialogButtonBox::Cancel
| QDialogButtonBox::Help);
connect(buttonBox, &QDialogButtonBox::accepted, this, &FindFileDialog::openFile);
connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
connect(buttonBox, &QDialogButtonBox::helpRequested, this, &FindFileDialog::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::AdjustToContents);
directoryComboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
connect(fileNameComboBox, &QComboBox::editTextChanged, this, &FindFileDialog::update);
connect(directoryComboBox, &QComboBox::currentTextChanged, this, &FindFileDialog::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, &QTreeWidget::itemActivated, this, &FindFileDialog::openFile);
}
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);
}