diff --git a/src/declarativeimports/core/tooltip.cpp b/src/declarativeimports/core/tooltip.cpp index 88a9a403e..7df6fb5d8 100644 --- a/src/declarativeimports/core/tooltip.cpp +++ b/src/declarativeimports/core/tooltip.cpp @@ -29,12 +29,16 @@ #include "framesvgitem.h" #include +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 || diff --git a/src/declarativeimports/core/tooltip.h b/src/declarativeimports/core/tooltip.h index e95970fde..9f7277665 100644 --- a/src/declarativeimports/core/tooltip.h +++ b/src/declarativeimports/core/tooltip.h @@ -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 diff --git a/src/declarativeimports/core/tooltipdialog.cpp b/src/declarativeimports/core/tooltipdialog.cpp index ea1c7f37c..5a6b908a5 100644 --- a/src/declarativeimports/core/tooltipdialog.cpp +++ b/src/declarativeimports/core/tooltipdialog.cpp @@ -28,8 +28,6 @@ #include -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()); } -ToolTipDialog* ToolTipDialog::instance() -{ - return toolTipDialogInstance(); -} - #include "moc_tooltipdialog.cpp" diff --git a/src/declarativeimports/core/tooltipdialog.h b/src/declarativeimports/core/tooltipdialog.h index 884ab945a..71ea034b9 100644 --- a/src/declarativeimports/core/tooltipdialog.h +++ b/src/declarativeimports/core/tooltipdialog.h @@ -59,8 +59,6 @@ public: */ virtual void adjustGeometry(const QRect &geom); - static ToolTipDialog* instance(); - void dismiss(); void keepalive();