1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
// -*- C++ -*-
//
// Package: Core
// Class : FWDigitSetProxyBuilder
//
// Implementation:
// [Notes on implementation]
//
// Original Author: Alja Mrak-Tadel
// Created: Tue Oct 19 12:00:50 CEST 2010
//
// system include files
// user include files
#include "TEveDigitSet.h"
#include "TEveBoxSet.h"
#include "TEveManager.h"
#include "TEveSelection.h"
#include "Fireworks/Core/interface/FWDigitSetProxyBuilder.h"
#include "Fireworks/Core/interface/FWFromEveSelectorBase.h"
#include "Fireworks/Core/interface/FWDisplayProperties.h"
#include "Fireworks/Core/interface/FWModelId.h"
#include "Fireworks/Core/interface/FWEventItem.h"
class FWSecondarySelectableSelector : public FWFromEveSelectorBase {
public:
FWSecondarySelectableSelector(const TEveSecondarySelectable::SelectionSet_t& s, const FWEventItem* i)
: m_selected(s), m_item(i) {}
~FWSecondarySelectableSelector() override {}
void doSelect() override { syncSelection(); }
void doUnselect() override { syncSelection(); }
const FWEventItem* item() const { return m_item; }
private:
const TEveSecondarySelectable::SelectionSet_t& m_selected;
const FWEventItem* m_item;
void syncSelection() {
size_t size = m_item->size();
for (size_t i = 0; i < size; ++i) {
FWEventItem::ModelInfo modelInfo = m_item->modelInfo(i);
TEveSecondarySelectable::SelectionSet_ci si = m_selected.find(i);
if ((si != m_selected.end()) != modelInfo.isSelected()) {
if (si != m_selected.end())
m_item->select(i);
else
m_item->unselect(i);
}
}
}
};
//==============================================================================
//==============================================================================
//==============================================================================
FWDigitSetProxyBuilder::FWDigitSetProxyBuilder() : m_boxSet(nullptr) {}
FWDigitSetProxyBuilder::~FWDigitSetProxyBuilder() {}
TString FWDigitSetProxyBuilder::getTooltip(TEveDigitSet* set, int idx) {
TEveElement* el = static_cast<TEveElement*>(set); // tmp-workaround
FWSecondarySelectableSelector* ss = static_cast<FWSecondarySelectableSelector*>(el->GetUserData());
return TString::Format(
"%d %s %s", idx, ss->item()->name().c_str(), ss->item()->modelInterestingValueAsString(idx).c_str());
}
TEveBoxSet* FWDigitSetProxyBuilder::addBoxSetToProduct(TEveElementList* product) {
assert(!product->HasChildren());
m_boxSet = new TEveBoxSet();
m_boxSet->SetTooltipCBFoo(getTooltip);
m_boxSet->Reset(TEveBoxSet::kBT_FreeBox, true, 256);
FWSecondarySelectableSelector* sel = new FWSecondarySelectableSelector(m_boxSet->RefSelectedSet(), item());
m_boxSet->SetUserData(sel);
m_boxSet->SetPickable(true);
m_boxSet->SetAlwaysSecSelect(true);
product->AddElement(m_boxSet);
return m_boxSet;
}
TEveDigitSet* FWDigitSetProxyBuilder::digitSet(TEveElement* product) {
assert(product->NumChildren() == 1);
return static_cast<TEveDigitSet*>(*product->BeginChildren());
}
void FWDigitSetProxyBuilder::addBox(TEveBoxSet* boxSet, const float* pnts, const FWDisplayProperties& dp) {
boxSet->AddBox(pnts);
boxSet->DigitValue(dp.isVisible());
if (dp.isVisible())
boxSet->DigitColor(dp.color(), dp.transparency());
if (dp.transparency())
boxSet->SetMainTransparency(dp.transparency());
}
void FWDigitSetProxyBuilder::modelChanges(const FWModelIds& iIds, Product* product) {
TEveDigitSet* digits = digitSet(product->m_elements);
if (!digits)
return;
TEveSecondarySelectable::SelectionSet_t& selected =
(TEveSecondarySelectable::SelectionSet_t&)(digits->RefSelectedSet());
for (std::set<FWModelId>::const_iterator it = iIds.begin(); it != iIds.end(); ++it) {
const FWEventItem::ModelInfo& info = item()->modelInfo(it->index());
// id display properties
const FWDisplayProperties& p = info.displayProperties();
digits->SetCurrentDigit(it->index());
digits->DigitValue(p.isVisible());
if (p.isVisible())
digits->DigitColor(p.color(), p.transparency());
// id selection
TEveSecondarySelectable::SelectionSet_ci si = selected.find(it->index());
if (info.isSelected()) {
if (si == selected.end())
selected.insert(it->index());
} else {
if (si != selected.end())
selected.erase(si);
}
}
if (!selected.empty()) {
if (0 == digits->GetSelectedLevel()) {
gEve->GetSelection()->AddElement(digits);
}
} else {
if (1 == digits->GetSelectedLevel() || 2 == digits->GetSelectedLevel()) {
gEve->GetSelection()->RemoveElement(digits);
}
}
digits->StampObjProps();
}
|