diff options
author | Thomas Hartmann <thomas.hartmann@qt.io> | 2020-11-11 17:33:35 +0100 |
---|---|---|
committer | Thomas Hartmann <thomas.hartmann@qt.io> | 2020-11-13 05:38:20 +0000 |
commit | fb9fb01e341a2d9d466b14c75885e9472417d0cf (patch) | |
tree | dc3b73b79f4cd46fd0119b15ce5d1654fde21ae5 | |
parent | 093d5f5ab10d04d928f10a042d27ad6025ccacde (diff) |
QmlDesigner: Collect events for telemetry plugin
For each action/event we want to track we
emit QmlDesignerPlugin::usageStatisticsNotifier() with an identifer.
This allows counting how many states, transitions, timelines were created
and we track every registered action.
More 'trace points' can be added later.
Change-Id: Ibb31e1b7e20d984a10697e05bb4417e7ad1b8980
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
10 files changed, 50 insertions, 6 deletions
diff --git a/src/plugins/qmldesigner/components/annotationeditor/annotationeditor.cpp b/src/plugins/qmldesigner/components/annotationeditor/annotationeditor.cpp index bfe248690c..8085691354 100644 --- a/src/plugins/qmldesigner/components/annotationeditor/annotationeditor.cpp +++ b/src/plugins/qmldesigner/components/annotationeditor/annotationeditor.cpp @@ -29,6 +29,10 @@ #include "annotation.h" #include "qmlmodelnodeproxy.h" + +#include <qmldesignerconstants.h> +#include <qmldesignerplugin.h> + #include <coreplugin/icore.h> #include <QObject> @@ -175,6 +179,7 @@ void AnnotationEditor::removeFullAnnotation() void AnnotationEditor::acceptedClicked() { if (m_dialog) { + QmlDesignerPlugin::emitUsageStatistics(Constants::EVENT_ANNOTATION_ADDED); QString customId = m_dialog->customId(); Annotation annotation = m_dialog->annotation(); diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp index dbad1d2553..0a8f567c54 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp @@ -343,7 +343,7 @@ public: parentNode = selectionContext().currentSingleSelectedNode().parentProperty().parentModelNode(); if (!ModelNode::isThisOrAncestorLocked(parentNode)) { - ActionTemplate *selectionAction = new ActionTemplate(QString(), &ModelNodeOperations::select); + ActionTemplate *selectionAction = new ActionTemplate("SELECTION", {}, &ModelNodeOperations::select); selectionAction->setParent(menu()); selectionAction->setText(QString(QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Select parent: %1")).arg( captionForModelNode(parentNode))); @@ -363,7 +363,7 @@ public: && !ModelNode::isThisOrAncestorLocked(node)) { selectionContext().setTargetNode(node); QString what = QString(QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Select: %1")).arg(captionForModelNode(node)); - ActionTemplate *selectionAction = new ActionTemplate(what, &ModelNodeOperations::select); + ActionTemplate *selectionAction = new ActionTemplate("SELECT", what, &ModelNodeOperations::select); SelectionContext nodeSelectionContext = selectionContext(); nodeSelectionContext.setTargetNode(node); @@ -546,7 +546,7 @@ public: for (const QmlFlowItemNode &node : QmlFlowViewNode(selectionContext().rootNode()).flowItems()) { if (node != selectionContext().currentSingleSelectedNode().parentProperty().parentModelNode()) { QString what = QString(QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Connect: %1")).arg(captionForModelNode(node)); - ActionTemplate *connectionAction = new ActionTemplate(what, &ModelNodeOperations::addTransition); + ActionTemplate *connectionAction = new ActionTemplate("CONNECT", what, &ModelNodeOperations::addTransition); SelectionContext nodeSelectionContext = selectionContext(); nodeSelectionContext.setTargetNode(node); diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.h b/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.h index 59029400e5..7fe891fd72 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.h +++ b/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.h @@ -29,6 +29,7 @@ #include "abstractaction.h" #include "abstractactiongroup.h" #include "qmlitemnode.h" +#include <qmldesignerplugin.h> #include <coreplugin/actionmanager/command.h> @@ -103,17 +104,19 @@ class ActionTemplate : public DefaultAction { public: - ActionTemplate(const QString &description, SelectionContextOperation action) - : DefaultAction(description), m_action(action) + ActionTemplate(const QByteArray &id, const QString &description, SelectionContextOperation action) + : DefaultAction(description), m_action(action), m_id(id) { } void actionTriggered(bool b) override { + QmlDesignerPlugin::emitUsageStatisticsContextAction(QString::fromUtf8(m_id)); m_selectionContext.setToggled(b); m_action(m_selectionContext); } SelectionContextOperation m_action; + QByteArray m_id; }; class ActionGroup : public AbstractActionGroup @@ -202,7 +205,7 @@ public: SelectionContextOperation selectionAction, SelectionContextPredicate enabled = &SelectionContextFunctors::always, SelectionContextPredicate visibility = &SelectionContextFunctors::always) : - AbstractAction(new ActionTemplate(description, selectionAction)), + AbstractAction(new ActionTemplate(id, description, selectionAction)), m_id(id), m_category(category), m_priority(priority), diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp index 10a253f5b6..ae3569ff02 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp @@ -572,6 +572,7 @@ void ItemLibraryWidget::addResources() for (const AddResourceHandler &handler : handlers) { QStringList fileNames = partitionedFileNames.values(category); if (handler.category == category) { + QmlDesignerPlugin::emitUsageStatistics(Constants::EVENT_RESOURCE_IMPORTED + category); if (!handler.operation(fileNames, document->fileName().parentDir().toString())) Core::AsynchronousMessageBox::warning(tr("Failed to Add Files"), tr("Could not add %1 to project.").arg(fileNames.join(" "))); break; diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp index 126d520d9c..eb4acb358d 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp @@ -40,6 +40,8 @@ #include <variantproperty.h> #include <nodelistproperty.h> +#include <qmldesignerconstants.h> +#include <qmldesignerplugin.h> #include <qmlitemnode.h> #include <qmlstate.h> #include <annotationeditor/annotationeditor.h> @@ -182,6 +184,8 @@ void StatesEditorView::addState() if (!QmlVisualNode::isValidQmlVisualNode(rootModelNode())) return; + QmlDesignerPlugin::emitUsageStatistics(Constants::EVENT_STATE_ADDED); + QStringList modelStateNames = rootStateGroup().names(); QString newStateName; diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelineview.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelineview.cpp index dab580a146..9f87a33c00 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelineview.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelineview.cpp @@ -44,6 +44,7 @@ #include <rewritertransaction.h> #include <variantproperty.h> #include <viewmanager.h> +#include <qmldesignerconstants.h> #include <qmldesignericons.h> #include <qmldesignerplugin.h> #include <qmlitemnode.h> @@ -304,6 +305,8 @@ const QmlTimeline TimelineView::addNewTimeline() QTC_ASSERT(isAttached(), return QmlTimeline()); + QmlDesignerPlugin::emitUsageStatistics(Constants::EVENT_TIMELINE_ADDED); + try { ensureQtQuickTimelineImport(); } catch (const Exception &e) { diff --git a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorview.cpp b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorview.cpp index 10b95f59df..62fb34403b 100644 --- a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorview.cpp +++ b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorview.cpp @@ -40,6 +40,7 @@ #include <rewritertransaction.h> #include <variantproperty.h> #include <viewmanager.h> +#include <qmldesignerconstants.h> #include <qmldesignericons.h> #include <qmldesignerplugin.h> #include <qmlitemnode.h> @@ -203,6 +204,8 @@ ModelNode TransitionEditorView::addNewTransition() states = QmlVisualNode(root).states().allStates(); } + QmlDesignerPlugin::emitUsageStatistics(Constants::EVENT_TRANSITION_ADDED); + if (states.isEmpty()) { Core::AsynchronousMessageBox::warning(tr("No States Defined"), tr("There are no states defined in this component.")); diff --git a/src/plugins/qmldesigner/qmldesignerconstants.h b/src/plugins/qmldesigner/qmldesignerconstants.h index c32f5b62ec..1e7fea711b 100644 --- a/src/plugins/qmldesigner/qmldesignerconstants.h +++ b/src/plugins/qmldesigner/qmldesignerconstants.h @@ -77,6 +77,13 @@ const char M_VIEW_WORKSPACES[] = "QmlDesigner.Menu.View.Workspaces"; const int MODELNODE_PREVIEW_IMAGE_DIMENSIONS = 150; +const char EVENT_TIMELINE_ADDED[] = "Timeline Added"; +const char EVENT_TRANSITION_ADDED[] = "Transition Added"; +const char EVENT_STATE_ADDED[] = "State Added"; +const char EVENT_ANNOTATION_ADDED[] = "Annotation Added"; +const char EVENT_RESOURCE_IMPORTED[] = "Resource Imported "; +const char EVENT_ACTION_EXECUTED[] = "Action Executed "; + namespace Internal { enum { debug = 0 }; } diff --git a/src/plugins/qmldesigner/qmldesignerplugin.cpp b/src/plugins/qmldesigner/qmldesignerplugin.cpp index ff6110efb7..466d304955 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.cpp +++ b/src/plugins/qmldesigner/qmldesignerplugin.cpp @@ -547,6 +547,17 @@ double QmlDesignerPlugin::formEditorDevicePixelRatio() return topLevelWindows.constFirst()->screen()->devicePixelRatio(); } +void QmlDesignerPlugin::emitUsageStatistics(const QString &identifier) +{ + QTC_ASSERT(instance(), return); + emit instance()->usageStatisticsNotifier(identifier); +} + +void QmlDesignerPlugin::emitUsageStatisticsContextAction(const QString &identifier) +{ + emitUsageStatistics(Constants::EVENT_ACTION_EXECUTED + identifier); +} + QmlDesignerPlugin *QmlDesignerPlugin::instance() { return m_instance; diff --git a/src/plugins/qmldesigner/qmldesignerplugin.h b/src/plugins/qmldesigner/qmldesignerplugin.h index 20dffbd5ba..f5a8242ae7 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.h +++ b/src/plugins/qmldesigner/qmldesignerplugin.h @@ -82,6 +82,13 @@ public: static double formEditorDevicePixelRatio(); + static void emitUsageStatistics(const QString &identifier); + static void emitUsageStatisticsContextAction(const QString &identifier); + +signals: + void usageStatisticsNotifier(const QString &identifier); + + private: // functions void integrateIntoQtCreator(QWidget *modeWidget); void showDesigner(); |