src/hbwidgets/widgets/hbcombobox_p.cpp
changeset 34 ed14f46c0e55
parent 7 923ff622b8b9
--- a/src/hbwidgets/widgets/hbcombobox_p.cpp	Mon Oct 04 17:49:30 2010 +0300
+++ b/src/hbwidgets/widgets/hbcombobox_p.cpp	Mon Oct 18 18:23:13 2010 +0300
@@ -34,6 +34,7 @@
 #include <hbtextitem.h>
 #include <hbstyleoptioncombobox_p.h>
 #include <hbgraphicsscene.h>
+#include <hbinputeditorinterface.h>
 
 #include <QSortFilterProxyModel>
 #include <QCompleter>
@@ -84,10 +85,14 @@
         return;
     }
 
-    if ( !mDropDown->scene() || !mDropDown->scene( )->property( "destructed" ).isValid( ) ) {
-        delete mDropDown;
-        mDropDown = 0;
+    //if drop down is added to scene then remove it from scene so that scene does not deletes
+    //drop down again
+    if( mDropDown->scene() ) {
+        q->scene()->removeItem(mDropDown);
     }
+
+    delete mDropDown;
+    mDropDown = 0;
 }
 
 void HbComboBoxPrivate::init( )
@@ -99,16 +104,16 @@
 {
     Q_Q( HbComboBox );
 
-    mTextItem = q->style( )->createPrimitive( HbStyle::P_ComboBox_text, q );
+    mTextItem = HbStylePrivate::createPrimitive( HbStylePrivate::P_ComboBox_text, q );
     HbStyle::setItemName( mTextItem, "combobox_labelfield" );
 
-    mBackgroundItem = q->style( )->createPrimitive( HbStyle::P_ComboBox_background, q );
+    mBackgroundItem = HbStylePrivate::createPrimitive( HbStylePrivate::P_ComboBox_background, q );
     HbStyle::setItemName( mBackgroundItem, "text_background" );
 
-    mButton = q->style( )->createPrimitive( HbStyle::P_ComboBox_button, q );
+    mButton = HbStylePrivate::createPrimitive( HbStylePrivate::P_ComboBox_button, q );
     HbStyle::setItemName( mButton, "combobox_button" );
 
-    mButtonTouchAreaItem = q->style( )->createPrimitive( HbStyle::P_ComboBoxButton_toucharea, q );
+    mButtonTouchAreaItem = HbStylePrivate::createPrimitive( HbStylePrivate::P_ComboBoxButton_toucharea, q );
 
     static_cast<HbTouchArea*>( mButtonTouchAreaItem )->grabGesture( Qt::TapGesture );
 }
@@ -121,7 +126,10 @@
     }
     mIsDown = true;
     q->updatePrimitives( );
-    q->setProperty( "state", "pressed" );
+    //Update the state only when valid model is there
+    if ( mModel && mModel->rowCount( ) ) {
+        q->setProperty( "state", "pressed" );
+    }
 }
 
 void HbComboBoxPrivate::touchAreaReleaseEvent(  )
@@ -167,10 +175,10 @@
             mDropDown->mList->setCurrentIndex( 
                 mModel->index( 0, 0 ), QItemSelectionModel::Select );
         }
+        positionDropDown( );
         #ifdef HB_EFFECTS
         HbEffect::start( mDropDown, HB_DROPD0WN_ITEM_TYPE, "appear" );
         #endif
-        positionDropDown( );
     }
 }
 
@@ -204,7 +212,12 @@
             mDropDown->mList->scrollTo( aModel->index( 0, 0 ) );
         }
         positionDropDown( );
-        mDropDown->setVisible( true );
+        if( !mDropDown->isVisible( ) ) {
+            mDropDown->setVisible( true );
+            #ifdef HB_EFFECTS
+            HbEffect::start( mDropDown, HB_DROPD0WN_ITEM_TYPE, "appear" );
+            #endif
+        }
     }
 }
 
@@ -238,6 +251,31 @@
     }
 }
 
