--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/radioapp/radiouiengine/src/radiostationfiltermodel.cpp Fri Mar 19 09:29:04 2010 +0200
@@ -0,0 +1,179 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include "radiostationfiltermodel.h"
+#include "radiouiengine.h"
+#include "radiostationmodel.h"
+#include "radiologger.h"
+
+#include "radiostation.h" // Remove
+
+/*!
+ *
+ */
+RadioStationFilterModel::RadioStationFilterModel( RadioUiEngine& uiEngine, QObject* parent ) :
+ QSortFilterProxyModel( parent ),
+ mUiEngine( uiEngine ),
+ mIsCyclic( false )
+{
+ setSourceModel( &mUiEngine.model() );
+ setDynamicSortFilter( true );
+}
+
+/*!
+ *
+ */
+RadioStationFilterModel::~RadioStationFilterModel()
+{
+}
+
+/*!
+ * \reimp
+ */
+int RadioStationFilterModel::rowCount( const QModelIndex& parent ) const
+{
+ const int count = QSortFilterProxyModel::rowCount( parent );
+ return mIsCyclic ? count * 2 : count;
+}
+
+/*!
+ * \reimp
+ */
+QModelIndex RadioStationFilterModel::index( int row, int column,
+ const QModelIndex &parent ) const
+{
+ const int count = QSortFilterProxyModel::rowCount();
+ if ( row < count ) {
+ return QSortFilterProxyModel::index( row, column, parent );
+ } else {
+ foreach ( const QModelIndex& shadowIndex, mShadowIndexes.keys() ) {
+ if ( shadowIndex.row() == row ) {
+ return shadowIndex;
+ }
+ }
+
+ return QModelIndex();
+ }
+}
+
+/*!
+ * \reimp
+ */
+QVariant RadioStationFilterModel::data( const QModelIndex& index, int role ) const
+{
+ QModelIndex dataIndex = index;
+ if ( mShadowIndexes.contains( index ) ) {
+ dataIndex = mShadowIndexes.value( index );
+ }
+
+ if ( !index.isValid() || !dataIndex.isValid() ) {
+ return QVariant();
+ }
+
+ return QSortFilterProxyModel::data( dataIndex, role );
+}
+
+/*!
+ *
+ */
+void RadioStationFilterModel::setTypeFilter( RadioStation::Type filter )
+{
+ mFilter = filter;
+ filterChanged();
+}
+
+/*!
+ * Returns the model index corresponding to the given frequency
+ */
+QModelIndex RadioStationFilterModel::modelIndexFromFrequency( uint frequency )
+{
+ QModelIndex index = static_cast<RadioStationModel*>( sourceModel() )->modelIndexFromFrequency( frequency );
+ return mapFromSource( index );
+}
+
+/*!
+ *
+ */
+void RadioStationFilterModel::setCyclic( bool cyclic )
+{
+ mIsCyclic = cyclic;
+ if ( mIsCyclic ) {
+ const int realCount = QSortFilterProxyModel::rowCount();
+ LOG_FORMAT( "Station count: %d", realCount );
+ for ( int i = 0; i < realCount; ++i ) {
+ QModelIndex realIndex = QSortFilterProxyModel::index( i, 0 );
+ QModelIndex shadowIndex = createIndex( i + realCount, 0, realIndex.internalPointer() );
+ const uint freq = realIndex.data( RadioStationModel::RadioStationRole ).value<RadioStation>().frequency();
+ LOG_FORMAT( "Adding shadow index %d for index %d. Freq: %u", shadowIndex.row(), realIndex.row(), freq );
+ mShadowIndexes.insert( shadowIndex, realIndex );
+ }
+ }
+}
+
+/*!
+ *
+ */
+bool RadioStationFilterModel::hasLooped( const QModelIndex& index ) const
+{
+ return mShadowIndexes.contains( index );
+}
+
+/*!
+ *
+ */
+QModelIndex RadioStationFilterModel::realIndex( const QModelIndex& shadowIndex ) const
+{
+ return mShadowIndexes.value( shadowIndex );
+}
+
+/*!
+ *
+ */
+bool RadioStationFilterModel::isEqual( const QModelIndex& first, const QModelIndex& second ) const
+{
+ if ( first == second ) {
+ return true;
+ }
+
+ QModelIndex realFirst = first;
+ if ( mShadowIndexes.contains( first ) ) {
+ realFirst = mShadowIndexes.value( first );
+ }
+
+ QModelIndex realSecond = second;
+ if ( mShadowIndexes.contains( second ) ) {
+ realSecond = mShadowIndexes.value( second );
+ }
+
+ if ( realFirst == realSecond ) {
+ return true;
+ }
+
+ return false;
+}
+
+/*!
+ *
+ */
+bool RadioStationFilterModel::filterAcceptsRow( int sourceRow, const QModelIndex& sourceParent ) const
+{
+ QAbstractItemModel* source = sourceModel();
+ QModelIndex index = source->index( sourceRow, 0, sourceParent );
+ const RadioStation station = source->data( index, RadioStationModel::RadioStationRole ).value<RadioStation>();
+ const bool isType = station.isType( mFilter );
+ return isType;
+}