radioapp/radiouiengine/src/radiostationfiltermodel.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 16 Apr 2010 14:58:55 +0300
changeset 14 63aabac4416d
parent 13 46974bebc798
child 19 afea38384506
permissions -rw-r--r--
Revision: 201011 Kit: 201015

/*
* 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;
}