YSTest: YUIContainer.h 源文件

YSTest PreAlpha_b800_20170810 The YSLib Test Project

- 首页
- 相关页面
- 模块
- 命名空间
- 类
- 文件

- 文件列表
- 文件成员

YUIContainer.h
浏览该文件的文档.
1 /*
2 © 2011-2016 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
33 #include <ystdex/iterator.hpp>
34
35 namespace YSLib
36 {
37
38 namespace UI
39 {
40
46 YF_API IWidget&
47 FetchTopLevel(IWidget&);
54 YF_API IWidget&
55 FetchTopLevel(IWidget&, Point&);
56
62 YF_API vector<pair<observer_ptr<const IWidget>, Point>>
63 FetchTrace(const IWidget&);
64
65
70 YF_API Point
71 LocateOffset(observer_ptr<const IWidget>, Point, observer_ptr<const IWidget>);
72
77 inline PDefH(Point, LocateContainerOffset, const IWidget& wgt, const Point& pt)
78 ImplRet(pt + GetLocationOf(wgt))
79
80
86 YF_API Point
87 LocateForTopOffset(const Point&, IWidget&, const Point& = {});
88
93 YF_API Point
94 LocateForTrace(const vector<pair<observer_ptr<const IWidget>, Point>>&,
95 const IWidget&);
96
101 inline PDefH(Point, LocateForWidget, const IWidget& base, const IWidget& wgt)
102 ImplRet(LocateForTrace(FetchTrace(base), wgt))
103
104
110 template<class _tWidget, typename _fFetcher>
111 Point
112 LocateForWidgetNode(IWidget& wgt, _fFetcher fetch_ptr)
113 {
114 if(YB_LIKELY(dynamic_cast<_tWidget*>(&wgt)))
115 return Point();
116
117 _tWidget* const pNode(fetch_ptr(wgt));
118
119 return pNode ? LocateOffset(pNode, Point(), YSLib::make_observer(&wgt))
120 : Point::Invalid;
121 }
122
128 YF_API Point
129 LocateForParentContainer(const IWidget&);
130
131
137 YF_API void
138 MoveToBottom(IWidget&);
139
145 YF_API void
146 MoveToCenter(IWidget&);
147
153 YF_API void
154 MoveToLeft(IWidget&);
155
161 YF_API void
162 MoveToRight(IWidget&);
163
169 YF_API void
170 MoveToTop(IWidget&);
171
172
174
175 using ZOrder = std::uint8_t;
178 const ZOrder DefaultZOrder(64);
180 const ZOrder DefaultWindowZOrder(128);
182
183
191 YF_API bool
192 RemoveFrom(IWidget&, IWidget&);
193
194
201 class YF_API MLinearUIContainer
202 {
203 public:
208 using ItemType = lref<IWidget>;
210 using WidgetVector = vector<ItemType>;
211 using iterator = WidgetIterator;
212
213 protected:
215 WidgetVector vWidgets;
216
217 public:
219
220 DefDeCtor(MLinearUIContainer)
222 DefDeMoveCtor(MLinearUIContainer)
223
228 void
229 operator+=(IWidget&);
230
237 bool
238 operator-=(IWidget&);
240
246 PDefHOp(IWidget&, [], size_t idx) ynothrowv
247 ImplRet(YAssert(idx < GetCount(), "Index is out of range."),
248 vWidgets[idx])
249 PDefHOp(IWidget&, [], size_t idx) const ynothrowv
250 ImplRet(YAssert(idx < GetCount(), "Index is out of range."),
251 vWidgets[idx])
253
258 bool
259 Contains(IWidget&) const;
260
265 DefGetter(const ynothrow, size_t, Count, vWidgets.size())
266
272 size_t
273 Find(IWidget&) const;
274
279 void
280 PaintVisibleChildren(PaintEventArgs&);
281
288 PDefH(IWidget&, at, size_t idx)
289 ImplRet(vWidgets.at(idx))
290 PDefH(IWidget&, at, size_t idx) const
291 ImplRet(vWidgets.at(idx))
293
294 iterator
295 begin();
296
298 PDefH(void, clear, ) ynothrow
299 ImplExpr(vWidgets.clear())
300
301 iterator
302 end();
303 };
304
305
311 class YF_API MUIContainer
312 {
313 public:
318 using ItemType = lref<IWidget>;
323 using WidgetMap = multimap<ZOrder, ItemType>;
324 using PairType = WidgetMap::value_type;
326 using iterator = WidgetIterator;
327
328 protected:
333 WidgetMap mWidgets;
334
335 public:
337
338
341 DefDeCtor(MUIContainer)
342 DefDeMoveCtor(MUIContainer)
343
350 PDefHOp(void, +=, IWidget& wgt)
351 ImplRet(Add(wgt))
352
359 bool
360 operator-=(IWidget&);
362
366 bool
367 Contains(IWidget&);
368
373 DefGetter(const ynothrow, size_t, Count, mWidgets.size())
374
382 void
383 Add(IWidget&, ZOrder = DefaultZOrder);
384
389 void
390 PaintVisibleChildren(PaintEventArgs&);
391
397 ZOrder
398 QueryZ(IWidget&) const;
399
401 iterator
402 begin();
403
405 PDefH(void, clear, ) ynothrow
406 ImplExpr(mWidgets.clear())
407
409 iterator
410 end();
411 };
412
413
418 template<class _tCon>
419 inline void
420 AddWidget(_tCon& con, IWidget& wgt)
421 {
422 con += wgt;
423 }
424
429 template<class _tCon>
430 inline void
431 AddWidget(_tCon& con, IWidget& wgt, ZOrder z)
432 {
433 con.Add(wgt, z);
434 }
435
441 template<class _tCon, class... _tWidgets>
442 inline void
443 AddWidgets(_tCon& con, _tWidgets&... wgts)
444 {
445 unseq_apply(std::bind(static_cast<void(_tCon::*)(IWidget&)>(
446 &_tCon::operator+=), std::ref(con), std::placeholders::_1),
447 std::forward<IWidget&>(wgts)...);
448 }
449
455 template<class _tCon, class... _tWidgets>
456 inline void
457 AddWidgetsZ(_tCon& con, ZOrder z, _tWidgets&... wgts)
458 {
459 unseq_apply(std::bind(static_cast<void(_tCon::*)(IWidget&, ZOrder)>(
460 &_tCon::Add), std::ref(con), std::placeholders::_1, z),
461 std::forward<IWidget&>(wgts)...);
462 }
463
469 template<class _tCon, class... _tWidgets>
470 inline void
471 RemoveWidgets(_tCon& con, _tWidgets&... wgts)
472 {
473 unseq_apply(std::bind(static_cast<bool(_tCon::*)(IWidget&)>(
474 &_tCon::operator-=), std::ref(con), std::placeholders::_1),
475 std::forward<IWidget&>(wgts)...);
476 }
477
478 } // namespace UI;
479
480 } // namespace YSLib;
481
482 #endif
483
YSLib::UI::PDefH
PDefH(void, DisplayFor, IWidget &wgt, Timers::TimeSpan delay) ImplExpr(Show(wgt)
在一定时间内显示部件。
YSLib::UI::ynothrow
AView &y ynothrow
Definition: YWidgetView.cpp:47
YSLib::UI::LocateForTopOffset
Point LocateForTopOffset(const Point &origin, IWidget &wgt, const Point &pt)
Definition: YUIContainer.cpp:91
YSLib::UI::DefaultZOrder
const ZOrder DefaultZOrder(64)
默认 Z 顺序值。
YSLib::UI::LocateForWidgetNode
wgt Point LocateForWidgetNode(IWidget &wgt, _fFetcher fetch_ptr)
取指定部件相对视图树中的直接节点指针的偏移坐标。
Definition: YUIContainer.h:112
YSLib
YSLib 命名空间。
Definition: AndroidHost.h:45
UI
iterator.hpp
通用迭代器。
ystdex::make_observer
observer_ptr< _type > make_observer(_type *p)
Definition: pointer.hpp:326
YSLib::UI::MUIContainer
部件容器模块。
Definition: YUIContainer.h:311
YSLib::UI::LocateForTrace
IWidget const Point &YF_API Point LocateForTrace(const vector< pair< observer_ptr< const IWidget >, Point >> &, const IWidget &)
取指定部件相对轨迹的偏移坐标。
Definition: YUIContainer.cpp:100
YSLib::UI::AddWidgetsZ
void AddWidgetsZ(_tCon &con, ZOrder z, _tWidgets &...wgts)
向部件容器添加指定 Z 顺序的子部件。
Definition: YUIContainer.h:457
YSLib::UI::wgt
IWidget & wgt
Definition: YControl.h:112
DefDeMoveCtor
#define DefDeMoveCtor(_t)
Definition: YBaseMacro.h:167
YSLib::UI::ImplRet
const IWidget &wgt ImplRet(wgt.GetView().IsVisible()) bool YF_API Contains(const IWidget &
判断点是否在部件的可视区域内。
YSLib::UI::AddWidget
void AddWidget(_tCon &con, IWidget &wgt)
向部件添加单一子部件。
Definition: YUIContainer.h:420
YSLib::Drawing::Point
GBinaryGroup< SPos > Point
屏幕二维点（直角坐标表示）。
Definition: YGDIBase.h:278
YSLib::UI::FetchTopLevel
YF_API IWidget & FetchTopLevel(IWidget &)
取指定部件的顶层部件。
Definition: YUIContainer.cpp:41
ystdex::cpp2011::end
_type * end(_type(&&array)[_vN])
Definition: range.hpp:54
YSLib::YAssert
YAssert(!(v< Deref(a)),"Value less than lower bound found.")
YSLib::UI::ZOrder
std::uint8_t ZOrder
Z 顺序类型：覆盖顺序，值越大表示越接近顶层。
Definition: YUIContainer.h:176
ystdex::lref
左值引用包装。
Definition: ref.hpp:74
YSLib::UI::RemoveFrom
YF_API bool RemoveFrom(IWidget &, IWidget &)
从容器中移除部件。
Definition: YUIContainer.cpp:164
DefDeCtor
#define DefDeCtor(_t)
简单通用成员函数定义。
Definition: YBaseMacro.h:157
YSLib::Drawing::GBinaryGroup< SPos >::Invalid
static const GBinaryGroup Invalid
无效（不在屏幕坐标系中）对象。
Definition: YGDIBase.h:58
YSLib::UI::MUIContainer::WidgetMap
multimap< ZOrder, ItemType > WidgetMap
部件映射表类型：映射 Z 顺序至部件。
Definition: YUIContainer.h:323
YSLib::UI::LocateForParentContainer
YF_API Point LocateForParentContainer(const IWidget &)
取指定部件相对容器的父容器的偏移坐标。
Definition: YUIContainer.cpp:119
YF_API
#define YF_API
Definition: Platform.h:56
YSLib::UI::GetLocationOf
pt pt Y const IWidget &wgt GetLocationOf
Definition: YWidget.h:153
YSLib::UI::PaintEventArgs
部件绘制参数。
Definition: YWidgetEvent.h:323
YSLib::UI::MLinearUIContainer::WidgetVector
vector< ItemType > WidgetVector
部件组类型。
Definition: YUIContainer.h:210
YSLib::UI::AddWidgets
void AddWidgets(_tCon &con, _tWidgets &...wgts)
向部件容器添加子部件。
Definition: YUIContainer.h:443
YSLib::Drawing::GBinaryGroup< SPos >
ynothrowv
#define ynothrowv
YSLib 无异常抛出保证验证：有条件地使用无异常抛出规范。
Definition: ydef.h:786
YModules.h
YSLib::UI::LocateOffset
YF_API Point LocateOffset(observer_ptr< const IWidget >, Point, observer_ptr< const IWidget >)
取相对第三参数指向的部件的点相对第一参数指向的容器的偏移坐标。
Definition: YUIContainer.cpp:79
YSLib::UI::MLinearUIContainer
线性部件容器模块。
Definition: YUIContainer.h:201
YSLib::UI::MoveToBottom
YF_API void MoveToBottom(IWidget &)
移动部件至容器下端。
Definition: YUIContainer.cpp:128
YSLib::UI::FetchTrace
YF_API vector< pair< observer_ptr< const IWidget >, Point > > FetchTrace(const IWidget &)
取指定部件向上遍历的轨迹：相对自身和所有父部件的位置。
Definition: YUIContainer.cpp:63
YSLib::UI::MoveToRight
YF_API void MoveToRight(IWidget &)
移动部件至容器右端。
Definition: YUIContainer.cpp:149
YSLib::UI::DefaultWindowZOrder
const ZOrder DefaultWindowZOrder(128)
默认窗口 Z 顺序值。
DefGetter
#define DefGetter(_q, _t, _n,...)
Definition: YBaseMacro.h:241
YSLib::UI::RemoveWidgets
void RemoveWidgets(_tCon &con, _tWidgets &...wgts)
从部件容器移除子部件。
Definition: YUIContainer.h:471
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::MoveToCenter
YF_API void MoveToCenter(IWidget &)
移动部件至容器中心。
Definition: YUIContainer.cpp:135
ystdex::cpp2011::begin
_type * begin(_type(&&array)[_vN])
Definition: range.hpp:46
ystdex::unseq_apply
void unseq_apply(_func &&f, _tParams &&...args)
无序调用。
Definition: functional.hpp:240
YSLib::UI::MoveToLeft
YF_API void MoveToLeft(IWidget &)
移动部件至容器左端。
Definition: YUIContainer.cpp:142
ystdex::size
auto size(const _tRange &c) -> decltype(c.size())
类容器访问。
Definition: range.hpp:233
YSLib::UI::MUIContainer::PairType
WidgetMap::value_type PairType
Definition: YUIContainer.h:324
YB_LIKELY
#define YB_LIKELY(_expr)
Definition: ydef.h:463
YSLib::UI::WidgetIterator
ystdex::any_input_iterator< IWidget > WidgetIterator
通用部件迭代器。
Definition: YWidget.h:52
ystdex::any_input_iterator
动态泛型输入迭代器。
Definition: any_iterator.hpp:227
ystdex::ref
lref< _type > ref(_type &t)
构造引用包装。
Definition: ref.hpp:132
YSLib::UI::MLinearUIContainer::vWidgets
WidgetVector vWidgets
部件组：存储部件引用。
Definition: YUIContainer.h:215
YSLib::UI::MUIContainer::mWidgets
WidgetMap mWidgets
部件映射：存储 Z 顺序映射至部件引用。
Definition: YUIContainer.h:333