File indexing completed on 2024-04-06 12:11:37
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 #include "TEveDigitSet.h"
0017 #include "TEveBoxSet.h"
0018 #include "TEveManager.h"
0019 #include "TEveSelection.h"
0020
0021 #include "Fireworks/Core/interface/FWDigitSetProxyBuilder.h"
0022 #include "Fireworks/Core/interface/FWFromEveSelectorBase.h"
0023 #include "Fireworks/Core/interface/FWDisplayProperties.h"
0024 #include "Fireworks/Core/interface/FWModelId.h"
0025 #include "Fireworks/Core/interface/FWEventItem.h"
0026
0027 class FWSecondarySelectableSelector : public FWFromEveSelectorBase {
0028 public:
0029 FWSecondarySelectableSelector(const TEveSecondarySelectable::SelectionSet_t& s, const FWEventItem* i)
0030 : m_selected(s), m_item(i) {}
0031 ~FWSecondarySelectableSelector() override {}
0032
0033 void doSelect() override { syncSelection(); }
0034
0035 void doUnselect() override { syncSelection(); }
0036
0037 const FWEventItem* item() const { return m_item; }
0038
0039 private:
0040 const TEveSecondarySelectable::SelectionSet_t& m_selected;
0041 const FWEventItem* m_item;
0042
0043 void syncSelection() {
0044 size_t size = m_item->size();
0045 for (size_t i = 0; i < size; ++i) {
0046 FWEventItem::ModelInfo modelInfo = m_item->modelInfo(i);
0047 TEveSecondarySelectable::SelectionSet_ci si = m_selected.find(i);
0048 if ((si != m_selected.end()) != modelInfo.isSelected()) {
0049 if (si != m_selected.end())
0050 m_item->select(i);
0051 else
0052 m_item->unselect(i);
0053 }
0054 }
0055 }
0056 };
0057
0058
0059
0060
0061
0062 FWDigitSetProxyBuilder::FWDigitSetProxyBuilder() : m_boxSet(nullptr) {}
0063
0064 FWDigitSetProxyBuilder::~FWDigitSetProxyBuilder() {}
0065
0066 TString FWDigitSetProxyBuilder::getTooltip(TEveDigitSet* set, int idx) {
0067 TEveElement* el = static_cast<TEveElement*>(set);
0068 FWSecondarySelectableSelector* ss = static_cast<FWSecondarySelectableSelector*>(el->GetUserData());
0069 return TString::Format(
0070 "%d %s %s", idx, ss->item()->name().c_str(), ss->item()->modelInterestingValueAsString(idx).c_str());
0071 }
0072
0073 TEveBoxSet* FWDigitSetProxyBuilder::addBoxSetToProduct(TEveElementList* product) {
0074 assert(!product->HasChildren());
0075
0076 m_boxSet = new TEveBoxSet();
0077 m_boxSet->SetTooltipCBFoo(getTooltip);
0078 m_boxSet->Reset(TEveBoxSet::kBT_FreeBox, true, 256);
0079 FWSecondarySelectableSelector* sel = new FWSecondarySelectableSelector(m_boxSet->RefSelectedSet(), item());
0080 m_boxSet->SetUserData(sel);
0081 m_boxSet->SetPickable(true);
0082 m_boxSet->SetAlwaysSecSelect(true);
0083
0084 product->AddElement(m_boxSet);
0085
0086 return m_boxSet;
0087 }
0088
0089 TEveDigitSet* FWDigitSetProxyBuilder::digitSet(TEveElement* product) {
0090 assert(product->NumChildren() == 1);
0091 return static_cast<TEveDigitSet*>(*product->BeginChildren());
0092 }
0093
0094 void FWDigitSetProxyBuilder::addBox(TEveBoxSet* boxSet, const float* pnts, const FWDisplayProperties& dp) {
0095 boxSet->AddBox(pnts);
0096 boxSet->DigitValue(dp.isVisible());
0097
0098 if (dp.isVisible())
0099 boxSet->DigitColor(dp.color(), dp.transparency());
0100
0101 if (dp.transparency())
0102 boxSet->SetMainTransparency(dp.transparency());
0103 }
0104
0105 void FWDigitSetProxyBuilder::modelChanges(const FWModelIds& iIds, Product* product) {
0106 TEveDigitSet* digits = digitSet(product->m_elements);
0107 if (!digits)
0108 return;
0109
0110 TEveSecondarySelectable::SelectionSet_t& selected =
0111 (TEveSecondarySelectable::SelectionSet_t&)(digits->RefSelectedSet());
0112
0113 for (std::set<FWModelId>::const_iterator it = iIds.begin(); it != iIds.end(); ++it) {
0114 const FWEventItem::ModelInfo& info = item()->modelInfo(it->index());
0115
0116
0117 const FWDisplayProperties& p = info.displayProperties();
0118 digits->SetCurrentDigit(it->index());
0119 digits->DigitValue(p.isVisible());
0120 if (p.isVisible())
0121 digits->DigitColor(p.color(), p.transparency());
0122
0123
0124 TEveSecondarySelectable::SelectionSet_ci si = selected.find(it->index());
0125 if (info.isSelected()) {
0126 if (si == selected.end())
0127 selected.insert(it->index());
0128 } else {
0129 if (si != selected.end())
0130 selected.erase(si);
0131 }
0132 }
0133
0134 if (!selected.empty()) {
0135 if (0 == digits->GetSelectedLevel()) {
0136 gEve->GetSelection()->AddElement(digits);
0137 }
0138 } else {
0139 if (1 == digits->GetSelectedLevel() || 2 == digits->GetSelectedLevel()) {
0140 gEve->GetSelection()->RemoveElement(digits);
0141 }
0142 }
0143
0144 digits->StampObjProps();
0145 }