summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2018-09-27 10:47:15 +0300
committerMiikka Heikkinen <miikka.heikkinen@qt.io>2018-09-27 07:57:38 +0000
commit05afa85a3a3320a688bcf276607c15a95743a9ba (patch)
treef3e65728fa48802020689dcb6be4e605a839cb68
parenteda406902e1d7a08d482d05a9c715609f93ff7b2 (diff)
Fix constant CPU load when project contains qml files
Checking whether a file is a behavior or qml stream is expensive, and it was getting done continuously for some reason. Now we cache the result of the first check for each file. Task-number: QT3DS-2404 Change-Id: Iaf7fab48559790c6561ecf6b00d60febd68e6a08 Reviewed-by: Kimmo Leppälä <kimmo.leppala@qt.io> Reviewed-by: Antti Määttä <antti.maatta@qt.io> Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
-rw-r--r--src/Authoring/Studio/Application/StudioApp.cpp22
-rw-r--r--src/Authoring/Studio/Application/StudioApp.h3
-rw-r--r--src/Authoring/Studio/Palettes/Project/ProjectView.cpp15
-rw-r--r--src/Authoring/Studio/Utils/ImportUtils.cpp13
4 files changed, 29 insertions, 24 deletions
diff --git a/src/Authoring/Studio/Application/StudioApp.cpp b/src/Authoring/Studio/Application/StudioApp.cpp
index a5328c13..8a684b01 100644
--- a/src/Authoring/Studio/Application/StudioApp.cpp
+++ b/src/Authoring/Studio/Application/StudioApp.cpp
@@ -1754,7 +1754,27 @@ QString CStudioApp::getMostRecentProjectParentDir() const
return parentDirectory;
}
-//=============================================================================
+bool CStudioApp::isQmlStream(const QString &fileName)
+{
+ bool retval = false;
+ if (m_qmlStreamMap.contains(fileName)) {
+ retval = m_qmlStreamMap[fileName];
+ } else {
+ if (!fileName.endsWith(QLatin1String(".qml"))) {
+ retval = false;
+ } else {
+ QQmlApplicationEngine qmlEngine(fileName);
+ if (qmlEngine.rootObjects().size() > 0) {
+ const char *rootClassName = qmlEngine.rootObjects().at(0)
+ ->metaObject()->superClass()->className();
+ retval = strcmp(rootClassName, "Q3DStudio::Q3DSQmlBehavior") != 0;
+ }
+ }
+ m_qmlStreamMap.insert(fileName, retval);
+ }
+ return retval;
+}
+
/**
* Called by OnLoadDocument, to allow the error reporting to be inserted.
* Because of the nature of the error reporting, OnLoadDocument has to have
diff --git a/src/Authoring/Studio/Application/StudioApp.h b/src/Authoring/Studio/Application/StudioApp.h
index e91be9e8..0332618a 100644
--- a/src/Authoring/Studio/Application/StudioApp.h
+++ b/src/Authoring/Studio/Application/StudioApp.h
@@ -147,6 +147,7 @@ private:
public:
CMainFrame* m_pMainWnd;
QWidget *m_lastActiveView = nullptr;
+ QHash<QString, bool> m_qmlStreamMap;
CCore *GetCore();
CViews *GetViews();
@@ -264,6 +265,8 @@ public:
void setLastActiveView(QWidget *widget) { m_lastActiveView = widget; }
QWidget *lastActiveView() const { return m_lastActiveView; }
+
+ bool isQmlStream(const QString &fileName);
};
extern CStudioApp g_StudioApp;
diff --git a/src/Authoring/Studio/Palettes/Project/ProjectView.cpp b/src/Authoring/Studio/Palettes/Project/ProjectView.cpp
index 6b7a5a49..fcfa8c2b 100644
--- a/src/Authoring/Studio/Palettes/Project/ProjectView.cpp
+++ b/src/Authoring/Studio/Palettes/Project/ProjectView.cpp
@@ -50,7 +50,6 @@
#include <QtQml/qqmlengine.h>
#include <QtQml/qqmlfile.h>
#include <QtQuick/qquickitem.h>
-#include <QtQml/qqmlapplicationengine.h>
ProjectView::ProjectView(const QSize &preferredSize, QWidget *parent) : QQuickWidget(parent)
, m_ProjectModel(new ProjectFileSystemModel(this))
@@ -369,19 +368,7 @@ bool ProjectView::isPresentation(int row) const
bool ProjectView::isQmlStream(int row) const
{
- const QString filePath = m_ProjectModel->filePath(row);
-
- if (!filePath.endsWith(QLatin1String(".qml")))
- return false;
-
- QQmlApplicationEngine qmlEngine(filePath);
- if (qmlEngine.rootObjects().size() > 0) {
- const char *rootClassName = qmlEngine.rootObjects().at(0)
- ->metaObject()->superClass()->className();
- return strcmp(rootClassName, "Q3DStudio::Q3DSQmlBehavior") != 0;
- } else {
- return false;
- }
+ return g_StudioApp.isQmlStream(m_ProjectModel->filePath(row));
}
bool ProjectView::isRefreshable(int row) const
diff --git a/src/Authoring/Studio/Utils/ImportUtils.cpp b/src/Authoring/Studio/Utils/ImportUtils.cpp
index 2bb4807c..933afe97 100644
--- a/src/Authoring/Studio/Utils/ImportUtils.cpp
+++ b/src/Authoring/Studio/Utils/ImportUtils.cpp
@@ -31,7 +31,7 @@
#include "ImportUtils.h"
#include "Dialogs.h"
#include "Qt3DSFileTools.h"
-#include <QtQml/qqmlapplicationengine.h>
+#include "StudioApp.h"
namespace Q3DStudio {
@@ -56,14 +56,9 @@ SObjectFileType ImportUtils::GetObjectFileTypeForFile(const CFilePath &inFile,
DocumentEditorFileType::Image); // Drag-drop image to scene will auto-map to Rectangle.
} else if (theExtension.Compare(CDialogs::GetQmlFileExtension(),
Q3DStudio::CString::ENDOFSTRING, false)) {
- QQmlApplicationEngine qmlEngine(inFile.absoluteFilePath());
- if (qmlEngine.rootObjects().size() > 0) {
- const char *rootClassName = qmlEngine.rootObjects().at(0)
- ->metaObject()->superClass()->className();
- bool isQmlStream = strcmp(rootClassName, "Q3DStudio::Q3DSQmlBehavior") != 0;
- return isQmlStream ? SObjectFileType(OBJTYPE_QML_STREAM, DocumentEditorFileType::QmlStream)
- : SObjectFileType(OBJTYPE_BEHAVIOR, DocumentEditorFileType::Behavior);
- } // If qml file is invalid, it will be of unknown type
+ return g_StudioApp.isQmlStream(inFile.absoluteFilePath())
+ ? SObjectFileType(OBJTYPE_QML_STREAM, DocumentEditorFileType::QmlStream)
+ : SObjectFileType(OBJTYPE_BEHAVIOR, DocumentEditorFileType::Behavior);
} else if (CDialogs::IsFontFileExtension(theExtension)) {
return SObjectFileType(OBJTYPE_TEXT, DocumentEditorFileType::Font);
} else if (CDialogs::IsEffectFileExtension(theExtension)) {