Files
lmms/src/core/ResourceListModel.cpp
Tobias Doerffel cc987b2e6a ResourceListModel: new model providing resources in a flat list
The new ResourceListModel implements a ResourceModel to be used with
QListView & friends. It provides all items of the given ResourceDB as
a flat unsorted list. It'll be mainly used for the upcoming
QuickLoadDialog.

ResourceListModel features an internal lookup table, resulting in very
good performance when filtering (even with thousands of items).
2009-08-18 00:15:14 +02:00

138 lines
3.0 KiB
C++

/*
* ResourceListModel.cpp - implementation of ResourceListModel
*
* Copyright (c) 2009 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program (see COPYING); if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA.
*
*/
#include "ResourceListModel.h"
ResourceListModel::ResourceListModel( ResourceDB * _db, QObject * _parent ) :
ResourceModel( _db, _parent ),
m_lookupTable()
{
connect( db(), SIGNAL( itemsChanged() ),
this, SLOT( updateLookupTable() ),
Qt::DirectConnection );
updateLookupTable();
}
int ResourceListModel::rowCount( const QModelIndex & _parent ) const
{
Q_UNUSED(_parent);
// return number of non-hidden items
return m_lookupTable.size();
}
QModelIndex ResourceListModel::index( int _row, int _col,
const QModelIndex & _parent ) const
{
if( _row < m_lookupTable.size() )
{
return createIndex( _row, _col, m_lookupTable[_row]->relation() );
}
return QModelIndex();
}
void ResourceListModel::setFilter( const QString & _s )
{
if( !_s.isEmpty() )
{
m_filterKeywords = _s.toLower().split( " " );
}
else
{
m_filterKeywords.clear();
}
updateLookupTable();
}
// update lookup table so ResourceListModel::index(...) can run with O(1)
void ResourceListModel::updateLookupTable()
{
int items = 0;
if( m_filterKeywords.isEmpty() )
{
// unhide all items if empty filter string given
m_lookupTable.resize( db()->items().size() );
foreach( ResourceItem * item, db()->items() )
{
item->setHidden( false, this );
m_lookupTable[items] = item;
++items;
}
}
else
{
// filter and count number of non-hidden items
foreach( ResourceItem * item, db()->items() )
{
if( item->keywordMatch( m_filterKeywords ) )
{
item->setHidden( false, this );
++items;
}
else
{
item->setHidden( true, this );
}
}
// resize our lookup table accordingly
m_lookupTable.resize( items );
// fill the lookup table
items = 0;
foreach( ResourceItem * item, db()->items() )
{
// insert all items that are not hidden due to filtering
if( !item->isHidden( this ) )
{
m_lookupTable[items] = item;
++items;
}
}
}
// finally notify view about changed data
emit layoutChanged();
}
#include "moc_ResourceListModel.cxx"
/* vim: set tw=0 noexpandtab: */