Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
RGeomHierarchy.cxx
Go to the documentation of this file.
1// Author: Sergey Linev, 3.03.2023
2
3/*************************************************************************
4 * Copyright (C) 1995-2023, Rene Brun and Fons Rademakers. *
5 * All rights reserved. *
6 * *
7 * For the licensing terms see $ROOTSYS/LICENSE. *
8 * For the list of contributors see $ROOTSYS/README/CREDITS. *
9 *************************************************************************/
10
12
13#include <ROOT/RWebWindow.hxx>
14
15#include "TBufferJSON.h"
16
17using namespace std::string_literals;
18
19using namespace ROOT;
20
21/** \class ROOT::RGeomHierarchy
22\ingroup webwidgets
23
24\brief Web-based %ROOT geometry hierarchy viewer
25*/
26
27
28
29//////////////////////////////////////////////////////////////////////////////////////////////
30/// constructor
31
32RGeomHierarchy::RGeomHierarchy(RGeomDescription &desc, bool use_server_threads) : fDesc(desc)
33{
35 if (use_server_threads)
36 fWebWindow->UseServerThreads();
37
38 fWebWindow->SetDataCallBack([this](unsigned connid, const std::string &arg) { WebWindowCallback(connid, arg); });
39 fWebWindow->SetDefaultPage("file:rootui5sys/geom/index.html");
40 fWebWindow->SetGeometry(600, 900); // configure predefined window geometry
41
42 fDesc.AddSignalHandler(this, [this](const std::string &kind) { ProcessSignal(kind); });
43}
44
45//////////////////////////////////////////////////////////////////////////////////////////////
46/// destructor
47
49{
51}
52
53//////////////////////////////////////////////////////////////////////////////////////////////
54/// Process data from client
55
56void RGeomHierarchy::WebWindowCallback(unsigned connid, const std::string &arg)
57{
58 if (arg.compare(0, 6, "BRREQ:") == 0) {
59 // central place for processing browser requests
60 auto json = fDesc.ProcessBrowserRequest(arg.substr(6));
61 if (json.length() > 0)
62 fWebWindow->Send(connid, json);
63 } else if (arg.compare(0, 7, "SEARCH:") == 0) {
64
65 std::string query = arg.substr(7);
66
67 if (!query.empty()) {
68 std::string hjson, json;
69 fDesc.SearchVisibles(query, hjson, json);
70 // send reply with appropriate header - NOFOUND, FOUND0:, FOUND1:
71 fWebWindow->Send(0, hjson);
72 // inform viewer that search is changed
73 if (fDesc.SetSearch(query, json))
74 fDesc.IssueSignal(this, json.empty() ? "ClearSearch" : "ChangeSearch");
75 } else {
76 fDesc.SetSearch(""s, ""s);
77 fDesc.IssueSignal(this, "ClearSearch");
78 }
79
80 auto connids = fWebWindow->GetConnections(connid);
81
82 for (auto id : connids)
83 fWebWindow->Send(id, "SETSR:"s + query);
84
85 } else if (arg.compare(0, 7, "SETTOP:") == 0) {
86 auto path = TBufferJSON::FromJSON<std::vector<std::string>>(arg.substr(7));
87 if (path && fDesc.SelectTop(*path)) {
88 fDesc.IssueSignal(this, "SelectTop");
89 auto connids = fWebWindow->GetConnections(connid);
90
91 for (auto id : connids)
92 fWebWindow->Send(id, "UPDATE"s);
93 }
94 } else if (arg.compare(0, 6, "HOVER:") == 0) {
95 auto path = TBufferJSON::FromJSON<std::vector<std::string>>(arg.substr(6));
96 if (path) {
97 auto stack = fDesc.MakeStackByPath(*path);
98 if (fDesc.SetHighlightedItem(stack))
99 fDesc.IssueSignal(this, "HighlightItem");
100 }
101 } else if (arg.compare(0, 6, "CLICK:") == 0) {
102 auto path = TBufferJSON::FromJSON<std::vector<std::string>>(arg.substr(6));
103 if (path) {
104 auto stack = fDesc.MakeStackByPath(*path);
105 if (fDesc.SetClickedItem(stack))
106 fDesc.IssueSignal(this, "ClickItem");
107 }
108 } else if ((arg.compare(0, 7, "SETVI0:") == 0) || (arg.compare(0, 7, "SETVI1:") == 0)) {
109 // change visibility for specified nodeid
110
111 auto path = TBufferJSON::FromJSON<std::vector<std::string>>(arg.substr(7));
112
113 bool on = (arg[5] == '1');
114
115 if (path && fDesc.ChangeNodeVisibility(*path, on))
116 fDesc.IssueSignal(this, "NodeVisibility");
117
118 } else if ((arg.compare(0, 5, "SHOW:") == 0) || (arg.compare(0, 5, "HIDE:") == 0)) {
119 auto path = TBufferJSON::FromJSON<std::vector<std::string>>(arg.substr(5));
120 if (path && fDesc.SetPhysNodeVisibility(*path, arg.compare(0, 5, "SHOW:") == 0))
121 fDesc.IssueSignal(this, "NodeVisibility");
122 } else if (arg.compare(0, 6, "CLEAR:") == 0) {
123 auto path = TBufferJSON::FromJSON<std::vector<std::string>>(arg.substr(6));
124 if (path && fDesc.ClearPhysNodeVisibility(*path))
125 fDesc.IssueSignal(this, "NodeVisibility");
126 } else if (arg == "CLEARALL"s) {
128 fDesc.IssueSignal(this, "NodeVisibility");
129 }
130}
131
132/////////////////////////////////////////////////////////////////////////////////
133/// Show hierarchy in web window
134
136{
137 if (args.GetWidgetKind().empty())
138 const_cast<RWebDisplayArgs *>(&args)->SetWidgetKind("RGeomHierarchy");
139
140 fWebWindow->SetUserArgs("{ show_columns: true, only_hierarchy: true }");
142}
143
144/////////////////////////////////////////////////////////////////////////////////
145/// Update client - reload hierarchy
146
148{
149 if (fWebWindow)
150 fWebWindow->Send(0, "RELOAD"s);
151}
152
153/////////////////////////////////////////////////////////////////////////////////
154/// Let browse to specified location
155
156void RGeomHierarchy::BrowseTo(const std::string &itemname)
157{
158 if (fWebWindow)
159 fWebWindow->Send(0, "ACTIV:"s + itemname);
160}
161
162/////////////////////////////////////////////////////////////////////////////////
163/// Process signals from geometry description object
164
165void RGeomHierarchy::ProcessSignal(const std::string &kind)
166{
167 if (kind == "HighlightItem") {
168 auto stack = fDesc.GetHighlightedItem();
169 auto path = fDesc.MakePathByStack(stack);
170 if (stack.empty())
171 path = {"__OFF__"}; // just clear highlight
172 if (fWebWindow)
173 fWebWindow->Send(0, "HIGHL:"s + TBufferJSON::ToJSON(&path).Data());
174 } else if (kind == "NodeVisibility") {
175 // visibility changed from RGeomViewer, update hierarchy
176 if (fWebWindow)
177 fWebWindow->Send(0, "UPDATE"s);
178 } else if (kind == "ActiveItem") {
180 }
181}
182
183//////////////////////////////////////////////////////////////////////////////////////////////
184/// Set handle which will be cleared when connection is closed
185/// Must be called after window is shown
186
187void RGeomHierarchy::ClearOnClose(const std::shared_ptr<void> &handle)
188{
189 if (fWebWindow)
190 fWebWindow->SetClearOnClose(handle);
191}
nlohmann::json json
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void on
std::string ProcessBrowserRequest(const std::string &req="")
Find description object for requested shape If not exists - will be created.
void IssueSignal(const void *handler, const std::string &kind)
Issue signal, which distributed on all handlers - excluding source handler.
bool SetSearch(const std::string &query, const std::string &json)
Change search query and belongs to it json string Returns true if any parameter was really changed.
bool SetHighlightedItem(const std::vector< int > &stack)
bool SelectTop(const std::vector< std::string > &path)
Select top node by path Used by the client to change active node Returns true if selected node was ch...
bool ChangeNodeVisibility(const std::vector< std::string > &path, bool on)
Change visibility for specified element Returns true if changes was performed.
bool ClearAllPhysVisibility()
Reset all custom visibility settings.
bool SetPhysNodeVisibility(const std::vector< std::string > &path, bool on=true)
Set visibility of physical node by path It overrules TGeo visibility flags - but only for specific ph...
bool ClearPhysNodeVisibility(const std::vector< std::string > &path)
Reset custom visibility of physical node by path.
int SearchVisibles(const std::string &find, std::string &hjson, std::string &json)
Search visible nodes for provided name If number of found elements less than 100, create description ...
std::vector< std::string > MakePathByStack(const std::vector< int > &stack)
Returns path string for provided stack.
void AddSignalHandler(const void *handler, RGeomSignalFunc_t func)
Add signal handler.
std::vector< int > MakeStackByPath(const std::vector< std::string > &path)
Produce stack based on string path Used to highlight geo volumes by browser hover event.
std::vector< int > GetHighlightedItem() const
void RemoveSignalHandler(const void *handler)
Remove signal handler.
std::string GetActiveItem() const
bool SetClickedItem(const std::vector< int > &stack)
void Show(const RWebDisplayArgs &args="")
Show hierarchy in web window.
void Update()
Update client - reload hierarchy.
RGeomHierarchy(RGeomDescription &desc, bool use_server_threads=false)
constructor
std::shared_ptr< RWebWindow > fWebWindow
! web window to show geometry
virtual ~RGeomHierarchy()
destructor
void ClearOnClose(const std::shared_ptr< void > &handle)
Set handle which will be cleared when connection is closed Must be called after window is shown.
void BrowseTo(const std::string &itemname)
Let browse to specified location.
void ProcessSignal(const std::string &kind)
Process signals from geometry description object.
void WebWindowCallback(unsigned connid, const std::string &arg)
Process data from client.
RGeomDescription & fDesc
! geometry description, shared with external
Holds different arguments for starting browser with RWebDisplayHandle::Display() method.
const std::string & GetWidgetKind() const
returns widget kind
static std::shared_ptr< RWebWindow > Create()
Create new RWebWindow Using default RWebWindowsManager.
static unsigned ShowWindow(std::shared_ptr< RWebWindow > window, const RWebDisplayArgs &args="")
Static method to show web window Has to be used instead of RWebWindow::Show() when window potentially...
static TString ToJSON(const T *obj, Int_t compact=0, const char *member_name=nullptr)
Definition TBufferJSON.h:75
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...