mirror of
https://invent.kde.org/system/dolphin
synced 2024-11-05 18:47:12 +00:00
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:
parent
def780c672
commit
9ef4b489c0
4 changed files with 25 additions and 24 deletions
|
@ -694,6 +694,12 @@ void DolphinView::wheelEvent(QWheelEvent* event)
|
|||
}
|
||||
}
|
||||
|
||||
void DolphinView::hideEvent(QHideEvent* event)
|
||||
{
|
||||
hideToolTip();
|
||||
QWidget::hideEvent(event);
|
||||
}
|
||||
|
||||
void DolphinView::activate()
|
||||
{
|
||||
setActive(true);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue