1 /*
2  * DQt - D bindings for the Qt Toolkit
3  *
4  * GNU Lesser General Public License Usage
5  * This file may be used under the terms of the GNU Lesser
6  * General Public License version 3 as published by the Free Software
7  * Foundation and appearing in the file LICENSE.LGPL3 included in the
8  * packaging of this file. Please review the following information to
9  * ensure the GNU Lesser General Public License version 3 requirements
10  * will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
11  */
12 module qt.widgets.layoutitem;
13 extern(C++):
14 
15 import qt.config;
16 import qt.core.namespace;
17 import qt.core.rect;
18 import qt.core.size;
19 import qt.helpers;
20 import qt.widgets.layout;
21 import qt.widgets.sizepolicy;
22 import qt.widgets.widget;
23 
24 extern(D) immutable int QLAYOUTSIZE_MAX = int.max/256/16;
25 
26 
27 interface QLayoutItemInterface
28 {
29 //    ~this();
30     /+ virtual +/ QSize sizeHint() const;
31     /+ virtual +/ QSize minimumSize() const;
32     /+ virtual +/ QSize maximumSize() const;
33     /+ virtual +/ /+ Qt::Orientations +/abstract qt.core.namespace.Orientations expandingDirections() const;
34     /+ virtual +/ void setGeometry(ref const(QRect) );
35     /+ virtual +/ QRect geometry() const;
36     /+ virtual +/ bool isEmpty() const;
37     /+ virtual +/ bool hasHeightForWidth() const;
38     /+ virtual +/ int heightForWidth(int) const;
39     /+ virtual +/ int minimumHeightForWidth(int) const;
40     /+ virtual +/ void invalidate();
41     /+ virtual +/ QWidget widget();
42     /+ virtual +/ QLayout layout();
43     /+ virtual +/ QSpacerItem spacerItem();
44     /+ virtual +/ /+ QSizePolicy::ControlTypes +/QSizePolicy.ControlTypes controlTypes() const;
45 }
46 
47 /// Binding for C++ class [QLayoutItem](https://doc.qt.io/qt-6/qlayoutitem.html).
48 abstract class /+ Q_WIDGETS_EXPORT +/ QLayoutItem
49 {
50 public:
51     /+ explicit +/pragma(inline, true) this(/+ Qt:: +/qt.core.namespace.Alignment aalignment = /+ Qt:: +/qt.core.namespace.Alignment())
52     {
53         this.align_ = aalignment;
54     }
55     /+ virtual +/~this();
56     /+ virtual +/ abstract QSize sizeHint() const;
57     /+ virtual +/ abstract QSize minimumSize() const;
58     /+ virtual +/ abstract QSize maximumSize() const;
59     /+ virtual +/ abstract /+ Qt:: +/qt.core.namespace.Orientations expandingDirections() const;
60     /+ virtual +/ abstract void setGeometry(ref const(QRect));
61     /+ virtual +/ abstract QRect geometry() const;
62     /+ virtual +/ abstract bool isEmpty() const;
63     /+ virtual +/ bool hasHeightForWidth() const;
64     /+ virtual +/ int heightForWidth(int) const;
65     /+ virtual +/ int minimumHeightForWidth(int) const;
66     /+ virtual +/ void invalidate();
67 
68     /+ virtual +/ QWidget widget() const;
69     /+ virtual +/ QLayout layout();
70     /+ virtual +/ QSpacerItem spacerItem();
71 
72     final /+ Qt:: +/qt.core.namespace.Alignment alignment() const { return align_; }
73     final void setAlignment(/+ Qt:: +/qt.core.namespace.Alignment a);
74     /+ virtual +/ QSizePolicy.ControlTypes controlTypes() const;
75 
76 protected:
77     /+ Qt:: +/qt.core.namespace.Alignment align_;
78     mixin(CREATE_CONVENIENCE_WRAPPERS);
79 }
80 
81 /// Binding for C++ class [QSpacerItem](https://doc.qt.io/qt-6/qspaceritem.html).
82 class /+ Q_WIDGETS_EXPORT +/ QSpacerItem : QLayoutItem
83 {
84 public:
85     this(int w, int h,
86                      QSizePolicy.Policy hData = QSizePolicy.Policy.Minimum,
87                      QSizePolicy.Policy vData = QSizePolicy.Policy.Minimum)
88     {
89         this.width = w;
90         this.height = h;
91         this.sizeP = typeof(this.sizeP)(hData, vData);
92     }
93     ~this();
94 
95     final void changeSize(int w, int h,
96                          QSizePolicy.Policy hData = QSizePolicy.Policy.Minimum,
97                          QSizePolicy.Policy vData = QSizePolicy.Policy.Minimum);
98     override QSize sizeHint() const;
99     override QSize minimumSize() const;
100     override QSize maximumSize() const;
101     override /+ Qt:: +/qt.core.namespace.Orientations expandingDirections() const;
102     override bool isEmpty() const;
103     override void setGeometry(ref const(QRect));
104     override QRect geometry() const;
105     override QSpacerItem spacerItem();
106     final QSizePolicy sizePolicy() const { return sizeP; }
107 
108 private:
109     int width;
110     int height;
111     QSizePolicy sizeP;
112     QRect rect;
113     mixin(CREATE_CONVENIENCE_WRAPPERS);
114 }
115 
116 /// Binding for C++ class [QWidgetItem](https://doc.qt.io/qt-6/qwidgetitem.html).
117 class /+ Q_WIDGETS_EXPORT +/ QWidgetItem : QLayoutItem
118 {
119 private:
120     /+ Q_DISABLE_COPY(QWidgetItem) +/
121 
122 public:
123     /+ explicit +/this(QWidget w)
124     {
125         this.wid = w;
126     }
127     ~this();
128 
129     override QSize sizeHint() const;
130     override QSize minimumSize() const;
131     override QSize maximumSize() const;
132     override /+ Qt:: +/qt.core.namespace.Orientations expandingDirections() const;
133     override bool isEmpty() const;
134     override void setGeometry(ref const(QRect));
135     override QRect geometry() const;
136     override QWidget widget() const;
137 
138     override bool hasHeightForWidth() const;
139     override int heightForWidth(int) const;
140     override int minimumHeightForWidth(int) const;
141     override QSizePolicy.ControlTypes controlTypes() const;
142 protected:
143     QWidget wid;
144     mixin(CREATE_CONVENIENCE_WRAPPERS);
145 }
146 
147 class /+ Q_WIDGETS_EXPORT +/ QWidgetItemV2 : QWidgetItem
148 {
149 public:
150     /+ explicit +/this(QWidget widget);
151     ~this();
152 
153     override QSize sizeHint() const;
154     override QSize minimumSize() const;
155     override QSize maximumSize() const;
156     override int heightForWidth(int width) const;
157 
158 private:
159     enum { Dirty = -123, HfwCacheMaxSize = 3 }
160 
161     //pragma(inline, true) final bool useSizeCache() const;
162     final void updateCacheIfNecessary() const;
163     pragma(inline, true) final void invalidateSizeCache() {
164         q_cachedMinimumSize.setWidth(Dirty);
165         q_hfwCacheSize = 0;
166     }
167 
168     /+ mutable +/ QSize q_cachedMinimumSize;
169     /+ mutable +/ QSize q_cachedSizeHint;
170     /+ mutable +/ QSize q_cachedMaximumSize;
171     /+ mutable +/ QSize[HfwCacheMaxSize] q_cachedHfws;
172     /+ mutable +/ short q_firstCachedHfw;
173     /+ mutable +/ short q_hfwCacheSize;
174     void* d;
175 
176     /+ friend class QWidgetPrivate; +/
177 
178     /+ Q_DISABLE_COPY(QWidgetItemV2) +/
179     mixin(CREATE_CONVENIENCE_WRAPPERS);
180 }
181 
182 static assert(__traits(classInstanceSize, QLayoutItem) == (void*).sizeof + 4);
183 struct QLayoutItemFakeInheritance
184 {
185     void*[(__traits(classInstanceSize, QLayoutItem) + (void*).sizeof - 1) / (void*).sizeof - 1] data;
186 }
187