]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/tooltipmanager.cpp
SVN_SILENT made messages (.desktop file)
[dolphin.git] / src / tooltipmanager.cpp
index 32b196912a5819f536c8bffcb49f242182e0c52a..8e4ad0eba986fdea3cd7a5ee4ca826a9356b56eb 100644 (file)
 #include <kicon.h>
 #include <ktooltip.h>
 
+#include <QApplication>
+#include <QDesktopWidget>
 #include <QTimer>
+#include <QToolTip>
 
-K_GLOBAL_STATIC(KFormattedBalloonTipDelegate, g_delegate);
+K_GLOBAL_STATIC(KFormattedBalloonTipDelegate, g_delegate)
 
 ToolTipManager::ToolTipManager(QAbstractItemView* parent,
                                DolphinSortFilterProxyModel* model) :
@@ -38,7 +41,7 @@ ToolTipManager::ToolTipManager(QAbstractItemView* parent,
     m_proxyModel(model),
     m_timer(0),
     m_item(),
-    m_pos()
+    m_itemRect()
 {
     KToolTip::setToolTipDelegate(g_delegate);
 
@@ -76,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()
@@ -96,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"