Logo ROOT  
Reference Guide
 
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
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
33{
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
54
55//////////////////////////////////////////////////////////////////////////////////////////////
56/// Process data from client
57
58void RGeomHierarchy::WebWindowCallback(unsigned connid, const std::string &arg)
59{
60 if (arg.compare(0, 6, "BRREQ:") == 0) {
61 // central place for processing browser requests
62 auto json = fDesc.ProcessBrowserRequest(arg.substr(6));
63 if (json.length() > 0)
64 fWebWindow->Send(connid, json);
65 } else if (arg.compare(0, 7, "SEARCH:") == 0) {
66
67 std::string query = arg.substr(7);
68
69 if (!query.empty()) {
70 std::string hjson, json;
72 // send reply with appropriate header - NOFOUND, FOUND0:, FOUND1:
73 fWebWindow->Send(0, hjson);
74 // inform viewer that search is changed
76 fDesc.IssueSignal(this, json.empty() ? "ClearSearch" : "ChangeSearch");
77 } else {
78 fDesc.SetSearch(""s, ""s);
79 fDesc.IssueSignal(this, "ClearSearch");
80 }
81
82 auto connids = fWebWindow->GetConnections(connid);
83
84 for (auto id : connids)
85 fWebWindow->Send(id, "SETSR:"s + query);
86
87 } else if (arg.compare(0, 7, "SETTOP:") == 0) {
88 auto path = TBufferJSON::FromJSON<std::vector<std::string>>(arg.substr(7));
89 if (path && fDesc.SelectTop(*path)) {
90 fDesc.IssueSignal(this, "SelectTop");
91 auto connids = fWebWindow->GetConnections(connid);
92
93 for (auto id : connids)
94 fWebWindow->Send(id, "UPDATE"s);
95 }
96 } else if (arg.compare(0, 6, "HOVER:") == 0) {
97 auto path = TBufferJSON::FromJSON<std::vector<std::string>>(arg.substr(6));
98 if (path) {
99 auto stack = fDesc.MakeStackByPath(*path);
100 if (fDesc.SetHighlightedItem(stack))
101 fDesc.IssueSignal(this, "HighlightItem");
102 }
103 } else if (arg.compare(0, 6, "CLICK:") == 0) {
104 auto path = TBufferJSON::FromJSON<std::vector<std::string>>(arg.substr(6));
105 if (path) {
106 auto stack = fDesc.MakeStackByPath(*path);
107 if (fDesc.SetClickedItem(stack))
108 fDesc.IssueSignal(this, "ClickItem");
109 }
110 } else if ((arg.compare(0, 7, "SETVI0:") == 0) || (arg.compare(0, 7, "SETVI1:") == 0)) {
111 // change visibility for specified nodeid
112
113 auto path = TBufferJSON::FromJSON<std::vector<std::string>>(arg.substr(7));
114
115 bool on = (arg[5] == '1');
116
117 if (path && fDesc.ChangeNodeVisibility(*path, on))
118 fDesc.IssueSignal(this, "NodeVisibility");
119
120 } else if ((arg.compare(0, 5, "SHOW:") == 0) || (arg.compare(0, 5, "HIDE:") == 0)) {
121 auto path = TBufferJSON::FromJSON<std::vector<std::string>>(arg.substr(5));
122 if (path && fDesc.SetPhysNodeVisibility(*path, arg.compare(0, 5, "SHOW:") == 0))
123 fDesc.IssueSignal(this, "NodeVisibility");
124 } else if (arg.compare(0, 6, "CLEAR:") == 0) {
125 auto path = TBufferJSON::FromJSON<std::vector<std::string>>(arg.substr(6));
126 if (path && fDesc.ClearPhysNodeVisibility(*path))
127 fDesc.IssueSignal(this, "NodeVisibility");
128 } else if (arg == "CLEARALL"s) {
130 fDesc.IssueSignal(this, "NodeVisibility");
131 }
132}
133
134/////////////////////////////////////////////////////////////////////////////////
135/// Show hierarchy in web window
136
138{
139 if (args.GetWidgetKind().empty())
140 const_cast<RWebDisplayArgs *>(&args)->SetWidgetKind("RGeomHierarchy");
141
142 fWebWindow->SetUserArgs("{ show_columns: true, only_hierarchy: true }");
144}
145
146/////////////////////////////////////////////////////////////////////////////////
147/// Update client - reload hierarchy
148
150{
151 if (fWebWindow)
152 fWebWindow->Send(0, "RELOAD"s);
153}
154
155/////////////////////////////////////////////////////////////////////////////////
156/// Let browse to specified location
157
158void RGeomHierarchy::BrowseTo(const std::string &itemname)
159{
160 if (fWebWindow)
161 fWebWindow->Send(0, "ACTIV:"s + itemname);
162}
163
164/////////////////////////////////////////////////////////////////////////////////
165/// Process signals from geometry description object
166
167void RGeomHierarchy::ProcessSignal(const std::string &kind)
168{
169 if (kind == "HighlightItem") {
170 auto stack = fDesc.GetHighlightedItem();
171 auto path = fDesc.MakePathByStack(stack);
172 if (stack.empty())
173 path = {"__OFF__"}; // just clear highlight
174 if (fWebWindow)
175 fWebWindow->Send(0, "HIGHL:"s + TBufferJSON::ToJSON(&path).Data());
176 } else if (kind == "NodeVisibility") {
177 // visibility changed from RGeomViewer, update hierarchy
178 if (fWebWindow)
179 fWebWindow->Send(0, "UPDATE"s);
180 } else if (kind == "ActiveItem") {
182 }
183}
184
185//////////////////////////////////////////////////////////////////////////////////////////////
186/// Set handle which will be cleared when connection is closed
187/// Must be called after window is shown
188
189void RGeomHierarchy::ClearOnClose(const std::shared_ptr<void> &handle)
190{
191 if (fWebWindow)
192 fWebWindow->SetClearOnClose(handle);
193}
nlohmann::json json
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
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...