diff options
| author | Peter Penz <[email protected]> | 2008-06-26 21:41:13 +0000 |
|---|---|---|
| committer | Peter Penz <[email protected]> | 2008-06-26 21:41:13 +0000 |
| commit | 71634554cf25186e01843dd87eae7b9f5df2d40a (patch) | |
| tree | 1f87dd1ebebec34644116d34a91ce522391995be /src | |
| parent | 5be4abc3a8c87203f33e3e4090ff204dd8a1e664 (diff) | |
assure that the tooltip never exceeds the desktop area
BUG: 161895
svn path=/trunk/KDE/kdebase/apps/; revision=824927
Diffstat (limited to 'src')
| -rw-r--r-- | src/tooltipmanager.cpp | 46 | ||||
| -rw-r--r-- | src/tooltipmanager.h | 4 |
2 files changed, 44 insertions, 6 deletions
diff --git a/src/tooltipmanager.cpp b/src/tooltipmanager.cpp index 5bb1e1a32..cc3c9eb5a 100644 --- a/src/tooltipmanager.cpp +++ b/src/tooltipmanager.cpp @@ -26,7 +26,10 @@ #include <kicon.h> #include <ktooltip.h> +#include <QApplication> +#include <QDesktopWidget> #include <QTimer> +#include <QToolTip> K_GLOBAL_STATIC(KFormattedBalloonTipDelegate, g_delegate) @@ -38,7 +41,7 @@ ToolTipManager::ToolTipManager(QAbstractItemView* parent, m_proxyModel(model), m_timer(0), m_item(), - m_pos() + m_itemRect() { KToolTip::setToolTipDelegate(g_delegate); @@ -79,8 +82,9 @@ void ToolTipManager::requestToolTip(const QModelIndex& index) 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); @@ -100,7 +104,41 @@ 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()->availableGeometry(); + + // 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; + } + + KToolTip::showTip(QPoint(x, y), tip); } #include "tooltipmanager.moc" diff --git a/src/tooltipmanager.h b/src/tooltipmanager.h index 420b48a1a..381b1b7a4 100644 --- a/src/tooltipmanager.h +++ b/src/tooltipmanager.h @@ -21,7 +21,7 @@ #define TOOLTIPMANAGER_H #include <QObject> -#include <QPoint> +#include <QRect> #include <kfileitem.h> @@ -69,7 +69,7 @@ private: QTimer* m_timer; KFileItem m_item; - QPoint m_pos; + QRect m_itemRect; }; #endif |
