From 03a7b7d7a9980cf24e96089895a0009f9ae05501 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Wed, 4 Nov 2015 14:56:09 +0100 Subject: [PATCH] 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 --- .../filesselectionwizardpage.cpp | 135 +------ .../filesselectionwizardpage.h | 26 +- .../projectexplorer/selectablefilesmodel.cpp | 355 +++++++++--------- .../projectexplorer/selectablefilesmodel.h | 94 +++-- 4 files changed, 255 insertions(+), 355 deletions(-) diff --git a/src/plugins/genericprojectmanager/filesselectionwizardpage.cpp b/src/plugins/genericprojectmanager/filesselectionwizardpage.cpp index aadd5e33ef2..a8cdf8a660e 100644 --- a/src/plugins/genericprojectmanager/filesselectionwizardpage.cpp +++ b/src/plugins/genericprojectmanager/filesselectionwizardpage.cpp @@ -45,129 +45,29 @@ namespace GenericProjectManager { namespace Internal { -FilesSelectionWizardPage::FilesSelectionWizardPage(GenericProjectWizardDialog *genericProjectWizard, QWidget *parent) - : QWizardPage(parent), m_genericProjectWizardDialog(genericProjectWizard), m_model(0), m_finished(false) +FilesSelectionWizardPage::FilesSelectionWizardPage(GenericProjectWizardDialog *genericProjectWizard, + QWidget *parent) : + QWizardPage(parent), + m_genericProjectWizardDialog(genericProjectWizard), + m_filesWidget(new ProjectExplorer::SelectableFilesWidget(this)) { QVBoxLayout *layout = new QVBoxLayout(this); - createShowFileFilterControls(layout); - createHideFileFilterControls(layout); - 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); + layout->addWidget(m_filesWidget); + m_filesWidget->setBaseDirEditable(false); 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() { - m_view->setModel(0); - delete m_model; - 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); + m_filesWidget->resetModel(Utils::FileName::fromString(m_genericProjectWizardDialog->path()), + Utils::FileNameList()); } void FilesSelectionWizardPage::cleanupPage() { - m_model->cancel(); -} - -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()); + m_filesWidget->cancelParsing(); } bool FilesSelectionWizardPage::isComplete() const @@ -177,23 +77,12 @@ bool FilesSelectionWizardPage::isComplete() const Utils::FileNameList FilesSelectionWizardPage::selectedPaths() const { - return m_model ? m_model->selectedPaths() : Utils::FileNameList(); + return m_filesWidget->selectedPaths(); } Utils::FileNameList FilesSelectionWizardPage::selectedFiles() const { - return m_model ? m_model->selectedFiles() : Utils::FileNameList(); -} - -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); + return m_filesWidget->selectedFiles(); } } // namespace Internal diff --git a/src/plugins/genericprojectmanager/filesselectionwizardpage.h b/src/plugins/genericprojectmanager/filesselectionwizardpage.h index e130f28f93a..50f862423c6 100644 --- a/src/plugins/genericprojectmanager/filesselectionwizardpage.h +++ b/src/plugins/genericprojectmanager/filesselectionwizardpage.h @@ -42,7 +42,7 @@ class QTreeView; class QLineEdit; QT_END_NAMESPACE -namespace ProjectExplorer { class SelectableFilesModel; } +namespace ProjectExplorer { class SelectableFilesWidget; } namespace GenericProjectManager { namespace Internal { @@ -61,30 +61,10 @@ public: Utils::FileNameList selectedFiles() const; Utils::FileNameList selectedPaths() const; -private slots: - void applyFilter(); - void parsingProgress(const Utils::FileName &text); - void parsingFinished(); - private: - void createHideFileFilterControls(QVBoxLayout *layout); - void createShowFileFilterControls(QVBoxLayout *layout); - void createApplyButton(QVBoxLayout *layout); - GenericProjectWizardDialog *m_genericProjectWizardDialog; - ProjectExplorer::SelectableFilesModel *m_model; - - QLabel *m_hideFilesFilterLabel; - QLineEdit *m_hideFilesfilterLineEdit; - - QLabel *m_showFilesFilterLabel; - QLineEdit *m_showFilesfilterLineEdit; - - QPushButton *m_applyFilterButton; - - QTreeView *m_view; - QLabel *m_label; - bool m_finished; + ProjectExplorer::SelectableFilesWidget *m_filesWidget; + bool m_finished = false; }; } // namespace Internal diff --git a/src/plugins/projectexplorer/selectablefilesmodel.cpp b/src/plugins/projectexplorer/selectablefilesmodel.cpp index 1cf07dd8d9d..53be72671bc 100644 --- a/src/plugins/projectexplorer/selectablefilesmodel.cpp +++ b/src/plugins/projectexplorer/selectablefilesmodel.cpp @@ -38,6 +38,7 @@ #include #include +#include #include #include #include @@ -78,7 +79,7 @@ void SelectableFilesModel::startParsing(const Utils::FileName &baseDir) m_baseDir = baseDir; // Build a tree in a future m_rootForFuture = new Tree; - m_rootForFuture->name = QLatin1Char('/'); + m_rootForFuture->name = baseDir.toUserOutput(); m_rootForFuture->parent = 0; m_rootForFuture->fullPath = baseDir; m_rootForFuture->isDir = true; @@ -181,8 +182,7 @@ void SelectableFilesModel::buildTree(const Utils::FileName &baseDir, Tree *tree, SelectableFilesModel::~SelectableFilesModel() { - m_watcher.cancel(); - m_watcher.waitForFinished(); + cancel(); delete m_root; } @@ -510,136 +510,192 @@ Qt::CheckState SelectableFilesModel::applyFilter(const QModelIndex &index) } ////////// -// SelectableFilesDialogs +// SelectableFilesWidget ////////// -SelectableFilesDialogEditFiles::SelectableFilesDialogEditFiles(const Utils::FileName &path, - const Utils::FileNameList &files, - QWidget *parent) - : QDialog(parent) +namespace { + +enum class SelectableFilesWidgetRows { + 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(); - setLayout(layout); - setWindowTitle(tr("Edit Files")); + const QString showFilter + = Core::ICore::settings()->value(QLatin1String(Constants::SHOW_FILE_FILTER_SETTING), + 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); - createHideFileFilterControls(layout); - createApplyButton(layout); + m_baseDirLabel->setText(tr("Source directory:")); + m_baseDirChooser->setHistoryCompleter(QLatin1String("PE.AddToProjectDir.History")); + m_startParsingButton->setText(tr("Start Parsing")); + layout->addWidget(m_baseDirLabel, static_cast(SelectableFilesWidgetRows::BaseDirectory), 0); + layout->addWidget(m_baseDirChooser->lineEdit(), static_cast(SelectableFilesWidgetRows::BaseDirectory), 1); + layout->addWidget(m_baseDirChooser->buttonAtIndex(0), static_cast(SelectableFilesWidgetRows::BaseDirectory), 2); + layout->addWidget(m_startParsingButton, static_cast(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(SelectableFilesWidgetRows::ShowFileFilter), 0); + layout->addWidget(m_showFilesFilterEdit, static_cast(SelectableFilesWidgetRows::ShowFileFilter), 1, 1, 3); + + m_hideFilesFilterLabel->setText(tr("Hide files matching:")); + m_hideFilesFilterEdit->setText(hideFilter); + layout->addWidget(m_hideFilesFilterLabel, static_cast(SelectableFilesWidgetRows::HideFileFilter), 0); + layout->addWidget(m_hideFilesFilterEdit, static_cast(SelectableFilesWidgetRows::HideFileFilter), 1, 1, 3); + + m_applyFilterButton->setText(tr("Apply Filter")); + layout->addWidget(m_applyFilterButton, static_cast(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->setHeaderHidden(true); - m_view->hide(); - layout->addWidget(m_view); + layout->addWidget(m_view, static_cast(SelectableFilesWidgetRows::View), 0, 1, 4); - m_preservedFiles = new QLabel; - m_preservedFiles->hide(); - layout->addWidget(m_preservedFiles); + layout->addWidget(m_preservedFilesLabel, static_cast(SelectableFilesWidgetRows::PreservedInformation), 0, 1, 4); - m_progressLabel = new QLabel(this); m_progressLabel->setMaximumWidth(500); - layout->addWidget(m_progressLabel); - - 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); + layout->addWidget(m_progressLabel, static_cast(SelectableFilesWidgetRows::Progress), 0, 1, 4); } -void SelectableFilesDialogEditFiles::createHideFileFilterControls(QVBoxLayout *layout) +SelectableFilesWidget::SelectableFilesWidget(const Utils::FileName &path, + const Utils::FileNameList &files, QWidget *parent) : + SelectableFilesWidget(parent) { - 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); + resetModel(path, files); } -void SelectableFilesDialogEditFiles::createShowFileFilterControls(QVBoxLayout *layout) +void SelectableFilesWidget::setAddFileFilter(const QString &filter) { - 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); + m_showFilesFilterEdit->setText(filter); } -void SelectableFilesDialogEditFiles::createApplyButton(QVBoxLayout *layout) +void SelectableFilesWidget::setBaseDirEditable(bool edit) { - 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, SIGNAL(clicked()), this, SLOT(applyFilter())); + m_baseDirLabel->setVisible(edit); + m_baseDirChooser->lineEdit()->setVisible(edit); + m_baseDirChooser->buttonAtIndex(0)->setVisible(edit); + m_startParsingButton->setVisible(edit); } -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_hideFilesfilterLineEdit->show(); + m_view->setModel(0); - m_showFilesFilterLabel->show(); - m_showFilesfilterLineEdit->show(); + delete m_model; + m_model = new SelectableFilesModel(this); - m_applyFilterButton->show(); - m_view->show(); - m_progressLabel->hide(); - m_view->expand(QModelIndex()); - smartExpand(m_selectableFilesModel->index(0,0, QModelIndex())); + m_model->setInitialMarkedFiles(files); + connect(m_model, &SelectableFilesModel::parsingProgress, + this, &SelectableFilesWidget::parsingProgress); + connect(m_model, &SelectableFilesModel::parsingFinished, + 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(); - const Utils::FileNameList preservedFiles = m_selectableFilesModel->preservedFiles(); - 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()); + smartExpand(m_model->index(0,0, QModelIndex())); + + 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) { 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 { - return m_selectableFilesModel->selectedFiles(); + return m_filesWidget->selectedFiles(); } -void SelectableFilesDialogEditFiles::setAddFileFilter(const QString &filter) -{ - m_showFilesfilterLineEdit->setText(filter); -} +////////// +// SelectableFilesDialogAddDirectory +////////// -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, const Utils::FileNameList &files, @@ -677,62 +749,7 @@ SelectableFilesDialogAddDirectory::SelectableFilesDialogAddDirectory(const Utils { setWindowTitle(tr("Add Existing Directory")); - connect(m_selectableFilesModel, SIGNAL(parsingFinished()), this, SLOT(parsingFinished())); - - createPathChooser(static_cast(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); + m_filesWidget->setBaseDirEditable(true); } } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/selectablefilesmodel.h b/src/plugins/projectexplorer/selectablefilesmodel.h index a201c4a623a..e637a53d16d 100644 --- a/src/plugins/projectexplorer/selectablefilesmodel.h +++ b/src/plugins/projectexplorer/selectablefilesmodel.h @@ -122,10 +122,8 @@ signals: void parsingFinished(); void parsingProgress(const Utils::FileName &fileName); -private slots: - void buildTreeFinished(); - private: + void buildTreeFinished(); QList parseFilter(const QString &filter); Qt::CheckState applyFilter(const QModelIndex &index); bool filter(Tree *t); @@ -152,6 +150,56 @@ private: QList 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 { Q_OBJECT @@ -159,35 +207,12 @@ class PROJECTEXPLORER_EXPORT SelectableFilesDialogEditFiles : public QDialog public: SelectableFilesDialogEditFiles(const Utils::FileName &path, const Utils::FileNameList &files, QWidget *parent); - ~SelectableFilesDialogEditFiles(); Utils::FileNameList selectedFiles() const; - void setAddFileFilter(const QString &filter); - -private slots: - void applyFilter(); - void parsingProgress(const QString &fileName); - void parsingFinished(); + void setAddFileFilter(const QString &filter) { m_filesWidget->setAddFileFilter(filter); } protected: - void smartExpand(const QModelIndex &index); - 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; + SelectableFilesWidget *m_filesWidget; }; class SelectableFilesDialogAddDirectory : public SelectableFilesDialogEditFiles @@ -198,18 +223,7 @@ public: SelectableFilesDialogAddDirectory(const Utils::FileName &path, const Utils::FileNameList &files, QWidget *parent); -private slots: - 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); + void setAddFileFilter(const QString &filter) { m_filesWidget->setAddFileFilter(filter); } }; } // namespace ProjectExplorer