@@ -110,6 +110,41 @@ namespace cycfi::elements
110110 return {std::forward<Subject>(subject)};
111111 }
112112
113+ struct resizable_tracker_info : tracker_info
114+ {
115+ using tracker_info::tracker_info;
116+
117+ enum handle : unsigned char
118+ {
119+ top = 1 ,
120+ left = 2 ,
121+ bottom = 4 ,
122+ right = 8
123+ };
124+
125+ unsigned char _handle = 0 ;
126+ };
127+
128+ class resizable_base : public tracker <proxy_base, resizable_tracker_info>
129+ {
130+ public:
131+
132+ using tracker = tracker<proxy_base, resizable_tracker_info>;
133+
134+ bool cursor (context const & ctx, point p, cursor_tracking status) override ;
135+ element* hit_test (context const & ctx, point p, bool leaf, bool control) override ;
136+ bool click (context const & ctx, mouse_button btn) override ;
137+ void drag (context const & ctx, mouse_button btn) override ;
138+ void keep_tracking (context const & ctx, tracker_info& track_info) override ;
139+ };
140+
141+ template <concepts::Element Subject>
142+ inline proxy<remove_cvref_t <Subject>, resizable_base>
143+ resizable (Subject&& subject)
144+ {
145+ return {std::forward<Subject>(subject)};
146+ }
147+
113148 /* *
114149 * \class closable_element
115150 *
@@ -174,6 +209,76 @@ namespace cycfi::elements
174209 };
175210 }
176211 }
212+
213+ template <concepts::Element Subject>
214+ class minimizable_element : public proxy <Subject>
215+ {
216+ public:
217+
218+ using proxy<Subject>::proxy;
219+
220+ void prepare_subject (context& ctx) override ;
221+ };
222+
223+ template <concepts::Element Subject>
224+ inline minimizable_element<remove_cvref_t <Subject>>
225+ minimizable (Subject&& subject)
226+ {
227+ return {std::forward<Subject>(subject)};
228+ }
229+
230+ void minimize_floating_element (context& ctx, floating_element* cw);
231+
232+ template <concepts::Element Subject>
233+ inline void minimizable_element<Subject>::prepare_subject(context& ctx)
234+ {
235+ auto btn = find_subject<basic_button*>(this );
236+ if (btn)
237+ {
238+ btn->on_click =
239+ [&ctx](bool )
240+ {
241+ auto fl = find_parent<floating_element*>(ctx);
242+ if (fl)
243+ minimize_floating_element (ctx, fl);
244+ };
245+ }
246+ }
247+
248+ template <concepts::Element Subject>
249+ class maximizable_element : public proxy <Subject>
250+ {
251+ public:
252+
253+ using proxy<Subject>::proxy;
254+
255+ void prepare_subject (context& ctx) override ;
256+ };
257+
258+ template <concepts::Element Subject>
259+ inline maximizable_element<remove_cvref_t <Subject>>
260+ maximizable (Subject&& subject)
261+ {
262+ return {std::forward<Subject>(subject)};
263+ }
264+
265+ void maximize_floating_element (context& ctx, floating_element* cw);
266+
267+ template <concepts::Element Subject>
268+ inline void maximizable_element<Subject>::prepare_subject(context& ctx)
269+ {
270+ auto btn = find_subject<basic_button*>(this );
271+ if (btn)
272+ {
273+ btn->on_click =
274+ [&ctx](bool )
275+ {
276+ auto fl = find_parent<floating_element*>(ctx);
277+ if (fl)
278+ maximize_floating_element (ctx, fl);
279+ };
280+ }
281+ }
177282}
178283
179284#endif
0 commit comments