+void HbComboBoxPrivate::resetGeometryChangeFlag( )
+{
+    Q_Q( HbComboBox );
+    QGraphicsWidget *p = q;
+    if( widgetGeometryChange.count() > 0 ) {
+        while ( p->parentWidget( ) ) {
+            p = p->parentWidget( );
+            if ( !widgetGeometryChange.value( p ) ) {
+                //if earlier geometry change flag was disabled then disable this flag
+                p->setFlag( QGraphicsItem::ItemSendsGeometryChanges, false );
+            }
+        }
+        widgetGeometryChange.clear();
+    }
+}
+
+void HbComboBoxPrivate::showDismissEffect( )
+{
+    #ifdef HB_EFFECTS
+    HbEffect::start( mDropDown, HB_DROPD0WN_ITEM_TYPE, "disappear", mDropDown, "dismissEffectFinished" );
+    #else
+    mDropDown->setVisible( false );
+    #endif
+}
+
 void HbComboBoxPrivate::positionDropDown( )
 {
     Q_Q( HbComboBox );
@@ -249,24 +287,10 @@
     qreal totalHeightRequd = model->rowCount( ) * mListItemHeight;
     qreal maxPopupHeight = 0.0;
 
-    //read the maximum rows in drop down for different orientation from css
+    //calculate the maximum popup height for different orientation
     if( q->mainWindow( )->orientation( ) == Qt::Horizontal ) {
-        if( mDropDownRowsInLandscape == -1 ) {
-            HbStyleParameters params;
-            q->style( )->parameters( params );
-            params.addParameter( "max-rows-in-dropdown" );
-            q->polish( params );
-            mDropDownRowsInLandscape = params.value( "max-rows-in-dropdown" ).toInt( );
-        }
         maxPopupHeight = mDropDownRowsInLandscape * mListItemHeight;
     } else if( q->mainWindow( )->orientation( ) == Qt::Vertical ) {
-        if( mDropDownRowsInPortrait == -1 ) {
-            HbStyleParameters params;
-            q->style( )->parameters( params );
-            params.addParameter( "max-rows-in-dropdown" );
-            q->polish( params );
-            mDropDownRowsInPortrait = params.value( "max-rows-in-dropdown" ).toInt( );
-        }
         maxPopupHeight = mDropDownRowsInPortrait * mListItemHeight;
     }
 
@@ -275,7 +299,58 @@
     }
     QSizeF popupSize = QSizeF( q->rect( ).width( ), maxPopupHeight );
     QPointF popupPos;
