SGL
gcontainer.h
1 /*
2  * File: gcontainer.h
3  * ------------------
4  *
5  * @author Marty Stepp
6  * @version 2021/04/03
7  * - removed dependency on custom collections
8  * @version 2018/09/25
9  * - added getLayout method
10  * @version 2018/09/19
11  * - added contains, regionContains methods
12  * @version 2018/09/07
13  * - added doc comments for new documentation generation
14  * @version 2018/08/29
15  * - initial version
16  */
17 
18 
19 #ifndef _gcontainer_h
20 #define _gcontainer_h
21 
22 #include <map>
23 #include <vector>
24 #include <QBoxLayout>
25 #include <QLayout>
26 
27 #include "ginteractor.h"
28 
29 class _Internal_QContainer; // forward declaration
30 
69 class GContainer : public GInteractor {
70 public:
74  static const int MARGIN_DEFAULT;
75 
79  static const int SPACING_DEFAULT;
80 
84  enum Layout {
90  };
91 
96  enum Region {
102  };
103 
107  GContainer(Layout layout = LAYOUT_FLOW_HORIZONTAL, QWidget* parent = nullptr);
108 
113  GContainer(Layout layout, int rows, int cols, QWidget* parent = nullptr);
114 
118  ~GContainer() override;
119 
126  virtual void add(GInteractor* interactor);
127 
133  virtual void add(GInteractor& interactor);
134 
143  virtual void addToGrid(GInteractor* interactor, int row, int col, int rowspan = 1, int colspan = 1);
144 
152  virtual void addToGrid(GInteractor& interactor, int row, int col, int rowspan = 1, int colspan = 1);
153 
160  virtual void addToRegion(GInteractor* interactor, Region region);
161 
168  virtual void addToRegion(GInteractor* interactor, const string& region = "Center");
169 
175  virtual void addToRegion(GInteractor& interactor, Region region);
176 
182  virtual void addToRegion(GInteractor& interactor, const string& region = "Center");
183 
187  virtual void clear();
188 
194  virtual void clearRegion(Region region);
195 
201  virtual void clearRegion(const string& region);
202 
207  virtual bool contains(GInteractor* interactor) const;
208 
212  virtual bool contains(GInteractor& interactor) const;
213 
221  virtual std::vector<GInteractor*> getDescendents(const string& type = "") const;
222 
227  virtual GInteractor* getInteractor(int i) const;
228 
232  virtual const std::vector<GInteractor*>& getInteractors() const;
233 
237  virtual int getInteractorCount() const;
238 
245  virtual GInteractor* getInteractorByRegion(int i, Region region) const;
246 
253  virtual GInteractor* getInteractorByRegion(int i, const string& region = "Center") const;
254 
260  virtual int getInteractorCountByRegion(Region region) const;
261 
267  virtual int getInteractorCountByRegion(const string& region = "Center") const;
268 
269  /* @inherit */
270  _Internal_QWidget* getInternalWidget() const override;
271 
275  virtual Layout getLayout() const;
276 
280  virtual double getMargin() const;
281 
285  virtual double getPadding() const;
286 
290  virtual double getPaddingBottom() const;
291 
295  virtual double getPaddingLeft() const;
296 
300  virtual double getPaddingRight() const;
301 
305  virtual double getPaddingTop() const;
306 
307  /* @inherit */
308  GDimension getPreferredSize() const override;
309 
315  virtual double getRegionHeight(Region region) const;
316 
322  virtual double getRegionHeight(const string& region) const;
323 
329  virtual GDimension getRegionSize(Region region) const;
330 
336  virtual GDimension getRegionSize(const string& region) const;
337 
343  virtual double getRegionWidth(Region region) const;
344 
350  virtual double getRegionWidth(const string& region) const;
351 
355  virtual double getSpacing() const;
356 
357  /* @inherit */
358  string getType() const override;
359 
360  /* @inherit */
361  QWidget* getWidget() const override;
362 
367  virtual void insert(int index, GInteractor* interactor);
368 
373  virtual void insert(int index, GInteractor& interactor);
374 
381  virtual void insertToRegion(int index, GInteractor* interactor, Region region);
382 
389  virtual void insertToRegion(int index, GInteractor* interactor, const string& region = "Center");
390 
397  virtual void insertToRegion(int index, GInteractor& interactor, Region region);
398 
405  virtual void insertToRegion(int index, GInteractor& interactor, const string& region = "Center");
406 
410  virtual bool isEmpty() const;
411 
418  virtual bool regionContains(GInteractor* interactor, Region region) const;
419 
426  virtual bool regionContains(GInteractor* interactor, const string& region) const;
427 
433  virtual bool regionContains(GInteractor& interactor, Region region) const;
434 
440  virtual bool regionContains(GInteractor& interactor, const string& region) const;
441 
448  virtual void remove(GInteractor* interactor);
449 
455  virtual void remove(GInteractor& interactor);
456 
462  virtual void remove(int index);
463 
471  virtual void removeFromRegion(GInteractor* interactor, Region region);
472 
480  virtual void removeFromRegion(GInteractor* interactor, const string& region);
481 
488  virtual void removeFromRegion(GInteractor& interactor, Region region);
489 
496  virtual void removeFromRegion(GInteractor& interactor, const string& region);
497 
505  virtual void removeFromRegion(int index, Region region);
506 
514  virtual void removeFromRegion(int index, const string& region);
515 
519  virtual void setAlignment(HorizontalAlignment halign, VerticalAlignment valign);
520 
524  virtual void setHorizontalAlignment(HorizontalAlignment halign);
525 
529  virtual void setMargin(double px);
530 
534  virtual void setPadding(double px);
535 
540  virtual void setPadding(double topBottom, double leftRight);
541 
546  virtual void setPadding(double top, double right, double bottom, double left);
547 
551  virtual void setVerticalAlignment(VerticalAlignment valign);
552 
559  virtual void setRegionAlignment(Region region, HorizontalAlignment halign);
560 
567  virtual void setRegionAlignment(Region region, VerticalAlignment valign);
568 
575  virtual void setRegionAlignment(Region region, HorizontalAlignment halign, VerticalAlignment valign);
576 
583  virtual void setRegionAlignment(const string& region, const string& align);
584 
591  virtual void setRegionAlignment(const string& region, const string& halign, const string& valign);
592 
599  virtual void setRegionHorizontalAlignment(Region region, HorizontalAlignment halign);
600 
607  virtual void setRegionHorizontalAlignment(const string& region, const string& halign);
608 
615  virtual void setRegionVerticalAlignment(const string& region, const string& valign);
616 
623  virtual void setRegionVerticalAlignment(Region region, VerticalAlignment valign);
624 
628  virtual void setSpacing(double px);
629 
630 private:
631  Q_DISABLE_COPY(GContainer)
632 
633  _Internal_QContainer* _iqcontainer;
634  std::vector<GInteractor*> _interactors;
635  std::map<Region, std::vector<GInteractor*>> _interactorsByRegion;
636  Layout _layout;
637 
638  friend class _Internal_QContainer;
639  friend class GWindow;
640 
641  static Region stringToRegion(const string& regionStr);
642 };
643 
644 
649 class _Internal_QContainer : public QWidget, public _Internal_QWidget {
650  Q_OBJECT
651 
652 public:
653  _Internal_QContainer(GContainer* gcontainer, GContainer::Layout layoutType, QWidget* parent = nullptr);
654  _Internal_QContainer(GContainer* gcontainer, int rows, int cols, QWidget* parent = nullptr);
655  QSize sizeHint() const override;
656 
657 private:
658  GContainer* _gcontainer;
659  GContainer::Layout _layoutType;
660  HorizontalAlignment _halign;
661  VerticalAlignment _valign;
662  int _margin;
663  int _spacing;
664  // int _rows;
665  int _cols;
666  int _currentIndex;
667 
668  // border layout regions for N/S/W/E/C:
669  // +------------------------+
670  // | north |
671  // |------------------------|
672  // | middle |
673  // |+----------------------+|
674  // || west | center | east ||
675  // |+----------------------+|
676  // |------------------------|
677  // | south |
678  // +------------------------+
679  // sizing/stretching rules:
680  // - N/S expand horizontally
681  // - W/E expand vertically
682  // - C takes all remaining space
683  // - each widget other than Center widget appears at its preferred ("hinted") size
684  QVBoxLayout* _overallLayout;
685  QHBoxLayout* _northLayout;
686  QHBoxLayout* _southLayout;
687  QVBoxLayout* _westLayout;
688  QVBoxLayout* _eastLayout;
689  QHBoxLayout* _centerLayout;
690  QHBoxLayout* _middleLayout;
691  std::map<GContainer::Region, HorizontalAlignment> _halignMap;
692  std::map<GContainer::Region, VerticalAlignment> _valignMap;
693  std::map<GContainer::Region, bool> _regionStretchMap;
694 
695  virtual void add(QWidget* widget);
696  virtual void addToGrid(QWidget* widget, int row, int col, int rowspan = 1, int colspan = 1);
697  virtual void addToRegion(QWidget* widget, GContainer::Region region);
698  virtual void clear();
699  virtual void clearRegion(GContainer::Region region);
700  virtual bool contains(QWidget* widget) const;
701  void detach() override;
702  virtual void fixAlignment(QWidget* widget, GContainer::Region region = GContainer::REGION_CENTER);
703  virtual void fixMargin(QLayout* layout, bool hasStretch = false);
704  virtual HorizontalAlignment getHorizontalAlignment() const;
705  virtual VerticalAlignment getVerticalAlignment() const;
706  virtual GContainer::Layout getLayoutType() const;
707  virtual int getMargin() const;
708  QSize getPreferredSize() const override;
709  virtual QLayout* getQLayout() const;
710  virtual int getSpacing() const;
711  virtual void insert(int i, QWidget* widget);
712  virtual void insertToRegion(int i, QWidget* widget, GContainer::Region region);
713  virtual bool isRegionStretch(GContainer::Region region) const;
714  virtual QLayout* layoutForRegion(GContainer::Region region) const;
715  virtual bool regionContains(QWidget* widget, GContainer::Region region) const;
716  virtual void remove(QWidget* widget);
717  virtual void removeFromRegion(QWidget* widget, GContainer::Region region);
718  virtual void remove(int i);
719  virtual void removeFromRegion(int i, GContainer::Region region);
720  virtual void setHorizontalAlignment(HorizontalAlignment halign);
721  virtual void setLayoutType(GContainer::Layout layout);
722  virtual void setMargin(int margin);
723  virtual void setPadding(int padding);
724  virtual void setPadding(int left, int top, int right, int bottom);
725  virtual void setRegionAlignment(GContainer::Region region,
726  HorizontalAlignment halign,
727  VerticalAlignment valign);
728  virtual void setRegionHorizontalAlignment(GContainer::Region region,
729  HorizontalAlignment halign);
730  virtual void setRegionStretch(GContainer::Region region, bool stretch = true);
731  virtual void setRegionVerticalAlignment(GContainer::Region region,
732  VerticalAlignment valign);
733  virtual void setSpacing(int spacing);
734  virtual void setVerticalAlignment(VerticalAlignment valign);
735 
736  friend class GContainer;
737 };
738 
739 #endif // _gcontainer_h
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:282
virtual void add(GInteractor *interactor)
Adds the given interactor to the end of the list of interactors in this container.
Definition: gcontainer.cpp:65
This struct contains real-valued width and height fields.
Definition: gtypes.h:39
virtual const std::vector< GInteractor * > & getInteractors() const
Returns a vector of all children interactors in this container.
Definition: gcontainer.cpp:197
virtual double getSpacing() const
Returns the spacing between widgets in this container in pixels.
Definition: gcontainer.cpp:290
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:268
static const int MARGIN_DEFAULT
Default margin around each interactor.
Definition: gcontainer.h:74
virtual bool isEmpty() const
Returns true if the container does not contain any interactors.
Definition: gcontainer.cpp:349
virtual double getPaddingBottom() const
Returns the padding on the bottom side of this container in pixels.
Definition: gcontainer.cpp:239
Definition: gcontainer.h:85
virtual double getPadding() const
Returns the padding inside this container in pixels.
Definition: gcontainer.cpp:234
GDimension getPreferredSize() const override
Returns a GDimension structure storing the width and height in pixels that this interactor would pref...
Definition: gcontainer.cpp:255
virtual double getMargin() const
Returns the margin around each widget in this container in pixels.
Definition: gcontainer.cpp:230
virtual void setSpacing(double px)
Sets the spacing between interactors in this container.
Definition: gcontainer.cpp:523
virtual bool contains(GInteractor *interactor) const
Returns true if the given interactor is found in this container.
Definition: gcontainer.cpp:163
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:519
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:353
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:321
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:85
virtual Layout getLayout() const
Returns the type of layout used by this container.
Definition: gcontainer.cpp:226
~GContainer() override
Frees memory allocated internally by the container.
Definition: gcontainer.cpp:59
QWidget* getWidget() const override
Returns a direct pointer to the internal Qt widget being wrapped by this interactor.
Definition: gcontainer.cpp:298
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:477
virtual void setPadding(double px)
Sets the padding on all 4 sides around widgets in this container.
Definition: gcontainer.cpp:463
Definition: gcontainer.h:97
virtual double getPaddingLeft() const
Returns the padding on the left side of this container in pixels.
Definition: gcontainer.cpp:243
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:205
virtual void insert(int index, GInteractor *interactor)
Adds the given interactor to this container just before the given index.
Definition: gcontainer.cpp:302
virtual void setHorizontalAlignment(HorizontalAlignment halign)
Sets the horizontal alignment of interactors in this container.
Definition: gcontainer.cpp:451
virtual GInteractor * getInteractor(int i) const
Returns the child interactor at the given 0-based index in this container.
Definition: gcontainer.cpp:193
Definition: gcontainer.h:101
virtual void setAlignment(HorizontalAlignment halign, VerticalAlignment valign)
Sets the horizontal and vertical alignment of interactors in this container.
Definition: gcontainer.cpp:446
_Internal_QWidget* getInternalWidget() const override
Returns a direct pointer to the internal Qt widget being wrapped by this interactor.
Definition: gcontainer.cpp:222
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:403
virtual void clear()
Removes all interactors from this container.
Definition: gcontainer.cpp:134
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:260
static const int SPACING_DEFAULT
Default spacing between neighboring interactors.
Definition: gcontainer.h:79
Region
The five regions of border layouts.
Definition: gcontainer.h:96
This abstract class is the superclass for all graphical interactors.
Definition: ginteractor.h:48
Definition: gcontainer.h:86
virtual void setVerticalAlignment(VerticalAlignment valign)
Sets the vertical alignment of interactors in this container.
Definition: gcontainer.cpp:529
Definition: gcontainer.h:98
Layout
The various layout management styles that containers can use.
Definition: gcontainer.h:84
string getType() const override
Returns a string representing the class name of this interactor, such as "GButton" or "GCheckBox"...
Definition: gcontainer.cpp:294
virtual double getPaddingRight() const
Returns the padding on the right side of this container in pixels.
Definition: gcontainer.cpp:247
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:101
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:146
Definition: gcontainer.h:100
This class represents a graphics window that supports simple graphics.
Definition: gwindow.h:98
virtual std::vector< GInteractor * > getDescendents(string type="") const
Returns all interactors that are children or descendents inside this container.
Definition: gcontainer.cpp:175
virtual int getInteractorCount() const
Returns the number of children interactors in this container.
Definition: gcontainer.cpp:201
Definition: gcontainer.h:99
Definition: gcontainer.h:87
virtual void setMargin(double px)
Sets the margin in pixels around interactors in this container.
Definition: gcontainer.cpp:457
GContainer(Layout layout=LAYOUT_FLOW_HORIZONTAL, QWidget* parent=nullptr)
Creates a new container with the given layout.
Definition: gcontainer.cpp:41
Definition: gcontainer.h:89
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:503
virtual double getPaddingTop() const
Returns the padding on the top side of this container in pixels.
Definition: gcontainer.cpp:251
Definition: gcontainer.h:88
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:213
A GContainer is a logical grouping for interactors.
Definition: gcontainer.h:69