YSTest: YWidget.h 源文件

YSTest PreAlpha_b900_20201012 The YSLib Test Project

YWidget.h
浏览该文件的文档.
1 /*
2 © 2009-2016, 2019 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_ywidget_h_
29 #define YSL_INC_UI_ywidget_h_ 1
30
31 #include "YModules.h"
32 #include YFM_YSLib_UI_YFocus
33 #include <ystdex/any_iterator.hpp> // for ystdex::any_input_iterator;
34 #include YFM_YSLib_UI_YWidgetView
35 #include YFM_YSLib_UI_YRenderer
36
37 namespace YSLib
38 {
39
40 namespace UI
41 {
42
52 using WidgetIterator = ystdex::any_input_iterator<IWidget>;
57 using WidgetRange = pair<WidgetIterator, WidgetIterator>;
58
59
65 DeclI(YF_API, IWidget)
73 DeclIEntry(WidgetRange GetChildren())
79 DeclIEntry(AController& GetController() const)
85 DeclIEntry(Renderer& GetRenderer() const)
92 DeclIEntry(AView& GetView() const)
93 EndDecl
94
96
97
101 YB_ATTR_nodiscard YB_PURE inline PDefH(bool, IsVisible, const IWidget& wgt)
102 ImplRet(wgt.GetView().IsVisible())
103
108 YB_ATTR_nodiscard YB_PURE bool
109 YF_API Contains(const IWidget&, SPos, SPos);
114 YB_ATTR_nodiscard YB_PURE inline
115 PDefH(bool, Contains, const IWidget& wgt, const Point& pt)
116 ImplRet(Contains(wgt, pt.X, pt.Y))
117
122 YB_ATTR_nodiscard YB_PURE bool
123 YF_API ContainsVisible(const IWidget& wgt, SPos x, SPos y);
128 YB_ATTR_nodiscard YB_PURE inline
129 PDefH(bool, ContainsVisible, const IWidget& wgt, const Point& pt)
130 ImplRet(ContainsVisible(wgt, pt.X, pt.Y))
131
138 YB_ATTR_nodiscard YB_PURE inline
139 PDefH(observer_ptr<IWidget>, FetchContainerPtr, const IWidget& wgt)
140 ImplRet(wgt.GetView().ContainerPtr)
141
148 YB_ATTR_nodiscard YB_PURE inline
149 PDefH(observer_ptr<IWidget>, FetchFocusingPtr, const IWidget& wgt)
150 ImplRet(wgt.GetView().FocusingPtr)
151
157 YB_ATTR_nodiscard YB_PURE inline PDefH(Point, GetLocationOf, const IWidget& wgt)
158 ImplRet(wgt.GetView().GetLocation())
159
165 YB_ATTR_nodiscard YB_PURE inline PDefH(Size, GetSizeOf, const IWidget& wgt)
166 ImplRet(wgt.GetView().GetSize())
167
172 YB_ATTR_nodiscard YB_PURE inline PDefH(Rect, GetBoundsOf, const IWidget& wgt)
173 ImplRet(wgt.GetView().GetBounds())
174
180 YF_API void
181 SetBoundsOf(IWidget&, const Rect&);
182
187 inline PDefH(void, SetContainerPtrOf, IWidget& wgt,
188 observer_ptr<IWidget> p_con = {})
189 ImplExpr(wgt.GetView().ContainerPtr = p_con)
190
195 YF_API void
196 SetInvalidationOf(IWidget&);
197
203 YF_API void
204 SetInvalidationToParent(IWidget&);
205
211 YF_API void
212 SetLocationOf(IWidget&, const Point&);
213
219 YF_API void
220 SetSizeOf(IWidget&, const Size&);
221
226 inline PDefH(void, SetVisibleOf, IWidget& wgt, bool b)
227 ImplExpr(wgt.GetView().SetVisible(b))
228
229
235 YF_API void
236 Close(IWidget&);
237
243 YF_API void
244 Hide(IWidget&);
245
250 YF_API void
251 Invalidate(IWidget&, const Rect&);
256 inline PDefH(void, Invalidate, IWidget& wgt)
257 ImplExpr(Invalidate(wgt, GetSizeOf(wgt)))
258
260
261 YF_API void
263 InvalidateAll(IWidget&, const Rect&);
265 inline PDefH(void, InvalidateAll, IWidget& wgt)
266 ImplExpr(InvalidateAll(wgt, GetSizeOf(wgt)))
267
269 YF_API void
270 InvalidateChildren(IWidget&, const Rect&);
272 inline PDefH(void, InvalidateChildren, IWidget& wgt)
273 ImplExpr(InvalidateChildren(wgt, GetSizeOf(wgt)))
275
282 YF_API void
283 InvalidateParent(IWidget&);
284
286
287
291 YF_API void
292 InvalidateVisible(IWidget&, const Rect&);
297 inline PDefH(void, InvalidateVisible, IWidget& wgt)
298 ImplExpr(InvalidateVisible(wgt, GetSizeOf(wgt)))
299
306 YF_API void
307 InvalidateVisibleParent(IWidget&);
309
320 YF_API void
321 PaintChild(IWidget& wgt, PaintEventArgs&& e);
331 YF_API Rect
332 PaintChild(IWidget& wgt, const PaintContext& pc);
333
338 YF_API void
339 PaintChildAndCommit(IWidget&, PaintEventArgs&);
340
345 inline void
346 PaintVisibleChildAndCommit(IWidget& wgt, PaintEventArgs& e)
347 ImplExpr(IsVisible(wgt) ? PaintChildAndCommit(wgt, e) : void())
348
355 YF_API void
356 RequestToFront(IWidget&);
357
364 YF_API void
365 Show(IWidget&);
367
368
373 class YF_API Widget : implements IWidget
374 {
375 private:
385 unique_ptr<AView> view_ptr;
386 unique_ptr<Renderer> renderer_ptr;
387 unique_ptr<AController> controller_ptr;
388
389
390 public:
395 mutable HBrush Background;
396
398 explicit
399 Widget(const Rect& = {});
401 explicit
402 Widget(const Rect&, HBrush);
410 template<typename _tView, typename _tRenderer, typename _tController>
411 explicit inline
412 Widget(_tView&& pView_ = make_unique<View>(),
413 _tRenderer&& pRenderer_ = make_unique<Renderer>(),
414 _tController&& pController_ = {})
415 : view_ptr(yforward(pView_)), renderer_ptr(yforward(pRenderer_)),
416 controller_ptr(yforward(pController_)), Background()
417 {
418 YAssertNonnull(view_ptr), YAssertNonnull(renderer_ptr);
419 InitializeEvents();
420 }
424 Widget(const Widget&);
426 DefDelMoveCtor(Widget)
433 virtual
434 ~Widget();
435
436 private:
441 void
442 InitializeEvents();
443
444 public:
446 DefGetter(ImplI(IWidget), WidgetRange, Children, WidgetRange())
454 static HBrush
455 MakeBlankBrush();
456 DefGetter(const ImplI(IWidget), AController&, Controller,
457 Deref(controller_ptr))
458 DefGetterMem(const ynothrow, SDst, Height, GetView())
459 DefGetter(const ImplI(IWidget), Renderer&, Renderer, Deref(renderer_ptr))
461 DefGetter(const ImplI(IWidget), AView&, View, Deref(view_ptr))
462 DefGetterMem(const ynothrow, SDst, Width, GetView())
463 DefGetterMem(const ynothrow, SPos, X, GetView())
464 DefGetterMem(const ynothrow, SPos, Y, GetView())
465
466 DefSetterMem(, SDst, Height, GetView())
467 DefSetterMem(, SDst, Width, GetView())
469 DefSetterMem(, SPos, X, GetView())
471 DefSetterMem(, SPos, Y, GetView())
477 void
478 SetRenderer(unique_ptr<Renderer>);
485 void
486 SetView(unique_ptr<AView>);
487
499 virtual void
500 Refresh(PaintEventArgs&&);
501 };
502
510 template<class _tRenderer>
511 inline _tRenderer&
512 WrapRenderer(Widget& wgt, unique_ptr<_tRenderer> p_renderer)
513 {
514 auto& res(Deref(p_renderer));
515
516 wgt.SetRenderer(std::move(p_renderer));
517 return res;
518 }
519 template<class _tRenderer, typename... _tParams>
520 YB_ATTR_nodiscard inline _tRenderer&
521 WrapRenderer(Widget& wgt, _tParams&&... args)
522 {
523 return UI::WrapRenderer(wgt, make_unique<_tRenderer>(yforward(args)...));
524 }
526
527
532 template<class... _tWidgets>
533 inline void
534 InvalidateWidgets(_tWidgets&... wgts)
535 {
536 ystdex::unseq_apply(static_cast<void(*)(IWidget&)>(Invalidate), wgts...);
537 }
538
539 } // namespace UI;
540
541 } // namespace YSLib;
542
543 #endif
544
YSLib::UI::SetLocationOf
YF_API void SetLocationOf(IWidget &, const Point &)
设置部件左上角所在位置（相对容器的偏移坐标）。
Definition: YWidget.cpp:76
YB_ATTR_nodiscard
#define YB_ATTR_nodiscard
标记返回值不被忽略的属性。
Definition: ydef.h:715
DefGetterMem
#define DefGetterMem(_q, _t, _n, _m)
Definition: YBaseMacro.h:247
EndDecl
#define EndDecl
Definition: YBaseMacro.h:406
YSLib::UI::SPos
const IWidget &wgt SPos
Definition: YWidget.h:109
YSLib::UI::ynothrow
AView &y ynothrow
Definition: YWidgetView.cpp:47
YSLib::Drawing::Size
屏幕区域大小。
Definition: YGDIBase.h:536
YSLib::UI::InvalidateChildren
void InvalidateChildren(IWidget &wgt, const Rect &bounds)
Definition: YWidget.cpp:128
YSLib::UI::Hide
YF_API void Hide(IWidget &)
隐藏部件。
Definition: YWidget.cpp:100
YB_PURE
#define YB_PURE
指示函数或函数模板实例为纯函数。
Definition: ydef.h:919
ystdex::unseq_apply
void unseq_apply(_func &&f, _tParams &&... args)
无序调用。
Definition: function.hpp:314
YSLib::UI::Widget::DefGetter
DefGetter(ImplI(IWidget), WidgetRange, Children, WidgetRange()) static HBrush MakeBlankBrush()
取空白画刷。
YSLib::UI::PDefH
PDefH(void, DisplayFor, IWidget &wgt, Timers::TimeSpan delay) ImplExpr(Show(wgt)
在一定时间内显示部件。
YSLib::UI::InvalidateVisibleParent
void InvalidateVisibleParent(IWidget &wgt)
Definition: YWidget.cpp:163
ystdex::function_base
函数包装类模板。
Definition: function.hpp:578
YSLib::UI::Widget
部件。
Definition: YWidget.h:374
YSLib::UI::RequestToFront
void RequestToFront(IWidget &wgt)
Definition: YWidget.cpp:195
YSLib::UI::SetBoundsOf
void SetBoundsOf(IWidget &wgt, const Rect &r)
Definition: YWidget.cpp:56
YSLib::UI::InvalidateWidgets
void InvalidateWidgets(_tWidgets &... wgts)
向无效化部件。
Definition: YWidget.h:534
ystdex::any_input_iterator
动态泛型输入迭代器。
Definition: any_iterator.hpp:247
YSLib::UI::GetSizeOf
YB_ATTR_nodiscard YB_PURE pt pt Y YB_ATTR_nodiscard YB_PURE const IWidget &wgt const IWidget &wgt GetSizeOf
无效化：使相对部件的子部件的指定区域在直接和间接的窗口缓冲区中无效。
Definition: YWidget.h:165
YSLib::UI::AController
抽象控制器。
Definition: YWidgetEvent.h:599
YSLib::UI::AView
抽象部件视图。
Definition: YWidgetView.h:112
YF_API
#define YF_API
Definition: Platform.h:56
YSLib::UI::ContainsVisible
YB_ATTR_nodiscard YB_PURE pt pt Y YB_ATTR_nodiscard YB_PURE bool YF_API ContainsVisible(const IWidget &wgt, SPos x, SPos y)
判断点是否在可见部件的可视区域内。
Definition: YWidget.cpp:49
YSLib::UI::Widget::renderer_ptr
unique_ptr< Renderer > renderer_ptr
渲染器指针。
Definition: YWidget.h:386
YSLib::UI::Widget::Background
HBrush Background
背景。
Definition: YWidget.h:395
YSLib::UI::PaintChildAndCommit
YF_API void PaintChildAndCommit(IWidget &, PaintEventArgs &)
调用 PaintChild 指定子部件并提交参数的重绘区域。
Definition: YWidget.cpp:189
YSLib::UI::Invalidate
YF_API void Invalidate(IWidget &, const Rect &)
无效化：使相对部件的指定区域在直接和间接的窗口缓冲区中无效。
Definition: YWidget.cpp:108
YSLib::UI::args
yconstfn const string _tParams && args
Definition: Loader.h:131
YSLib::UI::FetchFocusingPtr
YB_ATTR_nodiscard YB_PURE pt pt Y YB_ATTR_nodiscard YB_PURE FetchFocusingPtr
Definition: YWidget.h:149
YSLib::UI::InvalidateVisible
YF_API void InvalidateVisible(IWidget &, const Rect &)
无效化：使相对可见的部件的指定区域在直接和间接的窗口缓冲区中无效。
Definition: YWidget.cpp:148
ImplI
#define ImplI(...)
Definition: YBaseMacro.h:396
YSLib::UI::Show
YF_API void Show(IWidget &)
显示部件。
Definition: YWidget.cpp:202
YSLib::UI::GetBoundsOf
YB_ATTR_nodiscard YB_PURE pt pt Y YB_ATTR_nodiscard YB_PURE const IWidget &wgt const IWidget &wgt const IWidget &wgt GetBoundsOf
Definition: YWidget.h:172
yforward
#define yforward(_expr)
根据参数类型使用 std::forward 转发对应参数。
Definition: ydef.h:1508
YSLib::UI::PaintChild
YF_API void PaintChild(IWidget &wgt, PaintEventArgs &&e)
调用指定子部件的 Paint 事件绘制参数指定的事件发送者。
Definition: YWidget.cpp:171
YSLib::UI::InvalidateParent
void InvalidateParent(IWidget &wgt)
Definition: YWidget.cpp:141
any_iterator.hpp
动态泛型迭代器。
YAssertNonnull
#define YAssertNonnull(_expr)
Definition: cassert.h:165
YSLib::Drawing::GBinaryGroup
屏幕二元组。
Definition: YGDIBase.h:295
YSLib::Drawing::GetSize
dst GetSize()
platform::SDst
std::uint16_t SDst
屏幕坐标距离。
Definition: Video.h:44
YSLib::UI::Close
void Close(IWidget &wgt)
Definition: YWidget.cpp:92
YSLib::UI::Renderer
部件渲染器。
Definition: YRenderer.h:47
YSLib::UI::Controller
部件控制器。
Definition: YControl.h:54
implements
#define implements
Definition: YBaseMacro.h:358
YSLib::UI::SetInvalidationToParent
YF_API void SetInvalidationToParent(IWidget &)
在容器设置部件的无效区域。
Definition: YWidget.cpp:69
YSLib::UI::y
SPos SPos y
Definition: YWidget.cpp:44
YSLib::UI::e
void e
Definition: YWidget.h:356
YSLib::UI::WrapRenderer
YB_ATTR_nodiscard _tRenderer & WrapRenderer(Widget &wgt, _tParams &&... args)
Definition: YWidget.h:521
platform::KeyCodes::DS::Y
@ Y
Definition: Keys.h:230
YSLib::Drawing::Rect
屏幕标准矩形：表示屏幕矩形区域。
Definition: YGDIBase.h:788
YSLib
YSLib 命名空间。
Definition: AndroidHost.h:46
YModules.h
YSLib 用户界面模块配置文件。
YSLib::UI::Widget::Widget
Widget(_tView &&pView_=make_unique< View >(), _tRenderer &&pRenderer_=make_unique< Renderer >(), _tController &&pController_={})
构造：使用视图指针、渲染器指针和控制器指针，无背景。
Definition: YWidget.h:412
platform::Deref
YB_PURE yconstfn auto Deref(_type &&p) -> decltype(*p)
断言并解引用非空指针。
Definition: Debug.h:547
YSLib::UI::wgt
IWidget & wgt
Definition: YControl.h:113
YSLib::UI::PaintEventArgs
部件绘制参数。
Definition: YWidgetEvent.h:330
YSLib::UI::x
SPos x
Definition: YWidget.cpp:43
YSLib::UI::InvalidateAll
void InvalidateAll(IWidget &wgt, const Rect &bounds)
Definition: YWidget.cpp:121
YSLib::_tParams
YB_ATTR_nodiscard YB_PURE typename _tParams
Definition: ValueNode.h:1294
YSLib::UI::View
部件视图。
Definition: YWidgetView.h:208
YSLib::UI::SetSizeOf
YF_API void SetSizeOf(IWidget &, const Size &)
设置部件大小。
Definition: YWidget.cpp:83
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::WidgetRange
pair< WidgetIterator, WidgetIterator > WidgetRange
两个部件迭代器组成的左闭右开区间确定的迭代器范围。
Definition: YWidget.h:57
YSLib::UI::SetInvalidationOf
void SetInvalidationOf(IWidget &wgt)
Definition: YWidget.cpp:63
YSLib::DeclI
DeclI(YF_API, IResource) EndDecl namespace Drawing
资源接口。
Definition: YResource.h:42
YSLib::DeclIEntry
YB_ATTR_nodiscard DeclIEntry(any Create(Creation, const any &) const) YB_ATTR_nodiscard YB_PURE DeclIEntry(bool Equals(const void *) const) YB_ATTR_nodiscard YB_PURE DeclIEntry(size_t OwnsCount() const ynothrow) YB_ATTR_nodiscard YB_PURE DeclIEntry(any Query(uintmax_t) const) template< typename _type > YB_ATTR_nodiscard static any CreateHolder(Creation
创建新的持有者。
YSLib::UI::Widget::DefDelMoveCtor
DefDelMoveCtor(Widget) virtual ~Widget()
since build 428
YSLib::UI::X
YB_ATTR_nodiscard YB_PURE pt X
Definition: YWidget.h:116
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
platform::SPos
std::int16_t SPos
屏幕坐标度量。
Definition: Video.h:43
YSLib::UI::IsVisible
IsVisible
Definition: YWidget.h:101
YSLib::UI::ImplRet
const IWidget &wgt ImplRet(wgt.GetView().IsVisible()) YB_ATTR_nodiscard YB_PURE bool YF_API Contains(const IWidget &
判断点是否在部件的可视区域内。
DefSetterMem
#define DefSetterMem(_q, _t, _n, _m)
Definition: YBaseMacro.h:268
YSLib::UI::Widget::view_ptr
unique_ptr< AView > view_ptr
部件视图指针。
Definition: YWidget.h:385
YSLib::UI::Widget::controller_ptr
unique_ptr< AController > controller_ptr
控制器指针。
Definition: YWidget.h:387
YSLib::UI::PaintVisibleChildAndCommit
void PaintVisibleChildAndCommit(IWidget &wgt, PaintEventArgs &e) ImplExpr(IsVisible(wgt) ? PaintChildAndCommit(wgt
调用可见的 PaintChild 指定子部件并提交参数的重绘区域。