SelectableFiles: Introduce a common widget

Introduce a SelectableFilesWidget and use it in the FileSelectionWizardPage
as well as in the two FileSelectionDialogs we have.

Change-Id: I56acaa7a9776ac2c0c16c548e95794a662b9cd27
Reviewed-by: Niels Weber <niels.weber@theqtcompany.com>
This commit is contained in:
Tobias Hunger
2015-11-04 14:56:09 +01:00
parent 70e0286f94
commit 03a7b7d7a9
4 changed files with 255 additions and 355 deletions

View File

@@ -45,129 +45,29 @@
namespace GenericProjectManager { namespace GenericProjectManager {
namespace Internal { namespace Internal {
FilesSelectionWizardPage::FilesSelectionWizardPage(GenericProjectWizardDialog *genericProjectWizard, QWidget *parent) FilesSelectionWizardPage::FilesSelectionWizardPage(GenericProjectWizardDialog *genericProjectWizard,
: QWizardPage(parent), m_genericProjectWizardDialog(genericProjectWizard), m_model(0), m_finished(false) QWidget *parent) :
QWizardPage(parent),
m_genericProjectWizardDialog(genericProjectWizard),
m_filesWidget(new ProjectExplorer::SelectableFilesWidget(this))
{ {
QVBoxLayout *layout = new QVBoxLayout(this); QVBoxLayout *layout = new QVBoxLayout(this);
createShowFileFilterControls(layout); layout->addWidget(m_filesWidget);
createHideFileFilterControls(layout); m_filesWidget->setBaseDirEditable(false);
createApplyButton(layout);
m_view = new QTreeView;
m_view->setMinimumSize(500, 400);
m_view->setHeaderHidden(true);
m_view->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding);
m_label = new QLabel;
m_label->setMaximumWidth(500);
layout->addWidget(m_view);
layout->addWidget(m_label);
setProperty(Utils::SHORT_TITLE_PROPERTY, tr("Files")); setProperty(Utils::SHORT_TITLE_PROPERTY, tr("Files"));
} }
void FilesSelectionWizardPage::createHideFileFilterControls(QVBoxLayout *layout)
{
QHBoxLayout *hbox = new QHBoxLayout;
m_hideFilesFilterLabel = new QLabel;
m_hideFilesFilterLabel->setText(tr("Hide files matching:"));
m_hideFilesFilterLabel->hide();
hbox->addWidget(m_hideFilesFilterLabel);
m_hideFilesfilterLineEdit = new QLineEdit;
const QString filter = Core::ICore::settings()->value(QLatin1String(Constants::HIDE_FILE_FILTER_SETTING),
QLatin1String(Constants::HIDE_FILE_FILTER_DEFAULT)).toString();
m_hideFilesfilterLineEdit->setText(filter);
m_hideFilesfilterLineEdit->hide();
hbox->addWidget(m_hideFilesfilterLineEdit);
layout->addLayout(hbox);
}
void FilesSelectionWizardPage::createShowFileFilterControls(QVBoxLayout *layout)
{
QHBoxLayout *hbox = new QHBoxLayout;
m_showFilesFilterLabel = new QLabel;
m_showFilesFilterLabel->setText(tr("Show files matching:"));
m_showFilesFilterLabel->hide();
hbox->addWidget(m_showFilesFilterLabel);
m_showFilesfilterLineEdit = new QLineEdit;
const QString filter = Core::ICore::settings()->value(QLatin1String(Constants::SHOW_FILE_FILTER_SETTING),
QLatin1String(Constants::SHOW_FILE_FILTER_DEFAULT)).toString();
m_showFilesfilterLineEdit->setText(filter);
m_showFilesfilterLineEdit->hide();
hbox->addWidget(m_showFilesfilterLineEdit);
layout->addLayout(hbox);
}
void FilesSelectionWizardPage::createApplyButton(QVBoxLayout *layout)
{
QHBoxLayout *hbox = new QHBoxLayout;
QSpacerItem *horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
hbox->addItem(horizontalSpacer);
m_applyFilterButton = new QPushButton(tr("Apply Filter"), this);
m_applyFilterButton->hide();
hbox->addWidget(m_applyFilterButton);
layout->addLayout(hbox);
connect(m_applyFilterButton, &QPushButton::clicked, this, &FilesSelectionWizardPage::applyFilter);
}
void FilesSelectionWizardPage::initializePage() void FilesSelectionWizardPage::initializePage()
{ {
m_view->setModel(0); m_filesWidget->resetModel(Utils::FileName::fromString(m_genericProjectWizardDialog->path()),
delete m_model; Utils::FileNameList());
m_model = new ProjectExplorer::SelectableFilesModel(this);
connect(m_model, &ProjectExplorer::SelectableFilesModel::parsingProgress,
this, &FilesSelectionWizardPage::parsingProgress);
connect(m_model, &ProjectExplorer::SelectableFilesModel::parsingFinished,
this, &FilesSelectionWizardPage::parsingFinished);
m_model->startParsing(Utils::FileName::fromString(m_genericProjectWizardDialog->path()));
m_hideFilesFilterLabel->setVisible(false);
m_hideFilesfilterLineEdit->setVisible(false);
m_showFilesFilterLabel->setVisible(false);
m_showFilesfilterLineEdit->setVisible(false);
m_applyFilterButton->setVisible(false);
m_view->setVisible(false);
m_label->setVisible(true);
m_view->setModel(m_model);
} }
void FilesSelectionWizardPage::cleanupPage() void FilesSelectionWizardPage::cleanupPage()
{ {
m_model->cancel(); m_filesWidget->cancelParsing();
}
void FilesSelectionWizardPage::parsingProgress(const Utils::FileName &text)
{
m_label->setText(tr("Generating file list...\n\n%1").arg(text.toUserOutput()));
}
void FilesSelectionWizardPage::parsingFinished()
{
m_finished = true;
m_hideFilesFilterLabel->setVisible(true);
m_hideFilesfilterLineEdit->setVisible(true);
m_showFilesFilterLabel->setVisible(true);
m_showFilesfilterLineEdit->setVisible(true);
m_applyFilterButton->setVisible(true);
m_view->setVisible(true);
m_label->setVisible(false);
m_view->expand(m_view->model()->index(0,0, QModelIndex()));
emit completeChanged();
applyFilter();
// work around qt
m_genericProjectWizardDialog->setTitleFormat(m_genericProjectWizardDialog->titleFormat());
} }
bool FilesSelectionWizardPage::isComplete() const bool FilesSelectionWizardPage::isComplete() const
@@ -177,23 +77,12 @@ bool FilesSelectionWizardPage::isComplete() const
Utils::FileNameList FilesSelectionWizardPage::selectedPaths() const Utils::FileNameList FilesSelectionWizardPage::selectedPaths() const
{ {
return m_model ? m_model->selectedPaths() : Utils::FileNameList(); return m_filesWidget->selectedPaths();
} }
Utils::FileNameList FilesSelectionWizardPage::selectedFiles() const Utils::FileNameList FilesSelectionWizardPage::selectedFiles() const
{ {
return m_model ? m_model->selectedFiles() : Utils::FileNameList(); return m_filesWidget->selectedFiles();
}
void FilesSelectionWizardPage::applyFilter()
{
const QString showFilesFilter = m_showFilesfilterLineEdit->text();
Core::ICore::settings()->setValue(QLatin1String(Constants::SHOW_FILE_FILTER_SETTING), showFilesFilter);
const QString hideFilesFilter = m_hideFilesfilterLineEdit->text();
Core::ICore::settings()->setValue(QLatin1String(Constants::HIDE_FILE_FILTER_SETTING), hideFilesFilter);
m_model->applyFilter(showFilesFilter, hideFilesFilter);
} }
} // namespace Internal } // namespace Internal

View File

@@ -42,7 +42,7 @@ class QTreeView;
class QLineEdit; class QLineEdit;
QT_END_NAMESPACE QT_END_NAMESPACE
namespace ProjectExplorer { class SelectableFilesModel; } namespace ProjectExplorer { class SelectableFilesWidget; }
namespace GenericProjectManager { namespace GenericProjectManager {
namespace Internal { namespace Internal {
@@ -61,30 +61,10 @@ public:
Utils::FileNameList selectedFiles() const; Utils::FileNameList selectedFiles() const;
Utils::FileNameList selectedPaths() const; Utils::FileNameList selectedPaths() const;
private slots:
void applyFilter();
void parsingProgress(const Utils::FileName &text);
void parsingFinished();
private: private:
void createHideFileFilterControls(QVBoxLayout *layout);
void createShowFileFilterControls(QVBoxLayout *layout);
void createApplyButton(QVBoxLayout *layout);
GenericProjectWizardDialog *m_genericProjectWizardDialog; GenericProjectWizardDialog *m_genericProjectWizardDialog;
ProjectExplorer::SelectableFilesModel *m_model; ProjectExplorer::SelectableFilesWidget *m_filesWidget;
bool m_finished = false;
QLabel *m_hideFilesFilterLabel;
QLineEdit *m_hideFilesfilterLineEdit;
QLabel *m_showFilesFilterLabel;
QLineEdit *m_showFilesfilterLineEdit;
QPushButton *m_applyFilterButton;
QTreeView *m_view;
QLabel *m_label;
bool m_finished;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -38,6 +38,7 @@
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <QDialogButtonBox> #include <QDialogButtonBox>
#include <QGridLayout>
#include <QHBoxLayout> #include <QHBoxLayout>
#include <QLineEdit> #include <QLineEdit>
#include <QPushButton> #include <QPushButton>
@@ -78,7 +79,7 @@ void SelectableFilesModel::startParsing(const Utils::FileName &baseDir)
m_baseDir = baseDir; m_baseDir = baseDir;
// Build a tree in a future // Build a tree in a future
m_rootForFuture = new Tree; m_rootForFuture = new Tree;
m_rootForFuture->name = QLatin1Char('/'); m_rootForFuture->name = baseDir.toUserOutput();
m_rootForFuture->parent = 0; m_rootForFuture->parent = 0;
m_rootForFuture->fullPath = baseDir; m_rootForFuture->fullPath = baseDir;
m_rootForFuture->isDir = true; m_rootForFuture->isDir = true;
@@ -181,8 +182,7 @@ void SelectableFilesModel::buildTree(const Utils::FileName &baseDir, Tree *tree,
SelectableFilesModel::~SelectableFilesModel() SelectableFilesModel::~SelectableFilesModel()
{ {
m_watcher.cancel(); cancel();
m_watcher.waitForFinished();
delete m_root; delete m_root;
} }
@@ -510,136 +510,192 @@ Qt::CheckState SelectableFilesModel::applyFilter(const QModelIndex &index)
} }
////////// //////////
// SelectableFilesDialogs // SelectableFilesWidget
////////// //////////
SelectableFilesDialogEditFiles::SelectableFilesDialogEditFiles(const Utils::FileName &path, namespace {
const Utils::FileNameList &files,
QWidget *parent) enum class SelectableFilesWidgetRows {
: QDialog(parent) BaseDirectory, ShowFileFilter, HideFileFilter, ApplyButton, View, Progress, PreservedInformation
};
} // namespace
SelectableFilesWidget::SelectableFilesWidget(QWidget *parent) :
QWidget(parent),
m_model(0),
m_baseDirChooser(new Utils::PathChooser),
m_baseDirLabel(new QLabel),
m_startParsingButton(new QPushButton),
m_showFilesFilterLabel(new QLabel),
m_showFilesFilterEdit(new QLineEdit),
m_hideFilesFilterLabel(new QLabel),
m_hideFilesFilterEdit(new QLineEdit),
m_applyFilterButton(new QPushButton),
m_view(new QTreeView),
m_preservedFilesLabel(new QLabel),
m_progressLabel(new QLabel)
{ {
QVBoxLayout *layout = new QVBoxLayout(); const QString showFilter
setLayout(layout); = Core::ICore::settings()->value(QLatin1String(Constants::SHOW_FILE_FILTER_SETTING),
setWindowTitle(tr("Edit Files")); QLatin1String(Constants::SHOW_FILE_FILTER_DEFAULT)).toString();
const QString hideFilter
= Core::ICore::settings()->value(QLatin1String(Constants::HIDE_FILE_FILTER_SETTING),
QLatin1String(Constants::HIDE_FILE_FILTER_DEFAULT)).toString();
m_view = new QTreeView(this); auto layout = new QGridLayout(this);
layout->setMargin(0);
createShowFileFilterControls(layout); m_baseDirLabel->setText(tr("Source directory:"));
createHideFileFilterControls(layout); m_baseDirChooser->setHistoryCompleter(QLatin1String("PE.AddToProjectDir.History"));
createApplyButton(layout); m_startParsingButton->setText(tr("Start Parsing"));
layout->addWidget(m_baseDirLabel, static_cast<int>(SelectableFilesWidgetRows::BaseDirectory), 0);
layout->addWidget(m_baseDirChooser->lineEdit(), static_cast<int>(SelectableFilesWidgetRows::BaseDirectory), 1);
layout->addWidget(m_baseDirChooser->buttonAtIndex(0), static_cast<int>(SelectableFilesWidgetRows::BaseDirectory), 2);
layout->addWidget(m_startParsingButton, static_cast<int>(SelectableFilesWidgetRows::BaseDirectory), 3);
connect(m_baseDirChooser, &Utils::PathChooser::validChanged,
this, &SelectableFilesWidget::baseDirectoryChanged);
connect(m_startParsingButton, &QAbstractButton::clicked,
this, &SelectableFilesWidget::startParsing);
m_showFilesFilterLabel->setText(tr("Show files matching:"));
m_showFilesFilterEdit->setText(showFilter);
layout->addWidget(m_showFilesFilterLabel, static_cast<int>(SelectableFilesWidgetRows::ShowFileFilter), 0);
layout->addWidget(m_showFilesFilterEdit, static_cast<int>(SelectableFilesWidgetRows::ShowFileFilter), 1, 1, 3);
m_hideFilesFilterLabel->setText(tr("Hide files matching:"));
m_hideFilesFilterEdit->setText(hideFilter);
layout->addWidget(m_hideFilesFilterLabel, static_cast<int>(SelectableFilesWidgetRows::HideFileFilter), 0);
layout->addWidget(m_hideFilesFilterEdit, static_cast<int>(SelectableFilesWidgetRows::HideFileFilter), 1, 1, 3);
m_applyFilterButton->setText(tr("Apply Filter"));
layout->addWidget(m_applyFilterButton, static_cast<int>(SelectableFilesWidgetRows::ApplyButton), 3);
connect(m_applyFilterButton, &QAbstractButton::clicked, this, &SelectableFilesWidget::applyFilter);
m_selectableFilesModel = new SelectableFilesModel(this);
m_selectableFilesModel->setInitialMarkedFiles(files);
m_view->setModel(m_selectableFilesModel);
m_view->setMinimumSize(500, 400); m_view->setMinimumSize(500, 400);
m_view->setHeaderHidden(true); m_view->setHeaderHidden(true);
m_view->hide(); layout->addWidget(m_view, static_cast<int>(SelectableFilesWidgetRows::View), 0, 1, 4);
layout->addWidget(m_view);
m_preservedFiles = new QLabel; layout->addWidget(m_preservedFilesLabel, static_cast<int>(SelectableFilesWidgetRows::PreservedInformation), 0, 1, 4);
m_preservedFiles->hide();
layout->addWidget(m_preservedFiles);
m_progressLabel = new QLabel(this);
m_progressLabel->setMaximumWidth(500); m_progressLabel->setMaximumWidth(500);
layout->addWidget(m_progressLabel); layout->addWidget(m_progressLabel, static_cast<int>(SelectableFilesWidgetRows::Progress), 0, 1, 4);
QDialogButtonBox *buttonBox = new QDialogButtonBox(Qt::Horizontal, this);
buttonBox->setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
connect(buttonBox, SIGNAL(accepted()),
this, SLOT(accept()));
connect(buttonBox, SIGNAL(rejected()),
this, SLOT(reject()));
layout->addWidget(buttonBox);
connect(m_selectableFilesModel, SIGNAL(parsingProgress(QString)),
this, SLOT(parsingProgress(QString)));
connect(m_selectableFilesModel, SIGNAL(parsingFinished()),
this, SLOT(parsingFinished()));
m_selectableFilesModel->startParsing(path);
} }
void SelectableFilesDialogEditFiles::createHideFileFilterControls(QVBoxLayout *layout) SelectableFilesWidget::SelectableFilesWidget(const Utils::FileName &path,
const Utils::FileNameList &files, QWidget *parent) :
SelectableFilesWidget(parent)
{ {
QHBoxLayout *hbox = new QHBoxLayout; resetModel(path, files);
m_hideFilesFilterLabel = new QLabel;
m_hideFilesFilterLabel->setText(tr("Hide files matching:"));
m_hideFilesFilterLabel->hide();
hbox->addWidget(m_hideFilesFilterLabel);
m_hideFilesfilterLineEdit = new QLineEdit;
const QString filter = Core::ICore::settings()->value(QLatin1String(Constants::HIDE_FILE_FILTER_SETTING),
QLatin1String(Constants::HIDE_FILE_FILTER_DEFAULT)).toString();
m_hideFilesfilterLineEdit->setText(filter);
m_hideFilesfilterLineEdit->hide();
hbox->addWidget(m_hideFilesfilterLineEdit);
layout->addLayout(hbox);
} }
void SelectableFilesDialogEditFiles::createShowFileFilterControls(QVBoxLayout *layout) void SelectableFilesWidget::setAddFileFilter(const QString &filter)
{ {
QHBoxLayout *hbox = new QHBoxLayout; m_showFilesFilterEdit->setText(filter);
m_showFilesFilterLabel = new QLabel;
m_showFilesFilterLabel->setText(tr("Show files matching:"));
m_showFilesFilterLabel->hide();
hbox->addWidget(m_showFilesFilterLabel);
m_showFilesfilterLineEdit = new QLineEdit;
const QString filter = Core::ICore::settings()->value(QLatin1String(Constants::SHOW_FILE_FILTER_SETTING),
QLatin1String(Constants::SHOW_FILE_FILTER_DEFAULT)).toString();
m_showFilesfilterLineEdit->setText(filter);
m_showFilesfilterLineEdit->hide();
hbox->addWidget(m_showFilesfilterLineEdit);
layout->addLayout(hbox);
} }
void SelectableFilesDialogEditFiles::createApplyButton(QVBoxLayout *layout) void SelectableFilesWidget::setBaseDirEditable(bool edit)
{ {
QHBoxLayout *hbox = new QHBoxLayout; m_baseDirLabel->setVisible(edit);
m_baseDirChooser->lineEdit()->setVisible(edit);
QSpacerItem *horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); m_baseDirChooser->buttonAtIndex(0)->setVisible(edit);
hbox->addItem(horizontalSpacer); m_startParsingButton->setVisible(edit);
m_applyFilterButton = new QPushButton(tr("Apply Filter"), this);
m_applyFilterButton->hide();
hbox->addWidget(m_applyFilterButton);
layout->addLayout(hbox);
connect(m_applyFilterButton, SIGNAL(clicked()), this, SLOT(applyFilter()));
} }
SelectableFilesDialogEditFiles::~SelectableFilesDialogEditFiles() Utils::FileNameList SelectableFilesWidget::selectedFiles() const
{ {
m_selectableFilesModel->cancel(); return m_model ? m_model->selectedFiles() : Utils::FileNameList();
} }
void SelectableFilesDialogEditFiles::parsingProgress(const QString &fileName) Utils::FileNameList SelectableFilesWidget::selectedPaths() const
{ {
m_progressLabel->setText(tr("Generating file list...\n\n%1").arg(fileName)); return m_model ? m_model->selectedPaths() : Utils::FileNameList();
} }
void SelectableFilesDialogEditFiles::parsingFinished() void SelectableFilesWidget::resetModel(const Utils::FileName &path, const Utils::FileNameList &files)
{ {
m_hideFilesFilterLabel->show(); m_view->setModel(0);
m_hideFilesfilterLineEdit->show();
m_showFilesFilterLabel->show(); delete m_model;
m_showFilesfilterLineEdit->show(); m_model = new SelectableFilesModel(this);
m_applyFilterButton->show(); m_model->setInitialMarkedFiles(files);
m_view->show(); connect(m_model, &SelectableFilesModel::parsingProgress,
m_progressLabel->hide(); this, &SelectableFilesWidget::parsingProgress);
m_view->expand(QModelIndex()); connect(m_model, &SelectableFilesModel::parsingFinished,
smartExpand(m_selectableFilesModel->index(0,0, QModelIndex())); this, &SelectableFilesWidget::parsingFinished);
m_baseDirChooser->setFileName(path);
m_view->setModel(m_model);
startParsing();
}
void SelectableFilesWidget::cancelParsing()
{
if (m_model)
m_model->cancel();
}
void SelectableFilesWidget::enableWidgets(bool enabled)
{
m_hideFilesFilterEdit->setEnabled(enabled);
m_showFilesFilterEdit->setEnabled(enabled);
m_applyFilterButton->setEnabled(enabled);
m_view->setEnabled(enabled);
m_baseDirChooser->setEnabled(enabled);
m_startParsingButton->setEnabled(enabled);
m_progressLabel->setVisible(!enabled);
m_preservedFilesLabel->setVisible(m_model && !m_model->preservedFiles().isEmpty());
}
void SelectableFilesWidget::applyFilter()
{
if (m_model)
m_model->applyFilter(m_showFilesFilterEdit->text(), m_hideFilesFilterEdit->text());
}
void SelectableFilesWidget::baseDirectoryChanged(bool validState)
{
m_startParsingButton->setEnabled(validState);
}
void SelectableFilesWidget::startParsing()
{
if (!m_model)
return;
enableWidgets(false);
m_model->startParsing(m_baseDirChooser->fileName());
}
void SelectableFilesWidget::parsingProgress(const Utils::FileName &fileName)
{
m_progressLabel->setText(tr("Generating file list...\n\n%1").arg(fileName.toUserOutput()));
}
void SelectableFilesWidget::parsingFinished()
{
if (!m_model)
return;
m_model->selectAllFiles();
applyFilter(); applyFilter();
const Utils::FileNameList preservedFiles = m_selectableFilesModel->preservedFiles(); smartExpand(m_model->index(0,0, QModelIndex()));
m_preservedFiles->setText(tr("Not showing %n files that are outside of the base directory.\nThese files are preserved.", 0, preservedFiles.count()));
m_preservedFiles->setVisible(!preservedFiles.isEmpty()); const Utils::FileNameList preservedFiles = m_model->preservedFiles();
m_preservedFilesLabel->setText(tr("Not showing %n files that are outside of the base directory.\n"
"These files are preserved.", 0, preservedFiles.count()));
enableWidgets(true);
} }
void SelectableFilesDialogEditFiles::smartExpand(const QModelIndex &index) void SelectableFilesWidget::smartExpand(const QModelIndex &index)
{ {
if (m_view->model()->data(index, Qt::CheckStateRole) == Qt::PartiallyChecked) { if (m_view->model()->data(index, Qt::CheckStateRole) == Qt::PartiallyChecked) {
m_view->expand(index); m_view->expand(index);
@@ -649,26 +705,42 @@ void SelectableFilesDialogEditFiles::smartExpand(const QModelIndex &index)
} }
} }
//////////
// SelectableFilesDialogs
//////////
SelectableFilesDialogEditFiles::SelectableFilesDialogEditFiles(const Utils::FileName &path,
const Utils::FileNameList &files,
QWidget *parent) :
QDialog(parent),
m_filesWidget(new SelectableFilesWidget(path, files))
{
setWindowTitle(tr("Edit Files"));
auto layout = new QVBoxLayout(this);
layout->addWidget(m_filesWidget);
m_filesWidget->setBaseDirEditable(false);
QDialogButtonBox *buttonBox = new QDialogButtonBox(Qt::Horizontal, this);
buttonBox->setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
connect(buttonBox, SIGNAL(accepted()),
this, SLOT(accept()));
connect(buttonBox, SIGNAL(rejected()),
this, SLOT(reject()));
layout->addWidget(buttonBox);
}
Utils::FileNameList SelectableFilesDialogEditFiles::selectedFiles() const Utils::FileNameList SelectableFilesDialogEditFiles::selectedFiles() const
{ {
return m_selectableFilesModel->selectedFiles(); return m_filesWidget->selectedFiles();
} }
void SelectableFilesDialogEditFiles::setAddFileFilter(const QString &filter) //////////
{ // SelectableFilesDialogAddDirectory
m_showFilesfilterLineEdit->setText(filter); //////////
}
void SelectableFilesDialogEditFiles::applyFilter()
{
const QString showFilesFilter = m_showFilesfilterLineEdit->text();
Core::ICore::settings()->setValue(QLatin1String(Constants::SHOW_FILE_FILTER_SETTING), showFilesFilter);
const QString hideFilesFilter = m_hideFilesfilterLineEdit->text();
Core::ICore::settings()->setValue(QLatin1String(Constants::HIDE_FILE_FILTER_SETTING), hideFilesFilter);
m_selectableFilesModel->applyFilter(showFilesFilter, hideFilesFilter);
}
SelectableFilesDialogAddDirectory::SelectableFilesDialogAddDirectory(const Utils::FileName &path, SelectableFilesDialogAddDirectory::SelectableFilesDialogAddDirectory(const Utils::FileName &path,
const Utils::FileNameList &files, const Utils::FileNameList &files,
@@ -677,62 +749,7 @@ SelectableFilesDialogAddDirectory::SelectableFilesDialogAddDirectory(const Utils
{ {
setWindowTitle(tr("Add Existing Directory")); setWindowTitle(tr("Add Existing Directory"));
connect(m_selectableFilesModel, SIGNAL(parsingFinished()), this, SLOT(parsingFinished())); m_filesWidget->setBaseDirEditable(true);
createPathChooser(static_cast<QVBoxLayout*>(layout()), path);
}
void SelectableFilesDialogAddDirectory::createPathChooser(QVBoxLayout *layout, const Utils::FileName &path)
{
QHBoxLayout *hbox = new QHBoxLayout;
m_pathChooser = new Utils::PathChooser;
m_pathChooser->setFileName(path);
m_pathChooser->setHistoryCompleter(QLatin1String("PE.AddToProjectDir.History"));
m_sourceDirectoryLabel = new QLabel(tr("Source directory:"));
hbox->addWidget(m_sourceDirectoryLabel);
hbox->addWidget(m_pathChooser);
layout->insertLayout(0, hbox);
m_startParsingButton = new QPushButton(tr("Start Parsing"));
hbox->addWidget(m_startParsingButton);
connect(m_pathChooser, SIGNAL(validChanged(bool)), this, SLOT(validityOfDirectoryChanged(bool)));
connect(m_startParsingButton, SIGNAL(clicked()), this, SLOT(startParsing()));
}
void SelectableFilesDialogAddDirectory::validityOfDirectoryChanged(bool validState)
{
m_startParsingButton->setEnabled(validState);
}
void SelectableFilesDialogAddDirectory::parsingFinished()
{
m_selectableFilesModel->selectAllFiles();
m_selectableFilesModel->applyFilter(m_showFilesfilterLineEdit->text(),
m_hideFilesfilterLineEdit->text());
setWidgetsEnabled(true);
}
void SelectableFilesDialogAddDirectory::startParsing()
{
setWidgetsEnabled(false);
m_selectableFilesModel->startParsing(m_pathChooser->fileName());
}
void SelectableFilesDialogAddDirectory::setWidgetsEnabled(bool enabled)
{
m_hideFilesfilterLineEdit->setEnabled(enabled);
m_showFilesfilterLineEdit->setEnabled(enabled);
m_applyFilterButton->setEnabled(enabled);
m_view->setEnabled(enabled);
m_pathChooser->setEnabled(enabled);
m_startParsingButton->setVisible(enabled);
m_progressLabel->setVisible(!enabled);
} }
} // namespace ProjectExplorer } // namespace ProjectExplorer

View File

@@ -122,10 +122,8 @@ signals:
void parsingFinished(); void parsingFinished();
void parsingProgress(const Utils::FileName &fileName); void parsingProgress(const Utils::FileName &fileName);
private slots:
void buildTreeFinished();
private: private:
void buildTreeFinished();
QList<Glob> parseFilter(const QString &filter); QList<Glob> parseFilter(const QString &filter);
Qt::CheckState applyFilter(const QModelIndex &index); Qt::CheckState applyFilter(const QModelIndex &index);
bool filter(Tree *t); bool filter(Tree *t);
@@ -152,6 +150,56 @@ private:
QList<Glob> m_showFilesFilter; QList<Glob> m_showFilesFilter;
}; };
class PROJECTEXPLORER_EXPORT SelectableFilesWidget : public QWidget
{
Q_OBJECT
public:
explicit SelectableFilesWidget(QWidget *parent = 0);
SelectableFilesWidget(const Utils::FileName &path, const Utils::FileNameList &files,
QWidget *parent = 0);
void setAddFileFilter(const QString &filter);
void setBaseDirEditable(bool edit);
Utils::FileNameList selectedFiles() const;
Utils::FileNameList selectedPaths() const;
void resetModel(const Utils::FileName &path, const Utils::FileNameList &files);
void cancelParsing();
private:
void enableWidgets(bool enabled);
void applyFilter();
void baseDirectoryChanged(bool validState);
void startParsing();
void parsingProgress(const Utils::FileName &fileName);
void parsingFinished();
void smartExpand(const QModelIndex &index);
SelectableFilesModel *m_model;
Utils::PathChooser *m_baseDirChooser;
QLabel *m_baseDirLabel;
QPushButton *m_startParsingButton;
QLabel *m_showFilesFilterLabel;
QLineEdit *m_showFilesFilterEdit;
QLabel *m_hideFilesFilterLabel;
QLineEdit *m_hideFilesFilterEdit;
QPushButton *m_applyFilterButton;
QTreeView *m_view;
QLabel *m_preservedFilesLabel;
QLabel *m_progressLabel;
};
class PROJECTEXPLORER_EXPORT SelectableFilesDialogEditFiles : public QDialog class PROJECTEXPLORER_EXPORT SelectableFilesDialogEditFiles : public QDialog
{ {
Q_OBJECT Q_OBJECT
@@ -159,35 +207,12 @@ class PROJECTEXPLORER_EXPORT SelectableFilesDialogEditFiles : public QDialog
public: public:
SelectableFilesDialogEditFiles(const Utils::FileName &path, const Utils::FileNameList &files, SelectableFilesDialogEditFiles(const Utils::FileName &path, const Utils::FileNameList &files,
QWidget *parent); QWidget *parent);
~SelectableFilesDialogEditFiles();
Utils::FileNameList selectedFiles() const; Utils::FileNameList selectedFiles() const;
void setAddFileFilter(const QString &filter); void setAddFileFilter(const QString &filter) { m_filesWidget->setAddFileFilter(filter); }
private slots:
void applyFilter();
void parsingProgress(const QString &fileName);
void parsingFinished();
protected: protected:
void smartExpand(const QModelIndex &index); SelectableFilesWidget *m_filesWidget;
void createShowFileFilterControls(QVBoxLayout *layout);
void createHideFileFilterControls(QVBoxLayout *layout);
void createApplyButton(QVBoxLayout *layout);
SelectableFilesModel *m_selectableFilesModel;
QLabel *m_hideFilesFilterLabel;
QLineEdit *m_hideFilesfilterLineEdit;
QLabel *m_showFilesFilterLabel;
QLineEdit *m_showFilesfilterLineEdit;
QPushButton *m_applyFilterButton;
QTreeView *m_view;
QLabel *m_preservedFiles;
QLabel *m_progressLabel;
}; };
class SelectableFilesDialogAddDirectory : public SelectableFilesDialogEditFiles class SelectableFilesDialogAddDirectory : public SelectableFilesDialogEditFiles
@@ -198,18 +223,7 @@ public:
SelectableFilesDialogAddDirectory(const Utils::FileName &path, const Utils::FileNameList &files, SelectableFilesDialogAddDirectory(const Utils::FileName &path, const Utils::FileNameList &files,
QWidget *parent); QWidget *parent);
private slots: void setAddFileFilter(const QString &filter) { m_filesWidget->setAddFileFilter(filter); }
void validityOfDirectoryChanged(bool validState);
void parsingFinished();
void startParsing();
private:
Utils::PathChooser *m_pathChooser;
QLabel *m_sourceDirectoryLabel;
QPushButton *m_startParsingButton;
void setWidgetsEnabled(bool enabled);
void createPathChooser(QVBoxLayout *layout, const Utils::FileName &path);
}; };
} // namespace ProjectExplorer } // namespace ProjectExplorer