forked from qt-creator/qt-creator
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:
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user