X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/9d4250e10ada4e2410722951dbd406263b61041c..817f3952e2bed820ea3b50dfdfe91ccb99dcb748:/src/tooltipmanager.cpp diff --git a/src/tooltipmanager.cpp b/src/tooltipmanager.cpp index 6af3bb8b6..8e4ad0eba 100644 --- a/src/tooltipmanager.cpp +++ b/src/tooltipmanager.cpp @@ -21,10 +21,17 @@ #include "dolphinmodel.h" #include "dolphinsortfilterproxymodel.h" -#include "ktooltip.h" -#include "kicon.h" +#include +#include +#include + +#include +#include #include +#include + +K_GLOBAL_STATIC(KFormattedBalloonTipDelegate, g_delegate) ToolTipManager::ToolTipManager(QAbstractItemView* parent, DolphinSortFilterProxyModel* model) : @@ -34,10 +41,9 @@ ToolTipManager::ToolTipManager(QAbstractItemView* parent, m_proxyModel(model), m_timer(0), m_item(), - m_pos(), - m_delegate() + m_itemRect() { - KToolTip::setToolTipDelegate(&m_delegate); + KToolTip::setToolTipDelegate(g_delegate); m_dolphinModel = static_cast(m_proxyModel->sourceModel()); connect(parent, SIGNAL(entered(const QModelIndex&)), @@ -57,6 +63,11 @@ ToolTipManager::~ToolTipManager() { } +void ToolTipManager::hideTip() +{ + hideToolTip(); +} + bool ToolTipManager::eventFilter(QObject* watched, QEvent* event) { if ((watched == m_view->viewport()) && (event->type() == QEvent::Leave)) { @@ -68,15 +79,20 @@ bool ToolTipManager::eventFilter(QObject* watched, QEvent* event) void ToolTipManager::requestToolTip(const QModelIndex& index) { - KToolTip::hideTip(); + if (index.column() == DolphinModel::Name) { + KToolTip::hideTip(); - const QRect rect = m_view->visualRect(index); - m_pos = m_view->viewport()->mapToGlobal(rect.bottomRight()); + m_itemRect = m_view->visualRect(index); + const QPoint pos = m_view->viewport()->mapToGlobal(m_itemRect.topLeft()); + m_itemRect.moveTo(pos); - const QModelIndex dirIndex = m_proxyModel->mapToSource(index); - m_item = m_dolphinModel->itemForIndex(dirIndex); + const QModelIndex dirIndex = m_proxyModel->mapToSource(index); + m_item = m_dolphinModel->itemForIndex(dirIndex); - m_timer->start(500); + m_timer->start(500); + } else { + hideToolTip(); + } } void ToolTipManager::hideToolTip() @@ -88,7 +104,36 @@ void ToolTipManager::hideToolTip() void ToolTipManager::showToolTip() { KToolTipItem* tip = new KToolTipItem(KIcon(m_item.iconName()), m_item.getToolTipText()); - KToolTip::showTip(m_pos, tip); + + KStyleOptionToolTip option; + // TODO: get option content from KToolTip or add KToolTip::sizeHint() method + option.direction = QApplication::layoutDirection(); + option.fontMetrics = QFontMetrics(QToolTip::font()); + option.activeCorner = KStyleOptionToolTip::TopLeftCorner; + option.palette = QToolTip::palette(); + option.font = QToolTip::font(); + option.rect = QRect(); + option.state = QStyle::State_None; + option.decorationSize = QSize(32, 32); + + const QSize size = g_delegate->sizeHint(&option, tip); + const QRect desktop = QApplication::desktop()->screenGeometry(m_itemRect.bottomRight()); + + // m_itemRect defines the area of the item, where the tooltip should be + // shown. Per default the tooltip is shown in the bottom right corner. + // If the tooltip content exceeds the desktop borders, it must be assured that: + // - the content is fully visible + // - the content is not drawn inside m_itemRect + int x = m_itemRect.right(); + int y = m_itemRect.bottom(); + if (x + size.width() - 1 > desktop.right()) { + x = m_itemRect.left() - size.width(); + } + if (y + size.height() - 1 > desktop.bottom()) { + y = m_itemRect.top() - size.height(); + } + + KToolTip::showTip(QPoint(x, y), tip); } #include "tooltipmanager.moc"