Thanks a lot to Mathias Tillman for finding a 100 % reliable way
how to reproduce the issue and for the initial patch!
BUG: 278302
FIXED-IN: 4.8.1
+void DolphinView::hideEvent(QHideEvent* event)
+{
+ hideToolTip();
+ QWidget::hideEvent(event);
+}
+
void DolphinView::activate()
{
setActive(true);
void DolphinView::activate()
{
setActive(true);
/** Changes the zoom level if Control is pressed during a wheel event. */
virtual void wheelEvent(QWheelEvent* event);
/** Changes the zoom level if Control is pressed during a wheel event. */
virtual void wheelEvent(QWheelEvent* event);
+ /** @reimp */
+ virtual void hideEvent(QHideEvent* event);
+
private slots:
/**
* Marks the view as active (DolphinView:isActive() will return true)
private slots:
/**
* Marks the view as active (DolphinView:isActive() will return true)
ToolTipManager::ToolTipManager(QWidget* parent) :
QObject(parent),
ToolTipManager::ToolTipManager(QWidget* parent) :
QObject(parent),
- m_parentWidget(parent),
m_showToolTipTimer(0),
m_contentRetrievalTimer(0),
m_fileMetaDataToolTip(0),
m_toolTipRequested(false),
m_metaDataRequested(false),
m_appliedWaitCursor(false),
m_showToolTipTimer(0),
m_contentRetrievalTimer(0),
m_fileMetaDataToolTip(0),
m_toolTipRequested(false),
m_metaDataRequested(false),
m_appliedWaitCursor(false),
+ if (parent) {
+ m_margin = qMax(m_margin, parent->style()->pixelMetric(QStyle::PM_ToolTipLabelFrameWidth));
+ }
+
m_showToolTipTimer = new QTimer(this);
m_showToolTipTimer->setSingleShot(true);
m_showToolTipTimer->setInterval(500);
m_showToolTipTimer = new QTimer(this);
m_showToolTipTimer->setSingleShot(true);
m_showToolTipTimer->setInterval(500);
m_itemRect = itemRect.toRect();
m_itemRect = itemRect.toRect();
- const int margin = toolTipMargin();
- m_itemRect.adjust(-margin, -margin, margin, margin);
+ m_itemRect.adjust(-m_margin, -m_margin, m_margin, m_margin);
m_item = item;
// Only start the retrieving of the content, when the mouse has been over this
// item for 200 milliseconds. This prevents a lot of useless preview jobs and
// meta data retrieval, when passing rapidly over a lot of items.
Q_ASSERT(!m_fileMetaDataToolTip);
m_item = item;
// Only start the retrieving of the content, when the mouse has been over this
// item for 200 milliseconds. This prevents a lot of useless preview jobs and
// meta data retrieval, when passing rapidly over a lot of items.
Q_ASSERT(!m_fileMetaDataToolTip);
- m_fileMetaDataToolTip = new FileMetaDataToolTip(m_parentWidget);
+ m_fileMetaDataToolTip = new FileMetaDataToolTip();
connect(m_fileMetaDataToolTip, SIGNAL(metaDataRequestFinished(KFileItemList)),
this, SLOT(slotMetaDataRequestFinished()));
connect(m_fileMetaDataToolTip, SIGNAL(metaDataRequestFinished(KFileItemList)),
this, SLOT(slotMetaDataRequestFinished()));
// It must be assured that:
// - the content is fully visible
// - the content is not drawn inside m_itemRect
// It must be assured that:
// - the content is fully visible
// - the content is not drawn inside m_itemRect
- const int margin = toolTipMargin();
- const bool hasRoomToLeft = (m_itemRect.left() - size.width() - margin >= screen.left());
- const bool hasRoomToRight = (m_itemRect.right() + size.width() + margin <= screen.right());
- const bool hasRoomAbove = (m_itemRect.top() - size.height() - margin >= screen.top());
- const bool hasRoomBelow = (m_itemRect.bottom() + size.height() + margin <= screen.bottom());
+ const bool hasRoomToLeft = (m_itemRect.left() - size.width() - m_margin >= screen.left());
+ const bool hasRoomToRight = (m_itemRect.right() + size.width() + m_margin <= screen.right());
+ const bool hasRoomAbove = (m_itemRect.top() - size.height() - m_margin >= screen.top());
+ const bool hasRoomBelow = (m_itemRect.bottom() + size.height() + m_margin <= screen.bottom());
if (!hasRoomAbove && !hasRoomBelow && !hasRoomToLeft && !hasRoomToRight) {
return;
}
if (!hasRoomAbove && !hasRoomBelow && !hasRoomToLeft && !hasRoomToRight) {
return;
}
x = screen.right() - size.width() + 1;
}
if (hasRoomBelow) {
x = screen.right() - size.width() + 1;
}
if (hasRoomBelow) {
- y = m_itemRect.bottom() + margin;
+ y = m_itemRect.bottom() + m_margin;
- y = m_itemRect.top() - size.height() - margin;
+ y = m_itemRect.top() - size.height() - m_margin;
}
} else {
Q_ASSERT(hasRoomToLeft || hasRoomToRight);
if (hasRoomToRight) {
}
} else {
Q_ASSERT(hasRoomToLeft || hasRoomToRight);
if (hasRoomToRight) {
- x = m_itemRect.right() + margin;
+ x = m_itemRect.right() + m_margin;
- x = m_itemRect.left() - size.width() - margin;
+ x = m_itemRect.left() - size.width() - m_margin;
}
// Put the tooltip at the bottom of the screen. The x-coordinate has already
// been adjusted, so that no overlapping with m_itemRect occurs.
}
// Put the tooltip at the bottom of the screen. The x-coordinate has already
// been adjusted, so that no overlapping with m_itemRect occurs.
m_toolTipRequested = false;
}
m_toolTipRequested = false;
}
-int ToolTipManager::toolTipMargin() const
-{
- const int margin = m_parentWidget->style()->pixelMetric(QStyle::PM_ToolTipLabelFrameWidth);
- return qMax(4, margin);
-}
-
#include "tooltipmanager.moc"
#include "tooltipmanager.moc"
void showToolTip();
private:
void showToolTip();
private:
- int toolTipMargin() const;
-
-private:
- QWidget* m_parentWidget;
-
/// Timeout from requesting a tooltip until the tooltip
/// should be shown
QTimer* m_showToolTipTimer;
/// Timeout from requesting a tooltip until the tooltip
/// should be shown
QTimer* m_showToolTipTimer;
bool m_toolTipRequested;
bool m_metaDataRequested;
bool m_appliedWaitCursor;
bool m_toolTipRequested;
bool m_metaDataRequested;
bool m_appliedWaitCursor;
KFileItem m_item;
QRect m_itemRect;
};
KFileItem m_item;
QRect m_itemRect;
};