Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
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);
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
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
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 }