]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Assure that the tooltip does not flash for items at the bottom-right edge
authorPeter Penz <peter.penz19@gmail.com>
Sun, 4 Apr 2010 14:28:54 +0000 (14:28 +0000)
committerPeter Penz <peter.penz19@gmail.com>
Sun, 4 Apr 2010 14:28:54 +0000 (14:28 +0000)
BUG: 226430

svn path=/trunk/KDE/kdebase/apps/; revision=1110974

src/tooltips/tooltipmanager.cpp

index b085e68618ac7bf96d4bca7747fe1f10658e8741..5f56cd956d89633d10ddde8aca6aa24d47114cbd 100644 (file)
@@ -226,6 +226,15 @@ void ToolTipManager::showToolTip(const QPixmap& pixmap)
         return;
     }
 
+    // The size hint provided by the tooltip is not necessarily equal to the
+    // size of the tooltip after showing it. As long as the tooltip is aligned
+    // on the upper-left edge, this is no problem. If the tooltip is aligned on
+    // another edge, the size after showing must be respected and the position
+    // corrected. Whether a correction must be done, is indicated by the variables
+    // updateWidth and updateHeight:
+    bool updateWidth = false;
+    bool updateHeight = false;
+    
     int x = 0;
     int y = 0;
     if (hasRoomBelow || hasRoomAbove) {
@@ -233,18 +242,46 @@ void ToolTipManager::showToolTip(const QPixmap& pixmap)
         if (x + size.width() >= desktop.right()) {
             x = desktop.right() - size.width();
         }
-        y = hasRoomBelow ? m_itemRect.bottom() : m_itemRect.top() - size.height();
+        if (hasRoomBelow) {
+            y = m_itemRect.bottom();
+        } else {
+            y = m_itemRect.top() - size.height();
+            updateHeight = true;
+        }
     } else {
         Q_ASSERT(hasRoomToLeft || hasRoomToRight);
-        x = hasRoomToRight ? m_itemRect.right() : m_itemRect.left() - size.width();
+        if (hasRoomToRight) {
+            x = m_itemRect.right();
+        } else {
+            x = m_itemRect.left() - size.width();
+            updateWidth = true;
+        }
 
         // 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();
+        updateHeight = true;
     }
 
-    m_fileMetaDataToolTip->move(x, y);
-    m_fileMetaDataToolTip->show();
+    if (!updateWidth && !updateHeight) {
+        // Default case: There is enough room below and right from the mouse
+        // pointer and the tooltip can be positioned there.
+        m_fileMetaDataToolTip->move(x, y);
+        m_fileMetaDataToolTip->show();
+    } else {
+        // There is not enough room to show the tooltip at the mouse pointer and
+        // it must be moved left or upwards. In this case the size hint of the
+        // tooltip is not sufficient and the size after opening must be respected.
+        // To prevent a flickering, the tooltip is first opened outside the visible
+        // desktop are and moved afterwards.
+        m_fileMetaDataToolTip->move(desktop.right() + 1, desktop.bottom() + 1);
+        m_fileMetaDataToolTip->show();
+
+        const QSize shownSize = m_fileMetaDataToolTip->size();
+        const int xDiff = updateWidth ? shownSize.width() - size.width() : 0;
+        const int yDiff = updateHeight ? shownSize.height() - size.height() : 0;
+        m_fileMetaDataToolTip->move(x - xDiff, y - yDiff);
+    }
 }
 
 #include "tooltipmanager.moc"