21 using namespace std::string_literals;
23 ROOT::Experimental::RPadBase::~RPadBase() =
default;
28 void ROOT::Experimental::RPadBase::UseStyle(
const std::shared_ptr<RStyle> &style)
30 RDrawable::UseStyle(style);
31 for (
auto &drawable : fPrimitives)
32 drawable->UseStyle(style);
38 std::shared_ptr<ROOT::Experimental::RDrawable> ROOT::Experimental::RPadBase::FindPrimitive(
const std::string &
id)
const
40 for (
auto &drawable : fPrimitives) {
42 if (drawable->GetId() == id)
43 return drawable.get_shared();
45 const RPadBase *pad_draw =
dynamic_cast<const RPadBase *
> (drawable.get());
48 auto subelem = pad_draw->FindPrimitive(
id);
62 std::shared_ptr<ROOT::Experimental::RDrawable> ROOT::Experimental::RPadBase::FindPrimitiveByDisplayId(
const std::string &
id)
const
64 auto p =
id.find(
"_");
65 if (p == std::string::npos)
68 auto prim = GetPrimitive(std::stoul(
id.substr(0,p)));
72 auto subid =
id.substr(p+1);
74 if (RDisplayItem::ObjectIDFromPtr(prim.get()) == subid)
77 auto subpad = std::dynamic_pointer_cast<RPadBase>(prim);
79 return subpad ? subpad->FindPrimitiveByDisplayId(subid) :
nullptr;
85 void ROOT::Experimental::RPadBase::AssignAutoColors()
90 for (
auto &drawable : fPrimitives) {
91 for (
auto &attr: drawable->fAttr) {
93 if (!attr.second->GetBool())
continue;
94 auto pos = attr.first.rfind(
"_color_auto");
95 if ((pos > 0) && (pos == attr.first.length() - 11)) {
98 case 0: col = RColor::kRed;
break;
99 case 1: col = RColor::kGreen;
break;
100 case 2: col = RColor::kBlue;
break;
102 drawable->fAttr.AddString(attr.first.substr(0,pos) +
"_color_rgb", col.GetHex());
112 void ROOT::Experimental::RPadBase::DisplayPrimitives(RPadBaseDisplayItem &paditem)
const
114 paditem.SetAttributes(&GetAttrMap());
115 paditem.SetFrame(GetFrame());
117 paditem.SetPadStyle(fStyle.lock());
121 for (
auto &drawable : fPrimitives) {
122 auto item = drawable->Display();
124 item->SetObjectIDAsPtr(drawable.get());
125 item->SetIndex(indx);
127 paditem.Add(std::move(item), drawable->fStyle.lock());
137 std::vector<std::vector<std::shared_ptr<ROOT::Experimental::RPad>>>
138 ROOT::Experimental::RPadBase::Divide(
int nHoriz,
int nVert,
const RPadExtent &padding)
140 std::vector<std::vector<std::shared_ptr<RPad>>> ret;
142 R__ERROR_HERE(
"Gpad") <<
"Cannot divide into 0 horizontal sub-pads!";
144 R__ERROR_HERE(
"Gpad") <<
"Cannot divide into 0 vertical sub-pads!";
145 if (!nHoriz || !nVert)
149 RPadExtent offset{1._normal, 1._normal};
151 offset = (offset + padding);
152 offset *= {1. / nHoriz, 1. / nVert};
153 const RPadExtent size = offset - padding;
155 for (
int iHoriz = 0; iHoriz < nHoriz; ++iHoriz) {
157 for (
int iVert = 0; iVert < nVert; ++iVert) {
158 RPadPos subPos = offset;
159 subPos *= {1. * iHoriz, 1. * iVert};
161 auto subpad = Draw<RPad>(
this, subPos, size);
163 ret.back().emplace_back(subpad);
170 ROOT::Experimental::RFrame *ROOT::Experimental::RPadBase::GetOrCreateFrame()
172 CreateFrameIfNeeded();
176 void ROOT::Experimental::RPadBase::CreateFrameIfNeeded()
179 fFrame = std::make_unique<ROOT::Experimental::RFrame>();
187 ROOT::Experimental::RPadUserAxisBase* ROOT::Experimental::RPadBase::GetAxis(
size_t dimension)
const
189 if (fFrame && dimension < fFrame->GetNDimensions())
190 return &fFrame->GetUserAxis(dimension);
198 ROOT::Experimental::RPadUserAxisBase* ROOT::Experimental::RPadBase::GetOrCreateAxis(
size_t dimension)
200 GetOrCreateFrame()->GrowToDimensions(dimension);
201 return &fFrame->GetUserAxis(dimension);
207 void ROOT::Experimental::RPadBase::SetAxisBounds(
int dimension,
double begin,
double end)
209 GetOrCreateFrame()->GrowToDimensions(dimension);
210 GetAxis(dimension)->SetBounds(begin, end);
216 void ROOT::Experimental::RPadBase::SetAxisBound(
int dimension, RPadUserAxisBase::EAxisBoundsKind boundsKind,
double bound)
218 GetOrCreateFrame()->GrowToDimensions(dimension);
219 GetAxis(dimension)->SetBound(boundsKind, bound);
225 void ROOT::Experimental::RPadBase::SetAxisAutoBounds(
int dimension)
227 GetOrCreateFrame()->GrowToDimensions(dimension);
228 GetAxis(dimension)->SetAutoBounds();
234 void ROOT::Experimental::RPadBase::SetAllAxisBounds(
const std::vector<std::array<double, 2>> &vecBeginAndEnd)
236 GetOrCreateFrame()->GrowToDimensions(vecBeginAndEnd.size());
237 if (vecBeginAndEnd.size() != fFrame->GetNDimensions()) {
238 R__ERROR_HERE(
"Gpadv7")
239 <<
"Array of axis bound has wrong size " << vecBeginAndEnd.size()
240 <<
" versus numer of axes in frame " << fFrame->GetNDimensions();
244 for (
size_t i = 0, n = fFrame->GetNDimensions(); i < n; ++i)
245 fFrame->GetUserAxis(i).SetBounds(vecBeginAndEnd[i][0], vecBeginAndEnd[i][1]);
251 void ROOT::Experimental::RPadBase::SetAllAxisBound(
const std::vector<BoundKindAndValue> &vecBoundAndKind)
253 GetOrCreateFrame()->GrowToDimensions(vecBoundAndKind.size());
254 if (vecBoundAndKind.size() != fFrame->GetNDimensions()) {
255 R__ERROR_HERE(
"Gpadv7")
256 <<
"Array of axis bound has wrong size " << vecBoundAndKind.size()
257 <<
" versus numer of axes in frame " << fFrame->GetNDimensions();
261 for (
size_t i = 0, n = fFrame->GetNDimensions(); i < n; ++i)
262 fFrame->GetUserAxis(i).SetBound(vecBoundAndKind[i].fKind, vecBoundAndKind[i].fBound);
268 void ROOT::Experimental::RPadBase::CollectShared(Internal::RIOSharedVector_t &vect)
270 for (
auto &handle : fPrimitives) {
271 vect.emplace_back(&handle);
272 auto drawable = handle.get();
273 if (drawable) drawable->CollectShared(vect);
280 void ROOT::Experimental::RPadBase::SetAllAxisAutoBounds()
282 for (
size_t i = 0, n = GetOrCreateFrame()->GetNDimensions(); i < n; ++i)
283 fFrame->GetUserAxis(i).SetAutoBounds();