11#pragma once
22
3+ #include < qflags.h>
34#include < qobject.h>
45#include < qproperty.h>
56#include < qqmlintegration.h>
@@ -69,6 +70,16 @@ class MarginWrapperManager: public WrapperManager {
6970 // / Determines if child item should be resized larger than its implicit size if
7071 // / the parent is resized larger than its implicit size. Defaults to false.
7172 Q_PROPERTY (bool resizeChild READ default WRITE default BINDABLE bindableResizeChild NOTIFY resizeChildChanged FINAL);
73+ // / Overrides the implicit width of the wrapper.
74+ // /
75+ // / Defaults to the implicit width of the content item plus its left and right margin,
76+ // / and may be reset by assigning `undefined`.
77+ Q_PROPERTY (qreal implicitWidth READ implicitWidth WRITE setImplicitWidth RESET resetImplicitWidth NOTIFY implicitWidthChanged FINAL);
78+ // / Overrides the implicit height of the wrapper.
79+ // /
80+ // / Defaults to the implicit width of the content item plus its top and bottom margin,
81+ // / and may be reset by assigning `undefined`.
82+ Q_PROPERTY (qreal implicitHeight READ implicitHeight WRITE setImplicitHeight RESET resetImplicitHeight NOTIFY implicitHeightChanged FINAL);
7283 // clang-format on
7384 QML_ELEMENT;
7485
@@ -81,35 +92,61 @@ class MarginWrapperManager: public WrapperManager {
8192 [[nodiscard]] QBindable<qreal> bindableExtraMargin () { return &this ->bExtraMargin ; }
8293
8394 [[nodiscard]] qreal topMargin () const { return this ->bTopMargin .value (); }
84- void resetTopMargin () { this ->bTopMarginSet = false ; }
95+ void resetTopMargin () { this ->bOverrides = this -> bOverrides . value () & ~TopMargin ; }
8596 void setTopMargin (qreal topMargin) {
86- this ->bTopMarginValue = topMargin;
87- this ->bTopMarginSet = true ;
97+ this ->bTopMarginOverride = topMargin;
98+ this ->bOverrides = this -> bOverrides . value () | TopMargin ;
8899 }
89100
90101 [[nodiscard]] qreal bottomMargin () const { return this ->bBottomMargin .value (); }
91- void resetBottomMargin () { this ->bBottomMarginSet = false ; }
102+ void resetBottomMargin () { this ->bOverrides = this -> bOverrides . value () & ~BottomMargin ; }
92103 void setBottomMargin (qreal bottomMargin) {
93- this ->bBottomMarginValue = bottomMargin;
94- this ->bBottomMarginSet = true ;
104+ this ->bBottomMarginOverride = bottomMargin;
105+ this ->bOverrides = this -> bOverrides . value () | BottomMargin ;
95106 }
96107
97108 [[nodiscard]] qreal leftMargin () const { return this ->bLeftMargin .value (); }
98- void resetLeftMargin () { this ->bLeftMarginSet = false ; }
109+ void resetLeftMargin () { this ->bOverrides = this -> bOverrides . value () & ~LeftMargin ; }
99110 void setLeftMargin (qreal leftMargin) {
100- this ->bLeftMarginValue = leftMargin;
101- this ->bLeftMarginSet = true ;
111+ this ->bLeftMarginOverride = leftMargin;
112+ this ->bOverrides = this -> bOverrides . value () | LeftMargin ;
102113 }
103114
104115 [[nodiscard]] qreal rightMargin () const { return this ->bRightMargin .value (); }
105- void resetRightMargin () { this ->bRightMarginSet = false ; }
116+ void resetRightMargin () { this ->bOverrides = this -> bOverrides . value () & ~RightMargin ; }
106117 void setRightMargin (qreal rightMargin) {
107- this ->bRightMarginValue = rightMargin;
108- this ->bRightMarginSet = true ;
118+ this ->bRightMarginOverride = rightMargin;
119+ this ->bOverrides = this -> bOverrides . value () | RightMargin ;
109120 }
110121
111122 [[nodiscard]] QBindable<bool > bindableResizeChild () { return &this ->bResizeChild ; }
112123
124+ [[nodiscard]] qreal implicitWidth () const { return this ->bWrapperImplicitWidth .value (); }
125+ void resetImplicitWidth () { this ->bOverrides = this ->bOverrides .value () & ~ImplicitWidth; }
126+ void setImplicitWidth (qreal implicitWidth) {
127+ this ->bImplicitWidthOverride = implicitWidth;
128+ this ->bOverrides = this ->bOverrides .value () | ImplicitWidth;
129+ }
130+
131+ [[nodiscard]] qreal implicitHeight () const { return this ->bWrapperImplicitHeight .value (); }
132+ void resetImplicitHeight () { this ->bOverrides = this ->bOverrides .value () & ~ImplicitHeight; }
133+ void setImplicitHeight (qreal implicitHeight) {
134+ this ->bImplicitHeightOverride = implicitHeight;
135+ this ->bOverrides = this ->bOverrides .value () | ImplicitHeight;
136+ }
137+
138+ // has to be public for flag operator definitions
139+ enum OverrideFlag : quint8 {
140+ ImplicitWidth = 0b1 ,
141+ ImplicitHeight = 0b10 ,
142+ TopMargin = 0b100 ,
143+ BottomMargin = 0b1000 ,
144+ LeftMargin = 0b10000 ,
145+ RightMargin = 0b100000 ,
146+ };
147+
148+ Q_DECLARE_FLAGS (OverrideFlags, OverrideFlag);
149+
113150signals:
114151 void marginChanged ();
115152 void baseMarginChanged ();
@@ -118,6 +155,8 @@ class MarginWrapperManager: public WrapperManager {
118155 void leftMarginChanged ();
119156 void rightMarginChanged ();
120157 void resizeChildChanged ();
158+ void implicitWidthChanged ();
159+ void implicitHeightChanged ();
121160
122161private slots:
123162 void onChildImplicitWidthChanged ();
@@ -135,14 +174,13 @@ private slots:
135174 Q_OBJECT_BINDABLE_PROPERTY (MarginWrapperManager, qreal, bMargin, &MarginWrapperManager::marginChanged);
136175 Q_OBJECT_BINDABLE_PROPERTY (MarginWrapperManager, qreal, bExtraMargin, &MarginWrapperManager::baseMarginChanged);
137176
138- Q_OBJECT_BINDABLE_PROPERTY (MarginWrapperManager, bool , bTopMarginSet);
139- Q_OBJECT_BINDABLE_PROPERTY (MarginWrapperManager, bool , bBottomMarginSet);
140- Q_OBJECT_BINDABLE_PROPERTY (MarginWrapperManager, bool , bLeftMarginSet);
141- Q_OBJECT_BINDABLE_PROPERTY (MarginWrapperManager, bool , bRightMarginSet);
142- Q_OBJECT_BINDABLE_PROPERTY (MarginWrapperManager, qreal, bTopMarginValue);
143- Q_OBJECT_BINDABLE_PROPERTY (MarginWrapperManager, qreal, bBottomMarginValue);
144- Q_OBJECT_BINDABLE_PROPERTY (MarginWrapperManager, qreal, bLeftMarginValue);
145- Q_OBJECT_BINDABLE_PROPERTY (MarginWrapperManager, qreal, bRightMarginValue);
177+ Q_OBJECT_BINDABLE_PROPERTY (MarginWrapperManager, OverrideFlags, bOverrides);
178+ Q_OBJECT_BINDABLE_PROPERTY (MarginWrapperManager, qreal, bImplicitWidthOverride);
179+ Q_OBJECT_BINDABLE_PROPERTY (MarginWrapperManager, qreal, bImplicitHeightOverride);
180+ Q_OBJECT_BINDABLE_PROPERTY (MarginWrapperManager, qreal, bTopMarginOverride);
181+ Q_OBJECT_BINDABLE_PROPERTY (MarginWrapperManager, qreal, bBottomMarginOverride);
182+ Q_OBJECT_BINDABLE_PROPERTY (MarginWrapperManager, qreal, bLeftMarginOverride);
183+ Q_OBJECT_BINDABLE_PROPERTY (MarginWrapperManager, qreal, bRightMarginOverride);
146184
147185 // computed
148186 Q_OBJECT_BINDABLE_PROPERTY (MarginWrapperManager, qreal, bTopMargin, &MarginWrapperManager::topMarginChanged);
@@ -167,4 +205,6 @@ private slots:
167205 // clang-format on
168206};
169207
208+ Q_DECLARE_OPERATORS_FOR_FLAGS (MarginWrapperManager::OverrideFlags);
209+
170210} // namespace qs::widgets
0 commit comments