Krita Source Code Documentation
Loading...
Searching...
No Matches
KoItemToolTip.cpp
Go to the documentation of this file.
1/*
2 SPDX-FileCopyrightText: 2006 Gábor Lehel <illissius@gmail.com>
3
4 SPDX-License-Identifier: LGPL-2.0-or-later
5*/
6#include "KoItemToolTip.h"
7
8#include <QApplication>
9#include <QBasicTimer>
10#include <QModelIndex>
11#include <QPainter>
12#include <QPaintEvent>
13#include <QPersistentModelIndex>
14#include <QStyleOptionViewItem>
15#include <QTextDocument>
16#include <QTimerEvent>
17#include <QToolTip>
18#include <QScreen>
19
20class Q_DECL_HIDDEN KoItemToolTip::Private
21{
22 public:
23 QTextDocument *document;
24 QPersistentModelIndex index;
25 QPoint pos;
26 QBasicTimer timer;
27
28 Private(): document(0) { }
29};
30
32 : d(new Private)
33{
34 d->document = new QTextDocument(this);
35 setWindowFlags(Qt::FramelessWindowHint | Qt::ToolTip
36 | Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint);
37 QApplication::instance()->installEventFilter(this);
38}
39
41{
42 delete d;
43}
44
45void KoItemToolTip::showTip(QWidget *widget, const QPoint &pos, const QStyleOptionViewItem &option, const QModelIndex &index)
46{
47 QTextDocument *doc = createDocument(index);
48
49 QPoint p = (isVisible() && index == d->index) ? d->pos : pos;
50
51 if (!isVisible() || index != d->index || doc->toHtml() != d->document->toHtml())
52 {
53 d->pos = p;
54 d->index = index;
55 delete d->document;
56 d->document = doc;
57 updatePosition(widget, p, option);
58 if (!isVisible())
59 show();
60 else
61 update();
62 d->timer.start(10000, this);
63 }
64 else
65 delete doc;
66}
67
68void KoItemToolTip::updatePosition(QWidget *widget, const QPoint &pos, const QStyleOptionViewItem &option)
69{
70 QScreen *screen = widget->screen();
71 const QRect drect = screen->availableGeometry();
72 const QSize size = sizeHint();
73 const int width = size.width(), height = size.height();
74 const QPoint gpos = widget->mapToGlobal(pos);
75 const QRect irect(widget->mapToGlobal(option.rect.topLeft()), option.rect.size());
76
77 int y = gpos.y() + 20;
78 if (y + height > drect.bottom())
79 y = qMax(drect.top(), irect.top() - height);
80
81 int x;
82 if (gpos.x() + width < drect.right())
83 x = gpos.x();
84 else
85 x = qMax(drect.left(), gpos.x() - width);
86
87 move(x, y);
88
89 resize(sizeHint());
90 }
91
93{
94 return d->document->size().toSize();
95}
96
97void KoItemToolTip::paintEvent(QPaintEvent*)
98{
99 QPainter p(this);
100 d->document->drawContents(&p, rect());
101 p.drawRect(0, 0, width() - 1, height() - 1);
102}
103
104void KoItemToolTip::timerEvent(QTimerEvent *e)
105{
106 if (e->timerId() == d->timer.timerId()) {
107 hide();
108 }
109}
110
111bool KoItemToolTip::eventFilter(QObject *object, QEvent *event)
112{
113 switch(event->type())
114 {
115 case QEvent::KeyPress:
116 case QEvent::KeyRelease:
117 case QEvent::MouseButtonPress:
118 case QEvent::MouseButtonRelease:
119 case QEvent::FocusIn:
120 case QEvent::FocusOut:
121 case QEvent::Enter:
122 case QEvent::Leave:
123 hide();
124 default: break;
125 }
126
127 return QFrame::eventFilter(object, event);
128}
const Params2D p
QSize sizeHint() const override
void updatePosition(QWidget *widget, const QPoint &pos, const QStyleOptionViewItem &option)
bool eventFilter(QObject *object, QEvent *event) override
QTextDocument * document
Private *const d
virtual QTextDocument * createDocument(const QModelIndex &index)=0
~KoItemToolTip() override
void paintEvent(QPaintEvent *e) override
QBasicTimer timer
void timerEvent(QTimerEvent *e) override
QPersistentModelIndex index
void showTip(QWidget *widget, const QPoint &pos, const QStyleOptionViewItem &option, const QModelIndex &index)