YSTest: YWidget.cpp 源文件

YSTest PreAlpha_b800_20170810 The YSLib Test Project

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

- 文件列表
- 文件成员

YWidget.cpp
浏览该文件的文档.
1 /*
2 © 2009-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 YFM_YSLib_Service_YBrush
31 #include YFM_YSLib_UI_YGUI
32
33 namespace YSLib
34 {
35
36 namespace UI
37 {
38
39 ImplDeDtor(IWidget)
40
41
42 bool
43 Contains(const IWidget& wgt, SPos x, SPos y)
44 {
45 return GetBoundsOf(wgt).Contains(x, y);
46 }
47
48 bool
49 ContainsVisible(const IWidget& wgt, SPos x, SPos y)
50 {
51 return IsVisible(wgt) && Contains(wgt, x, y);
52 }
53
54
55 void
56 SetBoundsOf(IWidget& wgt, const Rect& r)
57 {
58 SetLocationOf(wgt, r.GetPoint()),
59 SetSizeOf(wgt, r.GetSize());
60 }
61
62 void
63 SetInvalidationOf(IWidget& wgt)
64 {
65 wgt.GetRenderer().CommitInvalidation(Rect(GetSizeOf(wgt)));
66 }
67
68 void
69 SetInvalidationToParent(IWidget& wgt)
70 {
71 if(const auto p_con = FetchContainerPtr(wgt))
72 p_con->GetRenderer().CommitInvalidation(GetBoundsOf(wgt));
73 }
74
75 void
76 SetLocationOf(IWidget& wgt, const Point& pt)
77 {
78 wgt.GetView().SetLocation(pt);
79 CallEvent<Move>(wgt, UIEventArgs(wgt));
80 }
81
82 void
83 SetSizeOf(IWidget& wgt, const Size& s)
84 {
85 wgt.GetRenderer().SetSize(s);
86 wgt.GetView().SetSize(s);
87 CallEvent<Resize>(wgt, UIEventArgs(wgt));
88 }
89
90
91 void
92 Close(IWidget& wgt)
93 {
94 Hide(wgt);
95 if(const auto p_con = FetchContainerPtr(wgt))
96 ClearFocusingOf(*p_con);
97 }
98
99 void
100 Hide(IWidget& wgt)
101 {
102 SetVisibleOf(wgt, false);
103 ReleaseFocus(wgt);
104 Invalidate(wgt);
105 }
106
107 void
108 Invalidate(IWidget& wgt, const Rect& bounds)
109 {
110 Rect r(bounds);
111
112 for(auto p_wgt(make_observer(&wgt)); p_wgt;
113 p_wgt = FetchContainerPtr(*p_wgt))
114 {
115 r = p_wgt->GetRenderer().CommitInvalidation(r);
116 r.GetPointRef() += GetLocationOf(*p_wgt);
117 }
118 }
119
120 void
121 InvalidateAll(IWidget& wgt, const Rect& bounds)
122 {
123 InvalidateChildren(wgt, bounds);
124 Invalidate(wgt, bounds);
125 }
126
127 void
128 InvalidateChildren(IWidget& wgt, const Rect& bounds)
129 {
130 Rect r(wgt.GetRenderer().CommitInvalidation(bounds));
131
132 for(auto pr(wgt.GetChildren()); pr.first != pr.second; ++pr.first)
133 {
134 auto& child(*pr.first);
135
136 InvalidateChildren(child, Rect(r - GetLocationOf(child)));
137 }
138 }
139
140 void
141 InvalidateParent(IWidget& wgt)
142 {
143 if(const auto p_con = FetchContainerPtr(wgt))
144 Invalidate(*p_con, GetBoundsOf(wgt));
145 }
146
147 void
148 InvalidateVisible(IWidget& wgt, const Rect& bounds)
149 {
150 auto p_wgt(make_observer(&wgt));
151 Rect r(bounds);
152
153 while(IsVisible(*p_wgt))
154 {
155 r = p_wgt->GetRenderer().CommitInvalidation(r);
156 r.GetPointRef() += GetLocationOf(*p_wgt);
157 if(!(p_wgt = FetchContainerPtr(*p_wgt)))
158 break;
159 }
160 }
161
162 void
163 InvalidateVisibleParent(IWidget& wgt)
164 {
165 if(IsVisible(wgt))
166 if(const auto p_con = FetchContainerPtr(wgt))
167 InvalidateVisible(*p_con, GetBoundsOf(wgt));
168 }
169
170 void
171 PaintChild(IWidget& wgt, PaintEventArgs&& e)
172 {
173 auto& sender(e.GetSender());
174
175 if(Clip(e.ClipArea, Rect(e.Location += GetLocationOf(sender),
176 GetSizeOf(sender))))
177 wgt.GetRenderer().Paint(sender, std::move(e));
178 }
179 Rect
180 PaintChild(IWidget& wgt, const PaintContext& pc)
181 {
182 PaintEventArgs e(wgt, pc);
183
184 PaintChild(wgt, std::move(e));
185 return e.ClipArea;
186 }
187
188 void
189 PaintChildAndCommit(IWidget& wgt, PaintEventArgs& e)
190 {
191 e.ClipArea |= PaintChild(wgt, e);
192 }
193
194 void
195 RequestToFront(IWidget& wgt)
196 {
197 if(const auto p_pnl = dynamic_cast<Panel*>(FetchContainerPtr(wgt).get()))
198 p_pnl->MoveToFront(wgt);
199 }
200
201 void
202 Show(IWidget& wgt)
203 {
204 SetVisibleOf(wgt, true);
205 RequestFocus(wgt);
206 Invalidate(wgt);
207 }
208
209
210 Widget::Widget(const Rect& r)
211 : view_ptr(new View(r)), renderer_ptr(new Renderer()),
212 controller_ptr(new WidgetController({})), Background()
213 {
214 InitializeEvents();
215 }
216 Widget::Widget(const Rect& r, HBrush b)
217 // XXX: $2015-03 @ %Documentation::Workflow::Annual2015.
218 : IWidget(), view_ptr(new View(r)), renderer_ptr(new Renderer()),
219 controller_ptr(new WidgetController({})), Background(b)
220 {
221 InitializeEvents();
222 }
223 Widget::Widget(const Widget& wgt)
224 // XXX: $2015-03 @ %Documentation::Workflow::Annual2015.
225 : IWidget(), view_ptr(ystdex::clone_polymorphic(Deref(wgt.view_ptr))),
226 renderer_ptr(ystdex::clone_polymorphic(Deref(wgt.renderer_ptr))),
227 controller_ptr(ystdex::clone_polymorphic(Deref(wgt.controller_ptr))),
228 Background(wgt.Background)
229 {}
230 Widget::~Widget()
231 {
232 FetchGUIState().CleanupReferences(*this);
233 }
234
235 void
236 Widget::InitializeEvents()
237 {
238 (FetchEvent<Paint>(*this).Add(std::ref(Background), BackgroundPriority))
239 += std::bind(&Widget::Refresh, this, std::placeholders::_1);
240 }
241
242 HBrush
243 Widget::MakeBlankBrush()
244 {
245 return SolidBrush(ColorSpace::White);
246 }
247
248 void
249 Widget::SetRenderer(unique_ptr<Renderer> p)
250 {
251 renderer_ptr = p ? std::move(p) : make_unique<Renderer>();
252 renderer_ptr->SetSize(GetSizeOf(*this));
253 }
254 void
255 Widget::SetView(unique_ptr<AView> p)
256 {
257 if(!p)
258 p.reset(new View(GetBoundsOf(*this)));
259 swap(*p, *view_ptr);
260 view_ptr = std::move(p);
261 }
262
263 void
264 Widget::Refresh(PaintEventArgs&& e)
265 {
266 if(!e.ClipArea.IsUnstrictlyEmpty())
267 for(auto pr(GetChildren()); pr.first != pr.second; ++pr.first)
268 PaintVisibleChildAndCommit(*pr.first, e);
269 }
270
271 } // namespace UI;
272
273 } // namespace YSLib;
274
YSLib::UI::PaintChildAndCommit
YF_API void PaintChildAndCommit(IWidget &, PaintEventArgs &)
调用 PaintChild 指定子部件并提交参数的重绘区域。
Definition: YWidget.cpp:189
YSLib::UI::GetBoundsOf
pt pt Y const IWidget &wgt const IWidget &wgt const IWidget &wgt GetBoundsOf
Definition: YWidget.h:168
YSLib::UI::SetBoundsOf
void SetBoundsOf(IWidget &wgt, const Rect &r)
Definition: YWidget.cpp:56
YSLib::UI::SetSizeOf
YF_API void SetSizeOf(IWidget &, const Size &)
设置部件大小。
Definition: YWidget.cpp:83
YSLib
YSLib 命名空间。
Definition: AndroidHost.h:45
UI
ystdex::make_observer
observer_ptr< _type > make_observer(_type *p)
Definition: pointer.hpp:326
YSLib::UI::InvalidateVisible
YF_API void InvalidateVisible(IWidget &, const Rect &)
无效化：使相对可见的部件的指定区域在直接和间接的窗口缓冲区中无效。
Definition: YWidget.cpp:148
platform::Deref
yconstfn auto Deref(_type &&p) -> decltype(*p)
断言并解引用非空指针。
Definition: Debug.h:451
YSLib::UI::y
SPos SPos y
Definition: YWidget.cpp:44
YSLib::Drawing::r
The boundary is out of the const Graphics const Rect const Point const Point Color c const Rect const Rect & r
Definition: YDraw.h:174
YSLib::UI::x
SPos x
Definition: YWidget.cpp:43
ystdex::clone_polymorphic
auto clone_polymorphic(const _type &v) -> decltype(v.clone())
使用 clone 成员函数复制多态类类型对象。
Definition: memory.hpp:1115
YSLib::UI::ClearFocusingOf
wgt wgt YF_API void ClearFocusingOf(IWidget &)
清除焦点指针并以此部件作为事件源调用被清除焦点部件的 LostFocus 事件。
Definition: YFocus.cpp:111
YSLib::UI::wgt
IWidget & wgt
Definition: YControl.h:112
ystdex::cpp2014::make_unique
enable_if_t<!is_array< _type >::value, std::unique_ptr< _type > > make_unique(_tParams &&...args)
使用 new 和指定参数构造指定类型的 std::unique_ptr 对象。
Definition: memory.hpp:852
YSLib::UI::RequestToFront
void RequestToFront(IWidget &wgt)
Definition: YWidget.cpp:195
YSLib::UI::Close
void Close(IWidget &wgt)
Definition: YWidget.cpp:92
YSLib::UI::Widget::InitializeEvents
void InitializeEvents()
初始化事件组。
Definition: YWidget.cpp:236
YSLib::UI::Widget::Widget
Widget(const Rect &={})
Definition: YWidget.cpp:210
YSLib::UI::IsVisible
IsVisible
Definition: YWidget.h:101
YSLib::UI::Widget::View
Renderer AView View
Definition: YWidget.h:457
YSLib::UI::Invalidate
YF_API void Invalidate(IWidget &, const Rect &)
无效化：使相对部件的指定区域在直接和间接的窗口缓冲区中无效。
Definition: YWidget.cpp:108
YSLib::UI::FetchGUIState
GUIState & FetchGUIState() ynothrow
Definition: YGUI.cpp:508
YSLib::UI::BackgroundPriority
yconstexpr const EventPriority BackgroundPriority(0xC0)
用户界面绘制优先级。
YSLib::UI::Widget
部件。
Definition: YWidget.h:369
YSLib::UI::Widget::view_ptr
unique_ptr< AView > view_ptr
部件视图指针。
Definition: YWidget.h:381
YSLib::UI::Widget::SetView
void SetView(unique_ptr< AView >)
设置视图为指定指针指向的对象。
Definition: YWidget.cpp:255
YSLib::UI::SetLocationOf
YF_API void SetLocationOf(IWidget &, const Point &)
设置部件左上角所在位置（相对容器的偏移坐标）。
Definition: YWidget.cpp:76
CHRLib::s
_tDst const _tSrc * s
Definition: CharacterProcessing.h:140
YSLib::UI::View
部件视图。
Definition: YWidgetView.h:207
ystdex
特性测试宏。
Definition: ydef.h:822
YSLib::UI::GetLocationOf
pt pt Y const IWidget &wgt GetLocationOf
Definition: YWidget.h:153
YSLib::UI::HBrush
std::function< void(PaintEventArgs &&)> HBrush
画刷回调函数。
Definition: YComponent.h:81
YSLib::UI::PaintEventArgs
部件绘制参数。
Definition: YWidgetEvent.h:323
YSLib::UI::WidgetController
部件控制器。
Definition: YWidgetEvent.h:692
YSLib::UI::e
void e
Definition: YWidget.h:352
YSLib::Drawing::GBinaryGroup< SPos >
YModules.h
YSLib::UI::InvalidateAll
void InvalidateAll(IWidget &wgt, const Rect &bounds)
Definition: YWidget.cpp:121
YSLib::UI::Show
YF_API void Show(IWidget &)
显示部件。
Definition: YWidget.cpp:202
YSLib::UI::Renderer
部件渲染器。
Definition: YRenderer.h:46
YSLib::Drawing::Rect
屏幕标准矩形：表示屏幕矩形区域。
Definition: YGDIBase.h:540
YSLib::UI::Widget::Background
HBrush Background
背景。
Definition: YWidget.h:391
YSLib::UI::SetInvalidationToParent
YF_API void SetInvalidationToParent(IWidget &)
在容器设置部件的无效区域。
Definition: YWidget.cpp:69
YSLib::UI::Hide
YF_API void Hide(IWidget &)
隐藏部件。
Definition: YWidget.cpp:100
YSLib::UI::ContainsVisible
pt pt Y bool YF_API ContainsVisible(const IWidget &wgt, SPos x, SPos y)
判断点是否在可见部件的可视区域内。
Definition: YWidget.cpp:49
YSLib::Drawing::Size
屏幕区域大小。
Definition: YGDIBase.h:293
YSLib::Drawing::SolidBrush
单色画刷。
Definition: YBrush.h:58
YSLib::Drawing::bounds
The boundary is out of the const Rect & bounds
Definition: YDraw.h:127
YSLib::UI::UIEventArgs
用户界面事件参数基类。
Definition: YWidgetEvent.h:59
YSLib::UI::Widget::renderer_ptr
unique_ptr< Renderer > renderer_ptr
渲染器指针。
Definition: YWidget.h:382
YSLib::UI::SPos
const IWidget &wgt SPos
Definition: YWidget.h:109
YSLib::UI::PaintChild
YF_API void PaintChild(IWidget &wgt, PaintEventArgs &&e)
调用指定子部件的 Paint 事件绘制参数指定的事件发送者。
Definition: YWidget.cpp:171
YSLib::UI::InvalidateVisibleParent
void InvalidateVisibleParent(IWidget &wgt)
Definition: YWidget.cpp:163
YSLib::UI::bool
IWidget bool b bool
Definition: YControl.h:121
YSLib::UI::Widget::Refresh
virtual void Refresh(PaintEventArgs &&)
刷新：按指定参数绘制界面并更新状态。
Definition: YWidget.cpp:264
YSLib::UI::GetSizeOf
pt pt Y const IWidget &wgt const IWidget &wgt GetSizeOf
无效化：使相对部件的子部件的指定区域在直接和间接的窗口缓冲区中无效。
Definition: YWidget.h:161
ystdex::ref
lref< _type > ref(_type &t)
构造引用包装。
Definition: ref.hpp:132
YSLib::UI::SetInvalidationOf
void SetInvalidationOf(IWidget &wgt)
Definition: YWidget.cpp:63
YSLib::UI::PaintVisibleChildAndCommit
void PaintVisibleChildAndCommit(IWidget &wgt, PaintEventArgs &e) ImplExpr(IsVisible(wgt)?PaintChildAndCommit(wgt
调用可见的 PaintChild 指定子部件并提交参数的重绘区域。
YSLib::Consoles::White
Definition: YConsole.h:68
YSLib::UI::InvalidateChildren
void InvalidateChildren(IWidget &wgt, const Rect &bounds)
Definition: YWidget.cpp:128
CHRLib::p
const auto p(d)
YSLib::UI::InvalidateParent
void InvalidateParent(IWidget &wgt)
Definition: YWidget.cpp:141
YSLib::swap
void swap(ValueNode &x, ValueNode &y) ynothrow
Definition: ValueNode.cpp:73
YSLib::UI::ImplDeDtor
ImplDeDtor(Thumb) void DecorateAsCloseButton(Thumb &tmb)
Definition: Button.cpp:125