9 #ifndef ROOT7_RDrawable
10 #define ROOT7_RDrawable
21 namespace Experimental {
41 virtual const void *GetIOPtr()
const = 0;
42 virtual bool HasShared()
const = 0;
43 virtual void *MakeShared() = 0;
44 virtual void SetShared(
void *shared) = 0;
45 virtual ~RIOSharedBase() =
default;
48 using RIOSharedVector_t = std::vector<RIOSharedBase *>;
51 class RIOShared final :
public RIOSharedBase {
52 std::shared_ptr<T> fShared;
55 const void *GetIOPtr() const final {
return fIO; }
56 virtual bool HasShared() const final {
return fShared.get() !=
nullptr; }
57 virtual void *MakeShared() final { fShared.reset(fIO);
return &fShared; }
58 virtual void SetShared(
void *shared)
final { fShared = *((std::shared_ptr<T> *) shared); }
60 RIOShared() =
default;
62 RIOShared(
const std::shared_ptr<T> &ptr) : RIOSharedBase()
68 RIOShared &operator=(
const std::shared_ptr<T> &ptr)
75 operator bool()
const {
return !!fShared || !!fIO; }
77 const T *
get()
const {
return fShared ? fShared.get() : fIO; }
78 T *
get() {
return fShared ? fShared.get() : fIO; }
80 const T *operator->()
const {
return get(); }
81 T *operator->() {
return get(); }
83 std::shared_ptr<T> get_shared()
const {
return fShared; }
85 void reset() { fShared.reset(); fIO =
nullptr; }
101 friend class RPadBase;
102 friend class RAttrBase;
104 friend class RLegend;
108 std::weak_ptr<RStyle> fStyle;
109 std::string fCssType;
110 std::string fCssClass;
115 virtual void CollectShared(Internal::RIOSharedVector_t &) {}
117 RAttrMap &GetAttrMap() {
return fAttr; }
118 const RAttrMap &GetAttrMap()
const {
return fAttr; }
120 bool MatchSelector(
const std::string &selector)
const;
122 virtual std::unique_ptr<RDisplayItem> Display()
const;
126 explicit RDrawable(
const std::string &type) : fCssType(type) {}
128 virtual ~RDrawable();
133 virtual void PopulateMenu(RMenuItems &){};
135 virtual void Execute(
const std::string &);
137 virtual void UseStyle(
const std::shared_ptr<RStyle> &style) { fStyle = style; }
138 void ClearStyle() { UseStyle(
nullptr); }
140 void SetCssClass(
const std::string &cl) { fCssClass = cl; }
141 const std::string &GetCssClass()
const {
return fCssClass; }
143 const std::string &GetCssType()
const {
return fCssType; }
145 const std::string &GetId()
const {
return fId; }
146 void SetId(
const std::string &
id) { fId = id; }
152 template <
class DRAWABLE, std::enable_if_t<std::is_base_of<RDrawable, DRAWABLE>{}>* =
nullptr>
153 inline auto GetDrawable(
const std::shared_ptr<DRAWABLE> &drawable)