YSTest: YUIContainer.h 源文件

YSTest PreAlpha_b900_20201012 The YSLib Test Project

YUIContainer.h
浏览该文件的文档.
1 /*
2 © 2011-2016, 2019-2020 FrankHB.
3
4 This file is part of the YSLib project, and may only be used,
5 modified, and distributed under the terms of the YSLib project
6 license, LICENSE.TXT. By continuing to use, modify, or distribute
7 this file you indicate that you have read the license and
8 understand and accept it fully.
9 */
10
28 #ifndef YSL_INC_UI_YUIContainer_h_
29 #define YSL_INC_UI_YUIContainer_h_ 1
30
31 #include "YModules.h"
32 #include YFM_YSLib_UI_YWidget // for ystdex::unseq_apply;
33 #include <ystdex/iterator.hpp>
34
35 namespace YSLib
36 {
37
38 namespace UI
39 {
40
46 YB_ATTR_nodiscard YF_API YB_PURE IWidget&
47 FetchTopLevel(IWidget&);
54 YF_API IWidget&
55 FetchTopLevel(IWidget&, Point&);
56
62 YB_ATTR_nodiscard YF_API YB_PURE
63 vector<pair<observer_ptr<const IWidget>, Point>>
64 FetchTrace(const IWidget&);
65
66
71 YB_ATTR_nodiscard YF_API YB_PURE Point
72 LocateOffset(observer_ptr<const IWidget>, Point, observer_ptr<const IWidget>);
73
78 YB_ATTR_nodiscard YB_PURE inline
79 PDefH(Point, LocateContainerOffset, const IWidget& wgt, const Point& pt)
80 ImplRet(pt + GetLocationOf(wgt))
81
82
88 YB_ATTR_nodiscard YF_API Point
89 LocateForTopOffset(const Point&, IWidget&, const Point& = {});
90
95 YB_ATTR_nodiscard YF_API YB_PURE Point
96 LocateForTrace(const vector<pair<observer_ptr<const IWidget>, Point>>&,
97 const IWidget&);
98
103 YB_ATTR_nodiscard YB_PURE inline
104 PDefH(Point, LocateForWidget, const IWidget& base, const IWidget& wgt)
105 ImplRet(LocateForTrace(FetchTrace(base), wgt))
106
107
113 template<class _tWidget, typename _fFetcher>
114 Point
115 LocateForWidgetNode(IWidget& wgt, _fFetcher fetch_ptr)
116 {
117 if(YB_LIKELY(dynamic_cast<_tWidget*>(&wgt)))
118 return Point();
119
120 _tWidget* const pNode(fetch_ptr(wgt));
121
122 return pNode ? LocateOffset(pNode, Point(), YSLib::make_observer(&wgt))
123 : Point::Invalid;
124 }
125
131 YB_ATTR_nodiscard YF_API YB_PURE Point
132 LocateForParentContainer(const IWidget&);
133
134
140 YF_API void
141 MoveToBottom(IWidget&);
142
148 YF_API void
149 MoveToCenter(IWidget&);
150
156 YF_API void
157 MoveToLeft(IWidget&);
158
164 YF_API void
165 MoveToRight(IWidget&);
166
172 YF_API void
173 MoveToTop(IWidget&);
174
175
177
178 using ZOrder = std::uint8_t;
181 const ZOrder DefaultZOrder(64);
183 const ZOrder DefaultWindowZOrder(128);
185
186
194 YF_API bool
195 RemoveFrom(IWidget&, IWidget&);
196
197
204 class YF_API MLinearUIContainer
205 {
206 public:
211 using ItemType = lref<IWidget>;
213 using WidgetVector = vector<ItemType>;
214 using iterator = WidgetIterator;
215
216 protected:
218 WidgetVector vWidgets;
219
220 public:
222
223 DefDeCtor(MLinearUIContainer)
225 DefDeMoveCtor(MLinearUIContainer)
226
227
231 void
232 operator+=(IWidget&);
233
240 bool
241 operator-=(IWidget&);
243
249 PDefHOp(IWidget&, [], size_t idx) ynothrowv
250 ImplRet(YAssert(idx < GetCount(), "Index is out of range."),
251 vWidgets[idx])
252 PDefHOp(IWidget&, [], size_t idx) const ynothrowv
253 ImplRet(YAssert(idx < GetCount(), "Index is out of range."),
254 vWidgets[idx])
256
261 YB_ATTR_nodiscard YB_PURE bool
262 Contains(IWidget&) const;
263
268 DefGetter(const ynothrow, size_t, Count, vWidgets.size())
269
275 size_t
276 Find(IWidget&) const;
277
282 void
283 PaintVisibleChildren(PaintEventArgs&);
284
291 PDefH(IWidget&, at, size_t idx)
292 ImplRet(vWidgets.at(idx))
293 PDefH(IWidget&, at, size_t idx) const
294 ImplRet(vWidgets.at(idx))
296
297 iterator
298 begin();
299
301 PDefH(void, clear, ) ynothrow
302 ImplExpr(vWidgets.clear())
303
304 iterator
305 end();
306 };
307
308
314 class YF_API MUIContainer
315 {
316 public:
321 using ItemType = lref<IWidget>;
326 using WidgetMap = multimap<ZOrder, ItemType>;
327 using PairType = WidgetMap::value_type;
329 using iterator = WidgetIterator;
330
331 protected:
336 WidgetMap mWidgets;
337
338 public:
340
341
344 DefDeCtor(MUIContainer)
345 DefDeMoveCtor(MUIContainer)
346
347
353 PDefHOp(void, +=, IWidget& wgt)
354 ImplRet(Add(wgt))
355
362 bool
363 operator-=(IWidget&);
365
369 YB_ATTR_nodiscard YB_PURE bool
370 Contains(IWidget&);
371
376 DefGetter(const ynothrow, size_t, Count, mWidgets.size())
377
385 void
386 Add(IWidget&, ZOrder = DefaultZOrder);
387
392 void
393 PaintVisibleChildren(PaintEventArgs&);
394
400 ZOrder
401 QueryZ(IWidget&) const;
402
404 YB_ATTR_nodiscard YB_PURE iterator
405 begin();
406
408 PDefH(void, clear, ) ynothrow
409 ImplExpr(mWidgets.clear())
410
412 YB_ATTR_nodiscard YB_PURE iterator
413 end();
414 };
415
416
421 template<class _tCon>
422 inline void
423 AddWidget(_tCon& con, IWidget& wgt)
424 {
425 con += wgt;
426 }
427
432 template<class _tCon>
433 inline void
434 AddWidget(_tCon& con, IWidget& wgt, ZOrder z)
435 {
436 con.Add(wgt, z);
437 }
438
444 template<class _tCon, class... _tWidgets>
445 inline void
446 AddWidgets(_tCon& con, _tWidgets&... wgts)
447 {
448 ystdex::unseq_apply(std::bind(static_cast<void(_tCon::*)(IWidget&)>(
449 &_tCon::operator+=), std::ref(con), std::placeholders::_1),
450 static_cast<IWidget&>(wgts)...);
451 }
452
458 template<class _tCon, class... _tWidgets>
459 inline void
460 AddWidgetsZ(_tCon& con, ZOrder z, _tWidgets&... wgts)
461 {
462 ystdex::unseq_apply(std::bind(static_cast<void(_tCon::*)(IWidget&, ZOrder)>(
463 &_tCon::Add), std::ref(con), std::placeholders::_1, z),
464 static_cast<IWidget&>(wgts)...);
465 }
466
472 template<class _tCon, class... _tWidgets>
473 inline void
474 RemoveWidgets(_tCon& con, _tWidgets&... wgts)
475 {
476 ystdex::unseq_apply(std::bind(static_cast<bool(_tCon::*)(IWidget&)>(
477 &_tCon::operator-=), std::ref(con), std::placeholders::_1),
478 static_cast<IWidget&>(wgts)...);
479 }
480
481 } // namespace UI;
482
483 } // namespace YSLib;
484
485 #endif
486
DefDeCtor
#define DefDeCtor(_t)
简单通用成员函数定义。
Definition: YBaseMacro.h:157
YB_ATTR_nodiscard
#define YB_ATTR_nodiscard
标记返回值不被忽略的属性。
Definition: ydef.h:715
YSLib::UI::ZOrder
std::uint8_t ZOrder
Z 顺序类型：覆盖顺序，值越大表示越接近顶层。
Definition: YUIContainer.h:179
size
size_t size
Definition: memory_resource.cpp:295
YSLib::UI::ynothrow
AView &y ynothrow
Definition: YWidgetView.cpp:47
ystdex::lref
左值引用包装。
Definition: ref.hpp:61
YB_PURE
#define YB_PURE
指示函数或函数模板实例为纯函数。
Definition: ydef.h:919
YSLib::UI::MLinearUIContainer
线性部件容器模块。
Definition: YUIContainer.h:205
ystdex::unseq_apply
void unseq_apply(_func &&f, _tParams &&... args)
无序调用。
Definition: function.hpp:314
DefDeMoveCtor
#define DefDeMoveCtor(_t)
Definition: YBaseMacro.h:167
YSLib::UI::PDefH
PDefH(void, DisplayFor, IWidget &wgt, Timers::TimeSpan delay) ImplExpr(Show(wgt)
在一定时间内显示部件。
YSLib::UI::MLinearUIContainer::WidgetVector
vector< ItemType > WidgetVector
部件组类型。
Definition: YUIContainer.h:213
YSLib::UI::MoveToBottom
YF_API void MoveToBottom(IWidget &)
移动部件至容器下端。
Definition: YUIContainer.cpp:128
ystdex::any_input_iterator
动态泛型输入迭代器。
Definition: any_iterator.hpp:247
YSLib::Drawing::GBinaryGroup< SPos >::Invalid
static const GBinaryGroup Invalid
无效（不在屏幕坐标系中）对象。
Definition: YGDIBase.h:298
YSLib::UI::FetchTopLevel
YB_ATTR_nodiscard YF_API YB_PURE IWidget & FetchTopLevel(IWidget &)
取指定部件的顶层部件。
Definition: YUIContainer.cpp:41
YSLib::UI::DefaultWindowZOrder
const ZOrder DefaultWindowZOrder(128)
默认窗口 Z 顺序值。
YSLib::UI::RemoveWidgets
void RemoveWidgets(_tCon &con, _tWidgets &... wgts)
从部件容器移除子部件。
Definition: YUIContainer.h:474
YSLib::UI::AddWidget
void AddWidget(_tCon &con, IWidget &wgt)
向部件添加单一子部件。
Definition: YUIContainer.h:423
YF_API
#define YF_API
Definition: Platform.h:56
YSLib::UI::RemoveFrom
YF_API bool RemoveFrom(IWidget &, IWidget &)
从容器中移除部件。
Definition: YUIContainer.cpp:164
YSLib::UI::LocateOffset
YB_ATTR_nodiscard YF_API YB_PURE Point LocateOffset(observer_ptr< const IWidget >, Point, observer_ptr< const IWidget >)
取相对第三参数指向的部件的点相对第一参数指向的容器的偏移坐标。
Definition: YUIContainer.cpp:79
YSLib::UI::WidgetIterator
ystdex::any_input_iterator< IWidget > WidgetIterator
通用部件迭代器。
Definition: YWidget.h:52
YSLib::UI::AddWidgets
void AddWidgets(_tCon &con, _tWidgets &... wgts)
向部件容器添加子部件。
Definition: YUIContainer.h:446
YSLib::YAssert
YAssert(!(v< Deref(a)), "Value less than lower bound found.")
ystdex::make_observer
observer_ptr< _type > make_observer(_type *p)
Definition: pointer.hpp:405
YSLib::Drawing::Point
GBinaryGroup< SPos > Point
屏幕二维点（直角坐标表示）。
Definition: YGDIBase.h:520
ystdex::cpp2017::end
auto end(_tRange &c) -> decltype(c.end())
Definition: range.hpp:345
iterator.hpp
通用迭代器。
YSLib::UI::DefaultZOrder
const ZOrder DefaultZOrder(64)
默认 Z 顺序值。
YSLib::Drawing::GBinaryGroup< SPos >
YSLib::UI::MUIContainer::DefDeCtor
DefDeCtor(MUIContainer) DefDeMoveCtor(MUIContainer) PDefHOp(void
无参数构造：默认实现。
YSLib::UI::LocateForTrace
YB_ATTR_nodiscard YB_PURE IWidget const Point &YB_ATTR_nodiscard YF_API YB_PURE Point LocateForTrace(const vector< pair< observer_ptr< const IWidget >, Point >> &, const IWidget &)
取指定部件相对轨迹的偏移坐标。
YSLib::UI::LocateForTopOffset
Point LocateForTopOffset(const Point &origin, IWidget &wgt, const Point &pt)
Definition: YUIContainer.cpp:91
YSLib::UI::MLinearUIContainer::PDefHOp
PDefHOp(IWidget &, [], size_t idx) ynothrowv ImplRet(YAssert(idx< GetCount()
取指定索引的部件引用。
platform::containers::vector
std::vector< _type, _tAlloc > vector
Definition: Container.h:102
YSLib::UI::MoveToLeft
YF_API void MoveToLeft(IWidget &)
移动部件至容器左端。
Definition: YUIContainer.cpp:142
YSLib::UI::MUIContainer
部件容器模块。
Definition: YUIContainer.h:315
YSLib::UI::MoveToCenter
YF_API void MoveToCenter(IWidget &)
移动部件至容器中心。
Definition: YUIContainer.cpp:135
YSLib::UI::MLinearUIContainer::vWidgets
WidgetVector vWidgets
部件组：存储部件引用。
Definition: YUIContainer.h:218
YSLib
YSLib 命名空间。
Definition: AndroidHost.h:46
YSLib::UI::MoveToRight
YF_API void MoveToRight(IWidget &)
移动部件至容器右端。
Definition: YUIContainer.cpp:149
platform::containers::multimap
std::multimap< _tKey, _tMapped, _fComp, _tAlloc > multimap
Definition: Container.h:118
YB_LIKELY
#define YB_LIKELY(_expr)
Definition: ydef.h:827
YModules.h
YSLib 用户界面模块配置文件。
YSLib::UI::FetchTrace
YB_ATTR_nodiscard YF_API YB_PURE vector< pair< observer_ptr< const IWidget >, Point > > FetchTrace(const IWidget &)
取指定部件向上遍历的轨迹：相对自身和所有父部件的位置。
Definition: YUIContainer.cpp:63
YSLib::UI::MUIContainer::mWidgets
WidgetMap mWidgets
部件映射：存储 Z 顺序映射至部件引用。
Definition: YUIContainer.h:336
YSLib::UI::wgt
IWidget & wgt
Definition: YControl.h:113
ynothrowv
#define ynothrowv
YSLib 无异常抛出保证验证：有条件地使用无异常抛出规范。
Definition: ydef.h:1219
YSLib::UI::PaintEventArgs
部件绘制参数。
Definition: YWidgetEvent.h:330
YSLib::UI::LocateForWidgetNode
YB_ATTR_nodiscard YB_PURE wgt Point LocateForWidgetNode(IWidget &wgt, _fFetcher fetch_ptr)
取指定部件相对视图树中的直接节点指针的偏移坐标。
Definition: YUIContainer.h:115
YSLib::UI::AddWidgetsZ
void AddWidgetsZ(_tCon &con, ZOrder z, _tWidgets &... wgts)
向部件容器添加指定 Z 顺序的子部件。
Definition: YUIContainer.h:460
DefGetter
#define DefGetter(_q, _t, _n,...)
Definition: YBaseMacro.h:241
YSLib::UI::ImplExpr
IWidget bool b ImplExpr(wgt.GetController().SetEnabled(b)) YF_API bool Enable(IWidget &
设置部件可用性，且当可用性改变时无效化部件区域。
YSLib::UI::MoveToTop
YF_API void MoveToTop(IWidget &)
移动部件至容器上端。
Definition: YUIContainer.cpp:156
YSLib::UI::GetLocationOf
YB_ATTR_nodiscard YB_PURE pt pt Y YB_ATTR_nodiscard YB_PURE const IWidget &wgt GetLocationOf
Definition: YWidget.h:157
const
const Decapsulate const Decapsulate &y ynothrow ContextNode &ctx const
Definition: NPLA1Forms.cpp:1629
YSLib::UI::LocateForParentContainer
YB_ATTR_nodiscard YF_API YB_PURE Point LocateForParentContainer(const IWidget &)
取指定部件相对容器的父容器的偏移坐标。
Definition: YUIContainer.cpp:119
ystdex::ref
void ref(const _type &&)=delete
YSLib::UI::ImplRet
const IWidget &wgt ImplRet(wgt.GetView().IsVisible()) YB_ATTR_nodiscard YB_PURE bool YF_API Contains(const IWidget &
判断点是否在部件的可视区域内。
YSLib::UI::MUIContainer::WidgetMap
multimap< ZOrder, ItemType > WidgetMap
部件映射表类型：映射 Z 顺序至部件。
Definition: YUIContainer.h:326
ystdex::cpp2017::begin
auto begin(_tRange &c) -> decltype(c.begin())
Definition: range.hpp:323
YSLib::UI::MUIContainer::PairType
WidgetMap::value_type PairType
Definition: YUIContainer.h:327