From 13e00f1e2bea0ad21da0af4bbefd97fa8100ef61 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Fri, 30 May 2025 12:20:19 +0200 Subject: [PATCH] QmlDesigner: Add Navigator tracing Change-Id: I970a75012b5451a12214389ba01dfdb5ca2b5f59 Reviewed-by: Thomas Hartmann --- src/plugins/qmldesigner/CMakeLists.txt | 7 +- .../choosefrompropertylistdialog.cpp | 19 ++- .../navigator/iconcheckboxitemdelegate.cpp | 35 ++++-- .../components/navigator/nameitemdelegate.cpp | 25 +++- .../navigator/navigatorsearchwidget.cpp | 18 +++ .../components/navigator/navigatortracing.cpp | 26 ++++ .../components/navigator/navigatortracing.h | 26 ++++ .../navigator/navigatortreemodel.cpp | 112 ++++++++++++++++- .../navigator/navigatortreeview.cpp | 54 ++++++-- .../components/navigator/navigatorview.cpp | 115 +++++++++++++++++- .../components/navigator/navigatorwidget.cpp | 36 +++++- .../components/navigator/previewtooltip.cpp | 17 +++ .../libs/designercore/CMakeLists.txt | 2 +- 13 files changed, 449 insertions(+), 43 deletions(-) create mode 100644 src/plugins/qmldesigner/components/navigator/navigatortracing.cpp create mode 100644 src/plugins/qmldesigner/components/navigator/navigatortracing.h diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt index 21c9b7aff74..5c6cc939e72 100644 --- a/src/plugins/qmldesigner/CMakeLists.txt +++ b/src/plugins/qmldesigner/CMakeLists.txt @@ -40,7 +40,9 @@ env_with_default("QTC_ENABLE_FORM_EDITOR_TRACING" ENV_QTC_ENABLE_FORM_EDITOR_TRA option(ENABLE_FORM_EDITOR_TRACING "Enable form editor tracing" ${ENV_QTC_ENABLE_FORM_EDITOR_TRACING}) add_feature_info("Form editor tracing" ${ENABLE_FORM_EDITOR_TRACING} "") - +env_with_default("QTC_ENABLE_NAVIGATOR_TRACING" ENV_QTC_ENABLE_NAVIGATOR_TRACING OFF) +option(ENABLE_NAVIGATOR_TRACING "Enable navigator tracing" ${ENV_QTC_ENABLE_NAVIGATOR_TRACING}) +add_feature_info("Navigator tracing" ${ENABLE_NAVIGATOR_TRACING} "") if(QDS_DESIGNVIEWER_USE_STAGING) add_definitions(-DQDS_DESIGNVIEWER_USE_STAGING) @@ -396,12 +398,15 @@ extend_qtc_plugin(QmlDesigner extend_qtc_plugin(QmlDesigner SOURCES_PREFIX components/navigator + PUBLIC_DEFINES + $<$:ENABLE_NAVIGATOR_TRACING> SOURCES iconcheckboxitemdelegate.cpp iconcheckboxitemdelegate.h nameitemdelegate.cpp nameitemdelegate.h navigator.qrc navigatormodelinterface.h navigatorsearchwidget.cpp navigatorsearchwidget.h + navigatortracing.cpp navigatortracing.h navigatortreemodel.cpp navigatortreemodel.h navigatortreeview.cpp navigatortreeview.h navigatorview.cpp navigatorview.h diff --git a/src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.cpp b/src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.cpp index 573cd5ab98e..a632e415d4e 100644 --- a/src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.cpp +++ b/src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.cpp @@ -2,18 +2,24 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #include "choosefrompropertylistdialog.h" -#include "nodemetainfo.h" + +#include "navigatortracing.h" #include "ui_choosefrompropertylistdialog.h" +#include #include namespace QmlDesigner { +static auto category = NavigatorTracing::category; + // This will filter and return possible properties that the given type can be bound to ChooseFromPropertyListFilter::ChooseFromPropertyListFilter(const NodeMetaInfo &insertInfo, const NodeMetaInfo &parentInfo, bool breakOnFirst) { + NanotraceHR::Tracer tracer{"choose from property list filter constructor", category()}; + // TODO: Metainfo based matching system (QDS-6240) // Fall back to a hardcoded list of supported cases: @@ -136,11 +142,15 @@ ChooseFromPropertyListDialog::ChooseFromPropertyListDialog(const QStringList &pr ChooseFromPropertyListDialog::~ChooseFromPropertyListDialog() { + NanotraceHR::Tracer tracer{"choose from property list filter destructor", category()}; + delete m_ui; } TypeName ChooseFromPropertyListDialog::selectedProperty() const { + NanotraceHR::Tracer tracer{"choose from property list filter selected property", category()}; + return m_selectedProperty; } @@ -149,6 +159,8 @@ TypeName ChooseFromPropertyListDialog::selectedProperty() const ChooseFromPropertyListDialog *ChooseFromPropertyListDialog::createIfNeeded( const ModelNode &targetNode, const ModelNode &newNode, QWidget *parent) { + NanotraceHR::Tracer tracer{"choose from property list filter create if needed", category()}; + const NodeMetaInfo info = newNode.metaInfo(); const NodeMetaInfo targetInfo = targetNode.metaInfo(); ChooseFromPropertyListFilter *filter = new ChooseFromPropertyListFilter(info, targetInfo); @@ -163,6 +175,9 @@ ChooseFromPropertyListDialog *ChooseFromPropertyListDialog::createIfNeeded( ChooseFromPropertyListDialog *ChooseFromPropertyListDialog::createIfNeeded( const ModelNode &targetNode, const NodeMetaInfo &propertyType, QWidget *parent) { + NanotraceHR::Tracer tracer{"choose from property list filter create if needed for type", + category()}; + const NodeMetaInfo metaInfo = targetNode.metaInfo(); QStringList matchingNames; for (const auto &property : metaInfo.properties()) { @@ -178,6 +193,8 @@ ChooseFromPropertyListDialog *ChooseFromPropertyListDialog::createIfNeeded( void ChooseFromPropertyListDialog::fillList(const QStringList &propNames) { + NanotraceHR::Tracer tracer{"choose from property list filter fill list", category()}; + if (propNames.isEmpty()) return; diff --git a/src/plugins/qmldesigner/components/navigator/iconcheckboxitemdelegate.cpp b/src/plugins/qmldesigner/components/navigator/iconcheckboxitemdelegate.cpp index 3c985d0bb32..97940aeb98c 100644 --- a/src/plugins/qmldesigner/components/navigator/iconcheckboxitemdelegate.cpp +++ b/src/plugins/qmldesigner/components/navigator/iconcheckboxitemdelegate.cpp @@ -5,31 +5,38 @@ #include -#include "navigatorview.h" -#include "navigatortreeview.h" +#include "navigatortracing.h" #include "navigatortreemodel.h" -#include "qproxystyle.h" +#include "navigatortreeview.h" +#include "navigatorview.h" #include #include +#include #include -#include -#include #include #include +#include +#include namespace QmlDesigner { +static auto category = NavigatorTracing::category; + IconCheckboxItemDelegate::IconCheckboxItemDelegate(QObject *parent, const QIcon &icon) : QStyledItemDelegate(parent), m_icon(icon) -{} +{ + NanotraceHR::Tracer tracer{"icon checkbox item delegate constructor", category()}; +} QSize IconCheckboxItemDelegate::sizeHint(const QStyleOptionViewItem & /*option*/, const QModelIndex & /*modelIndex*/) const { + NanotraceHR::Tracer tracer{"icon checkbox item delegate size hint", category()}; + return {15, 20}; } @@ -63,6 +70,8 @@ void IconCheckboxItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &styleOption, const QModelIndex &modelIndex) const { + NanotraceHR::Tracer tracer{"icon checkbox item delegate paint", category()}; + if (isReference(modelIndex)) return; // Do not paint hover selection and icons for reference nodes @@ -109,12 +118,13 @@ void IconCheckboxItemDelegate::paint(QPainter *painter, painter->restore(); } - bool IconCheckboxItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) { + NanotraceHR::Tracer tracer{"icon checkbox item delegate editor event", category()}; + Q_ASSERT(event); Q_ASSERT(model); @@ -130,10 +140,9 @@ bool IconCheckboxItemDelegate::editorEvent(QEvent *event, return false; // make sure that we have the right event type - if ((event->type() == QEvent::MouseButtonRelease) - || (event->type() == QEvent::MouseButtonDblClick) + if ((event->type() == QEvent::MouseButtonRelease) || (event->type() == QEvent::MouseButtonDblClick) || (event->type() == QEvent::MouseButtonPress)) { - QMouseEvent *me = static_cast(event); + QMouseEvent *me = static_cast(event); if (me->button() != Qt::LeftButton || !option.rect.contains(me->pos())) return false; @@ -142,8 +151,8 @@ bool IconCheckboxItemDelegate::editorEvent(QEvent *event, return true; } else if (event->type() == QEvent::KeyPress) { - if (static_cast(event)->key() != Qt::Key_Space - && static_cast(event)->key() != Qt::Key_Select) + if (static_cast(event)->key() != Qt::Key_Space + && static_cast(event)->key() != Qt::Key_Select) return false; } else { return false; @@ -151,7 +160,7 @@ bool IconCheckboxItemDelegate::editorEvent(QEvent *event, Qt::CheckState state = static_cast(value.toInt()); if (flags & Qt::ItemIsUserTristate) - state = ((Qt::CheckState)((state + 1) % 3)); + state = ((Qt::CheckState) ((state + 1) % 3)); else state = (state == Qt::Checked) ? Qt::Unchecked : Qt::Checked; return model->setData(index, state, Qt::CheckStateRole); diff --git a/src/plugins/qmldesigner/components/navigator/nameitemdelegate.cpp b/src/plugins/qmldesigner/components/navigator/nameitemdelegate.cpp index 1593168617f..ceedfd49501 100644 --- a/src/plugins/qmldesigner/components/navigator/nameitemdelegate.cpp +++ b/src/plugins/qmldesigner/components/navigator/nameitemdelegate.cpp @@ -3,12 +3,13 @@ #include "nameitemdelegate.h" -#include #include "choosefrompropertylistdialog.h" +#include "navigatortracing.h" #include "navigatortreeview.h" #include "navigatorview.h" #include "navigatorwidget.h" + #include #include #include @@ -20,15 +21,18 @@ #include #include +#include #include -#include -#include #include #include #include +#include +#include namespace QmlDesigner { +static auto category = NavigatorTracing::category; + int NameItemDelegate::iconOffset = 0; static QPixmap generateWavyPixmap(qreal maxRadius, const QPen &pen) @@ -91,6 +95,7 @@ static QPixmap getWavyPixmap(qreal maxRadius, const QPen &pen) NameItemDelegate::NameItemDelegate(QObject *parent) : QStyledItemDelegate(parent) { + NanotraceHR::Tracer tracer{"name item delegate constructor", category()}; } static int drawIcon(QPainter *painter, const QStyleOptionViewItem &styleOption, const QModelIndex &modelIndex) @@ -194,6 +199,8 @@ static void openContextMenu(const QModelIndex &index, const QPoint &pos) QSize NameItemDelegate::sizeHint(const QStyleOptionViewItem & /*option*/, const QModelIndex & /*modelIndex*/) const { + NanotraceHR::Tracer tracer{"name item delegate size hint", category()}; + return {15, 20 + (2 * delegateMargin)}; } @@ -201,6 +208,8 @@ void NameItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &styleOption, const QModelIndex &modelIndex) const { + NanotraceHR::Tracer tracer{"name item delegate paint", category()}; + painter->save(); painter->setPen(Theme::getColor(Theme::Color::DSnavigatorText)); @@ -283,6 +292,8 @@ QWidget *NameItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &/*option*/, const QModelIndex &index) const { + NanotraceHR::Tracer tracer{"name item delegate create editor", category()}; + if (!getModelNode(index).isValid()) return nullptr; @@ -291,6 +302,8 @@ QWidget *NameItemDelegate::createEditor(QWidget *parent, void NameItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { + NanotraceHR::Tracer tracer{"name item delegate set editor data", category()}; + const ModelNode node = getModelNode(index); const QString value = node.id(); @@ -302,6 +315,8 @@ void NameItemDelegate::setModelData(QWidget *editor, [[maybe_unused]] QAbstractItemModel *model, const QModelIndex &index) const { + NanotraceHR::Tracer tracer{"name item delegate set model data", category()}; + auto lineEdit = static_cast(editor); setId(index, lineEdit->text()); lineEdit->clearFocus(); @@ -309,6 +324,8 @@ void NameItemDelegate::setModelData(QWidget *editor, bool NameItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *, const QStyleOptionViewItem &, const QModelIndex &index) { + NanotraceHR::Tracer tracer{"name item delegate editor event", category()}; + if (event->type() == QEvent::MouseButtonRelease) { auto mouseEvent = static_cast(event); if (mouseEvent->button() == Qt::RightButton) { @@ -324,6 +341,8 @@ void NameItemDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &/*index*/) const { + NanotraceHR::Tracer tracer{"name item delegate update editor geometry", category()}; + auto lineEdit = static_cast(editor); lineEdit->setTextMargins(0, 0, 0, 2); // + 2 is shifting the QLineEdit to the left so it will align with the text when activated diff --git a/src/plugins/qmldesigner/components/navigator/navigatorsearchwidget.cpp b/src/plugins/qmldesigner/components/navigator/navigatorsearchwidget.cpp index e7fe0ebb775..a01a151dfc1 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorsearchwidget.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatorsearchwidget.cpp @@ -3,6 +3,8 @@ #include "navigatorsearchwidget.h" +#include "navigatortracing.h" + #include #include @@ -15,9 +17,13 @@ namespace QmlDesigner { +static auto category = NavigatorTracing::category; + LineEdit::LineEdit(QWidget *parent) : QLineEdit(parent) { + NanotraceHR::Tracer tracer{"line edit constructor", category()}; + clearButton = new QToolButton(this); const QString fontName = "qtds_propertyIconFont.ttf"; @@ -74,6 +80,8 @@ LineEdit::LineEdit(QWidget *parent) void LineEdit::resizeEvent([[maybe_unused]] QResizeEvent *event) { + NanotraceHR::Tracer tracer{"line edit resize event", category()}; + QSize hint = clearButton->sizeHint(); int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); @@ -83,6 +91,8 @@ void LineEdit::resizeEvent([[maybe_unused]] QResizeEvent *event) void LineEdit::keyPressEvent(QKeyEvent *event) { + NanotraceHR::Tracer tracer{"line edit key press event", category()}; + if (event->key() == Qt::Key_Escape && event->modifiers() == Qt::NoModifier) { clear(); event->accept(); @@ -93,6 +103,8 @@ void LineEdit::keyPressEvent(QKeyEvent *event) void LineEdit::paintEvent(QPaintEvent *event) { + NanotraceHR::Tracer tracer{"line edit paint event", category()}; + if (text().isEmpty()) { QPalette p(palette()); p.setColor(QPalette::Active, @@ -108,12 +120,16 @@ void LineEdit::paintEvent(QPaintEvent *event) void LineEdit::updateClearButton(const QString& text) { + NanotraceHR::Tracer tracer{"line edit update clear button", category()}; + clearButton->setVisible(!text.isEmpty()); } NavigatorSearchWidget::NavigatorSearchWidget(QWidget *parent) : QWidget(parent) { + NanotraceHR::Tracer tracer{"line edit constructor", category()}; + auto layout = new QBoxLayout(QBoxLayout::LeftToRight); layout->setSpacing(0); layout->setContentsMargins(10, 6, 10, 6); @@ -136,6 +152,8 @@ NavigatorSearchWidget::NavigatorSearchWidget(QWidget *parent) void NavigatorSearchWidget::clear() { + NanotraceHR::Tracer tracer{"line edit clear", category()}; + m_textField->clear(); } diff --git a/src/plugins/qmldesigner/components/navigator/navigatortracing.cpp b/src/plugins/qmldesigner/components/navigator/navigatortracing.cpp new file mode 100644 index 00000000000..be0341812b5 --- /dev/null +++ b/src/plugins/qmldesigner/components/navigator/navigatortracing.cpp @@ -0,0 +1,26 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include "navigatortracing.h" + +#include + +#include + +namespace QmlDesigner::NavigatorTracing { +using namespace NanotraceHR::Literals; +namespace { + +thread_local Category category_{"model", + Tracing::eventQueueWithStringArguments(), + Tracing::eventQueueWithoutArguments(), + category}; + +} // namespace + +Category &category() +{ + return category_; +} + +} // namespace QmlDesigner::NavigatorTracing diff --git a/src/plugins/qmldesigner/components/navigator/navigatortracing.h b/src/plugins/qmldesigner/components/navigator/navigatortracing.h new file mode 100644 index 00000000000..45ab5def0e9 --- /dev/null +++ b/src/plugins/qmldesigner/components/navigator/navigatortracing.h @@ -0,0 +1,26 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include + +#include + +#pragma once + +namespace QmlDesigner::NavigatorTracing { + +constexpr NanotraceHR::Tracing tracingStatus() +{ +#ifdef ENABLE_NAVIGATOR_TRACING + return NanotraceHR::Tracing::IsEnabled; +#else + return NanotraceHR::Tracing::IsDisabled; +#endif +} + +using Category = NanotraceHR::StringViewWithStringArgumentsCategory; +using SourceLocation = Category::SourceLocation; + +[[gnu::pure]] QMLDESIGNERCOMPONENTS_EXPORT Category &category(); + +} // namespace QmlDesigner::NavigatorTracing diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp index ba5e2defb4e..b5934f7a2c0 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp @@ -3,13 +3,15 @@ #include "navigatortreemodel.h" -#include "assetslibrarywidget.h" #include "choosefrompropertylistdialog.h" -#include "createtexture.h" +#include "navigatortracing.h" #include "navigatorview.h" #include "navigatorwidget.h" -#include "qmldesignerconstants.h" -#include "qmldesignerplugin.h" + +#include +#include +#include +#include #include #include @@ -55,6 +57,8 @@ namespace QmlDesigner { +static auto category = NavigatorTracing::category; + static QList modelNodesFromMimeData(const QMimeData *mimeData, AbstractView *view) { QByteArray encodedModelNodeData = mimeData->data(Constants::MIME_TYPE_MODELNODE_LIST); @@ -223,13 +227,20 @@ static QColor nodeColor(const ModelNode &node) NavigatorTreeModel::NavigatorTreeModel(QObject *parent) : QAbstractItemModel(parent) { + NanotraceHR::Tracer tracer{"navigator tree model constructor", category()}; + m_actionManager = &QmlDesignerPlugin::instance()->viewManager().designerActionManager(); } -NavigatorTreeModel::~NavigatorTreeModel() = default; +NavigatorTreeModel::~NavigatorTreeModel() +{ + NanotraceHR::Tracer tracer{"navigator tree model destructor", category()}; +} QVariant NavigatorTreeModel::data(const QModelIndex &index, int role) const { + NanotraceHR::Tracer tracer{"navigator tree model data", category()}; + if (!index.isValid()) return QVariant(); @@ -309,6 +320,8 @@ QVariant NavigatorTreeModel::data(const QModelIndex &index, int role) const Qt::ItemFlags NavigatorTreeModel::flags(const QModelIndex &index) const { + NanotraceHR::Tracer tracer{"navigator tree model flags", category()}; + if (modelNodeForIndex(index).isRootNode()) { Qt::ItemFlags flags = Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDropEnabled; if (index.column() == ColumnType::Name) @@ -353,6 +366,8 @@ static void appendForcedNodes(const NodeListProperty &property, QList QList NavigatorTreeModel::filteredList(const NodeListProperty &property, bool filter, bool reverseOrder) const { + NanotraceHR::Tracer tracer{"navigator tree model filtered list", category()}; + auto it = m_rowCache.find(property.parentModelNode()); if (it != m_rowCache.end()) @@ -395,6 +410,8 @@ QList NavigatorTreeModel::filteredList(const NodeListProperty &proper QModelIndex NavigatorTreeModel::index(int row, int column, const QModelIndex &parent) const { + NanotraceHR::Tracer tracer{"navigator tree model index", category()}; + if (!m_view->model()) return {}; @@ -432,11 +449,15 @@ QModelIndex NavigatorTreeModel::index(int row, int column, const QModelIndex &pa QVariant NavigatorTreeModel::headerData(int, Qt::Orientation, int) const { + NanotraceHR::Tracer tracer{"navigator tree model header data", category()}; + return QVariant(); } QModelIndex NavigatorTreeModel::parent(const QModelIndex &index) const { + NanotraceHR::Tracer tracer{"navigator tree model parent", category()}; + if (!index.isValid()) return {}; @@ -467,6 +488,8 @@ QModelIndex NavigatorTreeModel::parent(const QModelIndex &index) const int NavigatorTreeModel::rowCount(const QModelIndex &parent) const { + NanotraceHR::Tracer tracer{"navigator tree model row count", category()}; + if (!m_view->isAttached() || parent.column() > 0 || isReference(parent)) return 0; @@ -491,6 +514,8 @@ int NavigatorTreeModel::rowCount(const QModelIndex &parent) const int NavigatorTreeModel::columnCount(const QModelIndex &parent) const { + NanotraceHR::Tracer tracer{"navigator tree model column count", category()}; + if (parent.column() > 0) return 0; @@ -499,6 +524,8 @@ int NavigatorTreeModel::columnCount(const QModelIndex &parent) const ModelNode NavigatorTreeModel::modelNodeForIndex(const QModelIndex &index) const { + NanotraceHR::Tracer tracer{"navigator tree model model node for index", category()}; + if (!index.isValid()) return ModelNode(); @@ -513,6 +540,8 @@ ModelNode NavigatorTreeModel::modelNodeForIndex(const QModelIndex &index) const bool NavigatorTreeModel::hasModelNodeForIndex(const QModelIndex &index) const { + NanotraceHR::Tracer tracer{"navigator tree model has model node for index", category()}; + if (!index.isValid()) return false; @@ -521,11 +550,15 @@ bool NavigatorTreeModel::hasModelNodeForIndex(const QModelIndex &index) const void NavigatorTreeModel::setView(NavigatorView *view) { + NanotraceHR::Tracer tracer{"navigator tree model set view", category()}; + m_view = view; } QStringList NavigatorTreeModel::mimeTypes() const { + NanotraceHR::Tracer tracer{"navigator tree model mime types", category()}; + static const QStringList types({Constants::MIME_TYPE_MODELNODE_LIST, Constants::MIME_TYPE_ITEM_LIBRARY_INFO, Constants::MIME_TYPE_TEXTURE, @@ -540,6 +573,8 @@ QStringList NavigatorTreeModel::mimeTypes() const QMimeData *NavigatorTreeModel::mimeData(const QModelIndexList &modelIndexList) const { + NanotraceHR::Tracer tracer{"navigator tree model mime data", category()}; + auto mimeData = new QMimeData(); QByteArray encodedModelNodeData; @@ -563,11 +598,15 @@ QMimeData *NavigatorTreeModel::mimeData(const QModelIndexList &modelIndexList) c QModelIndex NavigatorTreeModel::indexForModelNode(const ModelNode &node) const { + NanotraceHR::Tracer tracer{"navigator tree model index for model node", category()}; + return m_nodeIndexHash.value(node); } QModelIndex NavigatorTreeModel::createIndexFromModelNode(int row, int column, const ModelNode &modelNode) const { + NanotraceHR::Tracer tracer{"navigator tree model create index from model node", category()}; + QModelIndex index = createIndex(row, column, modelNode.internalId()); if (column == 0) m_nodeIndexHash.insert(modelNode, index); @@ -615,6 +654,8 @@ bool NavigatorTreeModel::dropMimeData(const QMimeData *mimeData, int /*columnNumber*/, const QModelIndex &dropModelIndex) { + NanotraceHR::Tracer tracer{"navigator tree model drop mime data", category()}; + if (action == Qt::IgnoreAction) return true; @@ -777,6 +818,8 @@ void NavigatorTreeModel::handleInternalDrop(const QMimeData *mimeData, int rowNumber, const QModelIndex &dropModelIndex) { + NanotraceHR::Tracer tracer{"navigator tree model handle internal drop", category()}; + QTC_ASSERT(m_view, return); const QModelIndex rowModelIndex = dropModelIndex.sibling(dropModelIndex.row(), 0); int targetRowNumber = rowNumber; @@ -804,6 +847,8 @@ static ItemLibraryEntry createItemLibraryEntryFromMimeData(const QByteArray &dat void NavigatorTreeModel::handleItemLibraryItemDrop(const QMimeData *mimeData, int rowNumber, const QModelIndex &dropModelIndex) { + NanotraceHR::Tracer tracer{"navigator tree model handle item library item drop", category()}; + QTC_ASSERT(m_view, return); const QModelIndex rowModelIndex = dropModelIndex.sibling(dropModelIndex.row(), 0); @@ -915,6 +960,8 @@ void NavigatorTreeModel::handleItemLibraryItemDrop(const QMimeData *mimeData, in void NavigatorTreeModel::addImport(const QString &importName) { + NanotraceHR::Tracer tracer{"navigator tree model add import", category()}; + #ifdef QDS_USE_PROJECTSTORAGE Import import = Import::createLibraryImport(importName); m_view->model()->changeImports({import}, {}); @@ -927,6 +974,8 @@ void NavigatorTreeModel::addImport(const QString &importName) bool QmlDesigner::NavigatorTreeModel::moveNodeToParent(const NodeAbstractProperty &targetProperty, const ModelNode &node) { + NanotraceHR::Tracer tracer{"navigator tree model move node to parent", category()}; + NodeAbstractProperty parentProp = targetProperty.parentProperty(); if (parentProp.isValid()) { ModelNode targetModel = parentProp.parentModelNode(); @@ -938,6 +987,8 @@ bool QmlDesigner::NavigatorTreeModel::moveNodeToParent(const NodeAbstractPropert QIcon NavigatorTreeModel::colorizeIcon(const QIcon &icon, const QColor &color) const { + NanotraceHR::Tracer tracer{"navigator tree model colorize icon", category()}; + if (!color.isValid()) return icon; @@ -966,6 +1017,8 @@ void NavigatorTreeModel::moveNodesInteractive(NodeAbstractProperty &parentProper int targetIndex, bool executeInTransaction) { + NanotraceHR::Tracer tracer{"navigator tree model move nodes interactive", category()}; + QTC_ASSERT(m_view, return); auto doMoveNodesInteractive = [&parentProperty, modelNodes, targetIndex]() { @@ -1024,16 +1077,22 @@ void NavigatorTreeModel::moveNodesInteractive(NodeAbstractProperty &parentProper Qt::DropActions NavigatorTreeModel::supportedDropActions() const { + NanotraceHR::Tracer tracer{"navigator tree model supported drop actions", category()}; + return Qt::LinkAction | Qt::MoveAction; } Qt::DropActions NavigatorTreeModel::supportedDragActions() const { + NanotraceHR::Tracer tracer{"navigator tree model supported drag actions", category()}; + return Qt::LinkAction; } bool NavigatorTreeModel::setData(const QModelIndex &index, const QVariant &value, int role) { + NanotraceHR::Tracer tracer{"navigator tree model set data", category()}; + QTC_ASSERT(m_view, return false); ModelNode modelNode = modelNodeForIndex(index); if (index.column() == ColumnType::Alias && role == Qt::CheckStateRole) { @@ -1053,6 +1112,8 @@ bool NavigatorTreeModel::setData(const QModelIndex &index, const QVariant &value void NavigatorTreeModel::notifyDataChanged(const ModelNode &modelNode) { + NanotraceHR::Tracer tracer{"navigator tree model notify data changed", category()}; + const auto emitDataChanged = [this](const QModelIndex &index) { const QAbstractItemModel *model = index.model(); const QModelIndex sibling = model ? model->sibling(index.row(), ColumnType::Count - 1, index) @@ -1081,12 +1142,16 @@ static QList collectParents(const QList &modelNodes) QList NavigatorTreeModel::nodesToPersistentIndex(const QList &modelNodes) { + NanotraceHR::Tracer tracer{"navigator tree model nodes to persistent index", category()}; + return ::Utils::transform>( modelNodes, std::bind_front(&NavigatorTreeModel::indexForModelNode, this)); } void NavigatorTreeModel::notifyModelNodesRemoved(const QList &modelNodes) { + NanotraceHR::Tracer tracer{"navigator tree model notify model nodes removed", category()}; + for (const ModelNode &modelNode : modelNodes) m_referenceIndexHash.remove(modelNode); @@ -1099,6 +1164,8 @@ void NavigatorTreeModel::notifyModelNodesRemoved(const QList &modelNo void NavigatorTreeModel::notifyModelNodesInserted(const QList &modelNodes) { + NanotraceHR::Tracer tracer{"navigator tree model notify model nodes inserted", category()}; + m_rowReferenceCache.clear(); m_rowCache.clear(); QList indexes = nodesToPersistentIndex(collectParents(modelNodes)); @@ -1108,6 +1175,8 @@ void NavigatorTreeModel::notifyModelNodesInserted(const QList &modelN void NavigatorTreeModel::notifyModelNodesMoved(const QList &modelNodes) { + NanotraceHR::Tracer tracer{"navigator tree model notify model nodes moved", category()}; + m_rowReferenceCache.clear(); m_rowCache.clear(); QList indexes = nodesToPersistentIndex(collectParents(modelNodes)); @@ -1117,6 +1186,9 @@ void NavigatorTreeModel::notifyModelNodesMoved(const QList &modelNode void NavigatorTreeModel::notifyModelReferenceNodesUpdated(const QList &modelNodes) { + NanotraceHR::Tracer tracer{"navigator tree model notify model reference nodes updated", + category()}; + for (const ModelNode &modelNode : modelNodes) m_rowReferenceCache.remove(modelNode); @@ -1127,11 +1199,15 @@ void NavigatorTreeModel::notifyModelReferenceNodesUpdated(const QList void NavigatorTreeModel::notifyIconsChanged() { + NanotraceHR::Tracer tracer{"navigator tree model notify icons changed", category()}; + emit dataChanged(index(0, 0), index(rowCount(), 0), {Qt::DecorationRole}); } void NavigatorTreeModel::showReferences(bool show) { + NanotraceHR::Tracer tracer{"navigator tree model show references", category()}; + m_showReferenceItems = show; m_rowCache.clear(); resetModel(); @@ -1139,6 +1215,8 @@ void NavigatorTreeModel::showReferences(bool show) void NavigatorTreeModel::setFilter(bool showOnlyVisibleItems) { + NanotraceHR::Tracer tracer{"navigator tree model set filter", category()}; + m_showOnlyVisibleItems = showOnlyVisibleItems; m_rowCache.clear(); resetModel(); @@ -1146,6 +1224,8 @@ void NavigatorTreeModel::setFilter(bool showOnlyVisibleItems) void NavigatorTreeModel::setNameFilter(const QString &filter) { + NanotraceHR::Tracer tracer{"navigator tree model set name filter", category()}; + m_nameFilter = filter; m_rowCache.clear(); @@ -1175,6 +1255,8 @@ void NavigatorTreeModel::setNameFilter(const QString &filter) void NavigatorTreeModel::setOrder(bool reverseItemOrder) { + NanotraceHR::Tracer tracer{"navigator tree model set order", category()}; + m_reverseItemOrder = reverseItemOrder; m_rowCache.clear(); resetModel(); @@ -1182,6 +1264,8 @@ void NavigatorTreeModel::setOrder(bool reverseItemOrder) void NavigatorTreeModel::resetModel() { + NanotraceHR::Tracer tracer{"navigator tree model reset model", category()}; + beginResetModel(); m_rowCache.clear(); m_nodeIndexHash.clear(); @@ -1192,16 +1276,22 @@ void NavigatorTreeModel::resetModel() void NavigatorTreeModel::updateToolTipPixmap(const ModelNode &node, const QPixmap &pixmap) { + NanotraceHR::Tracer tracer{"navigator tree model update tool tip pixmap", category()}; + emit toolTipPixmapUpdated(node.id(), pixmap); } bool NavigatorTreeModel::isReferenceNodesVisible() const { + NanotraceHR::Tracer tracer{"navigator tree model is reference nodes visible", category()}; + return m_showReferenceItems; } bool NavigatorTreeModel::canBeReference(const ModelNode &modelNode) const { + NanotraceHR::Tracer tracer{"navigator tree model can be reference", category()}; + return modelNode.hasMetaInfo(); } @@ -1209,6 +1299,8 @@ QModelIndex NavigatorTreeModel::createReferenceIndex(int row, int column, const ReferenceData &referenceData) const { + NanotraceHR::Tracer tracer{"navigator tree model create reference index", category()}; + const QString uniqueId = QString("%1-%2-%3") .arg(referenceData.owner.internalId()) .arg(referenceData.current.internalId()) @@ -1226,6 +1318,8 @@ QModelIndex NavigatorTreeModel::createReferenceIndex(int row, void NavigatorTreeModel::resetReferences() { + NanotraceHR::Tracer tracer{"navigator tree model reset references", category()}; + m_rowReferenceCache.clear(); m_referenceIndexHash.clear(); m_referenceUnique.clear(); @@ -1235,6 +1329,8 @@ void NavigatorTreeModel::resetReferences() QList NavigatorTreeModel::referenceList(const QList &bindingProperties, const QList &unwanted) const { + NanotraceHR::Tracer tracer{"navigator tree model reference list", category()}; + if (bindingProperties.isEmpty()) return {}; @@ -1261,17 +1357,23 @@ QList NavigatorTreeModel::referenceList(const QList bool NavigatorTreeModel::isReference(const QModelIndex &index) const { + NanotraceHR::Tracer tracer{"navigator tree model is reference", category()}; + return m_references.contains(index.internalId()); } ModelNode NavigatorTreeModel::referenceExtractCurrent(const QModelIndex &index) const { + NanotraceHR::Tracer tracer{"navigator tree model reference extract current", category()}; + Q_ASSERT(isReference(index)); return m_references[index.internalId()].current; } ModelNode NavigatorTreeModel::referenceExtractOwner(const QModelIndex &index) const { + NanotraceHR::Tracer tracer{"navigator tree model reference extract owner", category()}; + Q_ASSERT(isReference(index)); return m_references[index.internalId()].owner; } diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp index 53e597af44e..fde690857de 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp @@ -3,13 +3,14 @@ #include "navigatortreeview.h" +#include "navigatortracing.h" +#include "navigatortreemodel.h" +#include "navigatorview.h" +#include "previewtooltip.h" + #include -#include "modelnode.h" -#include "navigatorview.h" -#include "navigatortreemodel.h" -#include "qproxystyle.h" -#include "previewtooltip.h" +#include #include @@ -18,19 +19,22 @@ #include #include -#include -#include -#include -#include -#include -#include +#include #include #include +#include +#include +#include +#include +#include +#include namespace QmlDesigner { namespace { +auto category = NavigatorTracing::category; + // This style basically allows us to span the entire row // including the arrow indicators which would otherwise not be // drawn by the delegate @@ -40,6 +44,8 @@ public: TableViewStyle(QObject *parent) : QProxyStyle(new StudioStyle("fusion")) { + NanotraceHR::Tracer tracer{"table view style constructor", category()}; + setParent(parent); baseStyle()->setParent(parent); } @@ -49,6 +55,8 @@ public: QPainter *painter, const QWidget *widget = nullptr) const override { + NanotraceHR::Tracer tracer{"table view style draw primitive", category()}; + static QRect mouseOverStateSavedFrameRectangle; if (element == QStyle::PE_PanelItemViewRow) { if (option->state & QStyle::State_MouseOver) @@ -136,6 +144,8 @@ public: const QWidget *widget = nullptr, QStyleHintReturn *returnData = nullptr) const override { + NanotraceHR::Tracer tracer{"table view style style hint", category()}; + if (hint == SH_ItemView_ShowDecorationSelected) return 0; else @@ -145,12 +155,16 @@ public: private: // functions QColor highlightBrushColor() const { + NanotraceHR::Tracer tracer{"table view style highlight brush color", category()}; + QColor color = Theme::getColor(Theme::Color::DSnavigatorDropIndicatorBackground); color.setAlphaF(0.7f); return color; } QColor highlightLineColor() const { + NanotraceHR::Tracer tracer{"table view style highlight line color", category()}; + QColor color = Theme::getColor(Theme::Color::DSnavigatorDropIndicatorOutline); color.setAlphaF(0.7f); return color; @@ -158,6 +172,8 @@ private: // functions void drawHighlightFrame(const QRect &frameRectangle, QPainter *painter) const { + NanotraceHR::Tracer tracer{"table view style draw highlight frame", category()}; + painter->setPen(QPen(highlightLineColor(), 2)); painter->setBrush(highlightBrushColor()); painter->drawRect(frameRectangle); @@ -165,12 +181,16 @@ private: // functions void drawIndicatorLine(const QPoint &leftPoint, const QPoint &rightPoint, QPainter *painter) const { + NanotraceHR::Tracer tracer{"table view style draw indicator line", category()}; + painter->setPen(QPen(highlightLineColor(), 3)); painter->drawLine(leftPoint, rightPoint); } QRect adjustedRectangleToWidgetWidth(const QRect &originalRectangle, const QWidget *widget) const { + NanotraceHR::Tracer tracer{"table view style adjusted rectangle to widget width", category()}; + QRect adjustesRectangle = originalRectangle; adjustesRectangle.setLeft(0); adjustesRectangle.setWidth(widget->rect().width()); @@ -185,6 +205,8 @@ private: // variables NavigatorTreeView::NavigatorTreeView(QWidget *parent) : QTreeView(parent) { + NanotraceHR::Tracer tracer{"navigator tree view constructor", category()}; + setStyle(new TableViewStyle(this)); setMinimumWidth(240); setRootIsDecorated(false); @@ -194,6 +216,8 @@ NavigatorTreeView::NavigatorTreeView(QWidget *parent) void NavigatorTreeView::drawSelectionBackground(QPainter *painter, const QStyleOption &option) { + NanotraceHR::Tracer tracer{"navigator tree view draw selection background", category()}; + painter->save(); painter->fillRect(option.rect.adjusted(0, delegateMargin, 0, -delegateMargin), Theme::getColor(Theme::Color::DSnavigatorItemBackgroundSelected)); @@ -202,6 +226,8 @@ void NavigatorTreeView::drawSelectionBackground(QPainter *painter, const QStyleO bool NavigatorTreeView::viewportEvent(QEvent *event) { + NanotraceHR::Tracer tracer{"navigator tree view viewport event", category()}; + const QPoint offset(10, 5); if (event->type() == QEvent::ToolTip) { @@ -260,6 +286,8 @@ bool NavigatorTreeView::viewportEvent(QEvent *event) void NavigatorTreeView::mousePressEvent(QMouseEvent *event) { + NanotraceHR::Tracer tracer{"navigator tree view mouse press event", category()}; + m_clickedIndex = indexAt(event->pos()); if (auto navModel = qobject_cast(model())) { if (navModel->isReference(m_clickedIndex)) { @@ -279,6 +307,8 @@ void NavigatorTreeView::mousePressEvent(QMouseEvent *event) void NavigatorTreeView::mouseReleaseEvent(QMouseEvent *event) { + NanotraceHR::Tracer tracer{"navigator tree view mouse release event", category()}; + const QModelIndex modelIndex = indexAt(event->pos()); if (m_clickedIndex == modelIndex) { if (auto navModel = qobject_cast(model())) { @@ -299,6 +329,8 @@ void NavigatorTreeView::mouseReleaseEvent(QMouseEvent *event) void NavigatorTreeView::startDrag(Qt::DropActions supportedActions) { + NanotraceHR::Tracer tracer{"navigator tree view start drag", category()}; + if (m_dragAllowed) { if (m_previewToolTip) { // Workaround to ensure tooltip doesn't linger during drag, as drag grabs all mouse diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp index 986857a603b..23ad269a7fc 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp @@ -5,6 +5,7 @@ #include "iconcheckboxitemdelegate.h" #include "nameitemdelegate.h" +#include "navigatortracing.h" #include "navigatortreemodel.h" #include "navigatorwidget.h" @@ -17,13 +18,13 @@ #include #include #include -#include -#include -#include #include #include #include #include +#include +#include +#include #include #include @@ -42,6 +43,8 @@ #include #include +static auto category = QmlDesigner::NavigatorTracing::category; + inline static void setScenePos(const QmlDesigner::ModelNode &modelNode, const QPointF &pos) { if (modelNode.hasParentProperty() && QmlDesigner::QmlItemNode::isValidQmlItemNode(modelNode.parentProperty().parentModelNode())) { @@ -94,22 +97,28 @@ NavigatorView::NavigatorView(ExternalDependenciesInterface &externalDependencies : AbstractView{externalDependencies} , m_blockSelectionChangedSignal(false) { - + NanotraceHR::Tracer tracer{"navigator view constructor", category()}; } NavigatorView::~NavigatorView() { + NanotraceHR::Tracer tracer{"navigator view destructor", category()}; + if (m_widget && !m_widget->parent()) delete m_widget.data(); } bool NavigatorView::hasWidget() const { + NanotraceHR::Tracer tracer{"navigator view has widget", category()}; + return true; } WidgetInfo NavigatorView::widgetInfo() { + NanotraceHR::Tracer tracer{"navigator view widget info", category()}; + if (!m_widget) setupWidget(); @@ -122,6 +131,8 @@ WidgetInfo NavigatorView::widgetInfo() void NavigatorView::modelAttached(Model *model) { + NanotraceHR::Tracer tracer{"navigator view model attached", category()}; + AbstractView::modelAttached(model); QTreeView *treeView = treeWidget(); @@ -185,6 +196,8 @@ void NavigatorView::modelAttached(Model *model) void NavigatorView::clearExplorerWarnings() { + NanotraceHR::Tracer tracer{"navigator view clear explorer warnings", category()}; + QList allNodes; allNodes.append(rootModelNode()); allNodes.append(rootModelNode().allSubModelNodes()); @@ -199,6 +212,8 @@ void NavigatorView::clearExplorerWarnings() void NavigatorView::modelAboutToBeDetached(Model *model) { + NanotraceHR::Tracer tracer{"navigator view model about to be detached", category()}; + QHash &localExpandMap = m_expandMap[model->fileUrl()]; // If detaching full document model, recreate expand map from scratch to remove stale entries. @@ -241,12 +256,16 @@ void NavigatorView::modelAboutToBeDetached(Model *model) void NavigatorView::importsChanged(const Imports &/*addedImports*/, const Imports &/*removedImports*/) { + NanotraceHR::Tracer tracer{"navigator view imports changed", category()}; + treeWidget()->update(); } void NavigatorView::bindingPropertiesChanged(const QList &propertyList, PropertyChangeFlags /*propertyChange*/) { + NanotraceHR::Tracer tracer{"navigator view binding properties changed", category()}; + QSet owners; for (const BindingProperty &bindingProperty : propertyList) { @@ -274,6 +293,8 @@ void NavigatorView::bindingPropertiesChanged(const QList &prope void NavigatorView::dragStarted(QMimeData *mimeData) { + NanotraceHR::Tracer tracer{"navigator view drag started", category()}; + if (mimeData->hasFormat(Constants::MIME_TYPE_ITEM_LIBRARY_INFO)) { QByteArray data = mimeData->data(Constants::MIME_TYPE_ITEM_LIBRARY_INFO); QDataStream stream(data); @@ -345,6 +366,8 @@ void NavigatorView::dragStarted(QMimeData *mimeData) void NavigatorView::dragEnded() { + NanotraceHR::Tracer tracer{"navigator view drag ended", category()}; + m_widget->setDragType(""); m_widget->update(); } @@ -354,12 +377,16 @@ void NavigatorView::customNotification([[maybe_unused]] const AbstractView *view [[maybe_unused]] const QList &nodeList, [[maybe_unused]] const QList &data) { + NanotraceHR::Tracer tracer{"navigator view custom notification", category()}; + if (identifier == "asset_import_update") m_currentModelInterface->notifyIconsChanged(); } void NavigatorView::handleChangedExport(const ModelNode &modelNode, bool exported) { + NanotraceHR::Tracer tracer{"navigator view handle changed export", category()}; + const ModelNode rootNode = rootModelNode(); Q_ASSERT(rootNode.isValid()); const PropertyName modelNodeId = modelNode.id().toUtf8(); @@ -375,17 +402,23 @@ void NavigatorView::handleChangedExport(const ModelNode &modelNode, bool exporte bool NavigatorView::isNodeInvisible(const ModelNode &modelNode) const { + NanotraceHR::Tracer tracer{"navigator view is node invisible", category()}; + return QmlVisualNode(modelNode).visibilityOverride(); } void NavigatorView::disableWidget() { + NanotraceHR::Tracer tracer{"navigator view disable widget", category()}; + if (m_widget) m_widget->disableNavigator(); } void NavigatorView::enableWidget() { + NanotraceHR::Tracer tracer{"navigator view enable widget", category()}; + if (m_widget) m_widget->enableNavigator(); } @@ -394,6 +427,8 @@ void NavigatorView::modelNodePreviewPixmapChanged(const ModelNode &node, const QPixmap &pixmap, const QByteArray &requestId) { + NanotraceHR::Tracer tracer{"navigator view model node preview pixmap changed", category()}; + // There might be multiple requests for different preview pixmap sizes. // Here only the one with the default size is picked. if (requestId.isEmpty()) @@ -402,6 +437,8 @@ void NavigatorView::modelNodePreviewPixmapChanged(const ModelNode &node, ModelNode NavigatorView::modelNodeForIndex(const QModelIndex &modelIndex) const { + NanotraceHR::Tracer tracer{"navigator view model node for index", category()}; + return modelIndex.model()->data(modelIndex, ModelNodeRole).value(); } @@ -413,6 +450,8 @@ void NavigatorView::nodeRemoved(const ModelNode &removedNode, const NodeAbstractProperty & /*parentProperty*/, AbstractView::PropertyChangeFlags /*propertyChange*/) { + NanotraceHR::Tracer tracer{"navigator view node removed", category()}; + m_currentModelInterface->notifyModelNodesRemoved({removedNode}); } @@ -421,6 +460,8 @@ void NavigatorView::nodeReparented(const ModelNode &modelNode, const NodeAbstractProperty & oldPropertyParent, AbstractView::PropertyChangeFlags /*propertyChange*/) { + NanotraceHR::Tracer tracer{"navigator view node reparented", category()}; + if (!oldPropertyParent.isValid()) m_currentModelInterface->notifyModelNodesInserted({modelNode}); else @@ -433,6 +474,8 @@ void NavigatorView::nodeReparented(const ModelNode &modelNode, void NavigatorView::nodeIdChanged(const ModelNode& modelNode, const QString & /*newId*/, const QString & /*oldId*/) { + NanotraceHR::Tracer tracer{"navigator view node id changed", category()}; + m_currentModelInterface->notifyDataChanged(modelNode); } @@ -442,6 +485,8 @@ void NavigatorView::propertiesAboutToBeRemoved(const QList &/* void NavigatorView::propertiesRemoved(const QList &propertyList) { + NanotraceHR::Tracer tracer{"navigator view properties removed", category()}; + QList modelNodes; for (const AbstractProperty &property : propertyList) { if (property.isNodeAbstractProperty()) { @@ -455,11 +500,15 @@ void NavigatorView::propertiesRemoved(const QList &propertyLis void NavigatorView::rootNodeTypeChanged(const QString &/*type*/, int /*majorVersion*/, int /*minorVersion*/) { + NanotraceHR::Tracer tracer{"navigator view root node type changed", category()}; + m_currentModelInterface->notifyDataChanged(rootModelNode()); } void NavigatorView::nodeTypeChanged(const ModelNode &modelNode, const TypeName &, int , int) { + NanotraceHR::Tracer tracer{"navigator view node type changed", category()}; + m_currentModelInterface->notifyDataChanged(modelNode); } @@ -467,6 +516,8 @@ void NavigatorView::auxiliaryDataChanged(const ModelNode &modelNode, [[maybe_unused]] AuxiliaryDataKeyView key, [[maybe_unused]] const QVariant &data) { + NanotraceHR::Tracer tracer{"navigator view auxiliary data changed", category()}; + m_currentModelInterface->notifyDataChanged(modelNode); if (key == lockedProperty) { @@ -479,6 +530,8 @@ void NavigatorView::auxiliaryDataChanged(const ModelNode &modelNode, void NavigatorView::instanceErrorChanged(const QVector &errorNodeList) { + NanotraceHR::Tracer tracer{"navigator view instance error changed", category()}; + for (const ModelNode &modelNode : errorNodeList) { m_currentModelInterface->notifyDataChanged(modelNode); propagateInstanceErrorToExplorer(modelNode); @@ -487,6 +540,8 @@ void NavigatorView::instanceErrorChanged(const QVector &errorNodeList void NavigatorView::nodeOrderChanged(const NodeListProperty &listProperty) { + NanotraceHR::Tracer tracer{"navigator view node order changed", category()}; + m_currentModelInterface->notifyModelNodesMoved(listProperty.directSubNodes()); // make sure selection is in sync again @@ -495,6 +550,8 @@ void NavigatorView::nodeOrderChanged(const NodeListProperty &listProperty) void NavigatorView::changeToComponent(const QModelIndex &index) { + NanotraceHR::Tracer tracer{"navigator view change to component", category()}; + if (index.isValid() && currentModel()->data(index, Qt::UserRole).isValid()) { const ModelNode doubleClickNode = modelNodeForIndex(index); if (doubleClickNode.metaInfo().isFileComponent()) @@ -507,16 +564,22 @@ void NavigatorView::changeToComponent(const QModelIndex &index) QModelIndex NavigatorView::indexForModelNode(const ModelNode &modelNode) const { + NanotraceHR::Tracer tracer{"navigator view index for model node", category()}; + return m_currentModelInterface->indexForModelNode(modelNode); } QAbstractItemModel *NavigatorView::currentModel() const { + NanotraceHR::Tracer tracer{"navigator view current model", category()}; + return treeWidget()->model(); } const ProjectExplorer::FileNode *NavigatorView::fileNodeForModelNode(const ModelNode &node) const { + NanotraceHR::Tracer tracer{"navigator view file node for model node", category()}; + QString filename = ModelUtils::componentFilePath(node); Utils::FilePath filePath = Utils::FilePath::fromString(filename); ProjectExplorer::Project *currentProject = ProjectExplorer::ProjectManager::projectForFile( @@ -539,6 +602,8 @@ const ProjectExplorer::FileNode *NavigatorView::fileNodeForModelNode(const Model const ProjectExplorer::FileNode *NavigatorView::fileNodeForIndex(const QModelIndex &index) const { + NanotraceHR::Tracer tracer{"navigator view file node for index", category()}; + if (index.isValid() && currentModel()->data(index, Qt::UserRole).isValid()) { ModelNode node = modelNodeForIndex(index); if (node.metaInfo().isFileComponent()) { @@ -549,8 +614,11 @@ const ProjectExplorer::FileNode *NavigatorView::fileNodeForIndex(const QModelInd return nullptr; } -void NavigatorView::propagateInstanceErrorToExplorer(const ModelNode &modelNode) { - QModelIndex index = indexForModelNode(modelNode);; +void NavigatorView::propagateInstanceErrorToExplorer(const ModelNode &modelNode) +{ + NanotraceHR::Tracer tracer{"navigator view propagate instance error to explorer", category()}; + + QModelIndex index = indexForModelNode(modelNode); do { const ProjectExplorer::FileNode *fnode = fileNodeForIndex(index); @@ -566,6 +634,8 @@ void NavigatorView::propagateInstanceErrorToExplorer(const ModelNode &modelNode) void NavigatorView::leftButtonClicked() { + NanotraceHR::Tracer tracer{"navigator view left button clicked", category()}; + if (selectedModelNodes().size() > 1) return; //Semantics are unclear for multi selection. @@ -590,6 +660,8 @@ void NavigatorView::leftButtonClicked() void NavigatorView::rightButtonClicked() { + NanotraceHR::Tracer tracer{"navigator view right button clicked", category()}; + if (selectedModelNodes().size() > 1) return; //Semantics are unclear for multi selection. @@ -634,6 +706,8 @@ void NavigatorView::rightButtonClicked() void NavigatorView::upButtonClicked() { + NanotraceHR::Tracer tracer{"navigator view up button clicked", category()}; + bool blocked = blockSelectionChangedSignal(true); bool reverse = QmlDesignerPlugin::settings().value(DesignerSettingsKey::NAVIGATOR_REVERSE_ITEM_ORDER).toBool(); @@ -648,6 +722,8 @@ void NavigatorView::upButtonClicked() void NavigatorView::downButtonClicked() { + NanotraceHR::Tracer tracer{"navigator view down button clicked", category()}; + bool blocked = blockSelectionChangedSignal(true); bool reverse = QmlDesignerPlugin::settings().value(DesignerSettingsKey::NAVIGATOR_REVERSE_ITEM_ORDER).toBool(); @@ -662,12 +738,16 @@ void NavigatorView::downButtonClicked() void NavigatorView::colorizeToggled(bool flag) { + NanotraceHR::Tracer tracer{"navigator view colorize toggled", category()}; + QmlDesignerPlugin::settings().insert(DesignerSettingsKey::NAVIGATOR_COLORIZE_ICONS, flag); m_currentModelInterface->notifyIconsChanged(); } void NavigatorView::referenceToggled(bool flag) { + NanotraceHR::Tracer tracer{"navigator view reference toggled", category()}; + m_currentModelInterface->showReferences(flag); treeWidget()->expandAll(); QmlDesignerPlugin::settings().insert(DesignerSettingsKey::NAVIGATOR_SHOW_REFERENCE_NODES, flag); @@ -675,6 +755,8 @@ void NavigatorView::referenceToggled(bool flag) void NavigatorView::filterToggled(bool flag) { + NanotraceHR::Tracer tracer{"navigator view filter toggled", category()}; + m_currentModelInterface->setFilter(flag); treeWidget()->expandAll(); QmlDesignerPlugin::settings().insert(DesignerSettingsKey::NAVIGATOR_SHOW_ONLY_VISIBLE_ITEMS, flag); @@ -682,6 +764,8 @@ void NavigatorView::filterToggled(bool flag) void NavigatorView::reverseOrderToggled(bool flag) { + NanotraceHR::Tracer tracer{"navigator view reverse order toggled", category()}; + m_currentModelInterface->setOrder(flag); treeWidget()->expandAll(); QmlDesignerPlugin::settings().insert(DesignerSettingsKey::NAVIGATOR_REVERSE_ITEM_ORDER, flag); @@ -689,12 +773,16 @@ void NavigatorView::reverseOrderToggled(bool flag) void NavigatorView::textFilterChanged(const QString &text) { + NanotraceHR::Tracer tracer{"navigator view text filter changed", category()}; + m_treeModel->setNameFilter(text); treeWidget()->expandAll(); } void NavigatorView::changeSelection(const QItemSelection & /*newSelection*/, const QItemSelection &/*deselected*/) { + NanotraceHR::Tracer tracer{"navigator view change selection", category()}; + if (m_blockSelectionChangedSignal) return; @@ -713,12 +801,16 @@ void NavigatorView::changeSelection(const QItemSelection & /*newSelection*/, con void NavigatorView::selectedNodesChanged(const QList &/*selectedNodeList*/, const QList &/*lastSelectedNodeList*/) { + NanotraceHR::Tracer tracer{"navigator view selected nodes changed", category()}; + // Update selection asynchronously to ensure NavigatorTreeModel's index cache is up to date QTimer::singleShot(0, this, &NavigatorView::updateItemSelection); } void NavigatorView::updateItemSelection() { + NanotraceHR::Tracer tracer{"navigator view update item selection", category()}; + if (!isAttached()) return; @@ -761,6 +853,7 @@ void NavigatorView::updateItemSelection() QTreeView *NavigatorView::treeWidget() const { + NanotraceHR::Tracer tracer{"navigator view tree widget", category()}; if (m_widget) return m_widget->treeView(); return nullptr; @@ -768,12 +861,16 @@ QTreeView *NavigatorView::treeWidget() const NavigatorTreeModel *NavigatorView::treeModel() { + NanotraceHR::Tracer tracer{"navigator view tree model", category()}; + return m_treeModel.data(); } // along the lines of QObject::blockSignals bool NavigatorView::blockSelectionChangedSignal(bool block) { + NanotraceHR::Tracer tracer{"navigator view block selection changed signal", category()}; + bool oldValue = m_blockSelectionChangedSignal; m_blockSelectionChangedSignal = block; return oldValue; @@ -781,6 +878,8 @@ bool NavigatorView::blockSelectionChangedSignal(bool block) void NavigatorView::expandAncestors(const QModelIndex &index) { + NanotraceHR::Tracer tracer{"navigator view expand ancestors", category()}; + QModelIndex currentIndex = index.parent(); while (currentIndex.isValid()) { if (!treeWidget()->isExpanded(currentIndex)) @@ -791,6 +890,8 @@ void NavigatorView::expandAncestors(const QModelIndex &index) void NavigatorView::reparentAndCatch(NodeAbstractProperty property, const ModelNode &modelNode) { + NanotraceHR::Tracer tracer{"navigator view reparent and catch", category()}; + try { property.reparentHere(modelNode); } catch (Exception &exception) { @@ -800,6 +901,8 @@ void NavigatorView::reparentAndCatch(NodeAbstractProperty property, const ModelN void NavigatorView::setupWidget() { + NanotraceHR::Tracer tracer{"navigator view setup widget", category()}; + m_widget = new NavigatorWidget(this); m_treeModel = new NavigatorTreeModel(this); m_treeModel->setView(this); diff --git a/src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp b/src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp index 577b5bd6435..84f66ed8bc3 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp @@ -1,8 +1,9 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "navigatorsearchwidget.h" #include "navigatorwidget.h" +#include "navigatorsearchwidget.h" +#include "navigatortracing.h" #include "navigatorview.h" #include @@ -29,10 +30,14 @@ using namespace Core; namespace QmlDesigner { +static auto category = NavigatorTracing::category; + NavigatorWidget::NavigatorWidget(NavigatorView *view) : m_treeView(new NavigatorTreeView) , m_navigatorView(view) { + NanotraceHR::Tracer tracer{"navigator widget constructor", category()}; + setAcceptDrops(true); m_treeView->setDragEnabled(true); @@ -77,16 +82,22 @@ NavigatorWidget::NavigatorWidget(NavigatorView *view) void NavigatorWidget::setTreeModel(QAbstractItemModel *model) { + NanotraceHR::Tracer tracer{"navigator widget set tree model", category()}; + m_treeView->setModel(model); } QTreeView *NavigatorWidget::treeView() const { + NanotraceHR::Tracer tracer{"navigator widget tree view", category()}; + return m_treeView; } QList NavigatorWidget::createToolBarWidgets() { + NanotraceHR::Tracer tracer{"navigator widget create toolbar widgets", category()}; + QList buttons; auto empty = new QWidget(); @@ -212,6 +223,8 @@ QList NavigatorWidget::createToolBarWidgets() QToolBar *NavigatorWidget::createToolBar() { + NanotraceHR::Tracer tracer{"navigator widget create toolbar", category()}; + const QList buttons = createToolBarWidgets(); auto toolBar = new QToolBar(); @@ -224,6 +237,8 @@ QToolBar *NavigatorWidget::createToolBar() void NavigatorWidget::contextHelp(const Core::IContext::HelpCallback &callback) const { + NanotraceHR::Tracer tracer{"navigator widget context help", category()}; + if (auto view = navigatorView()) { QmlDesignerPlugin::contextHelp(callback, view->contextHelpId()); } else { @@ -233,29 +248,40 @@ void NavigatorWidget::contextHelp(const Core::IContext::HelpCallback &callback) void NavigatorWidget::disableNavigator() { + NanotraceHR::Tracer tracer{"navigator widget disable navigator", category()}; + m_treeView->setEnabled(false); } void NavigatorWidget::enableNavigator() { + NanotraceHR::Tracer tracer{"navigator widget enable navigator", category()}; + m_treeView->setEnabled(true); } NavigatorView *NavigatorWidget::navigatorView() const { + NanotraceHR::Tracer tracer{"navigator widget navigator view", category()}; + return m_navigatorView.data(); } void NavigatorWidget::dragEnterEvent(QDragEnterEvent *dragEnterEvent) { + NanotraceHR::Tracer tracer{"navigator widget drag enter event", category()}; + const DesignerActionManager &actionManager = QmlDesignerPlugin::instance() - ->viewManager().designerActionManager(); + ->viewManager() + .designerActionManager(); if (actionManager.externalDragHasSupportedAssets(dragEnterEvent->mimeData())) dragEnterEvent->acceptProposedAction(); } void NavigatorWidget::dropEvent(QDropEvent *dropEvent) { + NanotraceHR::Tracer tracer{"navigator widget drop event", category()}; + dropEvent->accept(); const DesignerActionManager &actionManager = QmlDesignerPlugin::instance() ->viewManager().designerActionManager(); @@ -264,16 +290,22 @@ void NavigatorWidget::dropEvent(QDropEvent *dropEvent) void NavigatorWidget::setDragType(const QByteArray &type) { + NanotraceHR::Tracer tracer{"navigator widget set drag type", category()}; + m_dragType = type; } QByteArray NavigatorWidget::dragType() const { + NanotraceHR::Tracer tracer{"navigator widget drag type", category()}; + return m_dragType; } void NavigatorWidget::clearSearch() { + NanotraceHR::Tracer tracer{"navigator widget clear search", category()}; + m_searchWidget->clear(); } diff --git a/src/plugins/qmldesigner/components/navigator/previewtooltip.cpp b/src/plugins/qmldesigner/components/navigator/previewtooltip.cpp index 1def3cf1198..90a21700ec4 100644 --- a/src/plugins/qmldesigner/components/navigator/previewtooltip.cpp +++ b/src/plugins/qmldesigner/components/navigator/previewtooltip.cpp @@ -2,6 +2,7 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #include "previewtooltip.h" +#include "navigatortracing.h" #include "ui_previewtooltip.h" #include @@ -11,10 +12,14 @@ namespace QmlDesigner { +static auto category = NavigatorTracing::category; + PreviewToolTip::PreviewToolTip(QWidget *parent) : QWidget(parent) , m_ui(new Ui::PreviewToolTip) { + NanotraceHR::Tracer tracer{"preview tooltip constructor", category()}; + setWindowFlags(Qt::FramelessWindowHint | Qt::Tool | Qt::WindowTransparentForInput | Qt::WindowStaysOnTopHint | Qt::WindowDoesNotAcceptFocus); m_ui->setupUi(this); @@ -38,26 +43,36 @@ PreviewToolTip::PreviewToolTip(QWidget *parent) PreviewToolTip::~PreviewToolTip() { + NanotraceHR::Tracer tracer{"preview tooltip destructor", category()}; + delete m_ui; } void PreviewToolTip::setId(const QString &id) { + NanotraceHR::Tracer tracer{"preview tooltip set id", category()}; + m_ui->idLabel->setText(id); } void PreviewToolTip::setType(const QString &type) { + NanotraceHR::Tracer tracer{"preview tooltip set type", category()}; + m_ui->typeLabel->setText(type); } void PreviewToolTip::setInfo(const QString &info) { + NanotraceHR::Tracer tracer{"preview tooltip set info", category()}; + m_ui->infoLabel->setText(info); } void PreviewToolTip::setPixmap(const QPixmap &pixmap) { + NanotraceHR::Tracer tracer{"preview tooltip set pixmap", category()}; + QPixmap scaled = pixmap.scaled(m_ui->labelBackground->size(), Qt::KeepAspectRatio); scaled.setDevicePixelRatio(1.); m_ui->imageLabel->setPixmap(scaled); @@ -65,6 +80,8 @@ void PreviewToolTip::setPixmap(const QPixmap &pixmap) QString PreviewToolTip::id() const { + NanotraceHR::Tracer tracer{"preview tooltip get id", category()}; + return m_ui->idLabel->text(); } diff --git a/src/plugins/qmldesigner/libs/designercore/CMakeLists.txt b/src/plugins/qmldesigner/libs/designercore/CMakeLists.txt index 87913eccde6..8c77a74be54 100644 --- a/src/plugins/qmldesigner/libs/designercore/CMakeLists.txt +++ b/src/plugins/qmldesigner/libs/designercore/CMakeLists.txt @@ -49,7 +49,7 @@ extend_qtc_library(QmlDesignerCore ) extend_qtc_library(QmlDesignerCore - CONDITION ENABLE_PROJECT_STORAGE_TRACING OR ENABLE_SOURCE_PATH_STORAGE_TRACING OR ENABLE_IMAGE_CACHE_TRACING OR ENABLE_MODEL_TRACING OR ENABLE_FORM_EDITOR_TRACING OR ENABLE_PROPERTY_EDITOR_TRACING + CONDITION ENABLE_PROJECT_STORAGE_TRACING OR ENABLE_SOURCE_PATH_STORAGE_TRACING OR ENABLE_IMAGE_CACHE_TRACING OR ENABLE_MODEL_TRACING OR ENABLE_FORM_EDITOR_TRACING OR ENABLE_PROPERTY_EDITOR_TRACING OR ENABLE_NAVIGATOR_TRACING PUBLIC_DEPENDS Nanotrace PUBLIC_DEFINES ENABLE_QMLDESIGNER_TRACING