YSTest: YControl.cpp 源文件

YSTest PreAlpha_b900_20201012 The YSLib Test Project

YControl.cpp
浏览该文件的文档.
1 /*
2 © 2010-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 #include "YSLib/UI/YModules.h"
29 #include YFM_YSLib_UI_YControl
30 #include YFM_YSLib_UI_YGUI
31 #include YFM_YSLib_UI_YUIContainer
32 #include YFM_YSLib_Core_YStorage
33 #include YFM_YSLib_Service_YBrush
34
35 namespace YSLib
36 {
37
38 namespace UI
39 {
40
41 namespace
42 {
43
45 void
46 OnKey_Bound_Events(KeyEventArgs& e, VisualEvent id)
47 {
48 if(const auto p_control = dynamic_cast<Control*>(&e.GetSender()))
49 if(p_control->BoundControlPtr)
50 {
51 auto p_ctl(p_control->BoundControlPtr(e.GetKeys()));
52
53 if(p_ctl && IsEnabled(*p_ctl))
54 {
55 TryExpr(DoEvent<HCursorEvent>(p_ctl->GetController(), id,
56 CursorEventArgs(*p_ctl, e.Keys, Point::Invalid)))
57 CatchIgnore(BadEvent&)
58 e.Handled = true;
59 }
60 }
61 }
62
64 void
65 TouchHeld_DragWidget(observer_ptr<IWidget> p = {})
66 {
67 auto& st(FetchGUIState());
68
69 if(!p)
70 p = st.GetIndependentFocusPtr();
71 if(st.CheckDraggingOffset(p))
72 {
73 // TODO: Compare subsequent states to make a more efficient implementation.
74 // TODO: Merge state to make a more efficient implementation.
75 InvalidateParent(*p);
76 SetLocationOf(*p, st.CursorLocation + st.DraggingOffset);
77 }
78 }
79
80 } // unnamed namespace;
81
82
83 EventRef
84 Controller::GetEventRef(VisualEvent id, EventItem(&f)()) const
85 {
86 return GetMappedEvent(EventMap, id, f);
87 }
88
89
90 bool
91 Enable(IWidget& wgt, bool b)
92 {
93 const auto enability_changed(IsEnabled(wgt) != b);
94
95 SetEnabledOf(wgt, b);
96 if(enability_changed)
97 Invalidate(wgt);
98 return enability_changed;
99 }
100
101
102 void
103 OnUIEvent_Invalidate(UIEventArgs&& e)
104 {
105 Invalidate(e.GetSender());
106 }
107
108 void
109 OnKeyHeld(KeyEventArgs&& e)
110 {
111 auto& st(FetchGUIState());
112
113 if(st.HeldTimer.RefreshHeld(st.KeyHeldState, Timers::TimeSpan(240),
114 Timers::TimeSpan(60)))
115 CallEvent<KeyDown>(e.GetSender(), e);
116 }
117
118 void
119 OnTouchDown_RequestToFrontFocused(CursorEventArgs&& e)
120 {
121 IWidget& wgt(e.GetSender());
122
123 if(e.Strategy != RoutedEventArgs::Bubble)
124 RequestToFront(wgt);
125 if(e.Strategy == RoutedEventArgs::Direct)
126 ClearFocusingOf(wgt);
127 if(e.Strategy != RoutedEventArgs::Tunnel)
128 RequestFocus(wgt);
129 }
130
131 void
132 OnTouchHeld(CursorEventArgs&& e)
133 {
134 if(e.Strategy == RoutedEventArgs::Direct)
135 {
136 auto& st(FetchGUIState());
137
138 if(st.GetIndependentFocusPtr() && st.HeldTimer.RefreshHeld(
139 st.TouchHeldState, Timers::TimeSpan(240), Timers::TimeSpan(80)))
140 CallEvent<TouchDown>(*st.GetIndependentFocusPtr(), e);
141 }
142 }
143
144 void
145 OnTouchHeld_Dragging(CursorEventArgs&& e)
146 {
147 if(e.Strategy == RoutedEventArgs::Direct && !e.Handled)
148 TouchHeld_DragWidget();
149 }
150
151 void
152 OnTouchHeld_DraggingRaw(CursorEventArgs&& e, IWidget& wgt)
153 {
154 if(e.Strategy == RoutedEventArgs::Direct && !e.Handled)
155 TouchHeld_DragWidget(make_observer(&wgt));
156 }
157
158
159 void
160 OnKey_Bound_TouchUp(KeyEventArgs&& e)
161 {
162 OnKey_Bound_Events(e, TouchUp);
163 }
164
165 void
166 OnKey_Bound_TouchDown(KeyEventArgs&& e)
167 {
168 OnKey_Bound_Events(e, TouchDown);
169 }
170
171 void
172 OnKey_Bound_Click(KeyEventArgs&& e)
173 {
174 OnKey_Bound_Events(e, Click);
175 }
176
177
178 Control::ControlEventMap::ControlEventMap()
179 {
180 FetchEvent<TouchDown>(*this) += OnTouchDown_RequestToFrontFocused;
181 }
182
183 Control::Control(const Rect& r)
184 : Widget(new View(r), new Renderer(),
185 new Controller(true, FetchPrototype<ControlEventMap>())),
186 BoundControlPtr(std::bind(&Control::GetBoundControlPtr, this,
187 std::placeholders::_1))
188 {
189 FetchGUIState().Wrap(*this),
190 yunseq(
191 FetchEvent<Move>(*this) += [](UIEventArgs&& e){
192 InvalidateParent(e.GetSender());
193 },
194 FetchEvent<Resize>(*this) += OnUIEvent_Invalidate
195 );
196 }
197 Control::Control(const Rect& r, HBrush b)
198 : Control(r)
199 {
200 Background = b;
201 }
202 Control::Control(const Control& ctl)
203 : Widget(ctl), BoundControlPtr(ctl.BoundControlPtr)
204 {}
205 ImplDeDtor(Control)
206
207 void
208 Control::OnTouch_Close(CursorEventArgs&&)
209 {
210 Close(*this);
211 }
212
213 } // namespace UI;
214
215 } // namespace YSLib;
216
YSLib::UI::SetLocationOf
YF_API void SetLocationOf(IWidget &, const Point &)
设置部件左上角所在位置（相对容器的偏移坐标）。
Definition: YWidget.cpp:76
YSLib::UI::Enable
bool Enable(IWidget &wgt, bool b)
Definition: YControl.cpp:91
CatchIgnore
#define CatchIgnore(_ex)
指定异常处理器忽略指定异常。
Definition: YBaseMacro.h:133
YSLib::UI::OnTouchHeld
YF_API void OnTouchHeld(CursorEventArgs &&)
处理屏幕接触保持事件。
Definition: YControl.cpp:132
YSLib::UI::OnKey_Bound_TouchUp
YF_API void OnKey_Bound_TouchUp(KeyEventArgs &&)
处理按键事件：按键-指针设备接触结束。
Definition: YControl.cpp:160
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
ystdex::function_base
函数包装类模板。
Definition: function.hpp:578
YSLib::UI::Control
控件。
Definition: YControl.h:271
YSLib::UI::Widget
部件。
Definition: YWidget.h:374
YSLib::UI::CursorEventArgs
指针设备输入事件参数类。
Definition: YWidgetEvent.h:216
YSLib::UI::RequestToFront
void RequestToFront(IWidget &wgt)
Definition: YWidget.cpp:195
YSLib::UI::RoutedEventArgs::Tunnel
@ Tunnel
隧道事件：向下遍历视图树时触发。
Definition: YWidgetEvent.h:111
YSLib::UI::TouchUp
@ TouchUp
屏幕接触结束。
Definition: YWidgetEvent.h:396
YSLib::Drawing::GBinaryGroup< SPos >::Invalid
static const GBinaryGroup Invalid
无效（不在屏幕坐标系中）对象。
Definition: YGDIBase.h:298
YSLib::UI::OnKey_Bound_Click
YF_API void OnKey_Bound_Click(KeyEventArgs &&)
处理按键事件：按键-指针设备按下。
Definition: YControl.cpp:172
YSLib::UI::OnTouchHeld_DraggingRaw
YF_API void OnTouchHeld_DraggingRaw(CursorEventArgs &&, IWidget &)
处理屏幕接触移动事件：拖放指定部件。
Definition: YControl.cpp:152
YSLib::UI::AController::GetEventRef
VisualEvent id const GetEventRef
Definition: YWidgetEvent.h:638
CHRLib::f
f(d, s)
YSLib::UI::ImplDeDtor
ImplDeDtor(Thumb) void DecorateAsCloseButton(Thumb &tmb)
Definition: Button.cpp:125
YSLib::UI::RoutedEventArgs::Bubble
@ Bubble
气泡事件：向上遍历视图树时触发。
Definition: YWidgetEvent.h:109
YSLib::UI::Widget::Background
HBrush Background
背景。
Definition: YWidget.h:395
YSLib::UI::ClearFocusingOf
wgt wgt YF_API void ClearFocusingOf(IWidget &)
清除焦点指针并以此部件作为事件源调用被清除焦点部件的 LostFocus 事件。
Definition: YFocus.cpp:111
YSLib::UI::Invalidate
YF_API void Invalidate(IWidget &, const Rect &)
无效化：使相对部件的指定区域在直接和间接的窗口缓冲区中无效。
Definition: YWidget.cpp:108
ystdex::make_observer
observer_ptr< _type > make_observer(_type *p)
Definition: pointer.hpp:405
YSLib::UI::Click
@ Click
屏幕点击。
Definition: YWidgetEvent.h:402
YSLib::UI::RoutedEventArgs::Direct
@ Direct
直接事件：仅当遍历至目标控件时触发。
Definition: YWidgetEvent.h:113
YSLib::UI::InvalidateParent
void InvalidateParent(IWidget &wgt)
Definition: YWidget.cpp:141
std
Definition: optional.h:982
YSLib::UI::EventItem
ValueObject EventItem
事件映射项类型。
Definition: YWidgetEvent.h:505
YSLib::UI::VisualEvent
VisualEvent
标准控件事件空间。
Definition: YWidgetEvent.h:377
yunseq
#define yunseq
无序列依赖表达式组求值。
Definition: ydef.h:1535
YSLib::UI::Close
void Close(IWidget &wgt)
Definition: YWidget.cpp:92
YSLib::UI::KeyEventArgs
按键输入事件参数类。
Definition: YWidgetEvent.h:193
YSLib::UI::OnKeyHeld
YF_API void OnKeyHeld(KeyEventArgs &&)
处理键接触保持事件。
Definition: YControl.cpp:109
YSLib::UI::e
void e
Definition: YWidget.h:356
YSLib::Drawing::Rect
屏幕标准矩形：表示屏幕矩形区域。
Definition: YGDIBase.h:788
YSLib
YSLib 命名空间。
Definition: AndroidHost.h:46
YModules.h
YSLib 用户界面模块配置文件。
YSLib::UI::UIEventArgs
用户界面事件参数基类。
Definition: YWidgetEvent.h:61
YSLib::UI::wgt
IWidget & wgt
Definition: YControl.h:113
YSLib::UI::Control::Control
Control(const Rect &, HBrush)
构造：使用指定边界和背景画刷。
Definition: YControl.cpp:197
YSLib::UI::GetMappedEvent
YB_ATTR_nodiscard YF_API YB_PURE EventRef GetMappedEvent(VisualEventMap &, VisualEvent, EventItem(&)())
在事件映射表中取指定索引对应的事件。
Definition: YWidgetEvent.cpp:119
YSLib::UI::SetEnabledOf
SetEnabledOf
Definition: YControl.h:113
YSLib::UI::OnUIEvent_Invalidate
YF_API void OnUIEvent_Invalidate(UIEventArgs &&)
处理用户界面事件：无效化发送者。
Definition: YControl.cpp:103
platform::p
return p p
Definition: YCLib/FileSystem.h:209
YSLib::FetchPrototype
const _type & FetchPrototype()
取指定类型的静态原型对象。
Definition: YStorage.hpp:65
YSLib::UI::Controller::EventMap
VisualEventMap EventMap
事件映射表。
Definition: YControl.h:60
YSLib::Timers::TimeSpan
std::chrono::duration< Duration::rep, std::milli > TimeSpan
低精度时间间隔。
Definition: YClock.h:81
TryExpr
#define TryExpr(...)
指定表达式在 try 块中求值。
Definition: YBaseMacro.h:120
YSLib::UI::FetchGUIState
GUIState & FetchGUIState() ynothrow
Definition: YGUI.cpp:506
YSLib::UI::OnKey_Bound_TouchDown
YF_API void OnKey_Bound_TouchDown(KeyEventArgs &&)
处理按键事件：按键-指针设备接触开始。
Definition: YControl.cpp:166
YSLib::UI::OnTouchDown_RequestToFrontFocused
YF_API void OnTouchDown_RequestToFrontFocused(CursorEventArgs &&)
处理屏幕接触开始事件：使用一般接触策略。
Definition: YControl.cpp:119
YSLib::UI::TouchDown
@ TouchDown
屏幕接触开始。
Definition: YWidgetEvent.h:398
YSLib::UI::OnTouchHeld_Dragging
YF_API void OnTouchHeld_Dragging(CursorEventArgs &&)
处理屏幕接触移动事件：拖放按下部件。
Definition: YControl.cpp:145