21 using namespace ROOT::Experimental;
22 namespace REX = ROOT::Experimental;
25 REveDataProxyBuilderBase::Product::Product(std::string iViewType,
const REveViewContext* c) : m_viewType(iViewType), m_viewContext(c), m_elements(0)
27 m_elements =
new REveCompound(
"ProxyProduct",
"",
false);
28 m_elements->IncDenyDestroy();
34 REveDataProxyBuilderBase::REveDataProxyBuilderBase(
const std::string &type):
36 m_collection(nullptr),
42 REveDataProxyBuilderBase::Product::~Product()
45 for (
auto i : m_elements->RefProjecteds())
47 REveElement *projected = i->GetProjectedAsElement();
48 projected->GetMother()->RemoveElement(projected);
55 if (m_elements->HasMother())
57 m_elements->GetMother()->RemoveElement(m_elements);
60 m_elements->Annihilate();
65 void REveDataProxyBuilderBase::SetCollection(REveDataCollection* c)
84 void REveDataProxyBuilderBase::Build()
91 auto itemSize = m_collection->GetNItems();
94 for (
auto &pp: m_products)
97 REveElement* elms = pp->m_elements;
98 auto oldSize = elms->NumChildren();
100 if (HaveSingleProduct())
102 Build(m_collection, elms, pp->m_viewContext);
106 BuildViewType(m_collection, elms, pp->m_viewType, pp->m_viewContext);
112 REveProjectable* pable =
dynamic_cast<REveProjectable*
>(elms);
113 if (pable->HasProjecteds())
116 for (
auto &prj: pable->RefProjecteds())
118 REveProjectionManager *pmgr = prj->GetManager();
119 Float_t oldDepth = pmgr->GetCurrentDepth();
120 pmgr->SetCurrentDepth(m_layer);
123 REveElement *projectedAsElement = prj->GetProjectedAsElement();
124 auto parentIt = projectedAsElement->RefChildren().begin();
125 for (
auto &prod: elms->RefChildren())
139 pmgr->SubImportChildren(prod, *parentIt);
143 else if (cnt < itemSize)
146 pmgr->SubImportElements(prod, projectedAsElement);
154 pmgr->SetCurrentDepth(oldDepth);
171 catch (
const std::runtime_error& iException)
173 std::cout <<
"Caught exception in build function for item " << m_collection->GetCName() <<
":\n"
174 << iException.what() << std::endl;
183 REveDataProxyBuilderBase::Build(
const REveDataCollection*, REveElement*,
const REveViewContext*)
185 assert(
"virtual Build(const REveEventItem*, REveElement*, const REveViewContext*) not implemented by inherited class");
190 REveDataProxyBuilderBase::BuildViewType(
const REveDataCollection*, REveElement*, std::string,
const REveViewContext*)
192 assert(
"virtual BuildViewType(const FWEventItem*, TEveElementList*, FWViewType::EType, const FWViewContext*) not implemented by inherited class");
198 REveDataProxyBuilderBase::CreateProduct( std::string viewType,
const REveViewContext* viewContext)
200 if ( m_products.empty() ==
false)
202 if (HaveSingleProduct()) {
203 return m_products.back()->m_elements;
207 for (
auto &prod: m_products)
209 if (viewType == prod->m_viewType)
210 return prod->m_elements;
215 auto product =
new Product(viewType, viewContext);
216 m_products.push_back(product);
221 product->m_elements->SetName(Form(
"product %s", m_collection->GetCName()));
223 return product->m_elements;
230 void applyColorAttrToChildren(REveElement* p) {
231 for (
auto &it: p->RefChildren())
234 if (c->GetMainColor() != p->GetMainColor())
236 c->SetMainColor(p->GetMainColor());
239 applyColorAttrToChildren(c);
245 REveDataProxyBuilderBase::ModelChanges(
const REveDataCollection::Ids_t& iIds, Product* p)
247 printf(
"REveDataProxyBuilderBase::ModelChanges %s \n", m_collection->GetCName());
248 REveElement* elms = p->m_elements;
249 assert(m_collection && static_cast<int>(m_collection->GetNItems()) <= elms->NumChildren() &&
"can not use default modelChanges implementation");
251 for (
auto itemIdx: iIds)
253 REveDataItem *item = m_collection->GetDataItem(itemIdx);
257 auto itElement = elms->RefChildren().begin();
258 std::advance(itElement, itemIdx);
259 REveElement* comp = *itElement;
260 bool visible = (!item->GetFiltered()) && item->GetRnrSelf();
261 comp->SetRnrSelf(visible);
262 comp->SetRnrChildren(visible);
264 if (item->GetMainColor() != comp->GetMainColor()) comp->SetMainColor(item->GetMainColor());
265 applyColorAttrToChildren(comp);
267 if (VisibilityModelChanges(itemIdx, comp, p->m_viewContext))
269 elms->ProjectChild(comp);
270 printf(
"---REveDataProxyBuilderBase project child\n");
274 LocalModelChanges(itemIdx, comp, p->m_viewContext);
280 REveDataProxyBuilderBase::LocalModelChanges(
int, REveElement*,
const REveViewContext*)
289 REveDataProxyBuilderBase::ModelChanges(
const REveDataCollection::Ids_t& iIds)
292 for (
auto &prod: m_products)
294 ModelChanges(iIds, prod);
296 m_modelsChanged =
false;
298 m_modelsChanged =
true;
304 REveDataProxyBuilderBase::CollectionChanged(
const REveDataCollection* )
314 REveDataProxyBuilderBase::SetupAddElement(REveElement* el, REveElement* parent,
bool color)
const
316 SetupElement(el, color);
318 el->SetName(parent->GetName());
319 parent->AddElement(el);
326 REveDataProxyBuilderBase::SetupElement(REveElement* el,
bool color)
const
328 el->CSCTakeMotherAsMaster();
329 el->SetPickable(
true);
333 el->CSCApplyMainColorToMatchingChildren();
334 el->CSCApplyMainTransparencyToMatchingChildren();
335 el->SetMainColor(m_collection->GetMainColor());
336 el->SetMainTransparency(m_collection->GetMainTransparency());
343 REveDataProxyBuilderBase::CreateCompound(
bool set_color,
bool propagate_color_to_all_children)
const
345 REveCompound *c =
new REveCompound();
346 c->CSCImplySelectAllChildren();
347 c->SetPickable(
true);
350 c->SetMainColor(m_collection->GetMainColor());
351 c->SetMainTransparency(m_collection->GetMainTransparency());
353 if (propagate_color_to_all_children)
355 c->CSCApplyMainColorToAllChildren();
356 c->CSCApplyMainTransparencyToAllChildren();
360 c->CSCApplyMainColorToMatchingChildren();
361 c->CSCApplyMainTransparencyToMatchingChildren();
368 void REveDataProxyBuilderBase::Clean()
371 for (
auto &prod: m_products)
373 if (prod->m_elements)
374 prod->m_elements->DestroyElements();
380 void REveDataProxyBuilderBase::CleanLocal()
385 void REveDataProxyBuilderBase::CollectionBeingDestroyed(
const REveDataCollection* )
387 m_collection =
nullptr;
391 for (
auto &prod: m_products)
401 bool REveDataProxyBuilderBase::VisibilityModelChanges(
int, REveElement *,
const REveViewContext *)
406 void REveDataProxyBuilderBase::SetHaveAWindow(
bool iHaveAWindow)
408 m_haveWindow = iHaveAWindow;