ItemRelation: new template for making up relations between ResourceItems

The new generic ItemRelation template class replaces ResourceTreeItem's,
resulting in cleaner and better organized code.

In the future other kind of items can be linked hierarchically using
the ItemRelation template.
This commit is contained in:
Tobias Doerffel
2009-08-17 19:58:06 +02:00
parent 26be3b0e81
commit f873ad2693
16 changed files with 333 additions and 384 deletions

View File

@@ -113,7 +113,7 @@ void LocalResourceProvider::removeDirectory( const QString & _path )
void LocalResourceProvider::reloadDirectory( const QString & _path )
{
ResourceTreeItem * dirTreeItem = NULL;
ResourceItem::Relation * dirRelation = NULL;
QString p = _path;
if( !p.endsWith( QDir::separator() ) )
{
@@ -125,18 +125,18 @@ void LocalResourceProvider::reloadDirectory( const QString & _path )
if( it->type() == ResourceItem::TypeDirectory &&
it->fullName() == p )
{
dirTreeItem = it->treeItem();
dirRelation = it->relation();
}
}
if( dirTreeItem )
if( dirRelation )
{
ResourceItem * dirItem = dirTreeItem->item();
ResourceItem * dirItem = dirRelation->item();
if( dirItem )
{
m_scannedFolders.clear();
readDir( dirItem->fullRelativeName(),
dirTreeItem->parent() );
dirRelation->parent() );
}
}
@@ -147,7 +147,7 @@ void LocalResourceProvider::reloadDirectory( const QString & _path )
void LocalResourceProvider::readDir( const QString & _dir,
ResourceTreeItem * _parent )
ResourceItem::Relation * _parent )
{
#ifdef LMMS_BUILD_LINUX
if( _dir.startsWith( "/dev" ) ||
@@ -162,14 +162,14 @@ void LocalResourceProvider::readDir( const QString & _dir,
m_scannedFolders << d.canonicalPath();
ResourceItem * parentItem;
ResourceTreeItem * curParent = _parent->findChild( d.dirName() +
ResourceItem::Relation * curParent = _parent->findChild( d.dirName() +
QDir::separator(),
m_baseDir );
printf("read dir: %s\n", d.canonicalPath().toUtf8().constData() );
if( curParent )
{
parentItem = curParent->item();
foreachResourceTreeItem( curParent->children() )
foreachResourceItemRelation( curParent->children() )
{
(*it)->setTemporaryMarker( false );
}
@@ -188,7 +188,7 @@ printf("read dir: %s\n", d.canonicalPath().toUtf8().constData() );
parentItem->setLastMod( QFileInfo(
d.canonicalPath() ).lastModified() );
database()->addItem( parentItem );
curParent = new ResourceTreeItem( _parent, parentItem );
curParent = new ResourceItem::Relation( _parent, parentItem );
curParent->setTemporaryMarker( true );
m_watcher.addPath( parentItem->fullName() );
}
@@ -210,7 +210,7 @@ printf("read dir: %s\n", d.canonicalPath().toUtf8().constData() );
{
fname += QDir::separator();
}
ResourceTreeItem * curChild =
ResourceItem::Relation * curChild =
curParent->findChild( fname, m_baseDir );
if( curChild )
{
@@ -252,20 +252,21 @@ printf("read dir: %s\n", d.canonicalPath().toUtf8().constData() );
);
newItem->setLastMod( f.lastModified() );
database()->addItem( newItem );
ResourceTreeItem * rti =
new ResourceTreeItem( curParent,
ResourceItem::Relation * relation =
new ResourceItem::Relation( curParent,
newItem );
rti->setTemporaryMarker( true );
relation->setTemporaryMarker( true );
}
}
}
for( ResourceTreeItemList::Iterator it = curParent->children().begin();
it != curParent->children().end(); )
for( ResourceItem::Relation::List::Iterator it =
curParent->children().begin();
it != curParent->children().end(); )
{
if( (*it)->temporaryMarker() == false )
{
ResourceTreeItem * item = *it;
ResourceItem::Relation * item = *it;
it = curParent->children().erase( it );
database()->recursiveRemoveItems( item );
}

View File

@@ -102,7 +102,7 @@ void ResourceDB::load( const QString & _file )
multimediaProject m( _file );
loadTreeItem( &m_topLevelNode, m.content() );
loadRelation( &m_topLevelNode, m.content() );
}
@@ -114,7 +114,7 @@ void ResourceDB::save( const QString & _file )
if( m_topLevelNode.getChild( 0 ) )
{
saveTreeItem( m_topLevelNode.getChild( 0 ), m, m.content() );
saveRelation( m_topLevelNode.getChild( 0 ), m, m.content() );
}
m.writeFile( _file );
@@ -123,14 +123,14 @@ void ResourceDB::save( const QString & _file )
void ResourceDB::saveTreeItem( const ResourceTreeItem * _i,
QDomDocument & _doc,
QDomElement & _de )
void ResourceDB::saveRelation( const ResourceItem::Relation * _i,
QDomDocument & _doc,
QDomElement & _de )
{
QDomElement e = _i->item() ? _doc.createElement( "item" ) : _de;
foreachConstResourceTreeItem( _i->children() )
foreachConstResourceItemRelation( _i->children() )
{
saveTreeItem( *it, _doc, e );
saveRelation( *it, _doc, e );
}
if( _i->item() )
{
@@ -152,7 +152,7 @@ void ResourceDB::saveTreeItem( const ResourceTreeItem * _i,
void ResourceDB::loadTreeItem( ResourceTreeItem * _i, QDomElement & _de )
void ResourceDB::loadRelation( ResourceItem::Relation * _i, QDomElement & _de )
{
QDomNode node = _de.firstChild();
while( !node.isNull() )
@@ -177,12 +177,13 @@ void ResourceDB::loadTreeItem( ResourceTreeItem * _i, QDomElement & _de )
Qt::ISODate )
);
addItem( item );
ResourceTreeItem * treeItem = new ResourceTreeItem( _i, item );
ResourceItem::Relation * relation =
new ResourceItem::Relation( _i, item );
if( item->type() == ResourceItem::TypeDirectory )
{
emit directoryItemAdded( item->fullName() );
}
loadTreeItem( treeItem, e );
loadRelation( relation, e );
}
}
node = node.nextSibling();
@@ -279,11 +280,11 @@ void ResourceDB::addItem( ResourceItem * newItem )
ResourceItem * oldItem = m_items[hash];
if( oldItem )
{
ResourceTreeItem * oldTreeItem = oldItem->treeItem();
if( oldTreeItem )
ResourceItem::Relation * oldRelation = oldItem->relation();
if( oldRelation )
{
recursiveRemoveItems( oldTreeItem, false );
delete oldTreeItem;
recursiveRemoveItems( oldRelation, false );
delete oldRelation;
}
if( oldItem->type() == ResourceItem::TypeDirectory )
{
@@ -298,8 +299,8 @@ void ResourceDB::addItem( ResourceItem * newItem )
void ResourceDB::recursiveRemoveItems( ResourceTreeItem * parent,
bool removeTopLevelParent )
void ResourceDB::recursiveRemoveItems( ResourceItem::Relation * parent,
bool removeTopLevelParent )
{
if( !parent )
{

View File

@@ -55,7 +55,7 @@ ResourceItem::ResourceItem( ResourceProvider * _provider,
m_size( _size ),
m_lastMod( _last_mod ),
m_tags( _tags ),
m_treeItem( NULL )
m_relation( NULL )
{
init();
}
@@ -76,7 +76,7 @@ ResourceItem::ResourceItem( const ResourceItem & _item ) :
m_size( _item.m_size ),
m_lastMod( _item.m_lastMod ),
m_tags( _item.m_tags ),
m_treeItem( NULL )
m_relation( NULL )
{
init();
}

View File

@@ -36,7 +36,7 @@ ResourceModel::ResourceModel( ResourceDB * _db, QObject * _parent ) :
{
setSupportedDragActions( Qt::CopyAction );
connect( m_db, SIGNAL( itemsChanged() ),
connect( db(), SIGNAL( itemsChanged() ),
this, SIGNAL( itemsChanged() ) );
}
@@ -49,11 +49,11 @@ QVariant ResourceModel::data( const QModelIndex & _idx, int _role ) const
if( _idx.isValid() )
{
ResourceTreeItem * treeItem = this->treeItem( _idx );
ResourceItem * item = treeItem->item();
ResourceItem::Relation * relation = this->relation( _idx );
ResourceItem * item = relation->item();
if( _role == Qt::DisplayRole )
{
if( treeItem->parent() == m_db->topLevelNode() )
if( relation->parent() == db()->topLevelNode() )
{
switch( item->baseDir() )
{
@@ -71,7 +71,7 @@ QVariant ResourceModel::data( const QModelIndex & _idx, int _role ) const
}
else if( _role == Qt::DecorationRole )
{
if( treeItem->parent() == m_db->topLevelNode() )
if( relation->parent() == db()->topLevelNode() )
{
switch( item->baseDir() )
{
@@ -216,7 +216,7 @@ QMimeData * ResourceModel::mimeData( const QModelIndexList & _list ) const
int ResourceModel::totalItems() const
{
const ResourceDB::ItemHashMap & items = m_db->items();
const ResourceDB::ItemHashMap & items = db()->items();
int num = 0;
foreach( const ResourceItem * i, items )
{
@@ -233,7 +233,7 @@ int ResourceModel::totalItems() const
int ResourceModel::shownItems() const
{
const ResourceDB::ItemHashMap & items = m_db->items();
const ResourceDB::ItemHashMap & items = db()->items();
int num = 0;
foreach( const ResourceItem * i, items )
{

View File

@@ -1,156 +0,0 @@
/*
* ResourceTreeItem.cpp - implementation of ResourceTreeItem
*
* 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 <QtCore/QHash>
#include "ResourceTreeItem.h"
ResourceTreeItem::ResourceTreeItem( ResourceTreeItem * _parent,
ResourceItem * _item ) :
m_parent( _parent ),
m_temporaryMarker( false ),
m_item( _item )
{
if( m_parent )
{
m_parent->addChild( this );
}
if( m_item )
{
m_item->setTreeItem( this );
}
}
ResourceTreeItem::~ResourceTreeItem()
{
foreachResourceTreeItem( m_children )
{
delete *it;
}
if( m_item )
{
m_item->setTreeItem( NULL );
}
if( m_parent )
{
m_parent->removeChild( this );
}
}
int ResourceTreeItem::rowCount( const ResourceModel * _model ) const
{
int rc = 0;
foreachConstResourceTreeItem( m_children )
{
if( !(*it)->item()->isHidden( _model ) )
{
++rc;
}
}
return rc;
}
ResourceTreeItem * ResourceTreeItem::getChild( int _row,
const ResourceModel * _model )
{
int rc = 0;
foreachResourceTreeItem( m_children )
{
if( !(*it)->item()->isHidden( _model ) )
{
if( rc == _row )
{
return *it;
}
++rc;
}
}
return NULL;
}
int ResourceTreeItem::row( const ResourceModel * _model ) const
{
if( !m_parent )
{
return 0;
}
int row = 0;
foreachConstResourceTreeItem( m_parent->m_children )
{
if( !(*it)->item()->isHidden( _model ) )
{
if( *it == this )
{
return row;
}
++row;
}
}
return 0;
}
ResourceTreeItem * ResourceTreeItem::findChild(
const QString & _name,
ResourceItem::BaseDirectory _base_dir )
{
if( _name.isNull() || _name.isEmpty() )
{
return NULL;
}
const int hash = qHash( _name );
foreachResourceTreeItem( m_children )
{
ResourceTreeItem * rti = *it;
if( rti->item() &&
rti->item()->nameHash() == hash &&
rti->item()->name() == _name &&
rti->item()->baseDir() == _base_dir )
{
return rti;
}
}
return NULL;
}

View File

@@ -49,7 +49,7 @@ int ResourceTreeModel::rowCount( const QModelIndex & _parent ) const
{
return db()->topLevelNode()->rowCount( this );
}
return treeItem( _parent )->rowCount( this );
return relation( _parent )->rowCount( this );
}
@@ -63,7 +63,7 @@ QModelIndex ResourceTreeModel::index( int _row, int _col,
return QModelIndex();
}
ResourceTreeItem * parentItem;
ResourceItem::Relation * parentItem;
if( !_parent.isValid() )
{
@@ -71,7 +71,7 @@ QModelIndex ResourceTreeModel::index( int _row, int _col,
}
else
{
parentItem = treeItem( _parent );
parentItem = relation( _parent );
}
if( _row < parentItem->rowCount( this ) )
@@ -91,8 +91,8 @@ QModelIndex ResourceTreeModel::parent( const QModelIndex & _idx ) const
return QModelIndex();
}
ResourceTreeItem * childItem = treeItem( _idx );
ResourceTreeItem * parentItem = childItem->parent();
ResourceItem::Relation * childItem = relation( _idx );
ResourceItem::Relation * parentItem = childItem->parent();
if( parentItem == db()->topLevelNode() )
{
return QModelIndex();
@@ -123,7 +123,7 @@ void ResourceTreeModel::setFilter( const QString & _s )
bool ResourceTreeModel::filterItems( ResourceTreeItem * _item,
bool ResourceTreeModel::filterItems( ResourceItem::Relation * _item,
const QModelIndex & _parent,
const QStringList & _keywords )
{
@@ -152,8 +152,7 @@ bool ResourceTreeModel::filterItems( ResourceTreeItem * _item,
int row = 0;
bool hide = true;
for( ResourceTreeItemList::Iterator it = _item->children().begin();
it != _item->children().end(); ++it )
foreachResourceItemRelation( _item->children() )
{
QModelIndex idx = createIndex( row, 0, *it );
if( filterItems( *it, idx , _keywords ) )
@@ -170,16 +169,14 @@ bool ResourceTreeModel::filterItems( ResourceTreeItem * _item,
void ResourceTreeModel::setHidden( ResourceTreeItem * _item,
void ResourceTreeModel::setHidden( ResourceItem::Relation * _item,
const QModelIndex & _parent,
bool _hide, bool _recursive )
{
if( _recursive )
{
int row = 0;
for( ResourceTreeItemList::Iterator it =
_item->children().begin();
it != _item->children().end(); ++it )
foreachResourceItemRelation( _item->children() )
{
setHidden( *it, createIndex( row, 0, *it ), _hide );
++row;

View File

@@ -51,7 +51,7 @@ UnifiedResourceProvider::~UnifiedResourceProvider()
void UnifiedResourceProvider::addDatabase( ResourceDB * _db )
{
ResourceTreeItem * childRoot = _db->topLevelNode()->getChild( 0 );
ResourceItem::Relation * childRoot = _db->topLevelNode()->getChild( 0 );
if( childRoot )
{
m_mergedDatabases << _db;

View File

@@ -93,14 +93,14 @@ void WebResourceProvider::finishDownload( int _id, bool a )
// create a recursive tree from flat items and their path property
ResourceTreeItem * WebResourceProvider::addTreeItem(
ResourceTreeItem * _parent,
ResourceItem::Relation * WebResourceProvider::addRelation(
ResourceItem::Relation * _parent,
ResourceItem * _item )
{
if( _parent == database()->topLevelNode() ||
_item->path().isEmpty() )
{
return new ResourceTreeItem( _parent, _item );
return new ResourceItem::Relation( _parent, _item );
}
const QStringList itemPath = _item->path().split( '/' );
@@ -114,23 +114,22 @@ ResourceTreeItem * WebResourceProvider::addTreeItem(
const int parentPathSize = parentPath.count( '/' );
if( parentPathSize+1 >= itemPath.size() )
{
if( _item->path() == parentPath )
// if( _item->path() == parentPath )
{
return new ResourceTreeItem( _parent, _item );
return new ResourceItem::Relation( _parent, _item );
}
else
/* else
{
// something went wrong
return new ResourceTreeItem( _parent, _item );
}
return new ResourceItem::Relation( _parent, _item );
}*/
}
pathComponent = itemPath[parentPathSize] + "/";
}
ResourceTreeItem * subParent =
_parent->findChild( pathComponent,
ResourceItem::BaseURL );
ResourceItem::Relation * subParent =
_parent->findChild( pathComponent, ResourceItem::BaseURL );
if( subParent == NULL )
{
ResourceItem * dirItem =
@@ -140,16 +139,16 @@ ResourceTreeItem * WebResourceProvider::addTreeItem(
ResourceItem::BaseURL,
parentPath );
database()->addItem( dirItem );
subParent = new ResourceTreeItem( _parent, dirItem );
subParent = new ResourceItem::Relation( _parent, dirItem );
}
return addTreeItem( subParent, _item );
return addRelation( subParent, _item );
}
void WebResourceProvider::importNodeIntoDB( const QDomNode & _n,
ResourceTreeItem * _parent )
ResourceItem::Relation * _parent )
{
QDomNode n = _n;
while( !n.isNull() )
@@ -178,10 +177,10 @@ void WebResourceProvider::importNodeIntoDB( const QDomNode & _n,
n.firstChildElement( "size" ).text().toInt() );
database()->addItem( item );
ResourceTreeItem * treeItem = addTreeItem( _parent, item );
ResourceItem::Relation * relation = addRelation( _parent, item );
if( n.nodeName() != "file" )
{
importNodeIntoDB( n.firstChild(), treeItem );
importNodeIntoDB( n.firstChild(), relation );
}
n = n.nextSibling();
}