src/hbwidgets/widgets/hbcombodropdown_p.cpp
changeset 21 4633027730f5
parent 7 923ff622b8b9
child 28 b7da29130b0e
--- a/src/hbwidgets/widgets/hbcombodropdown_p.cpp	Tue Jul 06 14:36:53 2010 +0300
+++ b/src/hbwidgets/widgets/hbcombodropdown_p.cpp	Wed Aug 18 10:05:37 2010 +0300
@@ -28,10 +28,12 @@
 #include "hbwidget_p.h"
 #include <hblistview.h>
 #include <hbwidgetfeedback.h>
+#include <hbinputvirtualkeyboard.h>
 
 #include <hbtapgesture.h>
 #include <hbpangesture.h>
 #include <QGestureEvent>
+#include <QGraphicsSceneMouseEvent>
 
 class HbComboDropDownPrivate : public HbWidgetPrivate
 {
@@ -44,7 +46,7 @@
      backgroundPressed( false )
 {
     Q_D(HbComboDropDown);
-    d->setBackgroundItem(HbStyle::P_ComboBoxPopup_background);
+    d->setBackgroundItem(HbStylePrivate::P_ComboBoxPopup_background);
     #if QT_VERSION >= 0x040600
     //this is to keep the focus in the previous widget.
     setFlag( QGraphicsItem::ItemIsPanel, true );
@@ -54,7 +56,6 @@
 
 HbComboDropDown::~HbComboDropDown( )
 {
-
 }
 
 void HbComboDropDown::createList( )
@@ -85,18 +86,44 @@
     Q_UNUSED( obj );
     bool accepted = false;
 
-    if ( isVisible( ) && !vkbOpened ) {
+    if ( isVisible( ) ) {
         switch( event->type( ) )
         {
         case QEvent::GraphicsSceneMousePress:
         case QEvent::GraphicsSceneMouseDoubleClick:
             {
-                if( !( this->isUnderMouse( ) ) ) {
-                    HbWidgetFeedback::triggered( this, Hb::InstantPopupClosed );
-                    setVisible( false );
-                    comboPrivate->q_ptr->setProperty("state","normal");
-                    backgroundPressed = true;
-                    accepted = true;
+                if( !vkbOpened ) {
+                    //if vkb is not opened and dropdown is not clicked then dismiss drop down
+                    if( !( this->isUnderMouse( ) ) ) {
+                        HbWidgetFeedback::triggered( this, Hb::InstantPopupClosed );
+                        setVisible( false );
+                        comboPrivate->q_ptr->setProperty("state","normal");
+                        backgroundPressed = true;
+                        accepted = true;
+                    }
+                } else {
+                    //if vkb is opened then dismiss drop down only if click happened outside drop down and
+                    //vkb area
+                    if( comboPrivate->mEditable ) {
+                        HbEditorInterface editorInterface( comboPrivate->q_ptr );
+                        HbVkbHost *host = editorInterface.vkbHost( );
+                        if( host ) {
+                            //get the scene rect of vkb
+                            QGraphicsWidget *vkbWidget = host->activeKeypad( )->asGraphicsWidget( );
+                            QRectF tmp = host->applicationArea( );
+                            QRectF vkbArea = vkbWidget->mapToScene( tmp ).boundingRect( );
+                            QGraphicsSceneMouseEvent *mouseEvent = 
+                                static_cast< QGraphicsSceneMouseEvent * >( event );
+                            if( !( this->isUnderMouse( ) ) &&
+                                !vkbArea.contains( mouseEvent->scenePos( ) ) ) {
+                                HbWidgetFeedback::triggered( this, Hb::InstantPopupClosed );
+                                setVisible( false );
+                                comboPrivate->q_ptr->setProperty( "state", "normal" );
+                                backgroundPressed = true;
+                                accepted = true;
+                            }
+                        }
+                    }
                 }
             }
             break;
@@ -124,5 +151,19 @@
     return accepted;
 }
 
+QVariant HbComboDropDown::itemChange( GraphicsItemChange change, const QVariant & value )
+{
+    switch( change ) {
+        case QGraphicsItem::ItemVisibleHasChanged:
+            if( !value.toBool( ) ) {
+                comboPrivate->resetGeometryChangeFlag( );
+            }
+            break;
+        default:
+            break;
+    }
+    return HbWidget::itemChange( change, value );
+}
+
 #include "moc_hbcombodropdown_p.cpp"