#ifndef DM_ITEMDRAWABLEBUILDERT_HPP #define DM_ITEMDRAWABLEBUILDERT_HPP #include "dm_itemdrawablebuildert.h" template DM_ItemDrawableBuilderT::DM_ItemDrawableBuilderT() : DM_AbstractItemDrawableBuilder() { m_mutex = new QMutex(QMutex::Recursive); m_nLevel = 1; m_getter = NULL; } template DM_ItemDrawableBuilderT::~DM_ItemDrawableBuilderT() { delete m_mutex; qDeleteAll(m_types.begin(), m_types.end()); } template bool DM_ItemDrawableBuilderT::tryLock() { return m_mutex->tryLock(); } template void DM_ItemDrawableBuilderT::lock() { m_mutex->lock(); } template void DM_ItemDrawableBuilderT::unlock() { m_mutex->unlock(); } template void DM_ItemDrawableBuilderT::setGetter(gMethod getter) { m_getter = getter; } template void DM_ItemDrawableBuilderT::setNLevel(const int &nLevel) { QMutexLocker locker(m_mutex); if(nLevel != m_nLevel) { if(nLevel < m_nLevel) { // remove all types that are after this new level } m_nLevel = nLevel; } } template bool DM_ItemDrawableBuilderT::existType(const T &type) const { QMutexLocker locker(m_mutex); return m_types.contains(type); } template DM_ItemDrawableType DM_ItemDrawableBuilderT::getType(const T &type) const { QMutexLocker locker(m_mutex); return DM_ItemDrawableType(type, m_types.value(type, NULL)); } template void DM_ItemDrawableBuilderT::addItemDrawable(const ItemT &item) { recursiveAddItemDrawable(item, 0); } template void DM_ItemDrawableBuilderT::removeItemDrawable(const ItemT &item) { recursiveRemoveItemDrawable(item, 0); } template void DM_ItemDrawableBuilderT::recursiveAddItemDrawable(const ItemT &item, const int &level) { lock(); T t = getTypeForItemDrawable(item); DM_ItemDrawableTypeBackup *backup = m_types.value(t, NULL); if(backup == NULL) { backup = new DM_ItemDrawableTypeBackup(); m_types.insert(t, backup); } backup->add(item, level); int size = backup->size(); unlock(); /*CT_ChildIterator it(&item); if(((level+1) < m_nLevel) && it.hasNext()) { while(it.hasNext()) recursiveAddItemDrawable(dynamic_cast(it.next()), level+1); }*/ if(size == 1) { emit listChanged(); emit added(); } } template void DM_ItemDrawableBuilderT::recursiveRemoveItemDrawable(const ItemT &item, const int &level) { lock(); T t = getTypeForItemDrawable(item); DM_ItemDrawableTypeBackup *backup = m_types.value(t, NULL); backup->remove(item, level); bool isE = backup->isEmpty(); unlock(); /*CT_ChildIterator it(&item); if(((level+1) < m_nLevel) && it.hasNext()) { while(it.hasNext()) recursiveAddItemDrawable(dynamic_cast(it.next()), level+1); }*/ if(isE) { lock(); delete m_types.take(t); unlock(); emit listChanged(); emit removed(); } } template QList< DM_ItemDrawableType > DM_ItemDrawableBuilderT::types() const { QMutexLocker locker(m_mutex); QList > l; QHashIterator*> it(m_types); while(it.hasNext()) { it.next(); l.append(DM_ItemDrawableType(it.key(), it.value())); } return l; } template bool DM_ItemDrawableBuilderT::isEmpty() const { QMutexLocker locker(m_mutex); return m_types.isEmpty(); } template DM_ItemDrawableType::DM_ItemDrawableType(const Type &type) { m_type = type; m_backup = NULL; } template DM_ItemDrawableType::DM_ItemDrawableType(const Type &type, const DM_ItemDrawableTypeBackup *backup) { m_type = type; m_backup = (DM_ItemDrawableTypeBackup*)backup; } template const Type& DM_ItemDrawableType::type() const { return m_type; } template QList DM_ItemDrawableType::itemDrawableCollection() const { return (m_backup != NULL ? m_backup->m_itemsWithLevel.uniqueKeys() : QList()); } template bool DM_ItemDrawableType::isEmpty() const { return (m_backup != NULL ? m_backup->m_itemsWithLevel.isEmpty() : true); } template void DM_ItemDrawableTypeBackup::add(const ItemTT &item, const int &level) { m_itemsWithLevel.insert((ItemTT*)&item, level); } template void DM_ItemDrawableTypeBackup::remove(const ItemTT &item, const int &level) { m_itemsWithLevel.remove((ItemTT*)&item, level); } template bool DM_ItemDrawableTypeBackup::isEmpty() const { return m_itemsWithLevel.isEmpty(); } template int DM_ItemDrawableTypeBackup::size() const { return m_itemsWithLevel.size(); } #endif // DM_ITEMDRAWABLEBUILDERT_HPP