Commit 03a7b7d7 authored by Tobias Hunger's avatar Tobias Hunger
Browse files

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: default avatarNiels Weber <niels.weber@theqtcompany.com>
parent 70e0286f
......@@ -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
......
......@@ -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
......
......@@ -38,6 +38,7 @@
#include <utils/algorithm.h>
#include <QDialogButtonBox>
#include <QGridLayout>
#include <QHBoxLayout>
#include <QLineEdit>
#include <QPushButton>
......@@ -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,229 +510,246 @@ Qt::CheckState SelectableFilesModel::applyFilter(const QModelIndex &index)
}
//////////
// SelectableFilesDialogs
// SelectableFilesWidget
//////////
SelectableFilesDialogEditFiles::SelectableFilesDialogEditFiles(const Utils::FileName &path,
const Utils::FileNameList &files,
QWidget *parent)
: QDialog(parent)
{
QVBoxLayout *layout = new QVBoxLayout();
setLayout(layout);
setWindowTitle(tr("Edit Files"));
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)
{
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();
auto layout = new QGridLayout(this);
layout->setMargin(0);
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<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_view = new QTreeView(this);
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);
createShowFileFilterControls(layout);
createHideFileFilterControls(layout);
createApplyButton(layout);
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<int>(SelectableFilesWidgetRows::View), 0, 1, 4);
m_preservedFiles = new QLabel;
m_preservedFiles->hide();
layout->addWidget(m_preservedFiles);
layout->addWidget(m_preservedFilesLabel, static_cast<int>(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<int>(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()));
applyFilter();
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);
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());
startParsing();
}
void SelectableFilesDialogEditFiles::smartExpand(const QModelIndex &index)
void SelectableFilesWidget::cancelParsing()
{
if (m_view->model()->data(index, Qt::CheckStateRole) == Qt::PartiallyChecked) {
m_view->expand(index);
int rows = m_view->model()->rowCount(index);
for (int i = 0; i < rows; ++i)
smartExpand(index.child(i, 0));
}
if (m_model)
m_model->cancel();
}
Utils::FileNameList SelectableFilesDialogEditFiles::selectedFiles() const
void SelectableFilesWidget::enableWidgets(bool enabled)
{
return m_selectableFilesModel->selectedFiles();
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 SelectableFilesDialogEditFiles::setAddFileFilter(const QString &filter)
void SelectableFilesWidget::applyFilter()
{
m_showFilesfilterLineEdit->setText(filter);
if (m_model)
m_model->applyFilter(m_showFilesFilterEdit->text(), m_hideFilesFilterEdit->text());
}
void SelectableFilesDialogEditFiles::applyFilter()
void SelectableFilesWidget::baseDirectoryChanged(bool validState)
{
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);
m_startParsingButton->setEnabled(validState);
}
SelectableFilesDialogAddDirectory::SelectableFilesDialogAddDirectory(const Utils::FileName &path,
const Utils::FileNameList &files,
QWidget *parent) :
SelectableFilesDialogEditFiles(path, files, parent)
void SelectableFilesWidget::startParsing()
{
setWindowTitle(tr("Add Existing Directory"));
if (!m_model)
return;
connect(m_selectableFilesModel, SIGNAL(parsingFinished()), this, SLOT(parsingFinished()));
enableWidgets(false);
m_model->startParsing(m_baseDirChooser->fileName());
}
createPathChooser(static_cast<QVBoxLayout*>(layout()), path);
void SelectableFilesWidget::parsingProgress(const Utils::FileName &fileName)
{
m_progressLabel->setText(tr("Generating file list...\n\n%1").arg(fileName.toUserOutput()));
}
void SelectableFilesDialogAddDirectory::createPathChooser(QVBoxLayout *layout, const Utils::FileName &path)
void SelectableFilesWidget::parsingFinished()
{
QHBoxLayout *hbox = new QHBoxLayout;
if (!m_model)
return;
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);
m_model->selectAllFiles();
applyFilter();
hbox->addWidget(m_pathChooser);
layout->insertLayout(0, hbox);
smartExpand(m_model->index(0,0, QModelIndex()));
m_startParsingButton = new QPushButton(tr("Start Parsing"));
hbox->addWidget(m_startParsingButton);
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()));
connect(m_pathChooser, SIGNAL(validChanged(bool)), this, SLOT(validityOfDirectoryChanged(bool)));
connect(m_startParsingButton, SIGNAL(clicked()), this, SLOT(startParsing()));
enableWidgets(true);
}
void SelectableFilesDialogAddDirectory::validityOfDirectoryChanged(bool validState)
void SelectableFilesWidget::smartExpand(const QModelIndex &index)
{
m_startParsingButton->setEnabled(validState);
if (m_view->model()->data(index, Qt::CheckStateRole) == Qt::PartiallyChecked) {
m_view->expand(index);
int rows = m_view->model()->rowCount(index);
for (int i = 0; i < rows; ++i)
smartExpand(index.child(i, 0));
}
}
void SelectableFilesDialogAddDirectory::parsingFinished()
//////////
// SelectableFilesDialogs
//////////
SelectableFilesDialogEditFiles::SelectableFilesDialogEditFiles(const Utils::FileName &path,