src/hbcore/gui/hbtooltiplabel_p.cpp
changeset 1 f7ac710697a9
parent 0 16d8024aca5e
child 6 c3690ec91ef8
--- a/src/hbcore/gui/hbtooltiplabel_p.cpp	Mon Apr 19 14:02:13 2010 +0300
+++ b/src/hbcore/gui/hbtooltiplabel_p.cpp	Mon May 03 12:48:33 2010 +0300
@@ -49,7 +49,8 @@
 }
 
 HbToolTipLabelPrivate::HbToolTipLabelPrivate():
-        label(0),aboutToHide(false)
+        label(0), aboutToHide(false),
+        mHorizontalMargin(0.0), mVerticalMargin(0.0), mPolishLayoutRequest(false)
 {
 }
 
@@ -151,88 +152,49 @@
 {
     Q_Q(HbToolTipLabel);    
     QRectF itemSceneRect = item->sceneBoundingRect();    
-    QRectF toolTipBoundingRect = QRectF(qreal(0.0), qreal(0.0), q->preferredSize().width(), q->preferredSize().height()); //q->boundingRect();
+    QRectF toolTipBoundingRect = QRectF(qreal(0.0), qreal(0.0),
+                                        q->preferredSize().width(), q->preferredSize().height());
     QRectF screenRect(QPointF(qreal(0.0), qreal(0.0)), HbDeviceProfile::profile(q).logicalSize());
 
     Qt::Alignment currentAlignment = (preferredAlignment & Qt::AlignHorizontal_Mask)?
                                      QStyle::visualAlignment(q->layoutDirection(), preferredAlignment ): // krazy:exclude=qclasses
                                      preferredAlignment;
-    Qt::AlignmentFlag nextAlignmentFlag;
-    Qt::Alignment nextAlignment;
-    Qt::Alignment visitedAlignment;
+
     bool matchingFinished = false;
 
-    forever {
-
-        toolTipBoundingRect.moveCenter(itemSceneRect.center());
-
-        if (currentAlignment & Qt::AlignTop) {            
-            visitedAlignment |= Qt::AlignTop;
-            if (currentAlignment & Qt::AlignRight) {
-                visitedAlignment |= Qt::AlignRight;
-                toolTipBoundingRect.moveBottomLeft(itemSceneRect.topRight());
-
-                nextAlignment = Qt::AlignTop;
-                nextAlignmentFlag = Qt::AlignLeft;
-                nextAlignment |= nextAlignmentFlag;
-
-            } else if (currentAlignment & Qt::AlignLeft) {
-                visitedAlignment |= Qt::AlignLeft;
-                toolTipBoundingRect.moveBottomRight(itemSceneRect.topLeft());
-
-                nextAlignment = Qt::AlignTop;
-                nextAlignmentFlag = Qt::AlignRight;
-                nextAlignment |= nextAlignmentFlag;
-
-            } else {
-                toolTipBoundingRect.moveBottom(itemSceneRect.top());
-
-                // Find out next alignment
-                nextAlignment = Qt::AlignRight | (preferredAlignment & Qt::AlignAbsolute);
-                nextAlignment = QStyle::visualAlignment(q->layoutDirection(), nextAlignment ); // krazy:exclude=qclasses
-                nextAlignmentFlag = ((nextAlignment & Qt::AlignRight)?Qt::AlignRight:Qt::AlignLeft);
-            }
-
-        } else if (currentAlignment & Qt::AlignRight) {
-
-            visitedAlignment |= Qt::AlignRight;
-            toolTipBoundingRect.moveLeft(itemSceneRect.right());
-            nextAlignment = nextAlignmentFlag = Qt::AlignLeft;
-
-        } else if (currentAlignment & Qt::AlignLeft ) {
-
-            visitedAlignment |= Qt::AlignLeft;
-            toolTipBoundingRect.moveRight(itemSceneRect.left());
-            nextAlignment = nextAlignmentFlag = Qt::AlignRight;
-
-        } else {
-            currentAlignment = Qt::AlignTop;
-            continue;
+    if (currentAlignment & Qt::AlignTop) {        
+        if ((itemSceneRect.y() - mVerticalMargin - toolTipBoundingRect.height()) >= 0) {
+            q->setPreferredPos(QPointF(itemSceneRect.x() + item->boundingRect().width()/2,
+                                       itemSceneRect.y() - mVerticalMargin),
+                               HbPopup::BottomEdgeCenter);
+            matchingFinished = true;
         }
 
-        // Respect screen boundaries
-        toolTipBoundingRect.moveBottom(qMin(toolTipBoundingRect.bottom(),screenRect.bottom()));
-        toolTipBoundingRect.moveLeft(qMax(toolTipBoundingRect.left(),screenRect.left()));
-        toolTipBoundingRect.moveRight(qMin(toolTipBoundingRect.right(),screenRect.right()));
-        toolTipBoundingRect.moveTop(qMax(toolTipBoundingRect.top(),screenRect.top()));
-
-        // Check if a match is found or if matching was finished
-        if (!toolTipBoundingRect.intersects(itemSceneRect) || matchingFinished) {
-            break;
-        }
-        else { // move to the next alignment
-
-            // Check if every supported alignment was tried
-            if (visitedAlignment & nextAlignmentFlag) {
-                   currentAlignment = Qt::AlignTop;
-                   matchingFinished = true;
-            } else {
-                currentAlignment = nextAlignment;
-            }
+    }
+    if (currentAlignment & Qt::AlignRight || !matchingFinished) {        
+        if ((itemSceneRect.x() + item->boundingRect().width() +
+             mHorizontalMargin + toolTipBoundingRect.width()) <= screenRect.width()) {
+            q->setPreferredPos(QPointF(itemSceneRect.x() + item->boundingRect().width() + mHorizontalMargin,
+                                       itemSceneRect.y() +  item->boundingRect().height()/2),
+                               HbPopup::LeftEdgeCenter);
+            matchingFinished = true;
         }
     }
+    if (currentAlignment & Qt::AlignLeft || !matchingFinished) {        
+        if ((itemSceneRect.x() - mHorizontalMargin - toolTipBoundingRect.width()) >= 0) {
+            q->setPreferredPos(QPointF(itemSceneRect.x() - mHorizontalMargin,
+                                       itemSceneRect.y() +  item->boundingRect().height()/2),
+                               HbPopup::RightEdgeCenter);
+            matchingFinished = true;
+        }
+    }
+    //Using AlignTop as default
+    if (!matchingFinished) {
+        q->setPreferredPos(QPointF(itemSceneRect.x() + item->boundingRect().width()/2,
+                                   itemSceneRect.y() - mVerticalMargin),
+                           HbPopup::BottomEdgeCenter);
+    }
 
-    q->setPos(toolTipBoundingRect.topLeft());
     q->show();
 }
 
@@ -287,8 +249,6 @@
                 case QEvent::GraphicsSceneHoverEnter:
                 case QEvent::GraphicsSceneHoverLeave:
                 case QEvent::GraphicsSceneHoverMove:
-                case QEvent::KeyPress:
-                case QEvent::KeyRelease:
                 case QEvent::FocusIn:
                 case QEvent::FocusOut:
 
@@ -409,6 +369,7 @@
 /*
     reimp
 */
+#include <QDebug>
 bool HbToolTipLabel::event(QEvent *event)
 {
     Q_D(HbToolTipLabel);
@@ -416,15 +377,40 @@
         if (d->label) {
             d->label->setFont(font());
         }
-    } else if (event->type() == QEvent::LayoutRequest) {        
-        if (d->label) {
-            resize(preferredSize());
-            d->label->resize(d->label->preferredSize());
-        }
-        if (isVisible()) {
-            showText(d->mItem, d->mPreferredAlignment);
+    } else if (event->type() == QEvent::LayoutRequest) {
+        if (isVisible() && d->mPolishLayoutRequest) {
+            d->mPolishLayoutRequest = false;
+            d->showText(d->mItem, d->mPreferredAlignment);
         }
     }
     return HbPopup::event(event);
 }
 
+/*
+    reimp
+*/
+void HbToolTipLabel::polish(HbStyleParameters &params)
+{
+    Q_D(HbToolTipLabel);
+    const QString HorizontalMargin = "horizontal-margin";
+    const QString VerticalMargin = "vertical-margin";
+    const QString ScreenMargin = "screen-margin";
+
+    params.addParameter(HorizontalMargin);
+    params.addParameter(VerticalMargin);
+    params.addParameter(ScreenMargin);
+
+    HbPopup::polish(params);
+
+    if (params.value(HorizontalMargin).isValid()) {
+        d->mHorizontalMargin = params.value(HorizontalMargin).toReal();
+    }
+    if (params.value(VerticalMargin).isValid()) {
+        d->mVerticalMargin = params.value(VerticalMargin).toReal();
+    }
+    if (params.value(ScreenMargin).isValid()) {
+        d->mScreenMargin = params.value(ScreenMargin).toReal();
+    }
+    d->mPolishLayoutRequest = true;
+}
+