CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_7/src/Fireworks/Core/src/FWDigitSetProxyBuilder.cc

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 //
00003 // Package:     Core
00004 // Class  :     FWDigitSetProxyBuilder
00005 // 
00006 // Implementation:
00007 //     [Notes on implementation]
00008 //
00009 // Original Author:  Alja Mrak-Tadel
00010 //         Created:  Tue Oct 19 12:00:50 CEST 2010
00011 // $Id: FWDigitSetProxyBuilder.cc,v 1.4 2012/06/18 23:56:21 amraktad Exp $
00012 //
00013 
00014 // system include files
00015 
00016 // user include files
00017 #include "TEveDigitSet.h"
00018 #include "TEveBoxSet.h"
00019 #include "TEveManager.h"
00020 #include "TEveSelection.h"
00021 
00022 #include "Fireworks/Core/interface/FWDigitSetProxyBuilder.h"
00023 #include "Fireworks/Core/interface/FWFromEveSelectorBase.h"
00024 #include "Fireworks/Core/interface/FWDisplayProperties.h"
00025 #include "Fireworks/Core/interface/FWModelId.h"
00026 #include "Fireworks/Core/interface/FWEventItem.h"
00027 
00028 
00029 class FWSecondarySelectableSelector : public FWFromEveSelectorBase
00030 {
00031 public:
00032    FWSecondarySelectableSelector(const TEveSecondarySelectable::SelectionSet_t& s, const FWEventItem* i): m_selected(s), m_item(i) {}
00033    ~FWSecondarySelectableSelector() {}
00034 
00035    virtual void doSelect()
00036    {
00037       syncSelection();
00038    }
00039 
00040    virtual void doUnselect()
00041    { 
00042       syncSelection(); 
00043    }
00044 
00045    const FWEventItem* item() const { return m_item; }
00046 
00047 private:
00048    const TEveSecondarySelectable::SelectionSet_t& m_selected;
00049    const FWEventItem* m_item;
00050 
00051    void syncSelection()
00052    {
00053       size_t size = m_item->size();
00054       for (size_t i = 0; i < size; ++i)
00055       {
00056          FWEventItem::ModelInfo modelInfo = m_item->modelInfo(i);
00057          TEveSecondarySelectable::SelectionSet_ci si = m_selected.find(i);
00058          if ((si != m_selected.end()) != modelInfo.isSelected() )
00059          {
00060             if (si != m_selected.end())
00061                m_item->select(i);
00062             else
00063                m_item->unselect(i);
00064          }
00065       }
00066    }
00067 };
00068 
00069 //==============================================================================
00070 //==============================================================================
00071 //==============================================================================
00072 
00073 FWDigitSetProxyBuilder::FWDigitSetProxyBuilder()
00074 {
00075 }
00076 
00077 FWDigitSetProxyBuilder::~FWDigitSetProxyBuilder()
00078 {
00079 }
00080 
00081 TString FWDigitSetProxyBuilder::getTooltip(TEveDigitSet* set, int idx)
00082 {
00083    TEveElement* el = static_cast<TEveElement*>(set); // tmp-workaround
00084    FWSecondarySelectableSelector* ss = static_cast<FWSecondarySelectableSelector*>(el->GetUserData());
00085    return TString::Format("%d %s %s", idx, ss->item()->name().c_str(), ss->item()->modelInterestingValueAsString(idx).c_str());
00086 }
00087 
00088 TEveBoxSet* FWDigitSetProxyBuilder::addBoxSetToProduct(TEveElementList* product)
00089 {
00090    assert(!product->HasChildren());
00091    
00092    TEveBoxSet* boxSet = new TEveBoxSet();
00093    boxSet->SetTooltipCBFoo(getTooltip);
00094    boxSet->Reset(TEveBoxSet::kBT_FreeBox, true, 256);
00095    FWSecondarySelectableSelector* sel = new FWSecondarySelectableSelector(boxSet->RefSelectedSet(), item());
00096    boxSet->SetUserData(sel);
00097    boxSet->SetPickable(1);
00098    boxSet->SetAlwaysSecSelect(1);
00099 
00100    product->AddElement(boxSet);
00101 
00102    return boxSet;
00103 }
00104 
00105 TEveDigitSet* FWDigitSetProxyBuilder::digitSet(TEveElement* product)
00106 {
00107    assert(product->NumChildren() == 1);
00108    return static_cast<TEveDigitSet*>(*product->BeginChildren());
00109 }
00110 
00111 void FWDigitSetProxyBuilder::addBox(TEveBoxSet* boxSet, const float* pnts, const FWDisplayProperties& dp)
00112 {
00113    boxSet->AddBox(pnts);
00114    boxSet->DigitValue(dp.isVisible());
00115 
00116    if (dp.isVisible()) 
00117       boxSet->DigitColor(dp.color(), dp.transparency());
00118 
00119    if (dp.transparency())
00120       boxSet->SetMainTransparency(dp.transparency());
00121 }
00122 
00123 void FWDigitSetProxyBuilder::modelChanges(const FWModelIds& iIds, Product* product)
00124 {
00125    TEveDigitSet* digits = digitSet(product->m_elements);
00126    if (!digits) return;
00127    
00128    TEveSecondarySelectable::SelectionSet_t& selected = (TEveSecondarySelectable::SelectionSet_t&)(digits->RefSelectedSet());
00129 
00130    for (std::set<FWModelId>::const_iterator it = iIds.begin(); it != iIds.end(); ++it)
00131    {
00132       const FWEventItem::ModelInfo& info = item()->modelInfo(it->index());
00133 
00134       // id display properties
00135       const FWDisplayProperties &p = info.displayProperties();
00136       digits->SetCurrentDigit(it->index());
00137       digits->DigitValue(p.isVisible());
00138       if (p.isVisible())
00139          digits->DigitColor(p.color(), p.transparency());
00140 
00141       // id selection
00142       TEveSecondarySelectable::SelectionSet_ci si = selected.find(it->index());
00143       if (info.isSelected())
00144       {
00145          if (si == selected.end())
00146             selected.insert(it->index());
00147       }
00148       else
00149       {
00150          if ( si != selected.end())
00151             selected.erase(si);
00152       }
00153    }
00154 
00155    if(!selected.empty()) {
00156       if(0==digits->GetSelectedLevel()) {
00157          gEve->GetSelection()->AddElement(digits);
00158       }
00159    } else {
00160       if(1==digits->GetSelectedLevel()||2==digits->GetSelectedLevel()) {
00161          gEve->GetSelection()->RemoveElement(digits);
00162       }
00163    }
00164 
00165    digits->StampObjProps();
00166 }