locally manage the ToolTipDialog singleton

ToolTipDialog is not a Q_GLOBAL_STATIC because QQuickwindows as global static
are deleted too later after some stuff in the qml runtime has already been deleted,
causing a crash on exit
This commit is contained in:
Marco Martin 2014-02-28 19:12:14 +01:00
parent 0a8df8895f
commit 31707f406c
4 changed files with 43 additions and 15 deletions

View File

@ -29,12 +29,16 @@
#include "framesvgitem.h"
#include <kwindoweffects.h>
ToolTipDialog *ToolTip::s_dialog = 0;
int ToolTip::s_dialogUsers = 0;
ToolTip::ToolTip(QQuickItem *parent)
: QQuickItem(parent),
m_containsMouse(false),
m_location(Plasma::Types::Floating),
m_active(true),
m_interactive(false)
m_interactive(false),
m_usingDialog(false)
{
m_showTimer = new QTimer(this);
m_showTimer->setSingleShot(true);
@ -48,6 +52,14 @@ ToolTip::ToolTip(QQuickItem *parent)
ToolTip::~ToolTip()
{
if (m_usingDialog) {
--s_dialogUsers;
}
if (s_dialogUsers == 0) {
delete s_dialog;
s_dialog = 0;
}
}
QQuickItem *ToolTip::mainItem() const
@ -55,6 +67,21 @@ QQuickItem *ToolTip::mainItem() const
return m_mainItem.data();
}
ToolTipDialog *ToolTip::tooltipDialogInstance()
{
if (!s_dialog) {
s_dialog = new ToolTipDialog;
s_dialogUsers = 1;
}
if (!m_usingDialog) {
s_dialogUsers++;
m_usingDialog = true;
}
return s_dialog;
}
void ToolTip::setMainItem(QQuickItem *mainItem)
{
if (m_mainItem.data() != mainItem) {
@ -70,7 +97,7 @@ void ToolTip::showToolTip()
return;
}
ToolTipDialog *dlg = ToolTipDialog::instance();
ToolTipDialog *dlg = tooltipDialogInstance();
if (!mainItem()) {
setMainItem(dlg->loadDefaultItem());
@ -181,7 +208,7 @@ void ToolTip::setActive(bool active)
m_active = active;
if (!active) {
ToolTipDialog::instance()->dismiss();
tooltipDialogInstance()->dismiss();
}
emit activeChanged();
}
@ -247,7 +274,7 @@ void ToolTip::setContainsMouse(bool contains)
emit containsMouseChanged();
}
if (!contains) {
ToolTipDialog::instance()->dismiss();
tooltipDialogInstance()->dismiss();
}
}
@ -255,12 +282,12 @@ void ToolTip::hoverEnterEvent(QHoverEvent *event)
{
setContainsMouse(true);
//m_showTimer->stop();
if (ToolTipDialog::instance()->isVisible()) {
if (tooltipDialogInstance()->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();
tooltipDialogInstance()->keepalive();
//FIXME: showToolTip needs to be renamed in sync or something like that
showToolTip();
} else if (m_mainItem ||

View File

@ -29,6 +29,7 @@
class QQuickItem;
class QGraphicsWidget;
class ToolTipDialog;
/**
* An Item managing a Plasma-themed tooltip. It is rendered in its own window.
@ -149,6 +150,8 @@ protected:
void hoverEnterEvent(QHoverEvent *event);
void hoverLeaveEvent(QHoverEvent *event);
ToolTipDialog *tooltipDialogInstance();
Q_SIGNALS:
void mainItemChanged();
void visibleChanged();
@ -172,6 +175,13 @@ private:
QVariant m_icon;
bool m_active;
bool m_interactive;
//ToolTipDialog is not a Q_GLOBAL_STATIC because QQuickwindows as global static
//are deleted too later after some stuff in the qml runtime has already been deleted,
//causing a crash on exit
bool m_usingDialog : 1;
static ToolTipDialog *s_dialog;
static int s_dialogUsers;
};
#endif

View File

@ -28,8 +28,6 @@
#include <kdeclarative/qmlobject.h>
Q_GLOBAL_STATIC(ToolTipDialog, toolTipDialogInstance)
ToolTipDialog::ToolTipDialog(QQuickItem *parent)
: DialogProxy(parent),
m_qmlObject(0),
@ -173,9 +171,4 @@ void ToolTipDialog::valueChanged(const QVariant &value)
setPosition(value.value<QPoint>());
}
ToolTipDialog* ToolTipDialog::instance()
{
return toolTipDialogInstance();
}
#include "moc_tooltipdialog.cpp"

View File

@ -59,8 +59,6 @@ public:
*/
virtual void adjustGeometry(const QRect &geom);
static ToolTipDialog* instance();
void dismiss();
void keepalive();