Logo ROOT  
Reference Guide
Loading...
Searching...
No Matches
RBrowserTCanvasWidget.cxx
Go to the documentation of this file.
1// Author: Sergey Linev <S.Linev@gsi.de>
2// Date: 2021-01-25
3// Warning: This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback is welcome!
4
5/*************************************************************************
6 * Copyright (C) 1995-2021, Rene Brun and Fons Rademakers. *
7 * All rights reserved. *
8 * *
9 * For the licensing terms see $ROOTSYS/LICENSE. *
10 * For the list of contributors see $ROOTSYS/README/CREDITS. *
11 *************************************************************************/
12
13#include "RBrowserWidget.hxx"
14
16
17#include "TCanvas.h"
18#include "TROOT.h"
19#include "TClass.h"
20#include "TEnv.h"
21#include "TWebCanvas.h"
22
23#include <map>
24
25using namespace ROOT;
26
27using namespace std::string_literals;
28
29
31
32 TString fCanvasName; ///<! canvas name
33 TCanvas *fCanvas{nullptr}; ///<! last canvas pointer
34 TWebCanvas *fWebCanvas{nullptr}; ///<! web implementation, owned by TCanvas
35
36 std::multimap<TVirtualPad *, std::unique_ptr<Browsable::RHolder>> fObjects; ///<! objects holder, associated with pads
37
39 {
40 if (!fCanvas)
41 return false;
42
43 auto c = gROOT->GetListOfCanvases()->FindObject(fCanvasName.Data());
44 if (c && (fCanvas == c))
45 return true;
46
47 fCanvas = nullptr;
48 return false;
49 }
50
51 void RegisterCanvasInGlobalLists(bool add_canvas)
52 {
54 auto l1 = gROOT->GetListOfCleanups();
55 if (l1) {
56 if (!add_canvas)
57 l1->Remove(fCanvas);
58 else if (!l1->FindObject(fCanvas))
59 l1->Add(fCanvas);
60 }
61 auto l2 = gROOT->GetListOfCanvases();
62 if (l2) {
63 if (!add_canvas)
64 l2->Remove(fCanvas);
65 else if (!l2->FindObject(fCanvas))
66 l2->Add(fCanvas);
67 }
68 }
69
70public:
71
72 // constructor when new canvas should be created
74 {
75 fCanvasName = name.c_str();
76
77 // create canvas with web display
79
83
84 // get implementation
85 fWebCanvas = static_cast<TWebCanvas *> (fCanvas->GetCanvasImp());
86
87 // use async mode to prevent blocking inside qt6/cef
88 fWebCanvas->SetAsyncMode(kTRUE);
89
91 }
92
93 // constructor when widget for existing canvas should be created
94 RBrowserTCanvasWidget(const std::string &name, std::unique_ptr<TCanvas> &canv) : RBrowserWidget(name)
95 {
96 fCanvas = canv.release();
97 fCanvasName = fCanvas->GetName();
98 fCanvas->SetBatch(kTRUE); // mark canvas as batch
99
100 // create implementation
101 fWebCanvas = static_cast<TWebCanvas *> (TWebCanvas::NewCanvas(fCanvas, "title", 0, 0, 800, 600));
102
103 // use async mode to prevent blocking inside qt6/cef
104 fWebCanvas->SetAsyncMode(kTRUE);
105
106 // assign implementation
107 fCanvas->SetCanvasImp(fWebCanvas);
108 fCanvas->cd();
109
110 // ensure creation of web window
111 fWebCanvas->CreateWebWindow();
112
114 }
115
116 // constructor when canvas already displayed and just integrated into RBrowser
117 RBrowserTCanvasWidget(const std::string &name, TCanvas *canv, TWebCanvas *webcanv) : RBrowserWidget(name)
118 {
119 fCanvas = canv;
120 fCanvasName = fCanvas->GetName();
121 fCanvas->SetBatch(kTRUE); // mark canvas as batch
122
123 fWebCanvas = webcanv;
124 // use async mode to prevent blocking inside qt6/cef
125 fWebCanvas->SetAsyncMode(kTRUE);
126 }
127
129 {
130 if (!fCanvas || !gROOT->GetListOfCanvases()->FindObject(fCanvas))
131 return;
132
134
135 if (fCanvas->GetCanvasImp() == fWebCanvas) {
136 fCanvas->SetCanvasImp(nullptr);
137 delete fWebCanvas;
138 }
139
140 fCanvas->Close();
141 delete fCanvas;
142 }
143
144 std::string GetKind() const override { return "tcanvas"s; }
145
146 void SetActive() override
147 {
148 if (CheckCanvasPointer())
149 fCanvas->cd();
150 }
151
152 std::shared_ptr<RWebWindow> GetWindow() override
153 {
154 if (CheckCanvasPointer())
155 return fWebCanvas->GetWebWindow();
156 return nullptr;
157 }
158
159 std::string GetTitle() override { return fCanvasName.Data(); }
160
161 bool DrawElement(std::shared_ptr<Browsable::RElement> &elem, const std::string &opt = "") override
162 {
163 if (!elem->IsCapable(Browsable::RElement::kActDraw6))
164 return false;
165
166 std::unique_ptr<Browsable::RHolder> obj = elem->GetObject();
167 if (!obj)
168 return false;
169
170 if (!CheckCanvasPointer())
171 return false;
172
173 Browsable::RProvider::ExtendProgressHandle(elem.get(), obj.get());
174
175 std::string drawopt = opt;
176
177 // first remove all objects which may belong to removed pads
178 bool find_removed_pad;
179 do {
180 find_removed_pad = false;
181 for (auto &entry : fObjects)
182 if ((entry.first != fCanvas) && !fCanvas->FindObject(entry.first)) {
183 fObjects.erase(entry.first);
184 find_removed_pad = true;
185 break;
186 }
187 } while (find_removed_pad);
188
189 TVirtualPad *pad = fCanvas;
190 if (gPad && fCanvas->FindObject(gPad))
191 pad = gPad;
192
193 if (drawopt.compare(0,8,"<append>") == 0) {
194 drawopt.erase(0,8);
195 } else {
196 pad->GetListOfPrimitives()->Clear();
197 if (pad == fCanvas)
198 fObjects.clear();
199 else
200 fObjects.erase(pad);
201 pad->Range(0,0,1,1); // set default range
202 }
203
204 if (drawopt == "<dflt>")
205 drawopt = Browsable::RProvider::GetClassDrawOption(obj->GetClass());
206
207 if (Browsable::RProvider::Draw6(pad, obj, drawopt)) {
208 fObjects.emplace(pad, std::move(obj));
209 pad->Modified();
210 fCanvas->UpdateAsync();
211 return true;
212 }
213
214 return false;
215 }
216
217 void CheckModified() override
218 {
219 if (CheckCanvasPointer() && fCanvas->IsModified())
220 fCanvas->UpdateAsync();
221 }
222
223 bool IsValid() override
224 {
225 return CheckCanvasPointer();
226 }
227
228};
229
230// ======================================================================
231
233protected:
234 std::shared_ptr<RBrowserWidget> Create(const std::string &name) final
235 {
236 return std::make_shared<RBrowserTCanvasWidget>(name);
237 }
238
239 std::shared_ptr<RBrowserWidget> CreateFor(const std::string &name, std::shared_ptr<Browsable::RElement> &elem) final
240 {
241 auto holder = elem->GetObject();
242 if (!holder) return nullptr;
243
244 auto canv = holder->get_unique<TCanvas>();
245 if (!canv) return nullptr;
246
247 return std::make_shared<RBrowserTCanvasWidget>(name, canv);
248 }
249
250 std::shared_ptr<RBrowserWidget> DetectWindow(RWebWindow &win) final
251 {
252 TIter iter(gROOT->GetListOfCanvases());
253
254 while (auto canv = static_cast<TCanvas *>(iter())) {
255 auto web_canv = dynamic_cast<TWebCanvas *>(canv->GetCanvasImp());
256 if (web_canv->GetWebWindow().get() == &win)
257 return std::make_shared<RBrowserTCanvasWidget>(canv->GetName(), canv, web_canv);
258 }
259 return nullptr;
260 }
261
262public:
264 ~RBrowserTCanvasProvider() override = default;
266
RBrowserTCanvasProvider sRBrowserTCanvasProvider
#define c(i)
Definition RSha256.hxx:101
constexpr Bool_t kTRUE
Definition RtypesCore.h:107
char name[80]
Definition TGX11.cxx:148
#define gROOT
Definition TROOT.h:417
externTVirtualMutex * gROOTMutex
Definition TROOT.h:63
#define R__LOCKGUARD(mutex)
#define gPad
std::shared_ptr< RBrowserWidget > Create(const std::string &name) final
std::shared_ptr< RBrowserWidget > CreateFor(const std::string &name, std::shared_ptr< Browsable::RElement > &elem) final
std::shared_ptr< RBrowserWidget > DetectWindow(RWebWindow &win) final
~RBrowserTCanvasProvider() override=default
std::shared_ptr< RWebWindow > GetWindow() override
TCanvas * fCanvas
! last canvas pointer
TWebCanvas * fWebCanvas
! web implementation, owned by TCanvas
TString fCanvasName
! canvas name
RBrowserTCanvasWidget(const std::string &name, std::unique_ptr< TCanvas > &canv)
std::string GetTitle() override
std::string GetKind() const override
std::multimap< TVirtualPad *, std::unique_ptr< Browsable::RHolder > > fObjects
! objects holder, associated with pads
RBrowserTCanvasWidget(const std::string &name)
bool DrawElement(std::shared_ptr< Browsable::RElement > &elem, const std::string &opt="") override
void RegisterCanvasInGlobalLists(bool add_canvas)
RBrowserTCanvasWidget(const std::string &name, TCanvas *canv, TWebCanvas *webcanv)
@ kActDraw6
can be drawn inside ROOT6 canvas
Definition RElement.hxx:55
static bool Draw6(TVirtualPad *subpad, std::unique_ptr< RHolder > &obj, const std::string &opt="")
Invoke drawing of object on TCanvas sub-pad All existing providers are checked, first checked are cla...
static std::string GetClassDrawOption(const ClassArg &)
Return configured draw option for the class.
static void ExtendProgressHandle(void *handle, void *handle2)
Extend progress handle - to be able react on sub item.
RBrowserWidgetProvider(const std::string &kind)
Constructor.
RBrowserWidget(const std::string &name)
Represents web window, which can be shown in web browser or any other supported environment.
The Canvas class.
Definition TCanvas.h:23
@ kShowToolBar
Definition TCanvas.h:96
@ kMenuBar
Definition TCanvas.h:95
@ kShowEditor
Definition TCanvas.h:97
void Clear(Option_t *option="") override
Remove all objects from the list.
Definition TList.cxx:532
Basic string class.
Definition TString.h:138
TVirtualPad is an abstract base class for the Pad and Canvas classes.
Definition TVirtualPad.h:51
virtual void Modified(Bool_t flag=1)=0
virtual TList * GetListOfPrimitives() const =0
virtual void Range(Double_t x1, Double_t y1, Double_t x2, Double_t y2)=0
Basic TCanvasImp ABI implementation for Web-based Graphics Provides painting of main ROOT classes in ...
Definition TWebCanvas.h:35
static TCanvas * CreateWebCanvas(const char *name, const char *title, UInt_t width=1200, UInt_t height=800)
Create TCanvas and assign TWebCanvas implementation to it Canvas is not displayed automatically,...
static TCanvasImp * NewCanvas(TCanvas *c, const char *name, Int_t x, Int_t y, UInt_t width, UInt_t height)
Static method to create TWebCanvas instance Used by plugin manager.