#include <QApplication>
#include <QDesktopWidget>
+#include <QScrollBar>
#include <QTimer>
#include <QToolTip>
connect(m_waitOnPreviewTimer, SIGNAL(timeout()),
this, SLOT(prepareToolTip()));
+ // When the mousewheel is used, the items don't get a hovered indication
+ // (Qt-issue #200665). To assure that the tooltip still gets hidden,
+ // the scrollbars are observed.
+ connect(parent->horizontalScrollBar(), SIGNAL(valueChanged(int)),
+ this, SLOT(hideTip()));
+ connect(parent->verticalScrollBar(), SIGNAL(valueChanged(int)),
+ this, SLOT(hideTip()));
+
m_view->viewport()->installEventFilter(this);
}
void ToolTipManager::requestToolTip(const QModelIndex& index)
{
- if (index.column() == DolphinModel::Name) {
+ // only request a tooltip for the name column and when no selection or
+ // drag & drop operation is done (indicated by the left mouse button)
+ if ((index.column() == DolphinModel::Name) && !(QApplication::mouseButtons() & Qt::LeftButton)) {
m_waitOnPreviewTimer->stop();
KToolTip::hideTip();
const QModelIndex dirIndex = m_proxyModel->mapToSource(index);
m_item = m_dolphinModel->itemForIndex(dirIndex);
- // Only start the previewJob when the mouse has been over this item for 200msec,
- // this prevents a lot of useless previewJobs (when passing rapidly over a lot of items).
+ // only start the previewJob when the mouse has been over this item for 200 milliseconds,
+ // this prevents a lot of useless preview jobs when passing rapidly over a lot of items
m_previewTimer->start(200);
- // reset these variables
m_preview = false;
m_previewIsLate = false;
m_previewPass = 0;
m_emptyRenderedKToolTipItem = toolTip; // make toolTip accessible everywhere
showToolTip(toolTip);
}
-
+
++m_previewPass;
m_waitOnPreviewTimer->start(250);
} else {
if (m_preview && m_previewIsLate) {
// We got a preview, but it is late, the tooltip has already been shown.
// So update the tooltip directly.
- m_emptyRenderedKToolTipItem->setData(Qt::DecorationRole, KIcon(m_pix));
+ if (m_emptyRenderedKToolTipItem != 0) {
+ m_emptyRenderedKToolTipItem->setData(Qt::DecorationRole, KIcon(m_pix));
+ }
return;
}
if (QApplication::mouseButtons() & Qt::LeftButton) {
delete tip;
tip = 0;
+ // m_emptyRenderedKToolTipItem is an alias for tip.
+ m_emptyRenderedKToolTipItem = 0;
return;
}
-
+
KStyleOptionToolTip option;
// TODO: get option content from KToolTip or add KToolTip::sizeHint() method
option.direction = QApplication::layoutDirection();
const bool hasRoomToLeft = (m_itemRect.left() - size.width() >= desktop.left());
const bool hasRoomToRight = (m_itemRect.right() + size.width() <= desktop.right());
const bool hasRoomAbove = (m_itemRect.top() - size.height() >= desktop.top());
- const bool hasRoomBelow = (m_itemRect.bottom() + size.height() <= desktop.bottom());
+ const bool hasRoomBelow = (m_itemRect.bottom() + size.height() <= desktop.bottom());
if (!hasRoomAbove && !hasRoomBelow && !hasRoomToLeft && !hasRoomToRight) {
delete tip;
tip = 0;
return;
}
- int x = 0;
+ int x = 0;
int y = 0;
if (hasRoomBelow || hasRoomAbove) {
x = QCursor::pos().x() + 16; // TODO: use mouse pointer width instead of the magic value of 16
} else {
Q_ASSERT(hasRoomToLeft || hasRoomToRight);
x = hasRoomToRight ? m_itemRect.right() : m_itemRect.left() - size.width();
-
+
// Put the tooltip at the bottom of the screen. The x-coordinate has already
// been adjusted, so that no overlapping with m_itemRect occurs.
y = desktop.bottom() - size.height();
m_generatingPreview = false;
return;
}
-
+
if (m_previewIsLate) {
// always use the maximal width
QPixmap paddedImage(QSize(PREVIEW_WIDTH, pixmap.height()));