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:
parent
0a8df8895f
commit
31707f406c
@ -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 ||
|
||||
|
@ -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
|
||||
|
@ -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"
|
||||
|
@ -59,8 +59,6 @@ public:
|
||||
*/
|
||||
virtual void adjustGeometry(const QRect &geom);
|
||||
|
||||
static ToolTipDialog* instance();
|
||||
|
||||
void dismiss();
|
||||
void keepalive();
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user