Fix crash when opening a tab during a tooltip is shown

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
This commit is contained in:
Peter Penz 2012-02-02 15:10:45 +01:00
parent def780c672
commit 9ef4b489c0
4 changed files with 25 additions and 24 deletions

View file

@ -694,6 +694,12 @@ void DolphinView::wheelEvent(QWheelEvent* event)
}
}
void DolphinView::hideEvent(QHideEvent* event)
{
hideToolTip();
QWidget::hideEvent(event);
}
void DolphinView::activate()
{
setActive(true);

View file

@ -549,6 +549,9 @@ protected:
/** 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)

View file

@ -33,16 +33,20 @@
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_margin(4),
m_item(),
m_itemRect()
{
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);
@ -68,15 +72,14 @@ void ToolTipManager::showToolTip(const KFileItem& item, const QRectF& itemRect)
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_fileMetaDataToolTip = new FileMetaDataToolTip(m_parentWidget);
m_fileMetaDataToolTip = new FileMetaDataToolTip();
connect(m_fileMetaDataToolTip, SIGNAL(metaDataRequestFinished(KFileItemList)),
this, SLOT(slotMetaDataRequestFinished()));
@ -216,11 +219,10 @@ void ToolTipManager::showToolTip()
// 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;
}
@ -232,16 +234,16 @@ void ToolTipManager::showToolTip()
x = screen.right() - size.width() + 1;
}
if (hasRoomBelow) {
y = m_itemRect.bottom() + margin;
y = m_itemRect.bottom() + m_margin;
} else {
y = m_itemRect.top() - size.height() - margin;
y = m_itemRect.top() - size.height() - m_margin;
}
} else {
Q_ASSERT(hasRoomToLeft || hasRoomToRight);
if (hasRoomToRight) {
x = m_itemRect.right() + margin;
x = m_itemRect.right() + m_margin;
} else {
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.
@ -257,10 +259,4 @@ void ToolTipManager::showToolTip()
m_toolTipRequested = false;
}
int ToolTipManager::toolTipMargin() const
{
const int margin = m_parentWidget->style()->pixelMetric(QStyle::PM_ToolTipLabelFrameWidth);
return qMax(4, margin);
}
#include "tooltipmanager.moc"

View file

@ -68,11 +68,6 @@ private slots:
void showToolTip();
private:
int toolTipMargin() const;
private:
QWidget* m_parentWidget;
/// Timeout from requesting a tooltip until the tooltip
/// should be shown
QTimer* m_showToolTipTimer;
@ -86,6 +81,7 @@ private:
bool m_toolTipRequested;
bool m_metaDataRequested;
bool m_appliedWaitCursor;
int m_margin;
KFileItem m_item;
QRect m_itemRect;
};