From d4775673f7582ccd22c352801143c0947e8cae6d Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Mon, 16 Nov 2020 15:36:54 +0200 Subject: [PATCH] QmlDesigner: Fix navigator preview tooltip issues Preview tooltip is now shown as separate frameless tool window instead of just a child widget to ensure it is always on top. Fixed the layout issues with preview tooltip when the navigator is moved to another screen with different pixel ratio. Node internal id is used to identify the hovered node instead of row index, as row index is only relative to immediate parent node. Change-Id: Ida06565c7addfb6247e13ded11a1fed51097f0e9 Fixes: QDS-3119 Reviewed-by: Thomas Hartmann --- .../navigator/navigatortreeview.cpp | 37 ++++++++++--------- .../components/navigator/navigatortreeview.h | 2 +- .../components/navigator/previewtooltip.cpp | 4 +- 3 files changed, 22 insertions(+), 21 deletions(-) diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp index f0e7b867251..ddf33ad32d9 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp @@ -46,7 +46,6 @@ #include #include #include -#include namespace QmlDesigner { @@ -248,43 +247,45 @@ bool NavigatorTreeView::viewportEvent(QEvent *event) QVariantMap imgMap = navModel->data(index, ToolTipImageRole).toMap(); if (!imgMap.isEmpty()) { - m_previewToolTipRow = index.row(); - if (!m_previewToolTip) { - m_previewToolTip = new PreviewToolTip(QApplication::activeWindow()); - connect(navModel, &NavigatorTreeModel::toolTipPixmapUpdated, - [this](const QString &id, const QPixmap &pixmap) { - if (m_previewToolTip && m_previewToolTip->id() == id) - m_previewToolTip->setPixmap(pixmap); - }); + m_previewToolTipNodeId = index.internalId(); + if (!m_previewToolTip || devicePixelRatioF() != m_previewToolTip->devicePixelRatioF()) { + if (!m_previewToolTip) { + connect(navModel, &NavigatorTreeModel::toolTipPixmapUpdated, + [this](const QString &id, const QPixmap &pixmap) { + if (m_previewToolTip && m_previewToolTip->id() == id) + m_previewToolTip->setPixmap(pixmap); + }); + } else { + delete m_previewToolTip; + } + m_previewToolTip = new PreviewToolTip(); } m_previewToolTip->setId(imgMap["id"].toString()); m_previewToolTip->setType(imgMap["type"].toString()); m_previewToolTip->setInfo(imgMap["info"].toString()); m_previewToolTip->setPixmap(imgMap["pixmap"].value()); - m_previewToolTip->move(m_previewToolTip->parentWidget()->mapFromGlobal(helpEvent->globalPos()) - + offset); + m_previewToolTip->move(helpEvent->globalPos() + offset); if (!m_previewToolTip->isVisible()) m_previewToolTip->show(); } else if (m_previewToolTip) { m_previewToolTip->hide(); - m_previewToolTipRow = -1; + m_previewToolTipNodeId = -1; } } } else if (event->type() == QEvent::Leave) { if (m_previewToolTip) { m_previewToolTip->hide(); - m_previewToolTipRow = -1; + m_previewToolTipNodeId = -1; } } else if (event->type() == QEvent::HoverMove) { - if (m_previewToolTip) { + if (m_previewToolTip && m_previewToolTip->isVisible()) { auto *he = static_cast(event); QModelIndex index = indexAt(he->pos()); - if (!index.isValid() || index.row() != m_previewToolTipRow) { + if (!index.isValid() || index.internalId() != m_previewToolTipNodeId) { m_previewToolTip->hide(); - m_previewToolTipRow = -1; + m_previewToolTipNodeId = -1; } else { - m_previewToolTip->move(m_previewToolTip->parentWidget()->mapFromGlobal(mapToGlobal(he->pos())) - + offset); + m_previewToolTip->move(mapToGlobal(he->pos()) + offset); } } } diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreeview.h b/src/plugins/qmldesigner/components/navigator/navigatortreeview.h index 201a4489f0a..227746e207d 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreeview.h +++ b/src/plugins/qmldesigner/components/navigator/navigatortreeview.h @@ -42,6 +42,6 @@ public: private: PreviewToolTip *m_previewToolTip = nullptr; - int m_previewToolTipRow = -1; + qint32 m_previewToolTipNodeId = -1; }; } diff --git a/src/plugins/qmldesigner/components/navigator/previewtooltip.cpp b/src/plugins/qmldesigner/components/navigator/previewtooltip.cpp index 83d8ee44993..800104bfb30 100644 --- a/src/plugins/qmldesigner/components/navigator/previewtooltip.cpp +++ b/src/plugins/qmldesigner/components/navigator/previewtooltip.cpp @@ -36,8 +36,8 @@ PreviewToolTip::PreviewToolTip(QWidget *parent) : QWidget(parent) , m_ui(new Ui::PreviewToolTip) { - setAttribute(Qt::WA_TransparentForMouseEvents); - setWindowFlags(Qt::Widget); + setWindowFlags(Qt::FramelessWindowHint | Qt::Tool | Qt::WindowTransparentForInput + | Qt::WindowStaysOnTopHint | Qt::WindowDoesNotAcceptFocus); m_ui->setupUi(this); m_ui->idLabel->setElideMode(Qt::ElideLeft); m_ui->typeLabel->setElideMode(Qt::ElideLeft);