added ResourcesTreeModel, a QAbstractModelItem implementation for ResourcesDB
git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms@1858 0778d3d1-df1d-0410-868b-ea421aaaa00d
This commit is contained in:
83
include/resources_tree_model.h
Normal file
83
include/resources_tree_model.h
Normal file
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
* resources_tree_model.h - tree-model for ResourcesDB
|
||||
*
|
||||
* Copyright (c) 2008 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _RESOURCES_TREE_MODEL_H
|
||||
#define _RESOURCES_TREE_MODEL_H
|
||||
|
||||
#include <QtCore/QAbstractItemModel>
|
||||
|
||||
#include "resources_db.h"
|
||||
|
||||
|
||||
class ResourcesTreeModel : public QAbstractItemModel
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
ResourcesTreeModel( ResourcesDB * _db, QObject * _parent = NULL );
|
||||
virtual ~ResourcesTreeModel()
|
||||
{
|
||||
}
|
||||
|
||||
virtual QVariant data( const QModelIndex & _idx,
|
||||
int _role = Qt::DisplayRole ) const;
|
||||
|
||||
virtual Qt::ItemFlags flags( const QModelIndex & _index ) const
|
||||
{
|
||||
return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
|
||||
}
|
||||
|
||||
int rowCount( const QModelIndex & _parent = QModelIndex() ) const;
|
||||
|
||||
virtual int columnCount( const QModelIndex & _parent =
|
||||
QModelIndex() ) const
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
virtual QModelIndex index( int _row, int _col,
|
||||
const QModelIndex & _parent = QModelIndex() ) const;
|
||||
|
||||
virtual QModelIndex parent ( const QModelIndex & index ) const;
|
||||
|
||||
void setFilter( const QString & _s );
|
||||
|
||||
|
||||
private:
|
||||
bool filterItems( ResourcesDB::TreeItem * _item,
|
||||
const QModelIndex & _parent,
|
||||
const QStringList & _keywords );
|
||||
void setHidden( ResourcesDB::TreeItem * _item,
|
||||
const QModelIndex & _parent,
|
||||
bool _hidden,
|
||||
bool _recursive = true );
|
||||
|
||||
ResourcesDB * m_db;
|
||||
|
||||
|
||||
signals:
|
||||
void itemsChanged( void );
|
||||
|
||||
} ;
|
||||
|
||||
#endif
|
||||
240
src/core/resources_tree_model.cpp
Normal file
240
src/core/resources_tree_model.cpp
Normal file
@@ -0,0 +1,240 @@
|
||||
/*
|
||||
* resources_tree_model.cpp - implementation of ResourcesTreeModel
|
||||
*
|
||||
* Copyright (c) 2008 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 "resources_tree_model.h"
|
||||
|
||||
|
||||
ResourcesTreeModel::ResourcesTreeModel( ResourcesDB * _db, QObject * _parent ) :
|
||||
QAbstractItemModel( _parent ),
|
||||
m_db( _db )
|
||||
{
|
||||
connect( m_db, SIGNAL( itemsChanged() ),
|
||||
this, SIGNAL( itemsChanged() ) );
|
||||
/* connect( m_db, SIGNAL( itemsChanged() ),
|
||||
this, SIGNAL( layoutChanged() ) );*/
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
QVariant ResourcesTreeModel::data( const QModelIndex & _idx, int _role ) const
|
||||
{
|
||||
if( _idx.isValid() && _role == Qt::DisplayRole )
|
||||
{
|
||||
ResourcesDB::TreeItem * item =
|
||||
static_cast<ResourcesDB::TreeItem *>(
|
||||
_idx.internalPointer() );
|
||||
return item->item()->name();
|
||||
}
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
int ResourcesTreeModel::rowCount( const QModelIndex & _parent ) const
|
||||
{
|
||||
ResourcesDB::TreeItem * parentItem;
|
||||
|
||||
if( _parent.column() > 0 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if( !_parent.isValid() )
|
||||
{
|
||||
parentItem = m_db->topLevelNode();
|
||||
}
|
||||
else
|
||||
{
|
||||
parentItem = static_cast<ResourcesDB::TreeItem *>(
|
||||
_parent.internalPointer() );
|
||||
}
|
||||
return parentItem->rowCount();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
QModelIndex ResourcesTreeModel::index( int _row, int _col,
|
||||
const QModelIndex & _parent ) const
|
||||
{
|
||||
if( !hasIndex( _row, _col, _parent ) )
|
||||
{
|
||||
return QModelIndex();
|
||||
}
|
||||
|
||||
ResourcesDB::TreeItem * parentItem;
|
||||
|
||||
if( !_parent.isValid() )
|
||||
{
|
||||
parentItem = m_db->topLevelNode();
|
||||
}
|
||||
else
|
||||
{
|
||||
parentItem = static_cast<ResourcesDB::TreeItem *>(
|
||||
_parent.internalPointer() );
|
||||
}
|
||||
|
||||
if( _row < parentItem->rowCount() )
|
||||
{
|
||||
return createIndex( _row, _col, parentItem->getChild( _row ) );
|
||||
}
|
||||
return QModelIndex();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
QModelIndex ResourcesTreeModel::parent( const QModelIndex & _idx ) const
|
||||
{
|
||||
if( !_idx.isValid() )
|
||||
{
|
||||
return QModelIndex();
|
||||
}
|
||||
|
||||
ResourcesDB::TreeItem * childItem =
|
||||
static_cast<ResourcesDB::TreeItem *>(
|
||||
_idx.internalPointer() );
|
||||
ResourcesDB::TreeItem * parentItem = childItem->parent();
|
||||
if( parentItem == m_db->topLevelNode() )
|
||||
{
|
||||
return QModelIndex();
|
||||
}
|
||||
|
||||
int row = 0;
|
||||
if( parentItem )
|
||||
{
|
||||
row = parentItem->row();
|
||||
}
|
||||
return createIndex( row, 0, parentItem );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void ResourcesTreeModel::setFilter( const QString & _s )
|
||||
{
|
||||
filterItems( m_db->topLevelNode(),
|
||||
createIndex( 0, 0, m_db->topLevelNode() ),
|
||||
_s.toLower().split( " " ) );
|
||||
if( _s.isEmpty() )
|
||||
{
|
||||
emit layoutChanged();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
bool ResourcesTreeModel::filterItems( ResourcesDB::TreeItem * _item,
|
||||
const QModelIndex & _parent,
|
||||
const QStringList & _keywords )
|
||||
{
|
||||
if( _item->item() )
|
||||
{
|
||||
ResourcesDB::Item * i = _item->item();
|
||||
bool accept = true;
|
||||
for( QStringList::ConstIterator it = _keywords.begin();
|
||||
it != _keywords.end(); ++it )
|
||||
{
|
||||
if( !( i->name().toLower().contains( *it ) ||
|
||||
i->path().toLower().contains( *it ) ||
|
||||
i->tags().toLower().contains( *it ) ) )
|
||||
{
|
||||
accept = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if( accept )
|
||||
{
|
||||
setHidden( _item, _parent, false );
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
int row = 0;
|
||||
bool hide = true;
|
||||
for( QList<ResourcesDB::TreeItem>::Iterator it =
|
||||
_item->children().begin();
|
||||
it != _item->children().end(); ++it )
|
||||
{
|
||||
QModelIndex idx = createIndex( row, 0, &( *it ) );
|
||||
if( filterItems( &( *it ), idx , _keywords ) )
|
||||
{
|
||||
hide = false;
|
||||
}
|
||||
++row;
|
||||
}
|
||||
|
||||
setHidden( _item, _parent, hide, false );
|
||||
return !hide;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void ResourcesTreeModel::setHidden( ResourcesDB::TreeItem * _item,
|
||||
const QModelIndex & _parent,
|
||||
bool _hide, bool _recursive )
|
||||
{
|
||||
if( _recursive )
|
||||
{
|
||||
int row = 0;
|
||||
for( QList<ResourcesDB::TreeItem>::Iterator it =
|
||||
_item->children().begin();
|
||||
it != _item->children().end(); ++it )
|
||||
{
|
||||
setHidden( &( *it ), createIndex( row, 0, &( *it ) ),
|
||||
_hide );
|
||||
++row;
|
||||
}
|
||||
}
|
||||
if( _item->isHidden() != _hide )
|
||||
{
|
||||
_item->setHidden( _hide );
|
||||
|
||||
/* if( _hide )
|
||||
{
|
||||
int row = _item->row();
|
||||
beginRemoveRows( _parent, row, row );
|
||||
_item->setHidden( true );
|
||||
endRemoveRows();
|
||||
}
|
||||
else
|
||||
{
|
||||
_item->setHidden( false );
|
||||
int row = _item->row();
|
||||
beginInsertRows( _parent, row, row );
|
||||
endInsertRows();
|
||||
}*/
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#include "moc_resources_tree_model.cxx"
|
||||
|
||||
Reference in New Issue
Block a user