#include "ct_tools/itemdrawable/ct_itemdrawablecollectionbuildert.h" template CT_ItemDrawableCollectionBuilderT::CT_ItemDrawableCollectionBuilderT(bool mutuallyExclusive, bool excludeColorsOfDocument, bool excludeNormalsOfDocument) : SuperClass(mutuallyExclusive, excludeColorsOfDocument, excludeNormalsOfDocument) { } template bool CT_ItemDrawableCollectionBuilderT::buildFrom(const CT_VirtualAbstractStep *step, bool forceSearchModels) { m_collection.clear(); m_onlyFindModels = forceSearchModels; if(step == nullptr) return false; recursiveBuildFromStep(step, forceSearchModels); return true; } template const QList& CT_ItemDrawableCollectionBuilderT::collection() const { return m_collection; } template CT_AbstractItemDrawableCollectionBuilder* CT_ItemDrawableCollectionBuilderT::copy() const { return new CT_ItemDrawableCollectionBuilderT(*this); } template void CT_ItemDrawableCollectionBuilderT::recursiveBuildFromStep(const CT_VirtualAbstractStep *step, bool findOnlyModels) { CT_ItemDrawableCollectionHierarchyStep hi; hi.step = (CT_VirtualAbstractStep*)step; if(findOnlyModels) { const QList results = step->getOutResultModels(); for(CT_OutAbstractResultModel* r : results) { CT_ItemDrawableCollectionHierarchyResult hir; hir.modelResult = r; recursiveBuildFromModels(QList() << r, hir, findOnlyModels); if(!hir.modelsCollection.isEmpty()) hi.results.append(hir); } } else { const QList results = step->getOutResultList(); for(CT_ResultGroup* result : results) { CT_ItemDrawableCollectionHierarchyResult hir; hir.result = result; recursiveBuildFromModels(QList() << static_cast(hir.result->model()->rootModel()), hir, findOnlyModels); if(!hir.collection.isEmpty()) hi.results.append(hir); } } if(!hi.results.empty()) m_collection.append(hi); const QList steps = step->getStepChildList(); for(CT_VirtualAbstractStep* child : steps) recursiveBuildFromStep(child, findOnlyModels); } template void CT_ItemDrawableCollectionBuilderT::recursiveBuildFromModels(QList models, CT_ItemDrawableCollectionHierarchyResult &hir, bool findOnlyModels) { for(CT_OutAbstractModel* model : models) { if((model->result() != nullptr) || findOnlyModels) { CT_AbstractItemDrawable* item = nullptr; CT_OutAbstractSingularItemModel* itemModel = dynamic_cast(model); CT_OutAbstractGroupModel* grModel = dynamic_cast(model); if(itemModel != nullptr) item = itemModel->itemDrawable(); else if(grModel != nullptr) item = grModel->group(); if(canBeDynamicCastTo(item)) { if(grModel != nullptr) { if(findOnlyModels) { hir.modelsCollection.append(grModel); } else { CT_ResultGroupIterator it((CT_ResultGroup*)model->result(), grModel); while(it.hasNext()) hir.collection.append((CT_AbstractSingularItemDrawable*)it.next()); } } else { if(findOnlyModels) { hir.modelsCollection.append(itemModel); } else { CT_ResultItemIterator it((CT_ResultGroup*)model->result(), itemModel); while(it.hasNext()) hir.collection.append((CT_AbstractSingularItemDrawable*)it.next()); } } } // TODO : if it was an attribute !! recursiveBuildFromModels(model->childrensStaticCast(), hir, findOnlyModels); } } }