Made UnifiedResourcesProvider actually pull ResourceItem's from its

merged databases into its own database (and also keep them up to date).

Furthermore added code to properly destroy merged databases and their
providers in desctrutor.
This commit is contained in:
Tobias Doerffel
2009-02-28 17:08:33 +01:00
parent e69709ae83
commit 18282e0de3
3 changed files with 82 additions and 11 deletions

View File

@@ -23,8 +23,6 @@
*/
#include <QtCore/QDir>
#include "unified_resources_provider.h"
#include "resources_db.h"
@@ -38,6 +36,19 @@ UnifiedResourcesProvider::UnifiedResourcesProvider() :
UnifiedResourcesProvider::~UnifiedResourcesProvider()
{
database()->items().clear();
foreach( ResourcesDB * db, m_mergedDatabases )
{
delete db->provider();
}
}
void UnifiedResourcesProvider::addDatabase( ResourcesDB * _db )
{
ResourcesTreeItem * childRoot = _db->topLevelNode()->getChild( 0 );
@@ -45,7 +56,9 @@ void UnifiedResourcesProvider::addDatabase( ResourcesDB * _db )
{
m_mergedDatabases << _db;
connect( _db, SIGNAL( itemsChanged() ),
this, SIGNAL( itemsChanged() ) );
database(), SIGNAL( itemsChanged() ) );
connect( _db, SIGNAL( itemsChanged() ),
this, SLOT( remergeItems() ) );
childRoot->setParent( database()->topLevelNode() );
database()->topLevelNode()->addChild( childRoot );
@@ -66,6 +79,54 @@ void UnifiedResourcesProvider::updateDatabase( void )
void UnifiedResourcesProvider::remergeItems( void )
{
typedef QHash<const ResourcesItem *,
const ResourcesItem *> PointerHashMap;
PointerHashMap itemsSeen;
ResourcesDB::ItemList & items = database()->items();
for( ResourcesDB::ItemList::Iterator it = items.begin();
it != items.end(); ++it )
{
itemsSeen[*it] = *it;
}
foreach( ResourcesDB * db, m_mergedDatabases )
{
for( ResourcesDB::ItemList::ConstIterator it =
db->items().begin();
it != db->items().end(); ++it )
{
const QString & h = (*it)->hash();
if( !items.contains( h ) )
{
items[(*it)->hash()] = *it;
}
else
{
itemsSeen[*it] = NULL;
}
}
}
for( ResourcesDB::ItemList::Iterator it = items.begin();
it != items.end(); )
{
if( itemsSeen[*it] == *it )
{
it = items.erase( it );
}
else
{
++it;
}
}
}
#include "moc_unified_resources_provider.cxx"