guit  0.1
 All Classes Functions Variables Typedefs Enumerations Friends
gbox.hpp
1 //
2 // Container gadget and variants
3 // Guit GUI Toolkit
4 // Copyright © 2021 Eric Lecolinet. All rights reserved.
5 // http://www.telecom-paris.fr/~elc
6 //
7 
8 #ifndef Guit_Box_hpp
9 #define Guit_Box_hpp
10 #include <vector>
11 #include <gadget.hpp>
12 namespace guit {
13 
56 class GBox : public Gadget {
57 protected:
58  GBox(GadgetType& c) : Gadget(c) {}
59  GBox(GadgetType&, GString const& css_and_title);
60 
61 public:
62  using IsBox = bool;
63 
64  virtual ~GBox();
65  GBox(GString const& css_and_title = "");
66  GBox& clone(GClone const&) override;
67 
68  GBox* toBox() override {return this;}
69  GBox const* toBox() const override {return this;}
70 
74  virtual GChoice* choiceProp();
75  virtual GProp* valueProp() override;
77 
78  enum Remove {
79  InContent = 1<<0, InBorder = 1<<1, Internals = 1<<2
80  };
81 
87  virtual Gadget* findChild(GadgetType& type, bool in_border = false) const;
88 
89  template <class T>
90  T* findChild(bool in_border = false) const {
91  return dynamic_cast<T*>(findChild(T::Type(), in_border));
92  }
94 
102  virtual Gadget* childAt(int pos) const;
103  Gadget& operator[](int index) const;
105 
109  virtual int childPos(Gadget* child) const;
110  int childPos(Gadget& child) const {return childPos(&child);}
112 
113  //int borderPos(int place) const;
114  int borderPos(Gadget& child) const;
115 
123  virtual Gadget* childAtPoint(GPoint const& point, bool indirect = false,
124  GPredicate const& = {});
125  virtual Gadget* childAtWPoint(GPoint const& wpoint, bool indirect = false,
126  GPredicate const& pred = {});
128 
131  virtual int nearestChildIndex(GPoint const& wpoint, bool localpos);
132 
137  GadgetList& children() {return children_;}
138  const GadgetList& children() const {return children_;}
140 
142  int childCount() const;
143 
144  using Gadget::contain;
145 
150  virtual bool contain(Gadget* child, bool indirect = false) const;
151  bool contain(Gadget& child, bool indirect = false) const {
152  return GBox::contain(&child, indirect);
153  }
155 
159  virtual void perform(std::function<void(Gadget& child)> fun);
160 
165  virtual void perform(std::function<void(Gadget& child, int index)> fun);
166 
167  using Gadget::add;
168 
183  virtual void add(Gadget* child, int index = -1);
184  virtual void add(Gadget& child, int index = -1) {GBox::add(&child, index);}
186 
187  virtual bool borderAdd(Gadget* child, Place place);
188  virtual bool borderAdd(Gadget& child, Place place) {return borderAdd(&child,place);}
189 
197  void add(GString const& item) override;
198  void add(GString const& item, int index);
199  void add(GStrings const& itemlist);
201 
202  using Gadget::remove;
203 
208  virtual bool remove(Gadget* child);
209  virtual bool remove(Gadget& child) {return GBox::remove(&child);}
211 
215  virtual bool removeAt(int pos);
216 
219  virtual void removeChildren(Remove mode = Remove::InContent);
220 
223  void cleanup() override;
224 
225  enum struct ChoiceBehavior : uint8_t {
226  NoChoice=0, Select=1, Show=2
227  };
228 
230  ChoiceBehavior choiceBehavior() const {return ChoiceBehavior(modes_.choiceBehavior);}
231 
232  void setValue(GString const&) override;
233  void clearValues() override;
234 
235  void doPaint(GRenderGraphics&, GRender* parent_render) override;
236  Gadget* doPick(GPoint const&, class GPickMode&) override;
237 
238  using GType = GadgetType_<GBox,Gadget>;
239  static GType& Type();
240  GType& type() const override {return Type();}
241 
245  virtual void topInit();
246  virtual void initChildren(GRender* parrender);
247  void initClone(Gadget& from, GClone const&) override;
248  void addProp(GProp&, bool add_to_proplist) override;
249  virtual void addItem(class GItemSpec const& item);
250  Gadget* addItemImpl(GString const& item, int index, GString& defclass);
251  virtual Gadget& createDefaultItem(GString const& arg);
252  virtual void setChoiceImpl(GChoice& c, bool add_to_list);
253 
254  virtual GDim computeInsideSize(GRender&);
255  virtual void computeInsideSizeColumn(GDim& boxsize, GRender&);
256  virtual void computeInsideSizeRow(GDim& boxsize, GRender&);
257  virtual void computeInsideSizeStack(GDim& boxsize, GRender&);
258  GRect childrenArea(GRender&) const;
259 
260  void pack(GRender* parent_render) override;
261  virtual void packColumn(GRect& ch_area, GRender&);
262  virtual void packRow(GRect& ch_area, GRender&);
263  virtual void packPie(GRect& ch_area, GRender&);
264  virtual void packStack(GRect& ch_area, GRender&);
265  virtual void packBorders(GRect& ch_area, GRender&); // changes ch_area
266  void moveImpl(float winx, float winy, bool callcb) override;
267 
268  struct BorderChild {
269  BorderChild(Gadget* c, Place p) : child_(c), place_(p) {}
270  gptr<Gadget> child_;
271  Place place_;
272  };
273  using BorderList = std::vector<BorderChild>;
274  GadgetList children_;
275  BorderList* bchildren_{};
276  //virtual BorderList* borderChildren() {return bchildren_;}
277  //virtual BorderList const* borderChildren() const {return bchildren_;}
279 };
280 
281 
283 using GVBox = GBox;
284 
286 class GHBox : public GBox {
287 public:
288  GHBox(GString const& css_and_title = "") : GBox(Type(), css_and_title) {}
289 
291  static GType& Type();
292  GType& type() const override {return Type();}
293 };
294 
295 
297 class GPane : public GBox {
298 public:
299  GPane(GString const& css_and_title = "") : GBox(Type(), css_and_title) {}
300 
302  static GType& Type();
303  GType& type() const override {return Type();}
304 };
305 
306 
307 
310 GBox& Box(GString const& css_and_title = "");
311 GVBox& VBox(GString const& css_and_title = "");
312 GHBox& HBox(GString const& css_and_title = "");
313 GPane& Pane(GString const& css_and_title = "");
315 
316 
317 
327 class GButtonBox : public GBox {
328 protected:
329  GButtonBox(GadgetType&, GString const& css_and_title);
330 
331 public:
332  GButtonBox(GString const& css_and_title = "");
333 
334  Gadget& createDefaultItem(GString const& arg) override;
335 
337  static GType& Type();
338  GType& type() const override {return Type();}
339 };
340 
341 GButtonBox& ButtonBox(GString const& css_and_title = "");
342 
343 
344 }
345 #endif