YSTest: YUIContainer.cpp 源文件

YSTest PreAlpha_b700_20160611 The YSLib Test Project

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

- 文件列表
- 文件成员

YUIContainer.cpp
浏览该文件的文档.
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 #include "YSLib/UI/YModules.h"
29 #include YFM_YSLib_UI_YDesktop
30 #include <ystdex/functional.hpp> // for ystdex::bind1;
31
32 using namespace ystdex;
33
34 namespace YSLib
35 {
36
37 namespace UI
38 {
39
40 IWidget&
41 FetchTopLevel(IWidget& wgt)
42 {
43 auto wgt_ref(ystdex::ref(wgt));
44
45 while(const auto p = FetchContainerPtr(wgt_ref))
46 wgt_ref = *p;
47 return wgt_ref;
48 }
49 IWidget&
50 FetchTopLevel(IWidget& wgt, Point& pt)
51 {
52 auto wgt_ref(ystdex::ref(wgt));
53
54 while(const auto p = FetchContainerPtr(wgt_ref))
55 {
56 pt += GetLocationOf(wgt_ref);
57 wgt_ref = *p;
58 }
59 return wgt_ref;
60 }
61
62 vector<pair<observer_ptr<const IWidget>, Point>>
63 FetchTrace(const IWidget& wgt)
64 {
65 vector<pair<observer_ptr<const IWidget>, Point>> lst;
66 Point pt;
67
68 for(auto p_wgt(make_observer(&wgt)); p_wgt;
69 p_wgt = FetchContainerPtr(*p_wgt))
70 {
71 lst.emplace_back(p_wgt, pt);
72 pt += GetLocationOf(*p_wgt);
73 }
74 return lst;
75 }
76
77
78 Point
79 LocateOffset(observer_ptr<const IWidget> p_end, Point pt,
80 observer_ptr<const IWidget> p_wgt)
81 {
82 while(p_wgt && p_wgt != p_end)
83 {
84 pt += GetLocationOf(*p_wgt);
85 p_wgt = FetchContainerPtr(*p_wgt);
86 }
87 return pt;
88 }
89
90 Point
91 LocateForTopOffset(const Point& origin, IWidget& wgt, const Point& pt)
92 {
93 auto loc(origin);
94
95 FetchTopLevel(wgt, loc);
96 return loc + pt;
97 }
98
99 Point
100 LocateForTrace(const vector<pair<observer_ptr<const IWidget>, Point>>& lst,
101 const IWidget& wgt)
102 {
103 Point pt;
104
105 for(auto p_wgt(make_observer(&wgt)); p_wgt;
106 p_wgt = FetchContainerPtr(*p_wgt))
107 {
108 const auto
109 i(std::find(lst.cbegin() | get_key, lst.cend() | get_key, p_wgt));
110
111 if(i != lst.cend())
112 return pt - i.get()->second;
113 pt += GetLocationOf(*p_wgt);
114 }
115 return Point::Invalid;
116 }
117
118 Point
119 LocateForParentContainer(const IWidget& wgt)
120 {
121 return FetchContainerPtr(wgt)
122 ? LocateContainerOffset(*FetchContainerPtr(wgt), GetLocationOf(wgt))
123 : Point::Invalid;
124 }
125
126
127 void
128 MoveToBottom(IWidget& wgt)
129 {
130 SetLocationOf(wgt, Point(GetLocationOf(wgt).X, GetSizeOf(
131 Deref(FetchContainerPtr(wgt))).Height - GetSizeOf(wgt).Height));
132 }
133
134 void
135 MoveToCenter(IWidget& wgt)
136 {
137 SetLocationOf(wgt,
138 LocateCenter(GetSizeOf(Deref(FetchContainerPtr(wgt))), GetSizeOf(wgt)));
139 }
140
141 void
142 MoveToLeft(IWidget& wgt)
143 {
144 YAssertNonnull(FetchContainerPtr(wgt));
145 SetLocationOf(wgt, Point(0, GetLocationOf(wgt).Y));
146 }
147
148 void
149 MoveToRight(IWidget& wgt)
150 {
151 SetLocationOf(wgt, Point(GetSizeOf(Deref(FetchContainerPtr(wgt))).Width
152 - GetSizeOf(wgt).Width, GetLocationOf(wgt).Y));
153 }
154
155 void
156 MoveToTop(IWidget& wgt)
157 {
158 YAssertNonnull(FetchContainerPtr(wgt));
159 SetLocationOf(wgt, Point(GetLocationOf(wgt).X, 0));
160 }
161
162
163 bool
164 RemoveFrom(IWidget& wgt, IWidget& con)
165 {
166 if(FetchContainerPtr(wgt).get() == &con)
167 {
168 SetContainerPtrOf(wgt);
169 if(FetchFocusingPtr(con).get() == &wgt)
170 con.GetView().FocusingPtr = {};
171 return true;
172 }
173 return {};
174 }
175
176
177 void
178 MLinearUIContainer::operator+=(IWidget& wgt)
179 {
180 if(!Contains(wgt))
181 vWidgets.push_back(ystdex::ref(wgt));
182 }
183
184 bool
185 MLinearUIContainer::operator-=(IWidget& wgt)
186 {
187 auto t(vWidgets.size());
188
189 erase_all_if(vWidgets, bind1(is_equal(), std::ref(wgt)));
190 t -= vWidgets.size();
191 YAssert(t <= 1, "Duplicate widget references found.");
192 return t != 0;
193 }
194
195 bool
196 MLinearUIContainer::Contains(IWidget& wgt) const
197 {
198 return std::count_if(vWidgets.cbegin(), vWidgets.cend(),
199 bind1(is_equal(), std::ref(wgt))) != 0;
200 }
201
202 size_t
203 MLinearUIContainer::Find(IWidget& wgt) const
204 {
205 return size_t(std::find_if(vWidgets.cbegin(), vWidgets.cend(),
206 bind1(is_equal(), std::ref(wgt))) - vWidgets.cbegin());
207 }
208
209 MLinearUIContainer::iterator
210 MLinearUIContainer::begin()
211 {
212 return vWidgets.begin() | get_get;
213 }
214
215 MLinearUIContainer::iterator
216 MLinearUIContainer::end()
217 {
218 return vWidgets.end() | get_get;
219 }
220
221
222 bool
223 MUIContainer::operator-=(IWidget& wgt)
224 {
225 auto t(mWidgets.size());
226
227 erase_all_if(mWidgets, mWidgets.cbegin(), mWidgets.cend(),
228 [&](decltype(*mWidgets.cend()) pr){
229 return is_equal()(pr.second, wgt);
230 });
231 t -= mWidgets.size();
232 YAssert(t <= 1, "Duplicate widget references found.");
233 return t != 0;
234 }
235
236 void
237 MUIContainer::Add(IWidget& wgt, ZOrder z)
238 {
239 if(!Contains(wgt))
240 mWidgets.emplace(z, ystdex::ref(wgt));
241 }
242
243 bool
244 MUIContainer::Contains(IWidget& wgt)
245 {
246 return std::count_if(mWidgets.cbegin(), mWidgets.cend(),
247 [&](decltype(*mWidgets.cend()) pr) ynothrow{
248 return is_equal()(pr.second, wgt);
249 }) != 0;
250 }
251
252 void
253 MUIContainer::PaintVisibleChildren(PaintEventArgs& e)
254 {
255 std::for_each(mWidgets.cbegin() | get_value, mWidgets.cend() | get_value,
256 [&](const ItemType& wgt_ref){
257 PaintVisibleChildAndCommit(wgt_ref, e);
258 });
259 }
260
261 ZOrder
262 MUIContainer::QueryZ(IWidget& wgt) const
263 {
264 for(auto& pr : mWidgets)
265 if(is_equal()(pr.second, wgt))
266 return pr.first;
267 throw std::out_of_range("Widget not found.");
268 }
269
270 MUIContainer::iterator
271 MUIContainer::begin()
272 {
273 return mWidgets.rbegin() | get_value | get_get;
274 }
275
276 MUIContainer::iterator
277 MUIContainer::end()
278 {
279 return mWidgets.rend() | get_value | get_get;
280 }
281
282 } // namespace UI;
283
284 } // namespace YSLib;
285
ystdex::erase_all_if
void erase_all_if(_tCon &con, _tIter first, _tIter last, _fPred pred)
删除指定容器中指定区间中的或全部满足谓词的元素。
Definition: container.hpp:723
platform::p
while p p
Definition: YCLib/FileSystem.h:225
ynothrow
#define ynothrow
YSLib 无异常抛出保证：若支持 noexcept 关键字， 指定特定的 noexcept 异常规范。
Definition: ydef.h:740
YSLib::UI::LocateForTopOffset
Point LocateForTopOffset(const Point &origin, IWidget &wgt, const Point &pt)
Definition: YUIContainer.cpp:91
YSLib::UI::ZOrder
std::uint8_t ZOrder
Z 顺序类型：覆盖顺序，值越大表示越接近顶层。
Definition: YUIContainer.h:176
ystdex::get_value
const second_tag get_value
Definition: iterator.hpp:589
YSLib::UI::MoveToTop
YF_API void MoveToTop(IWidget &)
移动部件至容器上端。
Definition: YUIContainer.cpp:156
YSLib::UI::LocateForParentContainer
YF_API Point LocateForParentContainer(const IWidget &)
取指定部件相对容器的父容器的偏移坐标。
Definition: YUIContainer.cpp:119
YSLib
YSLib 命名空间。
Definition: AndroidHost.h:45
CHRLib::e
const char const char * e
Definition: CharacterProcessing.h:109
ystdex::is_equal
相等关系仿函数。
Definition: functor.hpp:185
YSLib::UI::FetchTrace
YF_API vector< pair< observer_ptr< const IWidget >, Point > > FetchTrace(const IWidget &)
取指定部件向上遍历的轨迹：相对自身和所有父部件的位置。
Definition: YUIContainer.cpp:63
YSLib::UI::MoveToBottom
YF_API void MoveToBottom(IWidget &)
移动部件至容器下端。
Definition: YUIContainer.cpp:128
ystdex::get_get
const struct ystdex::get_get_t get_get
platform::size_t
YF_API size_t
Definition: FileIO.h:1262
YAssert
#define YAssert(_expr, _msg)
Definition: cassert.h:105
platform_ex::Windows::Invalid
Definition: MinGW32.h:461
YSLib::UI::LocateForTrace
IWidget const Point &YF_API Point LocateForTrace(const vector< pair< observer_ptr< const IWidget >, Point >> &, const IWidget &)
取指定部件相对轨迹的偏移坐标。
Definition: YUIContainer.cpp:100
platform::KeyCodes::DS::Y
Definition: Keys.h:229
ystdex::get_key
const first_tag get_key
Definition: iterator.hpp:588
YSLib::UI::LocateOffset
YF_API Point LocateOffset(observer_ptr< const IWidget >, Point, observer_ptr< const IWidget >)
取相对第三参数指向的部件的点相对第一参数指向的容器的偏移坐标。
Definition: YUIContainer.cpp:79
ystdex::lref< IWidget >
functional.hpp
函数和可调用对象。
platform::Deref
yconstfn auto Deref(_type &&p) -> decltype(*p)
断言并解引用非空指针。
Definition: Debug.h:440
YAssertNonnull
#define YAssertNonnull(_expr)
Definition: cassert.h:114
YSLib::UI::RemoveFrom
YF_API bool RemoveFrom(IWidget &, IWidget &)
从容器中移除部件。
Definition: YUIContainer.cpp:164
YSLib::UI::wgt
IWidget & wgt
Definition: YControl.h:112
ystdex::bind1
auto bind1(_func &&f, _tParams &&...args) -> decltype(std::bind(std::forward< decltype(f)>(f), std::placeholders::_1, std::forward< decltype(args)>(args)...))
复合调用 std::bind 和 std::placeholders::_1 。
Definition: functional.hpp:583
YSLib::UI::FetchFocusingPtr
pt pt Y FetchFocusingPtr
Definition: YWidget.h:145
ystdex
特性测试宏。
Definition: ydef.h:796
YSLib::UI::SetLocationOf
YF_API void SetLocationOf(IWidget &, const Point &)
设置部件左上角所在位置（相对容器的偏移坐标）。
Definition: YWidget.cpp:76
UI
YSLib::UI::MoveToCenter
YF_API void MoveToCenter(IWidget &)
移动部件至容器中心。
Definition: YUIContainer.cpp:135
YSLib::i
return i
Definition: YCoreUtilities.h:176
YModules.h
YSLib::UI::PaintVisibleChildAndCommit
void PaintVisibleChildAndCommit(IWidget &wgt, PaintEventArgs &e) ImplExpr(IsVisible(wgt)?PaintChildAndCommit(wgt
调用可见的 PaintChild 指定子部件并提交参数的重绘区域。
YSLib::Drawing::Point
GBinaryGroup< SPos > Point
屏幕二维点（直角坐标表示）。
Definition: YGDIBase.h:278
platform::KeyCodes::DS::X
Definition: Keys.h:228
YSLib::UI::MoveToRight
YF_API void MoveToRight(IWidget &)
移动部件至容器右端。
Definition: YUIContainer.cpp:149
YSLib::UI::GetSizeOf
pt pt Y const IWidget &wgt const IWidget &wgt GetSizeOf
无效化：使相对部件的子部件的指定区域在直接和间接的窗口缓冲区中无效。
Definition: YWidget.h:161
ystdex::make_observer
observer_ptr< _type > make_observer(_type *p)
Definition: memory.hpp:1042
YSLib::UI::PaintEventArgs
部件绘制参数。
Definition: YWidgetEvent.h:323
YSLib::UI::FetchTopLevel
YF_API IWidget & FetchTopLevel(IWidget &)
取指定部件的顶层部件。
Definition: YUIContainer.cpp:41
ystdex::cpp2011::begin
_type * begin(_type(&&array)[_vN])
Definition: range.hpp:46
YSLib::UI::MoveToLeft
YF_API void MoveToLeft(IWidget &)
移动部件至容器左端。
Definition: YUIContainer.cpp:142
YSLib::UI::GetLocationOf
pt pt Y const IWidget &wgt GetLocationOf
Definition: YWidget.h:153
ystdex::any_input_iterator
动态泛型输入迭代器。
Definition: any_iterator.hpp:209
ystdex::cpp2011::end
_type * end(_type(&&array)[_vN])
Definition: range.hpp:54
ystdex::ref
lref< _type > ref(_type &t)
构造引用包装。
Definition: ref.hpp:120
YSLib::Drawing::GBinaryGroup< SPos >