diff -r 000000000000 -r 16d8024aca5e src/hbwidgets/widgets/hbcombobox.cpp --- /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 +#include +#include +#include +#include + +#include +#include +#include + +/*! + @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(d->mButtonTouchAreaItem)) { + if( (event->type() == QEvent::GraphicsSceneMousePress ) || + (event->type() == QEvent::GraphicsSceneMouseDoubleClick ) ) { + if( static_cast(d->mButtonTouchAreaItem)->rect( ).contains( + static_cast( event )->pos( ) ) ){ + d->touchAreaPressEvent( ); + accepted = true; + } + }else if( event->type() == QEvent::GraphicsSceneMouseRelease ) { + if( static_cast(d->mButtonTouchAreaItem)->rect( ).contains( + static_cast( 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 + +