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
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
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();
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
105
106 // assign implementation
108 fCanvas->cd();
109
110 // ensure creation of web window
112
114 }
115
116 // constructor when canvas already displayed and just integrated into RBrowser
118 {
119 fCanvas = canv;
121 fCanvas->SetBatch(kTRUE); // mark canvas as batch
122
124 // use async mode to prevent blocking inside qt6/cef
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
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
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();
211 return true;
212 }
213
214 return false;
215 }
216
217 void CheckModified() override
218 {
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:93
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 char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t win
char name[80]
Definition TGX11.cxx:110
R__EXTERN TVirtualMutex * gROOTMutex
Definition TROOT.h:63
#define gROOT
Definition TROOT.h:414
#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.
Abstract Web-based widget, which can be used in the RBrowser Used to embed canvas,...
Represents web window, which can be shown in web browser or any other supported environment.
The Canvas class.
Definition TCanvas.h:23
TCanvasImp * GetCanvasImp() const override
Definition TCanvas.h:158
void Close(Option_t *option="") override
Close canvas.
Definition TCanvas.cxx:788
void SetCanvasImp(TCanvasImp *i)
Set canvas implementation If web-based implementation provided, some internal fields also initialized...
Definition TCanvas.cxx:2160
void UpdateAsync() override
Asynchronous pad update.
Definition TCanvas.cxx:2544
TVirtualPad * cd(Int_t subpadnumber=0) override
Set current canvas & pad.
Definition TCanvas.cxx:719
@ kShowToolBar
Definition TCanvas.h:92
@ kMenuBar
Definition TCanvas.h:91
@ kShowEditor
Definition TCanvas.h:93
void SetBatch(Bool_t batch=kTRUE) override
Toggle batch mode.
Definition TCanvas.cxx:1932
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
Definition TObject.cxx:864
void ResetBit(UInt_t f)
Definition TObject.h:204
Bool_t IsModified() const override
Definition TPad.h:274
TObject * FindObject(const char *name) const override
Search if object named name is inside this pad or in pads inside this pad.
Definition TPad.cxx:2716
const char * GetName() const override
Returns name of object.
Definition TPad.h:260
Basic string class.
Definition TString.h:139
const char * Data() const
Definition TString.h:376
TVirtualPad is an abstract base class for the Pad and Canvas classes.
Definition TVirtualPad.h:51
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,...
const std::shared_ptr< ROOT::RWebWindow > & GetWebWindow() const
Definition TWebCanvas.h:195
void SetAsyncMode(Bool_t on=kTRUE)
Definition TWebCanvas.h:256
void CreateWebWindow()
Create web window for the canvas.
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.
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...