Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
REveSelection.hxx
Go to the documentation of this file.
1 // @(#)root/eve7:$Id$
2 // Author: Matevz Tadel 2007
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2019, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 #ifndef ROOT7_REveSelection
13 #define ROOT7_REveSelection
14 
15 #include <ROOT/REveElement.hxx>
16 
17 #include <map>
18 
19 namespace ROOT {
20 namespace Experimental {
21 
22 ////////////////////////////////////////////////////////////////////////////////
23 /// REveSelection
24 /// Container for selected and highlighted elements.
25 ////////////////////////////////////////////////////////////////////////////////
26 
27 class REveSelection : public REveElement,
28  public REveAunt
29 {
30 public:
31  enum EPickToSelect // How to convert picking events to top selected element:
32  { kPS_Ignore, // ignore picking
33  kPS_Element, // select element (default for selection)
34  kPS_Projectable, // select projectable
35  kPS_Compound, // select compound
36  kPS_PableCompound, // select projectable and compound
37  kPS_Master // select master element (top-level compound)
38  };
39 
40  struct Record
41  {
42  REveElement *f_primary{nullptr}; ///<! it's also implied through the map -- XXXX do i need it ????
43  Set_t f_implied;
44  std::set<int> f_sec_idcs;
45  bool f_is_sec{false}; ///<! is secondary-selected -- XXXX do i need it ????
46 
47  Record(REveElement *el) :
48  f_primary (el),
49  f_is_sec (false)
50  {
51  // Apparently done in DoElementSelect
52  // el->FillImpliedSelectedSet(f_implied);
53  }
54 
55  Record(REveElement *el, const std::set<int>& secondary_idcs) :
56  f_primary (el),
57  f_sec_idcs (secondary_idcs),
58  f_is_sec (true)
59  {
60  // Apparently done in DoElementSelect
61  // el->FillImpliedSelectedSet(f_implied);
62  }
63 
64  bool is_secondary() const { return f_is_sec; }
65  };
66 
67  typedef std::map<REveElement*, Record> SelMap_t;
68  typedef SelMap_t::iterator SelMap_i;
69 
70 private:
71  REveSelection(const REveSelection &); // Not implemented
72  REveSelection &operator=(const REveSelection &); // Not implemented
73 
74 protected:
75  Color_t fVisibleEdgeColor; ///<!
76  Color_t fHiddenEdgeColor; ///<!
77 
78  std::vector<int> fPickToSelect; ///<!
79  Bool_t fActive{kFALSE}; ///<!
80  Bool_t fIsMaster{kFALSE}; ///<!
81 
82  SelMap_t fMap; ///<!
83 
84  Record* find_record(REveElement *el)
85  {
86  auto i = fMap.find(el);
87  return i != fMap.end() ? & i->second : nullptr;
88  }
89 
90  void DoElementSelect (SelMap_i &entry);
91  void DoElementUnselect(SelMap_i &entry);
92 
93  void RecheckImpliedSet(SelMap_i &entry);
94 
95 public:
96  REveSelection(const std::string &n = "REveSelection", const std::string &t = "",
97  Color_t col_visible = kViolet, Color_t col_hidden = kPink);
98  virtual ~REveSelection();
99 
100  void SetVisibleEdgeColorRGB(UChar_t r, UChar_t g, UChar_t b);
101  void SetHiddenEdgeColorRGB(UChar_t r, UChar_t g, UChar_t b);
102 
103  void SetHighlightMode();
104 
105  const std::vector<int>& RefPickToSelect() const { return fPickToSelect; }
106  void ClearPickToSelect() { fPickToSelect.clear(); }
107  void AddPickToSelect(int ps) { fPickToSelect.push_back(ps); }
108 
109  Bool_t GetIsMaster() const { return fIsMaster; }
110  void SetIsMaster(Bool_t m) { fIsMaster = m; }
111 
112  bool IsEmpty() const { return fMap.empty(); }
113  bool NotEmpty() const { return ! fMap.empty(); }
114 
115  // Abstract methods of REveAunt
116  bool HasNiece(REveElement *el) const override;
117  bool HasNieces() const override;
118  bool AcceptNiece(REveElement *el) override;
119  void AddNieceInternal(REveElement *el) override;
120  void RemoveNieceInternal(REveElement *el) override;
121  void RemoveNieces() override;
122 
123  void RemoveImpliedSelected(REveElement *el);
124 
125  void RecheckImpliedSetForElement(REveElement *el);
126 
127  void SelectionAdded(REveElement *el); // *SIGNAL*
128  void SelectionRemoved(REveElement *el); // *SIGNAL*
129  void SelectionCleared(); // *SIGNAL*
130  void SelectionRepeated(REveElement *el); // *SIGNAL*
131 
132  // ----------------------------------------------------------------
133  // Interface to make selection active/non-active.
134 
135  virtual void ActivateSelection();
136  virtual void DeactivateSelection();
137 
138  // ----------------------------------------------------------------
139  // User input processing.
140 
141  REveElement *MapPickedToSelected(REveElement *el);
142 
143  virtual void UserPickedElement(REveElement *el, Bool_t multi = kFALSE);
144  virtual void UserRePickedElement(REveElement *el);
145  virtual void UserUnPickedElement(REveElement *el);
146 
147  void NewElementPicked(ElementId_t id, bool multi, bool secondary, const std::set<int>& secondary_idcs={});
148  void ClearSelection();
149 
150  int RemoveImpliedSelectedReferencesTo(REveElement *el);
151 
152  // ----------------------------------------------------------------
153 
154  Int_t WriteCoreJson(nlohmann::json &cj, Int_t rnr_offset) override;
155 
156 };
157 
158 } // namespace Experimental
159 } // namespace ROOT
160 
161 #endif