]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/tooltipmanager.cpp
* convert the size in bytes to larger unit
[dolphin.git] / src / tooltipmanager.cpp
index cc3c9eb5a2bbe0b3efa5f35133abf6a423145614..687df218f0af5798b7ff75bbfe48c8a8e3b7bd54 100644 (file)
 
 #include "tooltipmanager.h"
 
+#include "dolphintooltip.h"
 #include "dolphinmodel.h"
 #include "dolphinsortfilterproxymodel.h"
 
-#include <kformattedballoontipdelegate.h>
 #include <kicon.h>
 #include <ktooltip.h>
 
@@ -31,7 +31,7 @@
 #include <QTimer>
 #include <QToolTip>
 
-K_GLOBAL_STATIC(KFormattedBalloonTipDelegate, g_delegate)
+K_GLOBAL_STATIC(DolphinBalloonTooltipDelegate, g_delegate)
 
 ToolTipManager::ToolTipManager(QAbstractItemView* parent,
                                DolphinSortFilterProxyModel* model) :
@@ -103,7 +103,10 @@ void ToolTipManager::hideToolTip()
 
 void ToolTipManager::showToolTip()
 {
-    KToolTipItem* tip = new KToolTipItem(KIcon(m_item.iconName()), m_item.getToolTipText());
+    // TODO - create tip during requestTip(...) - this makes it more likely that the previews
+    // job will have completed by the time the tooltip is shown, resulting in less flicker.
+    // The memory management will be more intricate, though.
+    DolphinToolTipItem *tip = new DolphinToolTipItem(m_item);
 
     KStyleOptionToolTip option;
     // TODO: get option content from KToolTip or add KToolTip::sizeHint() method
@@ -117,25 +120,40 @@ void ToolTipManager::showToolTip()
     option.decorationSize = QSize(32, 32);
 
     const QSize size = g_delegate->sizeHint(&option, tip);
-    const QRect desktop = QApplication::desktop()->availableGeometry();
+    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();
-    const int xDiff = x + size.width()  - desktop.width();
-    const int yDiff = y + size.height() - desktop.height();
-
-    if ((xDiff > 0) && (yDiff > 0)) {
-        x = m_itemRect.left() - size.width();
-        y = m_itemRect.top() - size.height();
-    } else if (xDiff > 0) {
-        x -= xDiff;
-    } else if (yDiff > 0) {
-        y -= yDiff;
+    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());    
+    if (!hasRoomAbove && !hasRoomBelow && !hasRoomToLeft && !hasRoomToRight) {
+        delete tip;
+        tip = 0;
+        return;
+    }
+
+    int x = 0;
+    if (hasRoomToLeft || hasRoomToRight) {
+        x = hasRoomToRight ? m_itemRect.right() : m_itemRect.left() - size.width();
+    } else {
+        // Put the tooltip at the far right of the screen. The item will be overlapped
+        // horizontally, but the y-coordinate will be adjusted afterwards so that no overlapping
+        // occurs vertically.
+        x = desktop.right() - size.width();
+    }
+    
+    int y = 0;
+    if (hasRoomBelow || hasRoomAbove) {
+        y = hasRoomBelow ? m_itemRect.bottom() : m_itemRect.top() - size.height();
+    } else {
+        // 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();
     }
 
     KToolTip::showTip(QPoint(x, y), tip);