Fix up showing and hiding of the dialog
ToolTipArea.containsMouse allows the use to update the tooltip way before it's shown, or when the contents of the tooltip should change within an open dialog. dismiss() and keepalive() allow handing over the tooltip dialog to another item, in order to allow for a smoother handover when a new item recycles the tooltipdialog. This avoids flickering when the tooltip moves from one item to another.
This commit is contained in:
parent
b8fc3aea7f
commit
f21ad15ed6
@ -150,9 +150,32 @@ void ToolTip::setImage(const QVariant &image)
|
|||||||
emit imageChanged();
|
emit imageChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ToolTip::containsMouse() const
|
||||||
|
{
|
||||||
|
return m_containsMouse;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ToolTip::setContainsMouse(bool contains)
|
||||||
|
{
|
||||||
|
if (m_containsMouse != contains) {
|
||||||
|
m_containsMouse = contains;
|
||||||
|
emit containsMouseChanged();
|
||||||
|
}
|
||||||
|
if (!contains) {
|
||||||
|
ToolTipDialog::instance()->dismiss();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ToolTip::hoverEnterEvent(QHoverEvent *event)
|
void ToolTip::hoverEnterEvent(QHoverEvent *event)
|
||||||
{
|
{
|
||||||
|
setContainsMouse(true);
|
||||||
|
//m_showTimer->stop();
|
||||||
if (ToolTipDialog::instance()->isVisible()) {
|
if (ToolTipDialog::instance()->isVisible()) {
|
||||||
|
// We signal the tooltipmanager that we're "potentially interested,
|
||||||
|
// and ask to keep it open for a bit, so other items get the chance
|
||||||
|
// to update the content before the tooltip hides -- this avoids
|
||||||
|
// flickering
|
||||||
|
ToolTipDialog::instance()->keepalive();
|
||||||
//FIXME: showToolTip needs to be renamed in sync or something like that
|
//FIXME: showToolTip needs to be renamed in sync or something like that
|
||||||
showToolTip();
|
showToolTip();
|
||||||
} else {
|
} else {
|
||||||
@ -162,6 +185,7 @@ void ToolTip::hoverEnterEvent(QHoverEvent *event)
|
|||||||
|
|
||||||
void ToolTip::hoverLeaveEvent(QHoverEvent *event)
|
void ToolTip::hoverLeaveEvent(QHoverEvent *event)
|
||||||
{
|
{
|
||||||
|
setContainsMouse(false);
|
||||||
m_showTimer->stop();
|
m_showTimer->stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,6 +58,11 @@ class ToolTip : public QQuickItem
|
|||||||
*/
|
*/
|
||||||
Q_PROPERTY(QVariant icon READ icon WRITE setIcon NOTIFY iconChanged)
|
Q_PROPERTY(QVariant icon READ icon WRITE setIcon NOTIFY iconChanged)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An icon for this tooltip, accepted values are an icon name, a QIcon, QImage or QPixmap
|
||||||
|
*/
|
||||||
|
Q_PROPERTY(bool m_containsMouse READ containsMouse NOTIFY containsMouseChanged)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO: single property for images?
|
* TODO: single property for images?
|
||||||
* An image for this tooltip, accepted values are an icon name, a QIcon, QImage or QPixmap
|
* An image for this tooltip, accepted values are an icon name, a QIcon, QImage or QPixmap
|
||||||
@ -85,6 +90,9 @@ public:
|
|||||||
QVariant image() const;
|
QVariant image() const;
|
||||||
void setImage(const QVariant &image);
|
void setImage(const QVariant &image);
|
||||||
|
|
||||||
|
bool containsMouse() const;
|
||||||
|
void setContainsMouse(bool contains);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool childMouseEventFilter(QQuickItem *item, QEvent *event);
|
bool childMouseEventFilter(QQuickItem *item, QEvent *event);
|
||||||
void hoverEnterEvent(QHoverEvent *event);
|
void hoverEnterEvent(QHoverEvent *event);
|
||||||
@ -97,8 +105,10 @@ Q_SIGNALS:
|
|||||||
void subTextChanged();
|
void subTextChanged();
|
||||||
void iconChanged();
|
void iconChanged();
|
||||||
void imageChanged();
|
void imageChanged();
|
||||||
|
void containsMouseChanged();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
bool m_containsMouse;
|
||||||
QWeakPointer<QQuickItem> m_mainItem;
|
QWeakPointer<QQuickItem> m_mainItem;
|
||||||
QTimer *m_showTimer;
|
QTimer *m_showTimer;
|
||||||
QString m_mainText;
|
QString m_mainText;
|
||||||
|
@ -31,7 +31,8 @@ Q_GLOBAL_STATIC(ToolTipDialog, toolTipDialogInstance)
|
|||||||
|
|
||||||
ToolTipDialog::ToolTipDialog(QQuickItem *parent)
|
ToolTipDialog::ToolTipDialog(QQuickItem *parent)
|
||||||
: DialogProxy(parent),
|
: DialogProxy(parent),
|
||||||
m_qmlObject(0)
|
m_qmlObject(0),
|
||||||
|
m_hideTimeout(4000)
|
||||||
{
|
{
|
||||||
setFlags(Qt::ToolTip);
|
setFlags(Qt::ToolTip);
|
||||||
setLocation(Plasma::Types::Floating);
|
setLocation(Plasma::Types::Floating);
|
||||||
@ -69,11 +70,21 @@ QQuickItem *ToolTipDialog::loadDefaultItem()
|
|||||||
|
|
||||||
void ToolTipDialog::showEvent(QShowEvent *event)
|
void ToolTipDialog::showEvent(QShowEvent *event)
|
||||||
{
|
{
|
||||||
m_showTimer->start(4000);
|
m_showTimer->start(m_hideTimeout);
|
||||||
|
|
||||||
DialogProxy::showEvent(event);
|
DialogProxy::showEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ToolTipDialog::dismiss()
|
||||||
|
{
|
||||||
|
m_showTimer->start(m_hideTimeout / 20); // pretty short: 200ms
|
||||||
|
}
|
||||||
|
|
||||||
|
void ToolTipDialog::keepalive()
|
||||||
|
{
|
||||||
|
m_showTimer->start(m_hideTimeout);
|
||||||
|
}
|
||||||
|
|
||||||
ToolTipDialog* ToolTipDialog::instance()
|
ToolTipDialog* ToolTipDialog::instance()
|
||||||
{
|
{
|
||||||
return toolTipDialogInstance();
|
return toolTipDialogInstance();
|
||||||
|
@ -48,12 +48,16 @@ public:
|
|||||||
|
|
||||||
static ToolTipDialog* instance();
|
static ToolTipDialog* instance();
|
||||||
|
|
||||||
|
void dismiss();
|
||||||
|
void keepalive();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void showEvent(QShowEvent *event);
|
void showEvent(QShowEvent *event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QmlObject *m_qmlObject;
|
QmlObject *m_qmlObject;
|
||||||
QTimer *m_showTimer;
|
QTimer *m_showTimer;
|
||||||
|
int m_hideTimeout;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user