diff --git a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.cpp b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.cpp index d6db50fee73..ecb7db989bd 100644 --- a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.cpp @@ -29,6 +29,9 @@ #include "graphicsview.h" #include "handleitem.h" +#include +#include + #include #include @@ -425,6 +428,19 @@ void GraphicsScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent) graphicsView()->setZoomY(0.0); } +void GraphicsScene::focusOutEvent(QFocusEvent *focusEvent) +{ + QmlDesignerPlugin::emitUsageStatisticsTime(Constants::EVENT_CURVEDITOR_TIME, + m_usageTimer.elapsed()); + QGraphicsScene::focusOutEvent(focusEvent); +} + +void GraphicsScene::focusInEvent(QFocusEvent *focusEvent) +{ + m_usageTimer.restart(); + QGraphicsScene::focusInEvent(focusEvent); +} + GraphicsView *GraphicsScene::graphicsView() const { const QList viewList = views(); diff --git a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.h b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.h index 2e5da41bc66..cd42ffbd4da 100644 --- a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.h +++ b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.h @@ -27,6 +27,7 @@ #include "keyframeitem.h" +#include #include namespace QmlDesigner { @@ -120,6 +121,10 @@ protected: void mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent) override; + void focusOutEvent(QFocusEvent *focusEvent) override; + + void focusInEvent(QFocusEvent *focusEvent) override; + private: using QGraphicsScene::addItem; @@ -140,6 +145,8 @@ private: mutable QRectF m_limits; bool m_doNotMoveItems; + + QElapsedTimer m_usageTimer; }; } // End namespace QmlDesigner. diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.cpp index cf93c81c121..62264e037f0 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.cpp @@ -30,6 +30,9 @@ #include "nodehints.h" #include "qmlvisualnode.h" +#include +#include + #include #include @@ -132,4 +135,17 @@ void Edit3DCanvas::dropEvent(QDropEvent *e) } } +void Edit3DCanvas::focusOutEvent(QFocusEvent *focusEvent) +{ + QmlDesignerPlugin::emitUsageStatisticsTime(Constants::EVENT_3DEDITOR_TIME, + m_usageTimer.elapsed()); + QWidget::focusOutEvent(focusEvent); +} + +void Edit3DCanvas::focusInEvent(QFocusEvent *focusEvent) +{ + m_usageTimer.restart(); + QWidget::focusInEvent(focusEvent); +} + } diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.h b/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.h index df9ab26be8f..adeaef6a97b 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.h +++ b/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.h @@ -29,6 +29,7 @@ #include #include #include +#include #include namespace QmlDesigner { @@ -57,12 +58,15 @@ protected: void resizeEvent(QResizeEvent *e) override; void dragEnterEvent(QDragEnterEvent *e) override; void dropEvent(QDropEvent *e) override; + void focusOutEvent(QFocusEvent *focusEvent) override; + void focusInEvent(QFocusEvent *focusEvent) override; private: QPointer m_parent; QImage m_image; qint32 m_activeScene = -1; ItemLibraryEntry m_itemLibraryEntry; + QElapsedTimer m_usageTimer; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp index 1812ee0dc24..734793987f9 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp @@ -28,6 +28,7 @@ #include "formeditorwidget.h" #include "formeditoritem.h" #include +#include #include #include @@ -321,10 +322,21 @@ void FormEditorScene::keyReleaseEvent(QKeyEvent *keyEvent) currentTool()->keyReleaseEvent(keyEvent); } -void FormEditorScene::focusOutEvent(QFocusEvent *) +void FormEditorScene::focusOutEvent(QFocusEvent *focusEvent) { if (currentTool()) currentTool()->focusLost(); + + QmlDesignerPlugin::emitUsageStatisticsTime(Constants::EVENT_FORMEDITOR_TIME, + m_usageTimer.elapsed()); + + QGraphicsScene::focusOutEvent(focusEvent); +} + +void FormEditorScene::focusInEvent(QFocusEvent *focusEvent) +{ + m_usageTimer.restart(); + QGraphicsScene::focusInEvent(focusEvent); } FormEditorView *FormEditorScene::editorView() const diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorscene.h b/src/plugins/qmldesigner/components/formeditor/formeditorscene.h index 2ab2dc273e3..6ac22f47f41 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorscene.h +++ b/src/plugins/qmldesigner/components/formeditor/formeditorscene.h @@ -30,6 +30,7 @@ #include #include #include +#include QT_BEGIN_NAMESPACE class QGraphicsSceneMouseEvent; @@ -119,6 +120,7 @@ protected: void keyReleaseEvent(QKeyEvent *keyEvent) override; void focusOutEvent(QFocusEvent *focusEvent) override; + void focusInEvent(QFocusEvent *focusEvent) override; private: QList removeLayerItems(const QList &itemList); @@ -135,6 +137,7 @@ private: ModelNode m_dragNode; bool m_showBoundingRects; bool m_annotationVisibility; + QElapsedTimer m_usageTimer; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp index 5c2621300fb..9e78fcaa4ca 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp @@ -42,6 +42,7 @@ #include #include #include +#include #include #include #include @@ -668,6 +669,19 @@ void TimelineGraphicsScene::keyReleaseEvent(QKeyEvent *keyEvent) QGraphicsScene::keyReleaseEvent(keyEvent); } +void TimelineGraphicsScene::focusOutEvent(QFocusEvent *focusEvent) +{ + QmlDesignerPlugin::emitUsageStatisticsTime(Constants::EVENT_TIMELINE_TIME, + m_usageTimer.elapsed()); + QGraphicsScene::focusOutEvent(focusEvent); +} + +void TimelineGraphicsScene::focusInEvent(QFocusEvent *focusEvent) +{ + m_usageTimer.restart(); + QGraphicsScene::focusInEvent(focusEvent); +} + void TimelineGraphicsScene::invalidateSections() { for (auto child : m_layout->childItems()) diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.h b/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.h index 792264f8fe8..ade4edfeb8d 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.h +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.h @@ -30,6 +30,7 @@ #include +#include #include #include @@ -193,6 +194,9 @@ protected: void keyPressEvent(QKeyEvent *keyEvent) override; void keyReleaseEvent(QKeyEvent *keyEvent) override; + void focusOutEvent(QFocusEvent *focusEvent) override; + void focusInEvent(QFocusEvent *focusEvent) override; + private: void copySelectedKeyframes(); void pasteSelectedKeyframes(); @@ -215,6 +219,7 @@ private: // sorted, unique cache of keyframes positions, used for snapping QVector m_keyframePositionsCache; + QElapsedTimer m_usageTimer; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorgraphicsscene.cpp b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorgraphicsscene.cpp index c080a49314e..7bea0b07bd8 100644 --- a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorgraphicsscene.cpp +++ b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorgraphicsscene.cpp @@ -45,6 +45,7 @@ #include #include #include +#include #include #include #include @@ -401,6 +402,19 @@ void TransitionEditorGraphicsScene::keyReleaseEvent(QKeyEvent *keyEvent) QGraphicsScene::keyReleaseEvent(keyEvent); } +void TransitionEditorGraphicsScene::focusOutEvent(QFocusEvent *focusEvent) +{ + QmlDesignerPlugin::emitUsageStatisticsTime(Constants::EVENT_TRANSITIONEDITOR_TIME, + m_usageTimer.elapsed()); + QGraphicsScene::focusOutEvent(focusEvent); +} + +void TransitionEditorGraphicsScene::focusInEvent(QFocusEvent *focusEvent) +{ + m_usageTimer.restart(); + QGraphicsScene::focusInEvent(focusEvent); +} + void TransitionEditorGraphicsScene::invalidateSections() { const QList children = m_layout->childItems(); diff --git a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorgraphicsscene.h b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorgraphicsscene.h index 5f442fc952c..d4e91cdd6ca 100644 --- a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorgraphicsscene.h +++ b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorgraphicsscene.h @@ -30,6 +30,7 @@ #include +#include #include #include @@ -123,6 +124,9 @@ protected: void keyPressEvent(QKeyEvent *keyEvent) override; void keyReleaseEvent(QKeyEvent *keyEvent) override; + void focusOutEvent(QFocusEvent *focusEvent) override; + void focusInEvent(QFocusEvent *focusEvent) override; + private: void invalidateSections(); QList itemsAt(const QPointF &pos); @@ -135,6 +139,7 @@ private: int m_scrollOffset = 0; TimelineToolDelegate m_tools; TransitionEditorPropertyItem *m_selectedProperty = nullptr; + QElapsedTimer m_usageTimer; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/qmldesignerconstants.h b/src/plugins/qmldesigner/qmldesignerconstants.h index 13ab6be83e2..8884039df23 100644 --- a/src/plugins/qmldesigner/qmldesignerconstants.h +++ b/src/plugins/qmldesigner/qmldesignerconstants.h @@ -88,6 +88,11 @@ const char EVENT_ACTION_EXECUTED[] = "Action Executed "; const char EVENT_IMPORT_ADDED[] = "Import Added "; const char EVENT_BINDINGEDITOR_OPENED[] = "Binding Editor Opened"; const char EVENT_RICHTEXT_OPENED[] = "Richtext Editor Opened"; +const char EVENT_FORMEDITOR_TIME[] = "Form Editor"; +const char EVENT_3DEDITOR_TIME[] = "3D Editor"; +const char EVENT_TIMELINE_TIME[] = "Timeline"; +const char EVENT_TRANSITIONEDITOR_TIME[] = "Transition Editor"; +const char EVENT_CURVEDITOR_TIME[] = "Curve Editor"; namespace Internal { enum { debug = 0 }; diff --git a/src/plugins/qmldesigner/qmldesignerplugin.cpp b/src/plugins/qmldesigner/qmldesignerplugin.cpp index 7b078f10f59..2a855b9e8c6 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.cpp +++ b/src/plugins/qmldesigner/qmldesignerplugin.cpp @@ -566,6 +566,11 @@ ImageCache &QmlDesignerPlugin::imageCache() return m_instance->d->viewManager.imageCache(); } +void QmlDesignerPlugin::emitUsageStatisticsTime(const QString &identifier, int elapsed) +{ + emit instance()->usageStatisticsUsageTimer(identifier, elapsed); +} + QmlDesignerPlugin *QmlDesignerPlugin::instance() { return m_instance; diff --git a/src/plugins/qmldesigner/qmldesignerplugin.h b/src/plugins/qmldesigner/qmldesignerplugin.h index 721ab84b100..d6cbe078757 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.h +++ b/src/plugins/qmldesigner/qmldesignerplugin.h @@ -85,11 +85,13 @@ public: static void emitUsageStatistics(const QString &identifier); static void emitUsageStatisticsContextAction(const QString &identifier); + static void emitUsageStatisticsTime(const QString &identifier, int elapsed); static ImageCache &imageCache(); signals: void usageStatisticsNotifier(const QString &identifier); + void usageStatisticsUsageTimer(const QString &identifier, int elapsed); private: // functions