-    if( !mDropDown->vkbOpened ) {
+
+    HbEditorInterface editorInterface( q );
+    HbVkbHost *host = editorInterface.vkbHost( );
+
+    if( host && ( host->keypadStatus( ) == HbVkbHost::HbVkbStatusOpened ) ) {
+        // case when vkb is visible
+        // positioning drop down when vkb is positioned
+        // drop down will come on top/below of combo based upon which side has more space
+        // available 
+        QSizeF keyBoardArea = host->keyboardArea( );
+        QSize screenSize = HbDeviceProfile::profile( q ).logicalSize( );
+
+        qreal heightDifference = screenSize.height( ) - keyBoardArea.height( );
+        qreal topSpace = widgetPos.y( );
+        qreal bottomSpace = heightDifference - topSpace - q->boundingRect( ).height( );
+
+        if( topSpace > bottomSpace ) {
+            //display drop down at top
+            if( widgetPos.y( ) - maxPopupHeight  > 0.0 ) {
+                popupPos = QPointF( widgetPos.x( ), widgetPos.y( ) - maxPopupHeight );
+            } else {
+                popupPos = QPointF( widgetPos.x( ), 0.0 );
+                popupSize.setHeight( topSpace );
+            }
+            #ifdef HB_EFFECTS
+            if ( !mHasUpEffect ) {
+                 mHasUpEffect = true;
+                 mHasDownEffect = false;
+                 //this Effect will be shown when there is more space in the view bottom.
+                 HbEffectInternal::add( mDropDown, "combo_appear_up", "appear" );
+                 HbEffectInternal::add( mDropDown, "combo_disappear_up", "disappear" );
+            }
+            #endif
+        } else {
+            //display drop down at bottom
+            popupPos = QPointF( widgetPos.x( ), widgetPos.y( ) + q->rect( ).height( ) );
+            if( bottomSpace < maxPopupHeight ) {
+                popupSize.setHeight( bottomSpace );
+            }
+            #ifdef HB_EFFECTS
+            if ( !mHasDownEffect ) {
+                mHasDownEffect = true;
+                mHasUpEffect = false;
+                //this Effect will be shown when there is more space in the view bottom.
+                HbEffectInternal::add( mDropDown, "combo_appear_down", "appear" );
+                HbEffectInternal::add( mDropDown, "combo_disappear_down", "disappear" );
+            }
+            #endif
+        }
+    } else {
+        //this is the case when vkb is not visible
+
         //position of drop down in both editable and non-editable combobox depends upon
         //the available space above and below combobox
         if( ( widgetPos.y( ) + q->rect( ).height( ) + maxPopupHeight) < sceneRect.height( ) ) {
@@ -284,17 +359,15 @@
             if ( !mHasDownEffect ) {
                  mHasDownEffect = true;
                  mHasUpEffect = false;
-                 // this is temporary until proper effect theming comes.
                  //this Effect will be shown when there is space in the view bottom.
                  HbEffectInternal::add( mDropDown, "combo_appear_down", "appear" );
-                 HbEffectInternal::add( mDropDown, "combo_disappear_downl", "disappear" );
+                 HbEffectInternal::add( mDropDown, "combo_disappear_down", "disappear" );
             }
             #endif
         } else if( widgetPos.y( ) - maxPopupHeight  > 0.0 ) {
             popupPos = QPointF( widgetPos.x( ), widgetPos.y( ) - maxPopupHeight );
             #ifdef HB_EFFECTS
             if ( !mHasUpEffect ) {
-                 // this is temporary until proper effect theming comes.
                  //this Effect will be shown when there is no space in the view bottom
                  mHasUpEffect = true;
                  mHasDownEffect = false;
@@ -310,7 +383,6 @@
                 if ( !mHasDownEffect ) {
                     mHasDownEffect = true;
                     mHasUpEffect = false;
-                    // this is temporary until proper effect theming comes.
                     //this Effect will be shown when there is more space in the view bottom.
                     HbEffectInternal::add( mDropDown, "combo_appear_down", "appear" );
                     HbEffectInternal::add( mDropDown, "combo_disappear_down", "disappear" );
@@ -322,7 +394,6 @@
                 if ( !mHasUpEffect ) {
                      mHasUpEffect = true;
                      mHasDownEffect = false;
-                     // this is temporary until proper effect theming comes.
                      //this Effect will be shown when there is more space in the view bottom.
                      HbEffectInternal::add( mDropDown, "combo_appear_up", "appear" );
                      HbEffectInternal::add( mDropDown, "combo_disappear_up", "disappear" );
@@ -330,56 +401,6 @@
                 #endif
             }
         }
-    } else {
-        // positioning drop down when vkb is positioned
-        // drop down will come on top/below of combo based upon which side has more space
-        // available 
-        HbEditorInterface editorInterface( q );
-        HbVkbHost *host = editorInterface.vkbHost( );
-        if ( host ) {
-            QSizeF keyBoardArea = host->keyboardArea( );
-            QSize screenSize = HbDeviceProfile::profile( q ).logicalSize( );
-
-            qreal heightDifference = screenSize.height( ) - keyBoardArea.height( );
-            qreal topSpace = widgetPos.y( );
-            qreal bottomSpace = heightDifference - topSpace - q->boundingRect( ).height( );
-
-            if( topSpace > bottomSpace ) {
-                //display drop down at top
-                if( widgetPos.y( ) - maxPopupHeight  > 0.0 ) {
-                    popupPos = QPointF( widgetPos.x( ), widgetPos.y( ) - maxPopupHeight );
-                } else {
-                    popupPos = QPointF( widgetPos.x( ), 0.0 );
-                    popupSize.setHeight( topSpace );
-                }
-                #ifdef HB_EFFECTS
-                if ( !mHasUpEffect ) {
-                     mHasUpEffect = true;
-                     mHasDownEffect = false;
-                     // this is temporary until proper effect theming comes.
-                     //this Effect will be shown when there is more space in the view bottom.
-                     HbEffectInternal::add( mDropDown, "combo_appear_up", "appear" );
-                     HbEffectInternal::add( mDropDown, "combo_disappear_up", "disappear" );
-                }
-                #endif
-            } else {
-                //display drop down at bottom
-                popupPos = QPointF( widgetPos.x( ), widgetPos.y( ) + q->rect( ).height( ) );
-                if( bottomSpace < maxPopupHeight ) {
-                    popupSize.setHeight( bottomSpace );
-                }
-                #ifdef HB_EFFECTS
-                if ( !mHasDownEffect ) {
-                    mHasDownEffect = true;
-                    mHasUpEffect = false;
-                    // this is temporary until proper effect theming comes.
-                    //this Effect will be shown when there is more space in the view bottom.
-                    HbEffectInternal::add( mDropDown, "combo_appear_down", "appear" );
-                    HbEffectInternal::add( mDropDown, "combo_disappear_down", "disappear" );
-                }
-                #endif
-            }
-        }
     }
     mDropDown->setPreferredSize( popupSize );
     mDropDown->setMinimumSize( popupSize );
@@ -388,6 +409,15 @@
     QGraphicsWidget *p = q;
     while ( p->parentWidget( ) ) {
         p = p->parentWidget( );
+        //cache the original geometry change flag of parent widget
+        QGraphicsItem::GraphicsItemFlags itemFlags = p->flags( );
+        bool geometryFlagEnabled =  itemFlags & QGraphicsItem::ItemSendsGeometryChanges;
+        widgetGeometryChange.insert(p, geometryFlagEnabled);
+
+        //This flag is being set since geometry change notification is required for properly
+        //positioning drop down when its visible and combobox position is changed for example
+        //when orientation change happens.
+        p->setFlag( QGraphicsItem::ItemSendsGeometryChanges );
     }
     mDropDown->setZValue( p->zValue( ) + 1 );
 }
@@ -403,7 +433,7 @@
         } else {
             HbStyleOptionComboBox comboBoxOption;
             q->initStyleOption( &comboBoxOption );
-            q->style( )->updatePrimitive( mTextItem, HbStyle::P_ComboBox_text, &comboBoxOption );
+            HbStylePrivate::updatePrimitive( mTextItem, HbStylePrivate::P_ComboBox_text, &comboBoxOption );
         }
         mCurrentIndex = aIndex;
     } else {
@@ -415,7 +445,7 @@
            SLOT( _q_textChanged( QString ) ) );
     }
     if ( mDropDown->isVisible( ) ) {
-        mDropDown->setVisible( false );
+        showDismissEffect( );
         q->setProperty( "state", "normal" );
     }
     currentIndexChanged( mCurrentIndex );
