--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/hbwidgets/widgets/hbcombobox.cpp Mon Apr 19 14:02:13 2010 +0300
@@ -0,0 +1,1003 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (developer.feedback@nokia.com)
+**
+** This file is part of the HbWidgets module of the UI Extensions for Mobile.
+**
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this file.
+** Please review the following information to ensure the GNU Lesser General
+** Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at developer.feedback@nokia.com.
+**
+****************************************************************************/
+
+#include "hbcombobox_p.h"
+
+#include <hbcombobox.h>
+#include <hblistview.h>
+#include <hbtoucharea.h>
+#include <hbtextitem.h>
+#include <hbstyleoptioncombobox.h>
+
+#include <QGraphicsSceneMouseEvent>
+#include <QStandardItemModel>
+#include <QDebug>
+
+/*!
+ @beta
+ @hbwidgets
+ \class HbComboBox
+
+ \brief The HbComboBox provides a drop-down list that permits selecting an item.
+
+ A HbComboBox provides a means of presenting a list of options to the user
+ in a way that takes up the minimum amount of screen space.
+
+ A combobox is a selection widget that displays the currently selected item,
+ and can provides a drop-down list that permits selecting an item.
+
+ A HbComboBox with currently Selected item
+ \image html noneditablecombobox.png.
+
+
+ A HbComboBox with drop-down list to select an item from list of options
+ \image html comboboxdropdownlist.png.
+
+
+ HbComboBox are of two types.
+
+ Editable:
+
+ If the comboBox is set to editable, touching the ComboBox label field invokes the VKB in
+ touch environments or accepts input from an attached keyboard.
+ choosing an element from the ComboBox dropdown list replaces the label
+ area with the chosen item.
+ on touching button area of the comboBox launches the drop-down list to select
+ the list of options
+ ( button area in comboBox behaves same in both editable and Non Editable comboBox ).
+
+ Non Editable:
+
+ If the comboBox is set to Non Editable widget that displays the currently selected item
+ in the label field of ComboBox.
+ Touching the comboBox label field or button area of the comboBox will opens
+ the drop-down list to select an item from list of options.
+
+ By Default comboBox is Non Editable.
+
+ Application is responsible for setting the model to the HbComboBox,
+ If no model is set, the drop down list cannot be displayed at all.
+
+ HbComboBox owns the model set by the Application.
+
+ HbComboBox provides three signals:
+
+ \li currentIndexChanged( index ) is emitted when the current selection in the combobox is
+ changed by user interaction. If application is setting a index/text then this signal is
+ not emmitted. In case of an editable combobox on combobox loosing focus if the current
+ selection has changed then this signal is emitted with the new model index.
+
+ \li currentIndexChanged( const QString& ) is emitted when the curret selection in the combobox
+ is changed by user interaction. If application is setting a differnet index/text
+ then this signal is not emmitted.
+ In case of an editable combobox on combobox loosing focus if the current selection
+ has changed then this signal is emitted with the new string.
+
+ \li editTextChanged( QString& ) is emitted when combobox looses focus and user has typed a text
+ for which there is no matching item found in the model with the text typed by the user.
+
+ The following is an example of how to create a model and adding item to the created model.
+ How to set the model on the HbcomboBox.
+ Here the model is ownership transfer to the widget.
+ \snippet{ultimatecodesnippet/ultimatecodesnippet.cpp,37}
+
+ An example how to add strings into HbComboBox and setting currentIndex.
+ HbComboBox will creates the model internally if model is not created.
+ \snippet{ultimatecodesnippet/ultimatecodesnippet.cpp,38}
+
+ An example how to add stringsList into HbComboBox and setting currentIndex.
+ HbComboBox will creates the model internally if model is not created.
+ \snippet{ultimatecodesnippet/ultimatecodesnippet.cpp,39}
+
+ An example how to insert String at index into HbComboBox.
+ HbComboBox will creates the model internally if model is not created.
+ \snippet{ultimatecodesnippet/ultimatecodesnippet.cpp,40}
+
+ An example how to insert StringList at index into HbComboBox.
+ HbComboBox will creates the model internally if model is not created.
+ \snippet{ultimatecodesnippet/ultimatecodesnippet.cpp,41}
+
+ An example how to set the items into HbComboBox.
+ HbComboBox will replces the existing model.
+ \snippet{ultimatecodesnippet/ultimatecodesnippet.cpp,42}
+
+*/
+
+
+/*!
+ Constructs a new HbComboBox with \a parent.
+ */
+HbComboBox::HbComboBox( QGraphicsItem *parent ):
+ HbWidget( *new HbComboBoxPrivate, parent )
+{
+ Q_D( HbComboBox );
+ d->init( );
+ updatePrimitives( );
+ setProperty("state", "normal");
+}
+
+/*!
+ Destructor.
+ */
+HbComboBox::~HbComboBox( )
+{
+}
+
+/*!
+ \internal[protected][Access Privilage]
+ */
+HbComboBox::HbComboBox( HbComboBoxPrivate &dd, QGraphicsItem *parent ) :
+ HbWidget( dd, parent )
+{
+ Q_D( HbComboBox );
+ d->init( );
+ updatePrimitives( );
+ setProperty("state", "normal");
+}
+
+/*!
+ @beta
+ \property HbComboBox::items
+ \brief list of comboBox items
+ It replaces the existing list.
+*/
+void HbComboBox::setItems( const QStringList &texts )
+{
+ if ( texts.isEmpty( ) ) {
+ return;
+ }
+ QStandardItemModel* model = new QStandardItemModel( this );
+ int textCount = texts.count( );
+ for( int i = 0; i < textCount; i++ )
+ {
+ QStandardItem* standardItem = new QStandardItem( );
+ standardItem->setData( texts.at( i ),Qt::DisplayRole );
+ model->appendRow( standardItem );
+ }
+ setModel( model );
+}
+
+/*!
+ @beta
+ This property holds the list added in the combobox.
+ By default, for an empty combo box, this property has a empty StringList.
+ */
+QStringList HbComboBox::items( ) const
+{
+ Q_D( const HbComboBox );
+ if( d->mModel && d->mModel->rowCount( )) {
+ QStringList list;
+ int rowCount = d->mModel->rowCount();
+ for(int i = 0; i < rowCount; i++)
+ {
+ list<<( d->mModel->data( d->mModel->index( i, 0 ) ) ).toString();
+ }
+ return list;
+ } else {
+ return QStringList();
+ }
+}
+
+/*!
+ @alpha
+ Sets the \a icon for the item on the given \a index in the combobox.
+ this API will not work if applcation sets the model as QStringlistModel.
+*/
+void HbComboBox::setItemIcon( int index, const HbIcon &icon )
+{
+ Q_D(const HbComboBox);
+ if(d->mModel) {
+ QModelIndex item = d->mModel->index( index, 0 );
+ if ( item.isValid( ) ) {
+ d->mModel->setData( item, icon.qicon(), Qt::DecorationRole );
+ }
+ }
+}
+
+/*!
+ @alpha
+ returns the HbIcon for the given \a index in the combobox.
+*/
+HbIcon HbComboBox::itemIcon( int index ) const
+{
+ Q_D( const HbComboBox );
+ if( d->mModel ) {
+ QModelIndex mi = d->mModel->index( index, 0 );
+ if( mi.isValid ( ) ) {
+ return d->itemIcon( mi );
+ }
+ }
+ return HbIcon( );
+}
+
+/*!
+ @beta
+ Returns the data for the given \a role in the given \a index in the
+ combobox, or QVariant::Invalid if there is no data for this role.
+*/
+QVariant HbComboBox::itemData( int index, int role ) const
+{
+ Q_D( const HbComboBox );
+ if( d->mModel ) {
+ QModelIndex mi = d->mModel->index( index, 0 );
+ if( mi.isValid ( ) ) {
+ return d->mModel->data( mi, role );
+ }
+ }
+ return QVariant( );
+}
+
+/*!
+ @beta
+ Sets the data \a role for the item on the given \a index in the combobox
+ to the specified \a value.
+*/
+void HbComboBox::setItemData( int index, const QVariant &value, int role )
+{
+ Q_D( const HbComboBox );
+ if( d->mModel ) {
+ QModelIndex item = d->mModel->index( index, 0 );
+ if ( item.isValid( ) ) {
+ d->mModel->setData( item, value, role );
+ }
+ }
+}
+
+/*!
+ @proto
+ This case is valid only for Editable comboBox
+ Returns the validator that is used to constraint text input to the
+ combobox and returns NULL if it is invalid.
+
+ \sa editable
+*/
+const HbValidator *HbComboBox::validator() const
+{
+ Q_D( const HbComboBox );
+ if( d->mEditable) {
+ return d->mLineEdit->validator( );
+ }
+ return NULL;
+}
+
+/*!
+ @proto
+ This case is only valid for the Editable comboBox.
+ Sets the \a validator to use instead of the current validator.
+*/
+void HbComboBox::setValidator( HbValidator *validator )
+{
+ Q_D( HbComboBox );
+ if( d->mEditable ) {
+ disconnect( d->mLineEdit, SIGNAL( textChanged ( QString ) ),
+ this, SLOT( _q_textChanged( QString ) ) );
+ d->mLineEdit->setValidator( validator );
+ connect( d->mLineEdit, SIGNAL( textChanged ( QString ) ),
+ this, SLOT( _q_textChanged( QString ) ) );
+ }
+}
+
+/*!
+ This property holds the number of items in the combobox.
+ By default, for an empty combo box, this property has a value of 0.
+ */
+int HbComboBox::count( ) const
+{
+ Q_D( const HbComboBox );
+ if( d->mModel ) {
+ return d->mModel->rowCount( );
+ }
+ return 0;
+}
+
+/*!
+ \deprecated HbComboBox::insertPolicy() const
+ is deprecated.
+ \sa setInsertPolicy
+*/
+HbComboBox::InsertPolicy HbComboBox::insertPolicy( ) const
+{
+ Q_D( const HbComboBox );
+ qDebug() << "this is deprecated and will cease to exist in the near future.";
+ return d->insertPolicy;
+}
+
+/*!
+ \deprecated HbComboBox::setInsertPolicy(HbComboBox::InsertPolicy)
+ is deprecated.
+ \sa insertPolicy
+*/
+void HbComboBox::setInsertPolicy( InsertPolicy policy )
+{
+ Q_D( HbComboBox );
+ qDebug() << "this is deprecated and will cease to exist in the near future.";
+ d->insertPolicy = policy;
+}
+
+/*!
+ @beta
+ Sets the model to \a model
+ comboBox Owns the model set by the Application.
+ It replaces the old model if exists.
+ please do not pass 0(NULL) as \a model instead call clear() to clear the contens of the model.
+ */
+void HbComboBox::setModel( QAbstractItemModel * model )
+{
+ Q_D( HbComboBox );
+ if ( d->mModel != model ) {
+ if( model ) {
+ d->setModel( model );
+ } else {
+ clear( );
+ }
+ }
+}
+
+/*!
+ @beta
+ Returns model that view is currently presenting.
+ */
+QAbstractItemModel* HbComboBox::model( ) const
+{
+ Q_D( const HbComboBox );
+ return d->mModel;
+}
+
+/*!
+ @beta
+ Sets current index to \a index.
+ By default no item is selected.
+ */
+void HbComboBox::setCurrentIndex( int index )
+{
+ Q_D( HbComboBox );
+ if( d->mModel ) {
+ QModelIndex mi = d->mModel->index( index, 0 );
+ if( mi.isValid( ) ) {
+ d->setCurrentIndex( mi );
+ }
+ }
+}
+
+/*!
+ @beta
+ Returns index of current item and returns -1 for invalid current index.
+ */
+int HbComboBox::currentIndex( ) const
+{
+ Q_D( const HbComboBox );
+ return d->mCurrentIndex.row( );
+}
+
+/*!
+ @beta
+ \fn int HbComboBox::findText(const QString &text, Qt::MatchFlags
+ flags = Qt::MatchExactly|Qt::MatchCaseSensitive) const
+
+ Returns the index of the item containing the given \a text; otherwise
+ returns -1.
+
+ The \a flags specify how the items in the combobox are searched.
+*/
+
+/*!
+ Returns the index of the item containing the given \a data for the
+ given \a role; otherwise returns -1.
+
+ The \a flags specify how the items in the combobox are searched.
+*/
+int HbComboBox::findData( const QVariant &data, int role, Qt::MatchFlags flags ) const
+{
+ Q_D( const HbComboBox );
+ if(d->mModel) {
+ QModelIndexList result;
+ QModelIndex start = d->mModel->index( 0, 0 );
+ result = d->mModel->match( start, role, data, 1, flags );
+ if ( result.isEmpty( ) )
+ return -1;
+ return result.first( ).row( );
+ }
+ return -1;
+}
+
+/*!
+ @beta
+ This is specific to the Editable comboBox only.
+ Sets the text in the combobox's text edit
+ */
+void HbComboBox::setEditText( const QString &text )
+{
+ Q_D( HbComboBox );
+ if( d->mEditable ) {
+ disconnect( d->mLineEdit, SIGNAL( textChanged ( QString ) ),
+ this, SLOT( _q_textChanged( QString ) ) );
+ d->mLineEdit->setText( text );
+ connect( d->mLineEdit, SIGNAL( textChanged ( QString ) ),
+ this, SLOT( _q_textChanged( QString ) ) );
+ }
+}
+
+/*!
+ @beta
+ \property HbComboBox::currentText
+ \brief the text of the current item
+ combo box with model count \0 returns an empty string.
+*/
+QString HbComboBox::currentText( ) const
+{
+ Q_D( const HbComboBox );
+ if( d->mEditable ) {
+ return d->mLineEdit->text( );
+ }else if( d->mCurrentIndex.isValid( ) ) {
+ return itemText ( d->mCurrentIndex.row( ) );
+ } else {
+ return QString( );
+ }
+}
+
+/*!
+ @beta
+ Removes the item at the given index from the combobox.
+ This will update the current index if the index is removed.
+ */
+void HbComboBox::removeItem( int index )
+{
+ Q_D( HbComboBox );
+ if( d->mModel ) {
+ int rowCount = d->mModel->rowCount( );
+ if( index >=0 && index < rowCount ) {
+ bool currentText = false;
+ if ( d->mModel->index(index, 0) == d->mCurrentIndex ) {
+ currentText = true;
+ d->mModel->removeRow( index );
+ } else if( d->mCurrentIndex.row() > index ) {
+ int row = d->mCurrentIndex.row();
+ d->mModel->removeRow( index );
+ d->mCurrentIndex = d->mModel->index( --row, 0 );
+ d->currentIndexChanged( d->mCurrentIndex );
+ } else {
+ d->mModel->removeRow( index );
+ }
+ if( d->mModel->rowCount( ) == 0 ) {
+ if( d->mEditable ) {
+ clearEditText();
+ } else {
+ if( d->mLineEdit ) {
+ d->mLineEdit->setText( QString() );
+ } else {
+ d->mText = QString( );
+ HbStyleOptionComboBox comboBoxOption;
+ initStyleOption(&comboBoxOption);
+ style()->updatePrimitive( d->mTextItem, HbStyle::P_ComboBox_text, &comboBoxOption);
+ }
+ }
+ return;
+ }
+ if( currentText ) {
+ d->mCurrentIndex = d->mModel->index( 0, 0 );
+ if( d->mEditable ) {
+ disconnect(d->mLineEdit, SIGNAL( textChanged ( QString ) ),
+ this, SLOT( _q_textChanged( QString ) ) );
+ d->mLineEdit->setText( d->mModel->data( d->mCurrentIndex ).toString( ) );
+ connect(d->mLineEdit, SIGNAL( textChanged ( QString ) ),
+ this, SLOT( _q_textChanged( QString ) ) );
+ } else {
+ if( d->mLineEdit ) {
+ d->mLineEdit->setText( QString() );
+ } else {
+ d->mText = d->mModel->data( d->mCurrentIndex ).toString( );
+ HbStyleOptionComboBox comboBoxOption;
+ initStyleOption(&comboBoxOption);
+ style()->updatePrimitive( d->mTextItem, HbStyle::P_ComboBox_text, &comboBoxOption);
+ }
+ }
+ d->currentIndexChanged( d->mCurrentIndex );
+ }
+ }
+ }
+}
+
+/*!
+ \reimp
+ */
+void HbComboBox::resizeEvent( QGraphicsSceneResizeEvent *event )
+{
+ Q_UNUSED( event )
+ Q_D( HbComboBox );
+ if ( d->mDropDown && d->mDropDown->isVisible() ){
+ d->positionDropDown( );
+ }
+}
+
+/*!
+ \reimp
+*/
+void HbComboBox::keyPressEvent( QKeyEvent *event )
+{
+ Q_D( HbComboBox );
+ if ( !event->isAutoRepeat( ) ) {
+ if ( event->key( ) == Qt::Key_Enter || event->key( ) == Qt::Key_Return ) {
+ d->mIsDown = true;
+ updatePrimitives( );
+ event->accept( );
+ }
+ } else {
+ event->accept( );
+ }
+}
+
+/*!
+ \reimp
+*/
+void HbComboBox::keyReleaseEvent( QKeyEvent *event )
+{
+ Q_D( HbComboBox );
+ if ( !event->isAutoRepeat( ) ){
+ if ( event->key( ) == Qt::Key_Enter || event->key( ) == Qt::Key_Return ){
+ d->mIsDown = false;
+ updatePrimitives( );
+ event->accept( );
+ d->touchAreaClicked( );
+ d->mDropDown->mList->setFocus( );
+ }
+ } else {
+ event->accept( );
+ }
+}
+
+/*!
+ \reimp
+ */
+QGraphicsItem* HbComboBox::primitive( HbStyle::Primitive primitive ) const
+{
+ Q_D( const HbComboBox );
+
+ switch( primitive ){
+ case HbStyle::P_ComboBox_background:
+ return d->mBackgroundItem;
+ case HbStyle::P_ComboBoxButton_toucharea:
+ return d->mButtonTouchAreaItem;
+ default:
+ return 0;
+ }
+}
+
+void HbComboBox::initStyleOption( HbStyleOptionComboBox *option )const
+{
+ Q_D( const HbComboBox );
+ option->text = d->mText;
+ HbWidget::initStyleOption( option );
+}
+
+/*!
+ \reimp
+ */
+void HbComboBox::updatePrimitives( )
+{
+ Q_D( HbComboBox );
+ HbStyleOption styleOption;
+ HbWidget::initStyleOption( &styleOption );
+ if ( d->mIsDown ) {
+ styleOption.state |= QStyle::State_Sunken;
+ }
+ if ( d->mBackgroundItem ) {
+ style( )->updatePrimitive(
+ d->mBackgroundItem, HbStyle::P_ComboBox_background, &styleOption );
+ style( )->updatePrimitive(
+ d->mButton, HbStyle::P_ComboBox_button, &styleOption );
+ }
+}
+
+/*!
+ @beta
+ Clears the combobox, removes all items from model.
+ */
+void HbComboBox::clear( )
+{
+ Q_D( HbComboBox );
+ if( d->mModel ) {
+ d->mModel->removeRows(0, d->mModel->rowCount());
+ d->mCurrentIndex = QModelIndex( );
+ if( d->mEditable ) {
+ clearEditText();
+ } else {
+ if( d->mLineEdit ) {
+ d->mLineEdit->setText( QString() );
+ } else {
+ d->mText = QString( );
+ HbStyleOptionComboBox comboBoxOption;
+ initStyleOption(&comboBoxOption);
+ style()->updatePrimitive( d->mTextItem, HbStyle::P_ComboBox_text, &comboBoxOption);
+ }
+ }
+ }
+}
+
+/*!
+ @beta
+ Clears the contents of the line edit used for editing in the combobox.
+ */
+void HbComboBox::clearEditText( )
+{
+ Q_D( HbComboBox );
+ if( d->mEditable ) {
+ disconnect( d->mLineEdit, SIGNAL( textChanged ( QString ) ),
+ this, SLOT( _q_textChanged( QString ) ) );
+ d->mLineEdit->setText( QString( ) );
+ connect( d->mLineEdit, SIGNAL( textChanged ( QString ) ),
+ this, SLOT( _q_textChanged( QString ) ) );
+ }
+}
+
+/*!
+ @beta
+ \property HbComboBox::editable
+ \brief Set editable the property of the combobox.
+ True, Editable, user can type in the combobox to search for items from
+ the list of items. Shows the prediction. If user types a text which does not match
+ to any items in the model then slection is not changed.
+ False, Non editable user canot enter text using keyboard.
+ */
+void HbComboBox::setEditable( bool editable )
+{
+ Q_D( HbComboBox );
+ d->setEditable( editable );
+ setProperty("state", "normal");
+}
+
+/*!
+ @beta
+ Returns whether or not the combobox is editable
+ True if editable, else false
+ */
+bool HbComboBox::isEditable( ) const
+{
+ Q_D( const HbComboBox );
+ return d->mEditable;
+}
+
+/*!
+ @beta
+ Adds an item to the combobox with the given text,
+ and containing the specified userData (stored in the Qt::UserRole).
+ The item is appended to the list of existing items.
+ */
+void HbComboBox::addItem( const QString &text, const QVariant &userData)
+{
+ insertItem( count( ), text, userData );
+}
+
+/*!
+ @beta
+ Adds an item to the combobox with the given icon and text,
+ and containing the specified userData (stored in the Qt::UserRole).
+ The item is appended to the list of existing items.
+ */
+void HbComboBox::addItem( const HbIcon &icon, const QString &text, const QVariant &userData )
+{
+ insertItem( count( ), icon, text, userData );
+}
+
+/*!
+ @beta
+ Adds each of the strings in the given texts to the combobox.
+ Each item is appended to the list of existing items in turn.
+ */
+void HbComboBox::addItems( const QStringList &texts )
+{
+ insertItems( count(), texts );
+}
+
+
+/*!
+ @beta
+ Inserts the text into the combobox at the given index.
+ If the index is equal to or higher than the total number of items,
+ the new item is appended to the list of existing items.
+ If the index is zero or negative, the new item is prepended to the list of existing items.
+ */
+void HbComboBox::insertItem( int index, const QString &text, const QVariant &userData )
+{
+ Q_D( HbComboBox );
+ if( text.isNull( ) ){
+ return;
+ }
+ if( !d->mModel ) {
+ QStandardItemModel* model = new QStandardItemModel(this );
+ setModel( model );
+ }
+ if ( !d->mModel->rowCount( ) ) {
+ d->mModel->insertRow( 0 );
+ d->mModel->insertColumn( 0 );
+ if( d->mModel->index( 0, 0 ).isValid( ) ) {
+ d->mModel->setData( d->mModel->index( 0, 0 ), text, Qt::DisplayRole );
+ if( userData.isValid( ) ) {
+ d->mModel->setData( d->mModel->index( 0, 0 ), userData, Qt::UserRole );
+ }
+ setCurrentIndex( 0 );
+ }
+ } else {
+ int rowCount = d->mModel->rowCount( );
+ if( index >= rowCount ) {
+ d->mModel->insertRow( rowCount );
+ d->mModel->setData( d->mModel->index( rowCount, 0 ), text, Qt::DisplayRole );
+ if( userData.isValid( ) ) {
+ d->mModel->setData( d->mModel->index( rowCount, 0 ), userData, Qt::UserRole );
+ }
+ } else if(index <= 0) {
+ d->mModel->insertRow( 0 );
+ d->mModel->setData( d->mModel->index(0,0), text, Qt::DisplayRole );
+ if( userData.isValid( ) ) {
+ d->mModel->setData( d->mModel->index( 0, 0 ), userData, Qt::UserRole );
+ }
+ if( d->mCurrentIndex.row() >= 0 ) {
+ d->mCurrentIndex = d->mModel->index(d->mCurrentIndex.row()+1, 0);
+ d->currentIndexChanged(d->mCurrentIndex);
+ }
+ } else {
+ d->mModel->insertRow( index );
+ d->mModel->setData( d->mModel->index( index, 0 ), text, Qt::DisplayRole );
+ if( userData.isValid( ) ) {
+ d->mModel->setData( d->mModel->index( index, 0 ), userData, Qt::UserRole );
+ }
+ if( d->mCurrentIndex.row() <= index ) {
+ d->mCurrentIndex = d->mModel->index(d->mCurrentIndex.row()+1, 0);
+ d->currentIndexChanged(d->mCurrentIndex);
+ }
+ }
+ }
+}
+
+/*!
+ @beta
+ Inserts the text and icon into the combobox at the given index.
+ If the index is equal to or higher than the total number of items,
+ the new item is appended to the list of existing items.
+ If the index is zero or negative, the new item is prepended to the list of existing items.
+ */
+void HbComboBox::insertItem( int index, const HbIcon &icon, const QString &text, const QVariant &userData)
+{
+ Q_D( HbComboBox );
+ if( text.isEmpty( ) ){
+ return;
+ }
+
+ if( !d->mModel ) {
+ QStandardItemModel* model = new QStandardItemModel( this );
+ setModel( model );
+ }
+ if ( !d->mModel->rowCount( ) ) {
+ d->mModel->insertRow( 0 );
+ d->mModel->insertColumn( 0 );
+ if( d->mModel->index( 0, 0 ).isValid( ) ) {
+ d->mModel->setData( d->mModel->index(0,0), text, Qt::DisplayRole );
+ setCurrentIndex( 0 );
+ }
+ if(!icon.isNull() && d->mModel->index( 0, 0 ).isValid( ) ) {
+ d->mModel->setData(d->mModel->index( 0, 0 ), icon.qicon( ), Qt::DecorationRole);
+ }
+ if( userData.isValid( ) && d->mModel->index( 0, 0 ).isValid( ) ) {
+ d->mModel->setData( d->mModel->index( 0, 0 ), userData, Qt::UserRole );
+ }
+ } else {
+ int rowCount = d->mModel->rowCount( );
+ if( index >= rowCount ) {
+ d->mModel->insertRow( rowCount );
+ d->mModel->setData( d->mModel->index( rowCount, 0 ), text, Qt::DisplayRole );
+ if(!icon.isNull()) {
+ d->mModel->setData( d->mModel->index( rowCount, 0 ), icon, Qt::DecorationRole );
+ }
+ if( userData.isValid( ) ) {
+ d->mModel->setData( d->mModel->index( rowCount, 0 ), userData, Qt::UserRole );
+ }
+ if( d->mCurrentIndex.row() == index ) {
+ d->mCurrentIndex = d->mModel->index( d->mCurrentIndex.row( ) + 1, 0 );
+ d->currentIndexChanged( d->mCurrentIndex );
+ }
+ } else if(index <= 0) {
+ d->mModel->insertRow( 0 );
+ d->mModel->setData( d->mModel->index( 0, 0 ), text, Qt::DisplayRole );
+ if(!icon.isNull()) {
+ d->mModel->setData(d->mModel->index( 0, 0 ), icon, Qt::DecorationRole);
+ }
+ if( userData.isValid( ) ) {
+ d->mModel->setData( d->mModel->index( 0, 0 ), userData, Qt::UserRole );
+ }
+ if( d->mCurrentIndex.row() >= 0 ) {
+ d->mCurrentIndex = d->mModel->index( d->mCurrentIndex.row( ) + 1, 0);
+ d->currentIndexChanged( d->mCurrentIndex );
+ }
+ } else {
+ d->mModel->insertRow( index );
+ d->mModel->setData( d->mModel->index( index, 0 ), text, Qt::DisplayRole );
+ if(!icon.isNull( ) ) {
+ d->mModel->setData( d->mModel->index( index, 0 ), icon, Qt::DecorationRole );
+ }
+ if( userData.isValid( ) ) {
+ d->mModel->setData( d->mModel->index( index, 0 ), userData, Qt::UserRole );
+ }
+ if( d->mCurrentIndex.row() <= index ) {
+ d->mCurrentIndex = d->mModel->index( d->mCurrentIndex.row( ) + 1, 0);
+ d->currentIndexChanged( d->mCurrentIndex );
+ }
+ }
+ }
+}
+
+/*!
+ @beta
+ Inserts the strings from the list into the combobox as separate items, starting at the index.
+ If the index is equal to or higher than the total number of items,
+ the new item is appended to the list of existing items.
+ If the index is zero or negative, the new item is prepended to the list of existing items.
+ */
+void HbComboBox::insertItems( int index, const QStringList &texts )
+{
+ Q_D( HbComboBox );
+ if( !d->mModel ) {
+ QStandardItemModel* model = new QStandardItemModel( this );
+ setModel( model );
+ }
+ if ( !d->mModel->rowCount( ) ) {
+ int textCount = texts.count( );
+ for( int i = 0; i < textCount; i++)
+ {
+ d->mModel->insertRow( i );
+ if( i == 0)
+ d->mModel->insertColumn( 0 );
+ if( d->mModel->index( i, 0 ).isValid( ) ) {
+ d->mModel->setData( d->mModel->index( i, 0 ), texts.at( i ), Qt::DisplayRole );
+ if( i == 0) {
+ setCurrentIndex( 0 );
+ }
+ }
+ }
+ } else {
+ int rowCount = -1;
+ rowCount = d->mModel->rowCount( );
+ int textCount = texts.count( );
+ if ( index >= rowCount ) {
+ d->mModel->insertRows( rowCount, textCount );
+ int temp = 0;
+ for ( int i = rowCount; i < ( rowCount + textCount ); i++ ) {
+ d->mModel->setData ( d->mModel->index( i, 0 ), texts.at( temp++ ) );
+ }
+ if( d->mCurrentIndex.row() == index ) {
+ d->mCurrentIndex = d->mModel->index( d->mCurrentIndex.row( ) + textCount, 0);
+ d->currentIndexChanged( d->mCurrentIndex );
+ }
+ } else if( index <= 0 ) {
+ d->mModel->insertRows( 0, textCount );
+ for ( int i = 0; i < textCount; i++ ) {
+ d->mModel->setData( d->mModel->index( i, 0 ), texts.at( i ) );
+ }
+ if( d->mCurrentIndex.row() >= 0 ) {
+ d->mCurrentIndex = d->mModel->index(d->mCurrentIndex.row() + textCount, 0);
+ d->currentIndexChanged( d->mCurrentIndex );
+ }
+ } else {
+ d->mModel->insertRows( index, texts.count( ) );
+ int temp = 0;
+ for ( int i = index; i < ( textCount + index ); i++ ) {
+ d->mModel->setData( d->mModel->index( i, 0 ), texts.at( temp++ ) );
+ }
+ if( d->mCurrentIndex.row() <= index ) {
+ d->mCurrentIndex = d->mModel->index(d->mCurrentIndex.row() + textCount, 0);
+ d->currentIndexChanged( d->mCurrentIndex );
+ }
+ }
+ }
+}
+
+/*!
+ @beta
+ Returns the text for the given index in the combobox.
+ */
+QString HbComboBox::itemText( int index ) const
+{
+ Q_D( const HbComboBox );
+ if(d->mModel) {
+ QModelIndex mi = d->mModel->index( index, 0 );
+ if( mi.isValid() ) {
+ return d->itemText( mi );
+ }
+ }
+ return QString( );
+}
+
+/*!
+ @beta
+ Sets the text for the item on the given index in the combobox.
+ */
+void HbComboBox::setItemText( int index, const QString &text )
+{
+ Q_D( HbComboBox );
+ if (d->mModel) {
+ QModelIndex item = d->mModel->index( index, 0 );
+ if ( item.isValid( ) ) {
+ if(d->mModel->setData( item, text, Qt::EditRole )) {
+ if(d->mCurrentIndex.row() == index) {
+ if( d->mLineEdit ) {
+ d->mLineEdit->setText( text );
+ } else {
+ d->mText = text ;
+ HbStyleOptionComboBox comboBoxOption;
+ initStyleOption(&comboBoxOption);
+ style()->updatePrimitive( d->mTextItem, HbStyle::P_ComboBox_text, &comboBoxOption);
+ }
+ }
+ }
+
+ }
+ }
+}
+
+/*!
+ reimplementation.
+*/
+bool HbComboBox::eventFilter( QObject *obj, QEvent *event )
+{
+ Q_D( HbComboBox );
+ bool accepted = false;
+ if(obj == static_cast<HbTouchArea*>(d->mButtonTouchAreaItem)) {
+ if( (event->type() == QEvent::GraphicsSceneMousePress ) ||
+ (event->type() == QEvent::GraphicsSceneMouseDoubleClick ) ) {
+ if( static_cast<HbTouchArea*>(d->mButtonTouchAreaItem)->rect( ).contains(
+ static_cast<QGraphicsSceneMouseEvent *>( event )->pos( ) ) ){
+ d->touchAreaPressEvent( );
+ accepted = true;
+ }
+ }else if( event->type() == QEvent::GraphicsSceneMouseRelease ) {
+ if( static_cast<HbTouchArea*>(d->mButtonTouchAreaItem)->rect( ).contains(
+ static_cast<QGraphicsSceneMouseEvent *>( event )->pos( ) ) ){
+ d->touchAreaReleaseEvent( );
+ accepted = true;
+ } else if (d->mIsDown) {
+ d->mIsDown = false;
+ updatePrimitives( );
+ }
+ }
+ }
+ return accepted;
+}
+
+/*!
+ \reimp
+ */
+void HbComboBox::changeEvent( QEvent *event )
+{
+ switch ( event->type( ) ){
+ case QEvent::EnabledChange:
+ updatePrimitives( );
+ break;
+ default:
+ break;
+ }
+ HbWidget::changeEvent( event );
+}
+
+// End of file
+
+