┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Penz <[email protected]>2008-08-19 19:42:58 +0000
committerPeter Penz <[email protected]>2008-08-19 19:42:58 +0000
commitba1d46fb52ac282ca1bcc33031bee9020d561527 (patch)
tree1bbb7ea58ff05ede7083da65a59e3bf927629364
parent9b7e0607003a5e1d8145bae261be8e77e20961b2 (diff)
assure that the tooltip is never clipped at the screen borders and never overlaps the item area (patch provided by Simon St James)
CCMAIL: [email protected] svn path=/trunk/KDE/kdebase/apps/; revision=849586
-rw-r--r--src/tooltipmanager.cpp35
1 files changed, 27 insertions, 8 deletions
diff --git a/src/tooltipmanager.cpp b/src/tooltipmanager.cpp
index 71c29e51b..687df218f 100644
--- a/src/tooltipmanager.cpp
+++ b/src/tooltipmanager.cpp
@@ -127,16 +127,35 @@ void ToolTipManager::showToolTip()
// 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();
- // TODO: handle usecase if x or y get smaller than the
- // desktop-left or the desktop-top
- if (x + size.width() - 1 > desktop.right()) {
- x = m_itemRect.left() - size.width();
+ 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;
}
- if (y + size.height() - 1 > desktop.bottom()) {
- y = m_itemRect.top() - size.height();
+
+ 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);
}