diff --git a/applet.cpp b/applet.cpp
index 13a7aa3cd..3974536ee 100644
--- a/applet.cpp
+++ b/applet.cpp
@@ -1437,14 +1437,14 @@ bool Applet::sceneEvent(QEvent *event)
case QEvent::GraphicsSceneHoverMove:
// If the tooltip isn't visible, run through showing the tooltip again
// so that it only becomes visible after a stationary hover
- if (Plasma::ToolTipManager::self()->isVisible(this)) {
+ if (Plasma::ToolTipManager::self()->isWidgetToolTipDisplayed(this)) {
break;
}
case QEvent::GraphicsSceneHoverEnter:
{
// Check that there is a tooltip to show
- if (!Plasma::ToolTipManager::self()->hasToolTip(this)) {
+ if (!Plasma::ToolTipManager::self()->widgetHasToolTip(this)) {
break;
}
diff --git a/tooltip.cpp b/tooltip.cpp
index 19130a8a2..f3c8a5b61 100644
--- a/tooltip.cpp
+++ b/tooltip.cpp
@@ -105,7 +105,7 @@ ToolTip::~ToolTip()
delete d;
}
-void ToolTip::setData(const ToolTipManager::ToolTipData &data)
+void ToolTip::setContent(const ToolTipManager::ToolTipContent &data)
{
//reset our size
d->label->setText("" + data.mainText + "
" + data.subText + "");
diff --git a/tooltip_p.h b/tooltip_p.h
index fc62c15f7..739671b87 100644
--- a/tooltip_p.h
+++ b/tooltip_p.h
@@ -46,7 +46,7 @@ public:
ToolTip();
~ToolTip();
void updateTheme();
- void setData(const ToolTipManager::ToolTipData &data);
+ void setContent(const ToolTipManager::ToolTipContent &data);
void prepareShowing();
protected:
diff --git a/tooltipmanager.cpp b/tooltipmanager.cpp
index b9009da10..a09b9c648 100644
--- a/tooltipmanager.cpp
+++ b/tooltipmanager.cpp
@@ -42,9 +42,9 @@ class ToolTipManagerPrivate
{
public :
ToolTipManagerPrivate()
- : showTimer(0)
+ : currentWidget(0)
+ , showTimer(0)
, hideTimer(0)
- , currentWidget(0)
{
}
@@ -122,7 +122,7 @@ void ToolTipManager::showToolTip(QGraphicsWidget *widget)
}
}
-bool ToolTipManager::isVisible(QGraphicsWidget *widget)
+bool ToolTipManager::isWidgetToolTipDisplayed(QGraphicsWidget *widget)
{
ToolTip * tooltip = d->tooltips.value(widget);
if (tooltip) {
@@ -151,18 +151,17 @@ void ToolTipManager::hideToolTip(QGraphicsWidget *widget)
}
}
-void ToolTipManager::registerToolTipData(QGraphicsWidget *widget,const ToolTipManager::ToolTipData &data)
+void ToolTipManager::registerWidget(QGraphicsWidget *widget)
{
if (!d->tooltips.contains(widget)) {
//the tooltip is not registered we add it in our map of tooltips
d->tooltips.insert(widget,new ToolTip());
- ToolTip * tooltip = d->tooltips.value(widget);
- tooltip->setData(data);
- tooltip->updateTheme();
+ //connect to object destruction
+ connect(widget,SIGNAL(destroyed(QObject *)),this,SLOT(onWidgetDestroyed(QObject *)));
}
}
-void ToolTipManager::unregisterToolTip(QGraphicsWidget *widget)
+void ToolTipManager::unregisterWidget(QGraphicsWidget *widget)
{
if (d->tooltips.contains(widget)) {
ToolTip * tooltip = d->tooltips.take(widget);
@@ -172,18 +171,19 @@ void ToolTipManager::unregisterToolTip(QGraphicsWidget *widget)
}
}
-void ToolTipManager::updateToolTipData(QGraphicsWidget *widget,const ToolTipData &data)
+void ToolTipManager::setWidgetToolTipContent(QGraphicsWidget *widget,const ToolTipContent &data)
{
if (!d->tooltips.contains(widget)) {
return;
}
else {
ToolTip * tooltip = d->tooltips.value(widget);
- tooltip->setData(data);
+ tooltip->setContent(data);
+ tooltip->updateTheme();
}
}
-bool ToolTipManager::hasToolTip(QGraphicsWidget *widget)
+bool ToolTipManager::widgetHasToolTip(QGraphicsWidget *widget)
{
return d->tooltips.contains(widget);
}
@@ -197,6 +197,26 @@ void ToolTipManager::themeUpdated()
}
}
+void ToolTipManager::onWidgetDestroyed(QObject * object)
+{
+ if (object) {
+ QMapIterator iterator(d->tooltips);
+ while (iterator.hasNext()) {
+ iterator.next();
+ if (iterator.key() == object) {
+ ToolTip * tooltip = iterator.value();
+ d->tooltips.remove(iterator.key());
+ kDebug()<<"Tooltip destroyed"<<(int)object;
+ d->showTimer->stop(); // stop the timer to show the tooltip
+ d->delayedHide = false;
+ d->currentWidget = 0;
+ tooltip->hide();
+ delete tooltip;
+ }
+ }
+ }
+}
+
void ToolTipManagerPrivate::resetShownState()
{
if (currentWidget) {
diff --git a/tooltipmanager.h b/tooltipmanager.h
index a6e6d4469..c911683db 100644
--- a/tooltipmanager.h
+++ b/tooltipmanager.h
@@ -51,33 +51,52 @@ namespace Plasma
{
Q_OBJECT
public:
- struct ToolTipData
+ struct ToolTipContent
{
- ToolTipData() : windowToPreview( 0 ) {}
+ ToolTipContent() : windowToPreview( 0 ) {}
QString mainText; //Important information
QString subText; //Elaborates on the Main Text
QPixmap image; // Icon to show;
WId windowToPreview; // Id of window to show preview
};
+ /**
+ *
+ * @return The singleton instance of the manager.
+ **/
static ToolTipManager *self();
+
/**
* Default constructor. Usually you want to use the singleton instead.
*/
explicit ToolTipManager(QObject* parent = 0);
+
+ /**
+ * Default destructor.
+ */
~ToolTipManager();
+
void showToolTip(QGraphicsWidget *widget);
- bool isVisible(QGraphicsWidget *widget);
+
+ bool isWidgetToolTipDisplayed(QGraphicsWidget *widget);
+
void delayedHideToolTip();
+
void hideToolTip(QGraphicsWidget *widget);
- void registerToolTipData(QGraphicsWidget *widget,const ToolTipData &data);
- void unregisterToolTip(QGraphicsWidget *widget);
- void updateToolTipData(QGraphicsWidget *widget,const ToolTipData &data);
- bool hasToolTip(QGraphicsWidget *widget);
+
+ void registerWidget(QGraphicsWidget *widget);
+
+ void unregisterWidget(QGraphicsWidget *widget);
+
+ void setWidgetToolTipContent(QGraphicsWidget *widget,const ToolTipContent &data);
+
+ bool widgetHasToolTip(QGraphicsWidget *widget);
+
static QPoint popupPosition(const QGraphicsItem * item, const QSize &s);
private Q_SLOTS:
void themeUpdated();
+ void onWidgetDestroyed(QObject * object);
private:
friend class ToolTipManagerSingleton;