From 78c0e926671401ff4edaa75e7636eabacc8bd8b0 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sat, 29 Nov 2008 22:32:18 +0000 Subject: [PATCH] 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 --- include/resources_tree_model.h | 83 +++++++++++ src/core/resources_tree_model.cpp | 240 ++++++++++++++++++++++++++++++ 2 files changed, 323 insertions(+) create mode 100644 include/resources_tree_model.h create mode 100644 src/core/resources_tree_model.cpp diff --git a/include/resources_tree_model.h b/include/resources_tree_model.h new file mode 100644 index 000000000..e617a438e --- /dev/null +++ b/include/resources_tree_model.h @@ -0,0 +1,83 @@ +/* + * resources_tree_model.h - tree-model for ResourcesDB + * + * Copyright (c) 2008 Tobias Doerffel + * + * 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 + +#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 diff --git a/src/core/resources_tree_model.cpp b/src/core/resources_tree_model.cpp new file mode 100644 index 000000000..e4a04201d --- /dev/null +++ b/src/core/resources_tree_model.cpp @@ -0,0 +1,240 @@ +/* + * resources_tree_model.cpp - implementation of ResourcesTreeModel + * + * Copyright (c) 2008 Tobias Doerffel + * + * 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( + _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( + _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( + _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( + _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::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::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" +