forked from qt-creator/qt-creator
FolderNodes: Specify filter for Add Existing Directory
Allow foldernodes to specify which files they care for when doing "Add Existing Directory". Before we used a fixed list with C++ header and source files, which does make no sense for e.g. adding to resources. Task-number: QTCREATORBUG-15278 Change-Id: I15dad133391485c2bcebd2d864623304b31b5f8f Reviewed-by: Niels Weber <niels.weber@theqtcompany.com>
This commit is contained in:
@@ -3151,6 +3151,7 @@ void ProjectExplorerPluginPrivate::addExistingDirectory()
|
|||||||
QTC_ASSERT(folderNode, return);
|
QTC_ASSERT(folderNode, return);
|
||||||
|
|
||||||
SelectableFilesDialogAddDirectory dialog(directoryFor(ProjectTree::currentNode()), QStringList(), ICore::mainWindow());
|
SelectableFilesDialogAddDirectory dialog(directoryFor(ProjectTree::currentNode()), QStringList(), ICore::mainWindow());
|
||||||
|
dialog.setAddFileFilter(folderNode->addFileFilter());
|
||||||
|
|
||||||
if (dialog.exec() == QDialog::Accepted)
|
if (dialog.exec() == QDialog::Accepted)
|
||||||
ProjectExplorerPlugin::addExistingFiles(folderNode, dialog.selectedFiles());
|
ProjectExplorerPlugin::addExistingFiles(folderNode, dialog.selectedFiles());
|
||||||
|
|||||||
@@ -309,6 +309,11 @@ void FolderNode::setIcon(const QIcon &icon)
|
|||||||
m_icon = icon;
|
m_icon = icon;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString FolderNode::addFileFilter() const
|
||||||
|
{
|
||||||
|
return parentFolderNode()->addFileFilter();
|
||||||
|
}
|
||||||
|
|
||||||
bool FolderNode::addFiles(const QStringList &filePaths, QStringList *notAdded)
|
bool FolderNode::addFiles(const QStringList &filePaths, QStringList *notAdded)
|
||||||
{
|
{
|
||||||
if (projectNode())
|
if (projectNode())
|
||||||
@@ -764,6 +769,11 @@ QList<ProjectNode*> SessionNode::projectNodes() const
|
|||||||
return m_projectNodes;
|
return m_projectNodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString SessionNode::addFileFilter() const
|
||||||
|
{
|
||||||
|
return QLatin1String("*.c; *.cc; *.cpp; *.cp; *.cxx; *.c++; *.h; *.hh; *.hpp; *.hxx;");
|
||||||
|
}
|
||||||
|
|
||||||
void SessionNode::addProjectNodes(const QList<ProjectNode*> &projectNodes)
|
void SessionNode::addProjectNodes(const QList<ProjectNode*> &projectNodes)
|
||||||
{
|
{
|
||||||
if (!projectNodes.isEmpty()) {
|
if (!projectNodes.isEmpty()) {
|
||||||
|
|||||||
@@ -184,6 +184,8 @@ public:
|
|||||||
void setDisplayName(const QString &name);
|
void setDisplayName(const QString &name);
|
||||||
void setIcon(const QIcon &icon);
|
void setIcon(const QIcon &icon);
|
||||||
|
|
||||||
|
virtual QString addFileFilter() const;
|
||||||
|
|
||||||
virtual bool addFiles(const QStringList &filePaths, QStringList *notAdded = 0);
|
virtual bool addFiles(const QStringList &filePaths, QStringList *notAdded = 0);
|
||||||
virtual bool removeFiles(const QStringList &filePaths, QStringList *notRemoved = 0);
|
virtual bool removeFiles(const QStringList &filePaths, QStringList *notRemoved = 0);
|
||||||
virtual bool deleteFiles(const QStringList &filePaths);
|
virtual bool deleteFiles(const QStringList &filePaths);
|
||||||
@@ -294,6 +296,8 @@ public:
|
|||||||
|
|
||||||
QList<ProjectNode*> projectNodes() const;
|
QList<ProjectNode*> projectNodes() const;
|
||||||
|
|
||||||
|
QString addFileFilter() const override;
|
||||||
|
|
||||||
void accept(NodesVisitor *visitor) override;
|
void accept(NodesVisitor *visitor) override;
|
||||||
|
|
||||||
bool isEnabled() const override { return true; }
|
bool isEnabled() const override { return true; }
|
||||||
|
|||||||
@@ -663,6 +663,11 @@ QStringList SelectableFilesDialogEditFiles::selectedFiles() const
|
|||||||
return m_selectableFilesModel->selectedFiles();
|
return m_selectableFilesModel->selectedFiles();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SelectableFilesDialogEditFiles::setAddFileFilter(const QString &filter)
|
||||||
|
{
|
||||||
|
m_showFilesfilterLineEdit->setText(filter);
|
||||||
|
}
|
||||||
|
|
||||||
void SelectableFilesDialogEditFiles::applyFilter()
|
void SelectableFilesDialogEditFiles::applyFilter()
|
||||||
{
|
{
|
||||||
const QString showFilesFilter = m_showFilesfilterLineEdit->text();
|
const QString showFilesFilter = m_showFilesfilterLineEdit->text();
|
||||||
|
|||||||
@@ -155,6 +155,8 @@ public:
|
|||||||
~SelectableFilesDialogEditFiles();
|
~SelectableFilesDialogEditFiles();
|
||||||
QStringList selectedFiles() const;
|
QStringList selectedFiles() const;
|
||||||
|
|
||||||
|
void setAddFileFilter(const QString &filter);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void applyFilter();
|
void applyFilter();
|
||||||
void parsingProgress(const QString &fileName);
|
void parsingProgress(const QString &fileName);
|
||||||
|
|||||||
@@ -337,6 +337,8 @@ public:
|
|||||||
|
|
||||||
QList<ProjectAction> supportedActions(Node *node) const override;
|
QList<ProjectAction> supportedActions(Node *node) const override;
|
||||||
|
|
||||||
|
QString addFileFilter() const override;
|
||||||
|
|
||||||
bool renameFile(const QString &filePath, const QString &newFilePath) override;
|
bool renameFile(const QString &filePath, const QString &newFilePath) override;
|
||||||
void refresh(QSet<QString> oldFileList = QSet<QString>());
|
void refresh(QSet<QString> oldFileList = QSet<QString>());
|
||||||
|
|
||||||
@@ -1057,6 +1059,11 @@ QList<ProjectAction> PythonProjectNode::supportedActions(Node *node) const
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString PythonProjectNode::addFileFilter() const
|
||||||
|
{
|
||||||
|
return QLatin1String("*.py");
|
||||||
|
}
|
||||||
|
|
||||||
bool PythonProjectNode::renameFile(const QString &filePath, const QString &newFilePath)
|
bool PythonProjectNode::renameFile(const QString &filePath, const QString &newFilePath)
|
||||||
{
|
{
|
||||||
return m_project->renameFile(filePath, newFilePath);
|
return m_project->renameFile(filePath, newFilePath);
|
||||||
|
|||||||
@@ -88,24 +88,25 @@ using namespace Utils;
|
|||||||
|
|
||||||
struct FileTypeDataStorage {
|
struct FileTypeDataStorage {
|
||||||
FileType type;
|
FileType type;
|
||||||
|
Theme::ImageFile themeImage;
|
||||||
const char *typeName;
|
const char *typeName;
|
||||||
const char *icon;
|
const char *icon;
|
||||||
Theme::ImageFile themeImage;
|
const char *addFileFilter;
|
||||||
};
|
};
|
||||||
|
|
||||||
static const FileTypeDataStorage fileTypeDataStorage[] = {
|
static const FileTypeDataStorage fileTypeDataStorage[] = {
|
||||||
{ HeaderType, QT_TRANSLATE_NOOP("QmakeProjectManager::QmakePriFileNode", "Headers"),
|
{ HeaderType, Theme::ProjectExplorerHeader, QT_TRANSLATE_NOOP("QmakeProjectManager::QmakePriFileNode", "Headers"),
|
||||||
":/qmakeprojectmanager/images/headers.png", Theme::ProjectExplorerHeader },
|
":/qmakeprojectmanager/images/headers.png", "*.h; *.hh; *.hpp; *.hxx;"},
|
||||||
{ SourceType, QT_TRANSLATE_NOOP("QmakeProjectManager::QmakePriFileNode", "Sources"),
|
{ SourceType, Theme::ProjectExplorerSource, QT_TRANSLATE_NOOP("QmakeProjectManager::QmakePriFileNode", "Sources"),
|
||||||
":/qmakeprojectmanager/images/sources.png", Theme::ProjectExplorerSource },
|
":/qmakeprojectmanager/images/sources.png", "*.c; *.cc; *.cpp; *.cp; *.cxx; *.c++;" },
|
||||||
{ FormType, QT_TRANSLATE_NOOP("QmakeProjectManager::QmakePriFileNode", "Forms"),
|
{ FormType, Theme::ProjectExplorerForm, QT_TRANSLATE_NOOP("QmakeProjectManager::QmakePriFileNode", "Forms"),
|
||||||
":/qtsupport/images/forms.png", Theme::ProjectExplorerForm },
|
":/qtsupport/images/forms.png", "*.ui;" },
|
||||||
{ ResourceType, QT_TRANSLATE_NOOP("QmakeProjectManager::QmakePriFileNode", "Resources"),
|
{ ResourceType, Theme::ProjectExplorerResource, QT_TRANSLATE_NOOP("QmakeProjectManager::QmakePriFileNode", "Resources"),
|
||||||
":/qtsupport/images/qt_qrc.png", Theme::ProjectExplorerResource },
|
":/qtsupport/images/qt_qrc.png", "*.qrc;" },
|
||||||
{ QMLType, QT_TRANSLATE_NOOP("QmakeProjectManager::QmakePriFileNode", "QML"),
|
{ QMLType, Theme::ProjectExplorerQML, QT_TRANSLATE_NOOP("QmakeProjectManager::QmakePriFileNode", "QML"),
|
||||||
":/qtsupport/images/qml.png", Theme::ProjectExplorerQML },
|
":/qtsupport/images/qml.png", "*.qml; *.qml.ui" },
|
||||||
{ UnknownFileType, QT_TRANSLATE_NOOP("QmakeProjectManager::QmakePriFileNode", "Other files"),
|
{ UnknownFileType, Theme::ProjectExplorerOtherFiles, QT_TRANSLATE_NOOP("QmakeProjectManager::QmakePriFileNode", "Other files"),
|
||||||
":/qmakeprojectmanager/images/unknown.png", Theme::ProjectExplorerOtherFiles }
|
":/qmakeprojectmanager/images/unknown.png", "*;" }
|
||||||
};
|
};
|
||||||
|
|
||||||
class SortByPath
|
class SortByPath
|
||||||
@@ -128,11 +129,13 @@ public:
|
|||||||
public:
|
public:
|
||||||
FileTypeData(FileType t = UnknownFileType,
|
FileTypeData(FileType t = UnknownFileType,
|
||||||
const QString &tN = QString(),
|
const QString &tN = QString(),
|
||||||
|
const QString &aff = QString(),
|
||||||
const QIcon &i = QIcon()) :
|
const QIcon &i = QIcon()) :
|
||||||
type(t), typeName(tN), icon(i) { }
|
type(t), typeName(tN), addFileFilter(aff), icon(i) { }
|
||||||
|
|
||||||
FileType type;
|
FileType type;
|
||||||
QString typeName;
|
QString typeName;
|
||||||
|
QString addFileFilter;
|
||||||
QIcon icon;
|
QIcon icon;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -164,8 +167,9 @@ QmakeNodeStaticData::QmakeNodeStaticData()
|
|||||||
QIcon folderIcon;
|
QIcon folderIcon;
|
||||||
folderIcon.addPixmap(folderPixmap);
|
folderIcon.addPixmap(folderPixmap);
|
||||||
const QString desc = QCoreApplication::translate("QmakeProjectManager::QmakePriFileNode", fileTypeDataStorage[i].typeName);
|
const QString desc = QCoreApplication::translate("QmakeProjectManager::QmakePriFileNode", fileTypeDataStorage[i].typeName);
|
||||||
|
const QString filter = QString::fromUtf8(fileTypeDataStorage[i].addFileFilter);
|
||||||
fileTypeData.push_back(QmakeNodeStaticData::FileTypeData(fileTypeDataStorage[i].type,
|
fileTypeData.push_back(QmakeNodeStaticData::FileTypeData(fileTypeDataStorage[i].type,
|
||||||
desc, folderIcon));
|
desc, filter, folderIcon));
|
||||||
}
|
}
|
||||||
// Project icon
|
// Project icon
|
||||||
const QString fileName = creatorTheme()->imageFile(Theme::ProjectFileIcon,
|
const QString fileName = creatorTheme()->imageFile(Theme::ProjectFileIcon,
|
||||||
@@ -246,9 +250,20 @@ public:
|
|||||||
bool isDeployable;
|
bool isDeployable;
|
||||||
QStringList errors;
|
QStringList errors;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
QString ProVirtualFolderNode::displayName() const
|
||||||
|
{
|
||||||
|
return m_typeName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString ProVirtualFolderNode::addFileFilter() const
|
||||||
|
{
|
||||||
|
return m_addFileFilter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // namespace Internal
|
||||||
|
} // namespace QMakeProjectManager
|
||||||
|
|
||||||
QmakePriFile::QmakePriFile(QmakeProjectManager::QmakePriFileNode *qmakePriFile)
|
QmakePriFile::QmakePriFile(QmakeProjectManager::QmakePriFileNode *qmakePriFile)
|
||||||
: IDocument(0), m_priFile(qmakePriFile)
|
: IDocument(0), m_priFile(qmakePriFile)
|
||||||
{
|
{
|
||||||
@@ -347,6 +362,7 @@ struct InternalNode
|
|||||||
int priority = 0;
|
int priority = 0;
|
||||||
QString displayName;
|
QString displayName;
|
||||||
QString typeName;
|
QString typeName;
|
||||||
|
QString addFileFilter;
|
||||||
QString fullPath;
|
QString fullPath;
|
||||||
QIcon icon;
|
QIcon icon;
|
||||||
|
|
||||||
@@ -446,8 +462,10 @@ struct InternalNode
|
|||||||
if (node->typeName.isEmpty()) {
|
if (node->typeName.isEmpty()) {
|
||||||
newNode = new FolderNode(FileName::fromString(node->fullPath));
|
newNode = new FolderNode(FileName::fromString(node->fullPath));
|
||||||
} else {
|
} else {
|
||||||
newNode = new ProVirtualFolderNode(FileName::fromString(node->fullPath),
|
auto n = new ProVirtualFolderNode(FileName::fromString(node->fullPath),
|
||||||
node->priority, node->typeName);
|
node->priority, node->typeName);
|
||||||
|
n->setAddFileFilter(node->addFileFilter);
|
||||||
|
newNode = n;
|
||||||
}
|
}
|
||||||
|
|
||||||
newNode->setDisplayName(node->displayName);
|
newNode->setDisplayName(node->displayName);
|
||||||
@@ -770,6 +788,7 @@ void QmakePriFileNode::update(const Internal::PriFileEvalResult &result)
|
|||||||
subfolder->icon = fileTypes.at(i).icon;
|
subfolder->icon = fileTypes.at(i).icon;
|
||||||
subfolder->fullPath = m_projectDir;
|
subfolder->fullPath = m_projectDir;
|
||||||
subfolder->typeName = fileTypes.at(i).typeName;
|
subfolder->typeName = fileTypes.at(i).typeName;
|
||||||
|
subfolder->addFileFilter = fileTypes.at(i).addFileFilter;
|
||||||
subfolder->priority = -i;
|
subfolder->priority = -i;
|
||||||
subfolder->displayName = fileTypes.at(i).typeName;
|
subfolder->displayName = fileTypes.at(i).typeName;
|
||||||
contents.virtualfolders.append(subfolder);
|
contents.virtualfolders.append(subfolder);
|
||||||
|
|||||||
@@ -267,9 +267,13 @@ public:
|
|||||||
: VirtualFolderNode(folderPath, priority), m_typeName(typeName)
|
: VirtualFolderNode(folderPath, priority), m_typeName(typeName)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
QString displayName() const override
|
QString displayName() const override;
|
||||||
|
|
||||||
|
QString addFileFilter() const override;
|
||||||
|
|
||||||
|
void setAddFileFilter(const QString &filter)
|
||||||
{
|
{
|
||||||
return m_typeName;
|
m_addFileFilter = filter;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString tooltip() const override
|
QString tooltip() const override
|
||||||
@@ -279,6 +283,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
QString m_typeName;
|
QString m_typeName;
|
||||||
|
QString m_addFileFilter;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
|
|||||||
@@ -201,6 +201,11 @@ void ResourceTopLevelNode::update()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString ResourceTopLevelNode::addFileFilter() const
|
||||||
|
{
|
||||||
|
return QLatin1String("*.png; *.jpg; *.gif; *.svg; *.ico; *.qml; *.qml.ui");
|
||||||
|
}
|
||||||
|
|
||||||
QList<ProjectExplorer::ProjectAction> ResourceTopLevelNode::supportedActions(ProjectExplorer::Node *node) const
|
QList<ProjectExplorer::ProjectAction> ResourceTopLevelNode::supportedActions(ProjectExplorer::Node *node) const
|
||||||
{
|
{
|
||||||
if (node != this)
|
if (node != this)
|
||||||
|
|||||||
@@ -49,6 +49,8 @@ public:
|
|||||||
~ResourceTopLevelNode() override;
|
~ResourceTopLevelNode() override;
|
||||||
void update();
|
void update();
|
||||||
|
|
||||||
|
QString addFileFilter() const override;
|
||||||
|
|
||||||
QList<ProjectExplorer::ProjectAction> supportedActions(Node *node) const override;
|
QList<ProjectExplorer::ProjectAction> supportedActions(Node *node) const override;
|
||||||
bool addFiles(const QStringList &filePaths, QStringList *notAdded) override;
|
bool addFiles(const QStringList &filePaths, QStringList *notAdded) override;
|
||||||
bool removeFiles(const QStringList &filePaths, QStringList *notRemoved) override;
|
bool removeFiles(const QStringList &filePaths, QStringList *notRemoved) override;
|
||||||
|
|||||||
Reference in New Issue
Block a user