X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/71634554cf25186e01843dd87eae7b9f5df2d40a..aa3e271ce39e7cbbd546d5f9197a1f83ba53fcde:/src/tooltipmanager.cpp diff --git a/src/tooltipmanager.cpp b/src/tooltipmanager.cpp index cc3c9eb5a..687df218f 100644 --- a/src/tooltipmanager.cpp +++ b/src/tooltipmanager.cpp @@ -19,10 +19,10 @@ #include "tooltipmanager.h" +#include "dolphintooltip.h" #include "dolphinmodel.h" #include "dolphinsortfilterproxymodel.h" -#include #include #include @@ -31,7 +31,7 @@ #include #include -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);