SGL
gcontainer.h
1 /*
2  * File: gcontainer.h
3  * ------------------
4  *
5  * @author Marty Stepp
6  * @version 2021/04/09
7  * - added sgl namespace
8  * @version 2021/04/03
9  * - removed dependency on custom collections
10  * @version 2018/09/25
11  * - added getLayout method
12  * @version 2018/09/19
13  * - added contains, regionContains methods
14  * @version 2018/09/07
15  * - added doc comments for new documentation generation
16  * @version 2018/08/29
17  * - initial version
18  */
19 
20 
21 #ifndef _gcontainer_h
22 #define _gcontainer_h
23 
24 #include <map>
25 #include <vector>
26 #include <QBoxLayout>
27 #include <QLayout>
28 
29 #include "ginteractor.h"
30 
31 namespace sgl {
32 
33 class _Internal_QContainer; // forward declaration
34 
73 class GContainer : public GInteractor {
74 public:
78  static const int MARGIN_DEFAULT;
79 
83  static const int SPACING_DEFAULT;
84 
88  enum Layout {
94  };
95 
100  enum Region {
106  };
107 
111  GContainer(Layout layout = LAYOUT_FLOW_HORIZONTAL, QWidget* parent = nullptr);
112 
117  GContainer(Layout layout, int rows, int cols, QWidget* parent = nullptr);
118 
122  ~GContainer() override;
123 
130  virtual void add(GInteractor* interactor);
131 
137  virtual void add(GInteractor& interactor);
138 
147  virtual void addToGrid(GInteractor* interactor, int row, int col, int rowspan = 1, int colspan = 1);
148 
156  virtual void addToGrid(GInteractor& interactor, int row, int col, int rowspan = 1, int colspan = 1);
157 
164  virtual void addToRegion(GInteractor* interactor, Region region);
165 
172  virtual void addToRegion(GInteractor* interactor, const string& region = "Center");
173 
179  virtual void addToRegion(GInteractor& interactor, Region region);
180 
186  virtual void addToRegion(GInteractor& interactor, const string& region = "Center");
187 
191  virtual void clear();
192 
198  virtual void clearRegion(Region region);
199 
205  virtual void clearRegion(const string& region);
206 
211  virtual bool contains(GInteractor* interactor) const;
212 
216  virtual bool contains(GInteractor& interactor) const;
217 
225  virtual std::vector<GInteractor*> getDescendents(const string& type = "") const;
226 
231  virtual GInteractor* getInteractor(int i) const;
232 
236  virtual const std::vector<GInteractor*>& getInteractors() const;
237 
241  virtual int getInteractorCount() const;
242 
249  virtual GInteractor* getInteractorByRegion(int i, Region region) const;
250 
257  virtual GInteractor* getInteractorByRegion(int i, const string& region = "Center") const;
258 
264  virtual int getInteractorCountByRegion(Region region) const;
265 
271  virtual int getInteractorCountByRegion(const string& region = "Center") const;
272 
273  /* @inherit */
274  _Internal_QWidget* getInternalWidget() const override;
275 
279  virtual Layout getLayout() const;
280 
284  virtual double getMargin() const;
285 
289  virtual double getPadding() const;
290 
294  virtual double getPaddingBottom() const;
295 
299  virtual double getPaddingLeft() const;
300 
304  virtual double getPaddingRight() const;
305 
309  virtual double getPaddingTop() const;
310 
311  /* @inherit */
312  GDimension getPreferredSize() const override;
313 
319  virtual double getRegionHeight(Region region) const;
320 
326  virtual double getRegionHeight(const string& region) const;
327 
333  virtual GDimension getRegionSize(Region region) const;
334 
340  virtual GDimension getRegionSize(const string& region) const;
341 
347  virtual double getRegionWidth(Region region) const;
348 
354  virtual double getRegionWidth(const string& region) const;
355 
359  virtual double getSpacing() const;
360 
361  /* @inherit */
362  string getType() const override;
363 
364  /* @inherit */
365  QWidget* getWidget() const override;
366 
371  virtual void insert(int index, GInteractor* interactor);
372 
377  virtual void insert(int index, GInteractor& interactor);
378 
385  virtual void insertToRegion(int index, GInteractor* interactor, Region region);
386 
393  virtual void insertToRegion(int index, GInteractor* interactor, const string& region = "Center");
394 
401  virtual void insertToRegion(int index, GInteractor& interactor, Region region);
402 
409  virtual void insertToRegion(int index, GInteractor& interactor, const string& region = "Center");
410 
414  virtual bool isEmpty() const;
415 
422  virtual bool regionContains(GInteractor* interactor, Region region) const;
423 
430  virtual bool regionContains(GInteractor* interactor, const string& region) const;
431 
437  virtual bool regionContains(GInteractor& interactor, Region region) const;
438 
444  virtual bool regionContains(GInteractor& interactor, const string& region) const;
445 
452  virtual void remove(GInteractor* interactor);
453 
459  virtual void remove(GInteractor& interactor);
460 
466  virtual void remove(int index);
467 
475  virtual void removeFromRegion(GInteractor* interactor, Region region);
476 
484  virtual void removeFromRegion(GInteractor* interactor, const string& region);
485 
492  virtual void removeFromRegion(GInteractor& interactor, Region region);
493 
500  virtual void removeFromRegion(GInteractor& interactor, const string& region);
501 
509  virtual void removeFromRegion(int index, Region region);
510 
518  virtual void removeFromRegion(int index, const string& region);
519 
523  virtual void setAlignment(HorizontalAlignment halign, VerticalAlignment valign);
524 
528  virtual void setHorizontalAlignment(HorizontalAlignment halign);
529 
533  virtual void setMargin(double px);
534 
538  virtual void setPadding(double px);
539 
544  virtual void setPadding(double topBottom, double leftRight);
545 
550  virtual void setPadding(double top, double right, double bottom, double left);
551 
555  virtual void setVerticalAlignment(VerticalAlignment valign);
556 
563  virtual void setRegionAlignment(Region region, HorizontalAlignment halign);
564 
571  virtual void setRegionAlignment(Region region, VerticalAlignment valign);
572 
579  virtual void setRegionAlignment(Region region, HorizontalAlignment halign, VerticalAlignment valign);
580 
587  virtual void setRegionAlignment(const string& region, const string& align);
588 
595  virtual void setRegionAlignment(const string& region, const string& halign, const string& valign);
596 
603  virtual void setRegionHorizontalAlignment(Region region, HorizontalAlignment halign);
604 
611  virtual void setRegionHorizontalAlignment(const string& region, const string& halign);
612 
619  virtual void setRegionVerticalAlignment(const string& region, const string& valign);
620 
627  virtual void setRegionVerticalAlignment(Region region, VerticalAlignment valign);
628 
632  virtual void setSpacing(double px);
633 
634 private:
635  Q_DISABLE_COPY(GContainer)
636 
637  _Internal_QContainer* _iqcontainer;
638  std::vector<GInteractor*> _interactors;
639  std::map<Region, std::vector<GInteractor*>> _interactorsByRegion;
640  Layout _layout;
641 
642  friend class _Internal_QContainer;
643  friend class GWindow;
644 
645  static Region stringToRegion(const string& regionStr);
646 };
647 
648 
653 class _Internal_QContainer : public QWidget, public _Internal_QWidget {
654  Q_OBJECT
655 
656 public:
657  _Internal_QContainer(GContainer* gcontainer, GContainer::Layout layoutType, QWidget* parent = nullptr);
658  _Internal_QContainer(GContainer* gcontainer, int rows, int cols, QWidget* parent = nullptr);
659  QSize sizeHint() const override;
660 
661 private:
662  GContainer* _gcontainer;
663  GContainer::Layout _layoutType;
664  HorizontalAlignment _halign;
665  VerticalAlignment _valign;
666  int _margin;
667  int _spacing;
668  // int _rows;
669  int _cols;
670  int _currentIndex;
671 
672  // border layout regions for N/S/W/E/C:
673  // +------------------------+
674  // | north |
675  // |------------------------|
676  // | middle |
677  // |+----------------------+|
678  // || west | center | east ||
679  // |+----------------------+|
680  // |------------------------|
681  // | south |
682  // +------------------------+
683  // sizing/stretching rules:
684  // - N/S expand horizontally
685  // - W/E expand vertically
686  // - C takes all remaining space
687  // - each widget other than Center widget appears at its preferred ("hinted") size
688  QVBoxLayout* _overallLayout;
689  QHBoxLayout* _northLayout;
690  QHBoxLayout* _southLayout;
691  QVBoxLayout* _westLayout;
692  QVBoxLayout* _eastLayout;
693  QHBoxLayout* _centerLayout;
694  QHBoxLayout* _middleLayout;
695  std::map<GContainer::Region, HorizontalAlignment> _halignMap;
696  std::map<GContainer::Region, VerticalAlignment> _valignMap;
697  std::map<GContainer::Region, bool> _regionStretchMap;
698 
699  virtual void add(QWidget* widget);
700  virtual void addToGrid(QWidget* widget, int row, int col, int rowspan = 1, int colspan = 1);
701  virtual void addToRegion(QWidget* widget, GContainer::Region region);
702  virtual void clear();
703  virtual void clearRegion(GContainer::Region region);
704  virtual bool contains(QWidget* widget) const;
705  void detach() override;
706  virtual void fixAlignment(QWidget* widget, GContainer::Region region = GContainer::REGION_CENTER);
707  virtual void fixMargin(QLayout* layout, bool hasStretch = false);
708  virtual HorizontalAlignment getHorizontalAlignment() const;
709  virtual VerticalAlignment getVerticalAlignment() const;
710  virtual GContainer::Layout getLayoutType() const;
711  virtual int getMargin() const;
712  QSize getPreferredSize() const override;
713  virtual QLayout* getQLayout() const;
714  virtual int getSpacing() const;
715  virtual void insert(int i, QWidget* widget);
716  virtual void insertToRegion(int i, QWidget* widget, GContainer::Region region);
717  virtual bool isRegionStretch(GContainer::Region region) const;
718  virtual QLayout* layoutForRegion(GContainer::Region region) const;
719  virtual bool regionContains(QWidget* widget, GContainer::Region region) const;
720  virtual void remove(QWidget* widget);
721  virtual void removeFromRegion(QWidget* widget, GContainer::Region region);
722  virtual void remove(int i);
723  virtual void removeFromRegion(int i, GContainer::Region region);
724  virtual void setHorizontalAlignment(HorizontalAlignment halign);
725  virtual void setLayoutType(GContainer::Layout layout);
726  virtual void setMargin(int margin);
727  virtual void setPadding(int padding);
728  virtual void setPadding(int left, int top, int right, int bottom);
729  virtual void setRegionAlignment(GContainer::Region region,
730  HorizontalAlignment halign,
731  VerticalAlignment valign);
732  virtual void setRegionHorizontalAlignment(GContainer::Region region,
733  HorizontalAlignment halign);
734  virtual void setRegionStretch(GContainer::Region region, bool stretch = true);
735  virtual void setRegionVerticalAlignment(GContainer::Region region,
736  VerticalAlignment valign);
737  virtual void setSpacing(int spacing);
738  virtual void setVerticalAlignment(VerticalAlignment valign);
739 
740  friend class GContainer;
741 };
742 
743 } // namespace sgl
744 
745 #endif // _gcontainer_h
A GContainer is a logical grouping for interactors.
Definition: gcontainer.h:73
This class represents a graphics window that supports simple graphics.
Definition: gwindow.h:102
HorizontalAlignment
The supported kinds of horizontal alignment of a widget or onscreen object.
Definition: gtypes.h:136
Definition: gcontainer.h:103
Definition: gcontainer.h:104
virtual void addToGrid(GInteractor *interactor, int row, int col, int rowspan=1, int colspan=1)
Adds the given interactor to the given row and column in this container, which is assumed to use a gr...
Definition: gcontainer.cpp:89
static const int SPACING_DEFAULT
Default spacing between neighboring interactors.
Definition: gcontainer.h:83
virtual bool contains(GInteractor *interactor) const
Returns true if the given interactor is found in this container.
Definition: gcontainer.cpp:167
virtual void addToRegion(GInteractor *interactor, Region region)
Adds the given interactor to the given region in this container, which is assumed to use a border lay...
Definition: gcontainer.cpp:105
virtual void setAlignment(HorizontalAlignment halign, VerticalAlignment valign)
Sets the horizontal and vertical alignment of interactors in this container.
Definition: gcontainer.cpp:450
virtual double getPaddingTop() const
Returns the padding on the top side of this container in pixels.
Definition: gcontainer.cpp:255
GDimension getPreferredSize() const override
Returns a GDimension structure storing the width and height in pixels that this interactor would pref...
Definition: gcontainer.cpp:259
virtual void setRegionVerticalAlignment(string region, string valign)
Sets the vertical alignment of interactors in the given region of this container, which is assumed to...
Definition: gcontainer.cpp:523
virtual double getPaddingRight() const
Returns the padding on the right side of this container in pixels.
Definition: gcontainer.cpp:251
Definition: gcontainer.h:91
Definition: gcontainer.h:89
virtual void insert(int index, GInteractor *interactor)
Adds the given interactor to this container just before the given index.
Definition: gcontainer.cpp:306
Definition: gcontainer.h:101
virtual bool regionContains(GInteractor *interactor, Region region) const
Returns true if the given interactor is found in the given region of this container, which is assumed to use a border layout.
Definition: gcontainer.cpp:357
virtual void removeFromRegion(GInteractor *interactor, Region region)
Removes the given interactor from the given region within this container, which is assumed to use a b...
Definition: gcontainer.cpp:407
Region
The five regions of border layouts.
Definition: gcontainer.h:100
QWidget* getWidget() const override
Returns a direct pointer to the internal Qt widget being wrapped by this interactor.
Definition: gcontainer.cpp:302
Definition: console.h:45
This abstract class is the superclass for all graphical interactors.
Definition: ginteractor.h:52
Definition: gcontainer.h:105
virtual const std::vector< GInteractor * > & getInteractors() const
Returns a vector of all children interactors in this container.
Definition: gcontainer.cpp:201
virtual double getSpacing() const
Returns the spacing between widgets in this container in pixels.
Definition: gcontainer.cpp:294
virtual double getPadding() const
Returns the padding inside this container in pixels.
Definition: gcontainer.cpp:238
virtual Layout getLayout() const
Returns the type of layout used by this container.
Definition: gcontainer.cpp:230
virtual GInteractor * getInteractorByRegion(int i, Region region) const
Returns the child interactor at the given 0-based index within the given region in this container...
Definition: gcontainer.cpp:209
virtual double getRegionHeight(Region region) const
Returns the height in pixels of the given region of this container, which is assumed to use a border ...
Definition: gcontainer.cpp:264
virtual GDimension getRegionSize(Region region) const
Returns the width and height in pixels of the given region of this container, which is assumed to use...
Definition: gcontainer.cpp:272
virtual void clear()
Removes all interactors from this container.
Definition: gcontainer.cpp:138
virtual void insertToRegion(int index, GInteractor *interactor, Region region)
Adds the given interactor to the given layout region within this container just before the given inde...
Definition: gcontainer.cpp:325
virtual int getInteractorCount() const
Returns the number of children interactors in this container.
Definition: gcontainer.cpp:205
virtual std::vector< GInteractor * > getDescendents(string type="") const
Returns all interactors that are children or descendents inside this container.
Definition: gcontainer.cpp:179
_Internal_QWidget* getInternalWidget() const override
Returns a direct pointer to the internal Qt widget being wrapped by this interactor.
Definition: gcontainer.cpp:226
Definition: gcontainer.h:92
This struct contains real-valued width and height fields.
Definition: gtypes.h:43
Layout
The various layout management styles that containers can use.
Definition: gcontainer.h:88
virtual void setVerticalAlignment(VerticalAlignment valign)
Sets the vertical alignment of interactors in this container.
Definition: gcontainer.cpp:533
GContainer(Layout layout=LAYOUT_FLOW_HORIZONTAL, QWidget* parent=nullptr)
Creates a new container with the given layout.
Definition: gcontainer.cpp:45
virtual void setHorizontalAlignment(HorizontalAlignment halign)
Sets the horizontal alignment of interactors in this container.
Definition: gcontainer.cpp:455
virtual void setRegionHorizontalAlignment(Region region, HorizontalAlignment halign)
Sets the horizontal alignment of interactors in the given region of this container, which is assumed to use a border layout.
Definition: gcontainer.cpp:507
virtual void setMargin(double px)
Sets the margin in pixels around interactors in this container.
Definition: gcontainer.cpp:461
virtual GInteractor * getInteractor(int i) const
Returns the child interactor at the given 0-based index in this container.
Definition: gcontainer.cpp:197
~GContainer() override
Frees memory allocated internally by the container.
Definition: gcontainer.cpp:63
virtual void setPadding(double px)
Sets the padding on all 4 sides around widgets in this container.
Definition: gcontainer.cpp:467
static const int MARGIN_DEFAULT
Default margin around each interactor.
Definition: gcontainer.h:78
virtual double getPaddingLeft() const
Returns the padding on the left side of this container in pixels.
Definition: gcontainer.cpp:247
virtual int getInteractorCountByRegion(Region region) const
Returns the number of children interactors within the given region in this container, which is assumed to use a border layout.
Definition: gcontainer.cpp:217
virtual void add(GInteractor *interactor)
Adds the given interactor to the end of the list of interactors in this container.
Definition: gcontainer.cpp:69
Definition: gcontainer.h:93
string getType() const override
Returns a string representing the class name of this interactor, such as "GButton" or "GCheckBox"...
Definition: gcontainer.cpp:298
virtual double getRegionWidth(Region region) const
Returns the width in pixels of the given region of this container, which is assumed to use a border l...
Definition: gcontainer.cpp:286
Definition: gcontainer.h:102
virtual double getMargin() const
Returns the margin around each widget in this container in pixels.
Definition: gcontainer.cpp:234
virtual void setSpacing(double px)
Sets the spacing between interactors in this container.
Definition: gcontainer.cpp:527
virtual double getPaddingBottom() const
Returns the padding on the bottom side of this container in pixels.
Definition: gcontainer.cpp:243
virtual void setRegionAlignment(Region region, HorizontalAlignment halign)
Sets the horizontal alignment of interactors in the given region of this container, which is assumed to use a border layout.
Definition: gcontainer.cpp:481
Definition: gcontainer.h:90
virtual bool isEmpty() const
Returns true if the container does not contain any interactors.
Definition: gcontainer.cpp:353
virtual void clearRegion(Region region)
Removes all interactors from the given region of this container, which is assumed to use a border lay...
Definition: gcontainer.cpp:150
VerticalAlignment
The supported kinds of vertical alignment of a widget or onscreen object.
Definition: gtypes.h:147