24#include <nlohmann/json.hpp>
38REveSelection::REveSelection(
const std::string&
n,
const std::string& t,
41 fVisibleEdgeColor (col_visible),
42 fHiddenEdgeColor (col_hidden),
107 Set_t &imp_set = entry->second.f_implied;
109 entry->first->FillImpliedSelectedSet(imp_set);
111 auto i = imp_set.begin();
112 while (i != imp_set.end())
114 if ((*i)->GetElementId() == 0)
118 Info(
"REveSelection::DoElementSelect",
119 "Element '%s' [%s] with 0 id detected and removed.",
120 (*i)->GetCName(), (*i)->IsA()->GetName());
127 (*i)->IncImpliedSelected();
139 Set_t &imp_set = entry->second.f_implied;
141 for (
auto &imp_el: imp_set) imp_el->DecImpliedSelected();
159 return !
fMap.empty();
168 return el !=
this &&
fMap.find(el) ==
fMap.end() &&
190 auto i =
fMap.find(el);
204 Warning(
"REveSelection::RemoveNieceLocal",
"element not found in map.");
216 for (
auto i =
fMap.begin(); i !=
fMap.end(); ++i)
218 i->first->RemoveAunt(
this);
235 bool changed =
false;
239 auto j = i.second.f_implied.find(el);
240 if (j != i.second.f_implied.end())
242 i.second.f_implied.erase(j);
257 bool changed =
false;
259 smi->first->FillImpliedSelectedSet(set);
262 if (smi->second.f_implied.find(i) == smi->second.f_implied.end())
264 smi->second.f_implied.insert(i);
265 i->IncImpliedSelected();
281 auto i =
fMap.find(el);
290 for (
auto i =
fMap.begin(); i !=
fMap.end(); ++i)
292 if (i->second.f_implied.find(el) != i->second.f_implied.end())
342 for (
auto i =
fMap.begin(); i !=
fMap.end(); ++i) {
355 for (
auto i =
fMap.begin(); i !=
fMap.end(); ++i) {
374 switch (pick_to_select)
484 static const REveException eh(
"REveSelection::NewElementPicked ");
489 std::set<int> secondary_idcs = in_secondary_idcs;
495 if ( ! pel)
throw eh +
"picked element id=" +
id +
" not found.";
501 if (!secondary && ss) {
509 std::string debug_secondary;
511 debug_secondary =
" {";
512 for (
auto si : secondary_idcs) {
513 debug_secondary.append(
" ");
514 debug_secondary.append(std::to_string(si));
516 debug_secondary.append(
" }");
518 ::Info(
"REveSelection::NewElementPicked",
"%p -> %p, multi: %d, secondary: %d %s", pel, el, multi, secondary, debug_secondary.c_str());
535 for (
auto &ns : secondary_idcs)
544 for (
auto &dit : dup)
548 if (!secondary_idcs.empty()) {
582 bool modified = (rec->
f_sec_idcs != secondary_idcs);
628 static const REveException eh(
"REveSelection::NewElementPickedStr ");
630 if (secondary_idcs == 0 || secondary_idcs[0] == 0)
636 static const std::regex comma_re(
"\\s*,\\s*", std::regex::optimize);
637 std::string str(secondary_idcs);
639 std::sregex_token_iterator itr(str.begin(), str.end(), comma_re, -1);
640 std::sregex_token_iterator end;
643 while (itr != end) sis.insert(std::stoi(*itr++));
645 catch (
const std::invalid_argument& ia) {
646 throw eh +
"invalid secondary index argument '" + *itr +
"' - must be int.";
675 auto j = i.second.f_implied.find(el);
677 if (j != i.second.f_implied.end())
679 i.second.f_implied.erase(j);
702 nlohmann::json rec = {}, imp = nlohmann::json::array(), sec = nlohmann::json::array();
704 rec[
"primary"] = i.first->GetElementId();
707 for (
auto &sec_id : i.second.f_sec_idcs)
708 sec.push_back(sec_id);
711 for (
auto &imp_el : i.second.f_implied) {
712 imp.push_back(imp_el->GetElementId());
713 imp_el->FillExtraSelectionData(rec[
"extra"], sec);
716 rec[
"implied"] = imp;
719 if (i.first->RequiresExtraSelectionData()) {
720 i.first->FillExtraSelectionData(rec[
"extra"], sec);
723 rec[
"sec_idcs"] = sec;
727 rec[
"tooltip"] = i.first->GetHighlightTooltip(i.second.f_sec_idcs);
729 sel_list.push_back(rec);
732 j[
"sel_list"] = sel_list;
734 j[
"UT_PostStream"] =
"UT_Selection_Refresh_State";
void Info(const char *location, const char *msgfmt,...)
Use this function for informational messages.
void Warning(const char *location, const char *msgfmt,...)
Use this function in warning situations.
virtual void AddNiece(REveElement *el)
virtual void RemoveNiece(REveElement *el)
TClass * IsA() const
Return class for this element.
REveCompound * GetCompound()
virtual REveElement * GetSelectionMaster()
Returns the master element - that is:
virtual Int_t WriteCoreJson(nlohmann::json &cj, Int_t rnr_offset)
Write core json.
void StampObjPropsPreChk()
void DecImpliedSelected()
std::set< REveElement * > Set_t
REveException Exception-type thrown by Eve classes.
REveElement * FindElementById(ElementId_t id) const
Lookup ElementId in element map and return corresponding REveElement*.
REveProjectable * GetProjectable() const
SelectionSet_t & RefSelectedSet()
void RemoveNieceInternal(REveElement *el) override
Virtual from REveAunt.
void NewElementPicked(ElementId_t id, bool multi, bool secondary, const std::set< int > &secondary_idcs={})
Called from GUI when user picks or un-picks an element.
bool HasNiece(REveElement *el) const override
Check if elemenet el is selected (not implied selected).
bool AcceptNiece(REveElement *el) override
Pre-addition check.
void AddNieceInternal(REveElement *el) override
Add an element into selection, virtual from REveAunt.
REveElement * MapPickedToSelected(REveElement *el)
Given element el that was picked or clicked by the user, find the parent/ancestor element that should...
void RemoveImpliedSelected(REveElement *el)
Remove element from all implied-selected sets.
int RemoveImpliedSelectedReferencesTo(REveElement *el)
Remove pointers to el from implied selected sets.
void SelectionRemoved(REveElement *el)
Emit SelectionRemoved signal.
void SetHiddenEdgeColorRGB(UChar_t r, UChar_t g, UChar_t b)
Set hidden highlight color.
virtual ~REveSelection()
Destructor.
void SetVisibleEdgeColorRGB(UChar_t r, UChar_t g, UChar_t b)
Set visible highlight color.
Color_t fHiddenEdgeColor
!
std::vector< int > fPickToSelect
!
virtual void ActivateSelection()
Activate this selection.
bool HasNieces() const override
Check if any elements are selected.
void SetHighlightMode()
Set to 'highlight' mode.
void SelectionCleared()
Emit SelectionCleared signal.
virtual void DeactivateSelection()
Deactivate this selection.
void DoElementSelect(SelMap_i &entry)
Select element indicated by the entry and fill its implied-selected set.
Int_t WriteCoreJson(nlohmann::json &cj, Int_t rnr_offset) override
Write core json. If rnr_offset negative, render data will not be written.
Record * find_record(REveElement *el)
SelMap_t::iterator SelMap_i
virtual void UserRePickedElement(REveElement *el)
Called when element selection is repeated.
virtual void UserPickedElement(REveElement *el, Bool_t multi=kFALSE)
Called when user picks/clicks on an element.
void AddPickToSelect(int ps)
void RecheckImpliedSetForElement(REveElement *el)
If given element is selected or implied-selected within this selection then recheck implied-set for g...
void SelectionRepeated(REveElement *el)
Emit SelectionRepeated signal.
void RecheckImpliedSet(SelMap_i &entry)
Recalculate implied-selected state for given selection entry.
void SelectionAdded(REveElement *el)
Emit SelectionAdded signal.
void NewElementPickedStr(ElementId_t id, bool multi, bool secondary, const char *secondary_idcs="")
Wrapper for NewElementPickedStr that takes secondary indices as C-style string.
void RemoveNieces() override
Add an element into selection, virtual from REveAunt.
Color_t fVisibleEdgeColor
!
void DoElementUnselect(SelMap_i &entry)
Deselect element indicated by the entry and clear its implied-selected set.
void ClearSelection()
Clear selection if not empty.
virtual void UserUnPickedElement(REveElement *el)
Called when an element is unselected.
Bool_t InheritsFrom(const char *cl) const
Return kTRUE if this class inherits from a class with name "classname".
static Int_t GetColor(const char *hexcolor)
Static method returning color number for color specified by hex color string of form: "#rrggbb",...
R__EXTERN REveManager * gEve
basic_json< std::map, std::vector, std::string, bool, std::int64_t, std::uint64_t, double, std::allocator, adl_serializer, std::vector< std::uint8_t > > json
bool is_secondary() const
std::set< int > f_sec_idcs
bool f_is_sec
! is secondary-selected – XXXX do i need it ????