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();