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
4/*************************************************************************
5 * Copyright (C) 1995-2021, Rene Brun and Fons Rademakers. *
6 * All rights reserved. *
7 * *
8 * For the licensing terms see $ROOTSYS/LICENSE. *
9 * For the list of contributors see $ROOTSYS/README/CREDITS. *
10 *************************************************************************/
11
12#include "RBrowserWidget.hxx"
13
15
16#include "TCanvas.h"
17#include "TROOT.h"
18#include "TClass.h"
19#include "TEnv.h"
20#include "TWebCanvas.h"
21
22#include <map>
23
24using namespace ROOT;
25
26using namespace std::string_literals;
27
28
30
31 TString fCanvasName; ///<! canvas name
32 TCanvas *fCanvas{nullptr}; ///<! last canvas pointer
33 TWebCanvas *fWebCanvas{nullptr}; ///<! web implementation, owned by TCanvas
34
35 std::multimap<TVirtualPad *, std::unique_ptr<Browsable::RHolder>> fObjects; ///<! objects holder, associated with pads
36
38 {
39 if (!fCanvas)
40 return false;
41
42 auto c = gROOT->GetListOfCanvases()->FindObject(fCanvasName.Data());
43 if (c && (fCanvas == c))
44 return true;
45
46 fCanvas = nullptr;
47 return false;
48 }
49
51 {
53 auto l1 = gROOT->GetListOfCleanups();
54 if (l1) {
55 if (!add_canvas)
56 l1->Remove(fCanvas);
57 else if (!l1->FindObject(fCanvas))
58 l1->Add(fCanvas);
59 }
60 auto l2 = gROOT->GetListOfCanvases();
61 if (l2) {
62 if (!add_canvas)
63 l2->Remove(fCanvas);
64 else if (!l2->FindObject(fCanvas))
65 l2->Add(fCanvas);
66 }
67 }
68
69public:
70
71 // constructor when new canvas should be created
73 {
74 fCanvasName = name.c_str();
75
76 // create canvas with web display
78
82
83 // get implementation
84 fWebCanvas = static_cast<TWebCanvas *> (fCanvas->GetCanvasImp());
85
86 // use async mode to prevent blocking inside qt6/cef
88
90 }
91
92 // constructor when widget for existing canvas should be created
93 RBrowserTCanvasWidget(const std::string &name, std::unique_ptr<TCanvas> &canv) : RBrowserWidget(name)
94 {
95 fCanvas = canv.release();
97 fCanvas->SetBatch(kTRUE); // mark canvas as batch
98
99 // create implementation
100 fWebCanvas = static_cast<TWebCanvas *> (TWebCanvas::NewCanvas(fCanvas, "title", 0, 0, 800, 600));
101
102 // use async mode to prevent blocking inside qt6/cef
104
105 // assign implementation
107 fCanvas->cd();
108
109 // ensure creation of web window
111
113 }
114
115 // constructor when canvas already displayed and just integrated into RBrowser
117 {
118 fCanvas = canv;
120 fCanvas->SetBatch(kTRUE); // mark canvas as batch
121
123 // use async mode to prevent blocking inside qt6/cef
125 }
126
128 {
129 if (!fCanvas || !gROOT->GetListOfCanvases()->FindObject(fCanvas))
130 return;
131
133
134 if (fCanvas->GetCanvasImp() == fWebCanvas) {
135 fCanvas->SetCanvasImp(nullptr);
136 delete fWebCanvas;
137 }
138
139 fCanvas->Close();
140 delete fCanvas;
141 }
142
143 std::string GetKind() const override { return "tcanvas"s; }
144
145 void SetActive() override
146 {
147 if (CheckCanvasPointer())
148 fCanvas->cd();
149 }
150
151 std::shared_ptr<RWebWindow> GetWindow() override
152 {
153 if (CheckCanvasPointer())
154 return fWebCanvas->GetWebWindow();
155 return nullptr;
156 }
157
158 std::string GetTitle() override { return fCanvasName.Data(); }
159
160 bool DrawElement(std::shared_ptr<Browsable::RElement> &elem, const std::string &opt = "") override
161 {
162 if (!elem->IsCapable(Browsable::RElement::kActDraw6))
163 return false;
164
165 std::unique_ptr<Browsable::RHolder> obj = elem->GetObject();
166 if (!obj)
167 return false;
168
169 if (!CheckCanvasPointer())
170 return false;
171
173
174 std::string drawopt = opt;
175
176 // first remove all objects which may belong to removed pads
177 bool find_removed_pad;
178 do {
179 find_removed_pad = false;
180 for (auto &entry : fObjects)
181 if ((entry.first != fCanvas) && !fCanvas->FindObject(entry.first)) {
182 fObjects.erase(entry.first);
183 find_removed_pad = true;
184 break;
185 }
186 } while (find_removed_pad);
187
189 if (gPad && fCanvas->FindObject(gPad))
190 pad = gPad;
191
192 if (drawopt.compare(0,8,"<append>") == 0) {
193 drawopt.erase(0,8);
194 } else {
195 pad->GetListOfPrimitives()->Clear();
196 if (pad == fCanvas)
197 fObjects.clear();
198 else
199 fObjects.erase(pad);
200 pad->Range(0,0,1,1); // set default range
201 }
202
203 if (drawopt == "<dflt>")
204 drawopt = Browsable::RProvider::GetClassDrawOption(obj->GetClass());
205
206 if (Browsable::RProvider::Draw6(pad, obj, drawopt)) {
207 fObjects.emplace(pad, std::move(obj));
208 pad->Modified();
210 return true;
211 }
212
213 return false;
214 }
215
216 void CheckModified() override
217 {
220 }
221
222 bool IsValid() override
223 {
224 return CheckCanvasPointer();
225 }
226
227};
228
229// ======================================================================
230
232protected:
233 std::shared_ptr<RBrowserWidget> Create(const std::string &name) final
234 {
235 return std::make_shared<RBrowserTCanvasWidget>(name);
236 }
237
238 std::shared_ptr<RBrowserWidget> CreateFor(const std::string &name, std::shared_ptr<Browsable::RElement> &elem) final
239 {
240 auto holder = elem->GetObject();
241 if (!holder) return nullptr;
242
243 auto canv = holder->get_unique<TCanvas>();
244 if (!canv) return nullptr;
245
246 return std::make_shared<RBrowserTCanvasWidget>(name, canv);
247 }
248
249 std::shared_ptr<RBrowserWidget> DetectWindow(RWebWindow &win) final
250 {
251 TIter iter(gROOT->GetListOfCanvases());
252
253 while (auto canv = static_cast<TCanvas *>(iter())) {
254 auto web_canv = dynamic_cast<TWebCanvas *>(canv->GetCanvasImp());
255 if (web_canv->GetWebWindow().get() == &win)
256 return std::make_shared<RBrowserTCanvasWidget>(canv->GetName(), canv, web_canv);
257 }
258 return nullptr;
259 }
260
261public:
263 ~RBrowserTCanvasProvider() override = default;
265
RBrowserTCanvasProvider sRBrowserTCanvasProvider
#define c(i)
Definition RSha256.hxx:101
constexpr Bool_t kTRUE
Definition RtypesCore.h:108
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:148
R__EXTERN TVirtualMutex * gROOTMutex
Definition TROOT.h:63
#define gROOT
Definition TROOT.h:417
#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:54
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:162
void Close(Option_t *option="") override
Close canvas.
Definition TCanvas.cxx:795
void SetCanvasImp(TCanvasImp *i)
Set canvas implementation If web-based implementation provided, some internal fields also initialized...
Definition TCanvas.cxx:2166
void UpdateAsync() override
Asynchronous pad update.
Definition TCanvas.cxx:2558
TVirtualPad * cd(Int_t subpadnumber=0) override
Set current canvas & pad.
Definition TCanvas.cxx:726
@ kShowToolBar
Definition TCanvas.h:96
@ kMenuBar
Definition TCanvas.h:95
@ kShowEditor
Definition TCanvas.h:97
void SetBatch(Bool_t batch=kTRUE) override
Toggle batch mode.
Definition TCanvas.cxx:1937
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
Definition TObject.cxx:888
void ResetBit(UInt_t f)
Definition TObject.h:203
Bool_t IsModified() const override
Definition TPad.h:276
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:2693
const char * GetName() const override
Returns name of object.
Definition TPad.h:262
Basic string class.
Definition TString.h:138
const char * Data() const
Definition TString.h:386
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.