Files
Casinotest/src/qt/qtquick_controls/cpp/qmllistmodel.cpp
felixrojauro 5a3b2dbce6 Adverts widget v0.2 added:
*Querying webAPI for adverts content;
*Starting browsers new tab with url specified in json file
*Basic QML items and models
*Overview tab layout changes
*Storing images on harddrive (temporary solution)
*Sending queries to webAPI straight from widget (temporary solution)
coming next:
-store whole json file as url/desription need to be stored for further use
-display images of adverts from QImage, not from file stored on harddrive
-hide/show adverts button tweaking
-proper webAPI base class for querying various servers for data (prypto for instance)

*
2015-10-30 01:51:54 +01:00

316 lines
6.7 KiB
C++

#include "qmllistmodel.h"
#include <QDebug>
QmlListModel::QmlListModel( QObject* a_pParent )
: QAbstractListModel( a_pParent )
, m_pPrototype( 0 )
, m_iCurrentElementIndex( -1 )
{
m_aItems = QList<ListItemInterface*>();
}
QmlListModel::QmlListModel( ListItemInterface* a_pPrototype, QObject* a_pParent )
: QAbstractListModel( a_pParent )
, m_pPrototype( a_pPrototype )
, m_iCurrentElementIndex( -1 )
{
m_aItems = QList<ListItemInterface*>();
}
QmlListModel::~QmlListModel()
{
clear();
if ( m_pPrototype )
{
delete m_pPrototype;
m_pPrototype = 0;
}
}
int QmlListModel::rowCount( const QModelIndex& a_rParent ) const
{
Q_UNUSED( a_rParent );
return m_aItems.size();
}
QVariant QmlListModel::data( const QModelIndex& a_rIndex, int a_iRole ) const
{
if ( a_rIndex.row() < 0 )
{
return QVariant();
}
if ( a_rIndex.row() > m_aItems.size() )
{
return QVariant();
}
ListItemInterface* pValidate = m_aItems.at( a_rIndex.row() );
if ( pValidate )
{
return pValidate->GetData( a_iRole );
}
return QVariant();
}
bool QmlListModel::setData( const QModelIndex& a_rIndex, const QVariant& a_rValue, int a_iRole )
{
if ( a_rIndex.isValid() && a_iRole > Qt::UserRole )
{
ListItemInterface* pItem = m_aItems.at( a_rIndex.row() );
if ( pItem )
{
if ( pItem->SetData( a_iRole, a_rValue ) )
{
emit dataChanged( a_rIndex, a_rIndex );
return true;
}
}
}
return false;
}
QHash<int, QByteArray> QmlListModel::roleNames() const //NS
{
if ( m_pPrototype )
{
return m_pPrototype->RoleNames();
}
return ( QHash<int, QByteArray>() );
}
bool QmlListModel::removeRows( int a_iRow, int a_iCount, const QModelIndex& a_rParent ) //NS
{
if ( a_iRow < 0 )
{
return false;
}
if ( a_iCount <= 0 )
{
return false;
}
if ( ( a_iRow + a_iCount ) > m_aItems.size() )
{
return false;
}
beginRemoveRows( a_rParent, a_iRow, a_iRow + a_iCount - 1 );
for ( int i = 0; i < a_iCount; i++ )
{
ListItemInterface* pItem = m_aItems.takeAt( a_iRow );
delete pItem;
pItem = 0;
}
endRemoveRows();
emit signalCountChanged( rowCount() );
return true;
}
void QmlListModel::append( ListItemInterface* a_pItem ) //NS
{
if ( a_pItem != 0 )
{
beginInsertRows( QModelIndex(), rowCount(), rowCount() );
m_aItems.append( a_pItem );
a_pItem->setObjectName( objectName() + "_item_" + QString::number( rowCount() ) );
endInsertRows();
emit signalCountChanged( rowCount() );
}
}
void QmlListModel::insert( int a_iIndex, ListItemInterface* a_pItem ) //NS
{
if ( a_pItem != 0 && a_iIndex >= 0 && a_iIndex <= m_aItems.size() )
{
beginInsertRows( QModelIndex(), a_iIndex, a_iIndex );
m_aItems.insert( a_iIndex, a_pItem );
a_pItem->setObjectName( objectName() + "_item_" + QString::number( a_iIndex ) );
endInsertRows();
emit signalCountChanged( rowCount() );
}
}
QVariant QmlListModel::get( int a_iIndex )
{
if ( a_iIndex < 0 )
{
return QVariant();
}
if ( a_iIndex >= m_aItems.size() )
{
return QVariant();
}
QMap<QString, QVariant> aItemData;
ListItemInterface* pItem = m_aItems.at( a_iIndex );
if ( pItem )
{
QHashIterator<int, QByteArray> aRolesItr( pItem->RoleNames() );
while ( aRolesItr.hasNext() )
{
aRolesItr.next();
aItemData.insert( aRolesItr.value(), QVariant( pItem->GetData( aRolesItr.key() ) ) );
}
return QVariant( aItemData );
}
return QVariant();
}
void QmlListModel::clear()
{
if ( m_aItems.size() > 0 )
{
removeRows( 0, m_aItems.size() );
// signalCountChanged emitted inside removeRows
}
}
void QmlListModel::refresh()
{
if ( m_aItems.size() > 0 )
{
beginResetModel();
endResetModel();
}
}
int QmlListModel::GetItemIndex( int a_iItemRole, QVariant a_variantValue ) const
{
for ( int i = 0; i < m_aItems.size(); i++ )
{
if ( m_aItems[i]->GetData( a_iItemRole ) == a_variantValue )
{
return i;
}
}
return -1;
}
ListItemInterface* QmlListModel::GetCurrentItem() const
{
if ( m_iCurrentElementIndex >= 0 && m_aItems.size() > m_iCurrentElementIndex )
{
return m_aItems[m_iCurrentElementIndex];
}
return 0;
}
void QmlListModel::SetCurrentItemIndex( int a_iIndex )
{
if ( a_iIndex == -1
|| ( a_iIndex >= 0 && a_iIndex < rowCount() )
)
{
if ( m_iCurrentElementIndex != a_iIndex )
{
m_iCurrentElementIndex = a_iIndex;
emit signalCurrentItemIndexChanged();
}
else
{
if ( m_iCurrentElementIndex != -1 )
{
emit signalCurrentItemIndexClicked();
}
}
}
}
int QmlListModel::GetCurrentItemIndex() const
{
return m_iCurrentElementIndex;
}
bool QmlListModel::SetData( int a_iIndex, const QVariant& a_rValue, int a_iRole )
{
QModelIndex modelIndex = createIndex( a_iIndex, 0 );
return setData( modelIndex, a_rValue, a_iRole );
}
QVariant QmlListModel::GetData( int a_iIndex, int a_iRole )
{
QModelIndex modelIndex = createIndex( a_iIndex, 0 );
return data( modelIndex, a_iRole );
}
void QmlListModel::Sort( int a_iRole, Qt::SortOrder a_eOrder )
{
QList<ListItemInterface*> aSortedList;
if ( a_eOrder == Qt::AscendingOrder )
{
foreach ( ListItemInterface* pItem, m_aItems )
{
int iSortedIndex = 0;
const int iSortedListCount = aSortedList.count();
QVariant valueOriginal = pItem->GetData( a_iRole );
bool bIndexFound = false;
for ( iSortedIndex = iSortedListCount - 1 ; iSortedIndex >= 0 ; --iSortedIndex )
{
const ListItemInterface* pSortedItem = aSortedList.at( iSortedIndex );
if ( pSortedItem )
{
QVariant valueSorted = pSortedItem->GetData( a_iRole );
if ( Compare( a_iRole, valueOriginal, valueSorted ) > 0 )
{
aSortedList.insert( iSortedIndex + 1, pItem );
bIndexFound = true;
break;
}
}
}
if ( !bIndexFound )
{
aSortedList.prepend( pItem );
}
}
}
else if ( Qt::DescendingOrder )
{
foreach ( ListItemInterface* pItem, m_aItems )
{
int iSortedIndex = 0;
const int iSortedListCount = aSortedList.count();
QVariant valueOriginal = pItem->GetData( a_iRole );
bool bIndexFound = false;
for ( iSortedIndex = 0 ; iSortedIndex < iSortedListCount ; ++iSortedIndex )
{
const ListItemInterface* pSortedItem = aSortedList.at( iSortedIndex );
if ( pSortedItem )
{
QVariant valueSorted = pSortedItem->GetData( a_iRole );
if ( Compare( a_iRole, valueOriginal, valueSorted ) > 0 )
{
aSortedList.insert( iSortedIndex, pItem );
bIndexFound = true;
break;
}
}
}
if ( !bIndexFound )
{
aSortedList.append( pItem );
}
}
}
m_aItems = aSortedList;
emit dataChanged( createIndex( 0, 0 ), createIndex( rowCount() - 1, 0 ) );
}
int QmlListModel::Compare( int a_iRole, QVariant& a_rValue1, QVariant& a_rValue2 )
{
Q_UNUSED( a_iRole );
int iReturn = 0;
if ( a_rValue1 > a_rValue2 )
{
iReturn = 1;
}
else if ( a_rValue1 < a_rValue2 )
{
iReturn = -1;
}
return iReturn;
}