@@ -444,7 +474,7 @@
         }
     } else {
         if( mDropDown ) {
-            mDropDown->setVisible( false );
+            showDismissEffect( );
         }
         //showPopup( mModel, mCurrentIndex);
     }
@@ -522,7 +552,6 @@
         q->setHandlesChildEvents( false );
         mLineEdit->setReadOnly( false );
         mLineEdit->setCursorVisibility( Hb::TextCursorVisible );
-        mLineEdit->setLongPressEnabled( );
         q->repolish( );
         q->connect( mLineEdit, SIGNAL( textChanged ( QString ) ),
             q, SLOT( _q_textChanged( QString ) ) );
@@ -532,7 +561,6 @@
             q, SLOT( _q_textChanged( QString ) ) );
         q->setHandlesChildEvents( true );
         mLineEdit->setReadOnly( true );
-        mLineEdit->setLongPressEnabled( false );
         setCompletion( false );
         mLineEdit->setCursorVisibility( Hb::TextCursorHidden );
         if( mModel && mModel->rowCount( ) ) {
@@ -600,8 +628,8 @@
             } else {
                 HbStyleOptionComboBox comboBoxOption;
                 q->initStyleOption(&comboBoxOption);
-                q->style( )->updatePrimitive(
-                    mTextItem, HbStyle::P_ComboBox_text, &comboBoxOption );
+                HbStylePrivate::updatePrimitive(
+                    mTextItem, HbStylePrivate::P_ComboBox_text, &comboBoxOption );
             }
         }
         currentIndexChanged( mCurrentIndex );