10 #define ROOT7_RPadBase
23 namespace Experimental {
27 class RPadBaseDisplayItem;
37 class RPadBase :
public RDrawable {
41 using Primitive_t = Internal::RIOShared<RDrawable>;
45 std::vector<Primitive_t> fPrimitives;
48 std::unique_ptr<RFrame> fFrame;
51 RPadBase(
const RPadBase &) =
delete;
54 RPadBase &operator=(
const RPadBase &) =
delete;
58 RPadBase() : RDrawable(
"pad") {}
60 void CollectShared(Internal::RIOSharedVector_t &)
override;
62 void DisplayPrimitives(RPadBaseDisplayItem &paditem)
const;
66 using Primitives_t = std::vector<std::shared_ptr<RDrawable>>;
70 void UseStyle(
const std::shared_ptr<RStyle> &style)
override;
77 std::vector<std::vector<std::shared_ptr<RPad>>> Divide(
int nHoriz,
int nVert,
const RPadExtent &padding = {});
80 template<
class T,
class... ARGS>
81 auto Draw(ARGS... args)
83 auto drawable = std::make_shared<T>(args...);
85 fPrimitives.emplace_back(drawable);
91 auto Draw(std::shared_ptr<RDrawable> &&drawable)
93 fPrimitives.emplace_back(std::move(drawable));
95 return fPrimitives.back().get_shared();
101 template <
class T,
class... ARGS>
102 auto Draw(
const std::shared_ptr<T> &what, ARGS... args)
105 auto drawable = GetDrawable(what, args...);
107 fPrimitives.emplace_back(drawable);
113 unsigned NumPrimitives()
const {
return fPrimitives.size(); }
116 std::shared_ptr<RDrawable> GetPrimitive(
unsigned num)
const
118 if (num >= fPrimitives.size())
return nullptr;
119 return fPrimitives[num].get_shared();
122 std::shared_ptr<RDrawable> FindPrimitive(
const std::string &
id)
const;
124 std::shared_ptr<RDrawable> FindPrimitiveByDisplayId(
const std::string &display_id)
const;
127 auto GetPrimitives()
const
130 for (
auto &entry : fPrimitives)
131 res.emplace_back(entry.get_shared());
136 bool Remove(
const std::string &
id)
138 auto iter = std::find_if(fPrimitives.begin(), fPrimitives.end(),
139 [&id](
const Internal::RIOShared<RDrawable>& dr) {
return dr->GetId() == id; });
140 if (iter == fPrimitives.end())
143 fPrimitives.erase(iter);
148 bool Remove(
const std::shared_ptr<RDrawable> &drawable)
150 auto iter = std::find_if(fPrimitives.begin(), fPrimitives.end(),
151 [&drawable](
const Internal::RIOShared<RDrawable>& dr) {
return drawable.get() == dr.get(); });
152 if (iter == fPrimitives.end())
155 fPrimitives.erase(iter);
160 bool RemoveAt(
unsigned indx)
162 if (indx >= fPrimitives.size())
return false;
163 fPrimitives[indx].reset();
164 fPrimitives.erase(fPrimitives.begin() + indx);
169 void Wipe() { fPrimitives.clear(); }
171 void CreateFrameIfNeeded();
173 RFrame *GetOrCreateFrame();
174 const RFrame *GetFrame()
const {
return fFrame.get(); }
176 RPadUserAxisBase* GetOrCreateAxis(
size_t dimension);
177 RPadUserAxisBase* GetAxis(
size_t dimension)
const;
179 void SetAxisBounds(
int dimension,
double begin,
double end);
180 void SetAxisBound(
int dimension, RPadUserAxisBase::EAxisBoundsKind boundsKind,
double bound);
181 void SetAxisAutoBounds(
int dimension);
183 void SetAllAxisBounds(
const std::vector<std::array<double, 2>> &vecBeginAndEnd);
186 struct BoundKindAndValue {
187 RPadUserAxisBase::EAxisBoundsKind fKind = RPadUserAxisBase::kAxisBoundsAuto;
190 void SetAllAxisBound(
const std::vector<BoundKindAndValue> &vecBoundAndKind);
191 void SetAllAxisAutoBounds();
194 virtual std::array<RPadLength::Normal, 2> PixelsToNormal(
const std::array<RPadLength::Pixel, 2> &pos)
const = 0;
197 virtual const RCanvas *GetCanvas()
const = 0;
200 virtual RCanvas *GetCanvas() = 0;
203 std::array<RPadLength::Normal, 2> UserToNormal(
const std::array<RPadLength::User, 2> &pos)
const
205 return fFrame->UserToNormal(pos);
208 void AssignAutoColors();