QmlDesigner: Add QmlDesignerProjectManager

Task-number: QDS-5886
Change-Id: I78605faa1871c9f27b26173d89e3daf68a07fd04
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Marco Bubke
2022-01-03 14:54:43 +01:00
committed by Thomas Hartmann
parent 3fd3cc307e
commit 00e3a3fa4b
4 changed files with 208 additions and 6 deletions
+1
View File
@@ -36,6 +36,7 @@ add_qtc_plugin(QmlDesigner
qmldesignerconstants.h
qmldesignericons.h
qmldesignerplugin.cpp qmldesignerplugin.h
qmldesignerprojectmanager.cpp qmldesignerprojectmanager.h
settingspage.cpp settingspage.h settingspage.ui
shortcutmanager.cpp shortcutmanager.h
designermcumanager.cpp designermcumanager.h
@@ -24,15 +24,16 @@
****************************************************************************/
#include "qmldesignerplugin.h"
#include "exception.h"
#include "qmldesignerconstants.h"
#include "designmodewidget.h"
#include "settingspage.h"
#include "designmodecontext.h"
#include "openuiqmlfiledialog.h"
#include "generateresource.h"
#include "designmodewidget.h"
#include "exception.h"
#include "generatecmakelists.h"
#include "generateresource.h"
#include "nodeinstanceview.h"
#include "openuiqmlfiledialog.h"
#include "qmldesignerconstants.h"
#include "qmldesignerprojectmanager.h"
#include "settingspage.h"
#include <metainfo.h>
#include <connectionview.h>
@@ -118,6 +119,7 @@ QtQuickDesignerFactory::QtQuickDesignerFactory()
class QmlDesignerPluginPrivate
{
public:
QmlDesignerProjectManager projectManager;
ViewManager viewManager;
DocumentManager documentManager;
ShortCutManager shortCutManager;
@@ -0,0 +1,135 @@
/****************************************************************************
**
** Copyright (C) 2022 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
****************************************************************************/
#include "qmldesignerprojectmanager.h"
#include <coreplugin/editormanager/editormanager.h>
#include <coreplugin/icore.h>
#include <projectexplorer/project.h>
#include <projectexplorer/session.h>
#include <projectexplorer/target.h>
#include <projectstorage/filestatuscache.h>
#include <projectstorage/filesystem.h>
#include <projectstorage/nonlockingmutex.h>
#include <projectstorage/projectstorage.h>
#include <projectstorage/projectstorageupdater.h>
#include <projectstorage/qmldocumentparser.h>
#include <projectstorage/qmltypesparser.h>
#include <projectstorage/sourcepathcache.h>
#include <sqlitedatabase.h>
#include <qmlprojectmanager/qmlproject.h>
#include <qtsupport/baseqtversion.h>
#include <qtsupport/qtkitinformation.h>
#include <asynchronousexplicitimagecache.h>
#include <imagecache/asynchronousimagefactory.h>
#include <imagecache/explicitimagecacheimageprovider.h>
#include <imagecache/imagecachecollector.h>
#include <imagecache/imagecacheconnectionmanager.h>
#include <imagecache/imagecachegenerator.h>
#include <imagecache/imagecachestorage.h>
#include <imagecache/timestampprovider.h>
#include <filesystem>
#include <type_traits>
namespace QmlDesigner {
class PreviewImageCacheData
{
public:
Sqlite::Database database{
Utils::PathString{Core::ICore::cacheResourcePath("previewcache.db").toString()}};
ImageCacheStorage<Sqlite::Database> storage{database};
ImageCacheConnectionManager connectionManager;
ImageCacheCollector collector{connectionManager};
ImageCacheGenerator generator{collector, storage};
TimeStampProvider timeStampProvider;
AsynchronousExplicitImageCache cache{storage};
AsynchronousImageFactory factory{storage, generator, timeStampProvider};
ExplicitImageCacheImageProvider imageProvider{cache, QImage{}};
};
class QmlDesignerProjectManagerProjectData
{
public:
::ProjectExplorer::Target *activeTarget = nullptr;
};
QmlDesignerProjectManager::QmlDesignerProjectManager()
: m_imageCacheData{std::make_unique<PreviewImageCacheData>()}
{
auto editorManager = ::Core::EditorManager::instance();
QObject::connect(editorManager, &::Core::EditorManager::editorOpened, [&](auto *editor) {
editorOpened(editor);
});
QObject::connect(editorManager, &::Core::EditorManager::currentEditorChanged, [&](auto *editor) {
currentEditorChanged(editor);
});
QObject::connect(editorManager, &::Core::EditorManager::editorsClosed, [&](const auto &editors) {
editorsClosed(editors);
});
auto sessionManager = ::ProjectExplorer::SessionManager::instance();
QObject::connect(sessionManager,
&::ProjectExplorer::SessionManager::projectAdded,
[&](auto *project) { projectAdded(project); });
QObject::connect(sessionManager,
&::ProjectExplorer::SessionManager::aboutToRemoveProject,
[&](auto *project) { aboutToRemoveProject(project); });
QObject::connect(sessionManager,
&::ProjectExplorer::SessionManager::projectRemoved,
[&](auto *project) { projectRemoved(project); });
}
QmlDesignerProjectManager::~QmlDesignerProjectManager() = default;
void QmlDesignerProjectManager::editorOpened(::Core::IEditor *) {}
void QmlDesignerProjectManager::currentEditorChanged(::Core::IEditor *) {}
void QmlDesignerProjectManager::editorsClosed(const QList<::Core::IEditor *> &) {}
namespace {
::QmlProjectManager::QmlBuildSystem *getQmlBuildSystem(::ProjectExplorer::Target *target)
{
return qobject_cast<::QmlProjectManager::QmlBuildSystem *>(target->buildSystem());
}
} // namespace
void QmlDesignerProjectManager::projectAdded(::ProjectExplorer::Project *) {}
void QmlDesignerProjectManager::aboutToRemoveProject(::ProjectExplorer::Project *project)
{
::QmlProjectManager::QmlBuildSystem *qmlBuildSystem = getQmlBuildSystem(project->activeTarget());
if (qmlBuildSystem)
m_imageCacheData->factory.generate(qmlBuildSystem->mainFilePath().toString().toUtf8());
}
void QmlDesignerProjectManager::projectRemoved(::ProjectExplorer::Project *) {}
} // namespace QmlDesigner
@@ -0,0 +1,64 @@
/****************************************************************************
**
** Copyright (C) 2022 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
****************************************************************************/
#pragma once
#include <QList>
#include <memory>
namespace Core {
class IEditor;
} // namespace Core
namespace ProjectExplorer {
class Project;
class Target;
} // namespace ProjectExplorer
namespace QmlDesigner {
class QmlDesignerProjectManagerProjectData;
class PreviewImageCacheData;
class QmlDesignerProjectManager
{
public:
QmlDesignerProjectManager();
~QmlDesignerProjectManager();
private:
void editorOpened(::Core::IEditor *editor);
void currentEditorChanged(::Core::IEditor *);
void editorsClosed(const QList<Core::IEditor *> &editor);
void projectAdded(::ProjectExplorer::Project *project);
void aboutToRemoveProject(::ProjectExplorer::Project *project);
void projectRemoved(::ProjectExplorer::Project *project);
private:
std::unique_ptr<QmlDesignerProjectManagerProjectData> m_projectData;
std::unique_ptr<PreviewImageCacheData> m_imageCacheData;
};
} // namespace QmlDesigner