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 <thomas.hartmann@qt.io>
This commit is contained in:
Miikka Heikkinen
2020-11-16 15:36:54 +02:00
parent 337e7ab1fa
commit d4775673f7
3 changed files with 22 additions and 21 deletions

View File

@@ -46,7 +46,6 @@
#include <QStyleFactory>
#include <QEvent>
#include <QImage>
#include <QApplication>
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();
m_previewToolTipNodeId = index.internalId();
if (!m_previewToolTip || devicePixelRatioF() != m_previewToolTip->devicePixelRatioF()) {
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);
});
} 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<QPixmap>());
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<QHoverEvent *>(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);
}
}
}

View File

@@ -42,6 +42,6 @@ public:
private:
PreviewToolTip *m_previewToolTip = nullptr;
int m_previewToolTipRow = -1;
qint32 m_previewToolTipNodeId = -1;
};
}

View File

@@ -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);