ProjectExplorer: Enable the document factory to handle directories.

Register the mime type inode/directory and use it to open
project files in that directory.

It is then possible to drop directories on the main window
which will cause the contained projects to be opened.

Also allows for simplifying the code in the command line handling.

Change-Id: I92138915216b1346a36b5ca7654cf2b7d6f405c4
Reviewed-by: Tobias Hunger <tobias.hunger@theqtcompany.com>
Reviewed-by: Eike Ziller <eike.ziller@theqtcompany.com>
This commit is contained in:
Friedemann Kleint
2016-02-26 15:16:55 +01:00
parent 9c7146a881
commit 4eeb9dc0c3
3 changed files with 19 additions and 22 deletions

View File

@@ -290,12 +290,9 @@ void FolderNavigationWidget::openItem(const QModelIndex &srcIndex, bool openDire
return; return;
// Try to find project files in directory and open those. // Try to find project files in directory and open those.
if (openDirectoryAsProject) { if (openDirectoryAsProject) {
QDir dir(path); const QStringList projectFiles = FolderNavigationWidget::projectFilesInDirectory(path);
QStringList proFiles; if (!projectFiles.isEmpty())
foreach (const QFileInfo &i, dir.entryInfoList(ProjectExplorerPlugin::projectFileGlobs(), QDir::Files)) Core::ICore::instance()->openFiles(projectFiles);
proFiles.append(i.absoluteFilePath());
if (!proFiles.isEmpty())
Core::ICore::instance()->openFiles(proFiles);
return; return;
} }
// Change to directory // Change to directory
@@ -428,6 +425,15 @@ void FolderNavigationWidget::ensureCurrentIndex()
m_listView->scrollTo(index); m_listView->scrollTo(index);
} }
QStringList FolderNavigationWidget::projectFilesInDirectory(const QString &path)
{
QDir dir(path);
QStringList projectFiles;
foreach (const QFileInfo &i, dir.entryInfoList(ProjectExplorerPlugin::projectFileGlobs(), QDir::Files))
projectFiles.append(i.absoluteFilePath());
return projectFiles;
}
// --------------------FolderNavigationWidgetFactory // --------------------FolderNavigationWidgetFactory
FolderNavigationWidgetFactory::FolderNavigationWidgetFactory() FolderNavigationWidgetFactory::FolderNavigationWidgetFactory()
{ {

View File

@@ -50,6 +50,8 @@ class FolderNavigationWidget : public QWidget
public: public:
explicit FolderNavigationWidget(QWidget *parent = 0); explicit FolderNavigationWidget(QWidget *parent = 0);
static QStringList projectFilesInDirectory(const QString &path);
bool autoSynchronization() const; bool autoSynchronization() const;
bool hiddenFilesFilter() const; bool hiddenFilesFilter() const;

View File

@@ -1472,7 +1472,10 @@ void ProjectExplorerPlugin::extensionsInitialized()
QStringList filterStrings; QStringList filterStrings;
auto factory = new IDocumentFactory; auto factory = new IDocumentFactory;
factory->setOpener([this](const QString &fileName) -> IDocument* { factory->setOpener([this](QString fileName) -> IDocument* {
const QFileInfo fi(fileName);
if (fi.isDir())
fileName = FolderNavigationWidget::projectFilesInDirectory(fi.absoluteFilePath()).value(0, fileName);
OpenProjectResult result = ProjectExplorerPlugin::openProject(fileName); OpenProjectResult result = ProjectExplorerPlugin::openProject(fileName);
if (!result) if (!result)
@@ -1481,6 +1484,7 @@ void ProjectExplorerPlugin::extensionsInitialized()
}); });
Utils::MimeDatabase mdb; Utils::MimeDatabase mdb;
factory->addMimeType(QStringLiteral("inode/directory"));
foreach (IProjectManager *manager, projectManagers) { foreach (IProjectManager *manager, projectManagers) {
const QString mimeType = manager->mimeType(); const QString mimeType = manager->mimeType();
factory->addMimeType(mimeType); factory->addMimeType(mimeType);
@@ -1848,7 +1852,6 @@ void ProjectExplorerPluginPrivate::restoreSession()
// "filename+45" and "filename:23". // "filename+45" and "filename:23".
if (!arguments.isEmpty()) { if (!arguments.isEmpty()) {
const QStringList sessions = SessionManager::sessions(); const QStringList sessions = SessionManager::sessions();
QStringList projectGlobs = ProjectExplorerPlugin::projectFileGlobs();
for (int a = 0; a < arguments.size(); ) { for (int a = 0; a < arguments.size(); ) {
const QString &arg = arguments.at(a); const QString &arg = arguments.at(a);
const QFileInfo fi(arg); const QFileInfo fi(arg);
@@ -1860,21 +1863,7 @@ void ProjectExplorerPluginPrivate::restoreSession()
dd->m_sessionToRestoreAtStartup = dir.dirName(); dd->m_sessionToRestoreAtStartup = dir.dirName();
arguments.removeAt(a); arguments.removeAt(a);
continue; continue;
} else {
// Are there project files in that directory?
const QFileInfoList proFiles
= dir.entryInfoList(projectGlobs, QDir::Files);
if (!proFiles.isEmpty()) {
arguments[a] = proFiles.front().absoluteFilePath();
++a;
continue;
}
} }
// Cannot handle: Avoid mime type warning for directory.
qWarning("Skipping directory '%s' passed on to command line.",
qPrintable(QDir::toNativeSeparators(arg)));
arguments.removeAt(a);
continue;
} // Done directories. } // Done directories.
// Converts "filename" "+45" or "filename" ":23" into "filename+45" and "filename:23" // Converts "filename" "+45" or "filename" ":23" into "filename+45" and "filename:23"
if (a && (arg.startsWith(QLatin1Char('+')) || arg.startsWith(QLatin1Char(':')))) { if (a && (arg.startsWith(QLatin1Char('+')) || arg.startsWith(QLatin1Char(':')))) {