YSTest: ListControl.cpp 源文件

YSTest PreAlpha_b900_20201012 The YSLib Test Project

ListControl.cpp
浏览该文件的文档.
1 /*
2 © 2011-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_ListControl // for ystdex::max;
30 #include YFM_YSLib_UI_YWindow
31 #include YFM_YSLib_UI_Border
32 #include YFM_YSLib_Service_YBlit
33 #include YFM_YSLib_Service_TextLayout // for FetchMaxTextWidth;
34 #include <ystdex/cast.hpp> // for ystdex::polymorphic_downcast;
35
36 namespace YSLib
37 {
38
39 using namespace Drawing;
40
41 namespace UI
42 {
43
44 AMUnitControlList::AMUnitControlList(unique_ptr<IWidget> p_wgt)
45 : AMUnitList(),
46 p_unit(std::move(p_wgt))
47 {}
48
49 IWidget&
50 AMUnitControlList::GetUnitRef() const
51 {
52 return Deref(p_unit);
53 }
54
55 void
56 AMUnitControlList::SetUnit(unique_ptr<IWidget> p)
57 {
58 if(p)
59 p_unit = std::move(p);
60 else
61 throw std::invalid_argument("Null widget pointer found.");
62 }
63
64 WidgetIterator
65 AMUnitControlList::MakeIterator(size_t item_idx)
66 {
67 return ystdex::make_prototyped_iterator(GetUnitRef(), item_idx,
68 [this](IWidget& wgt, size_t idx){
69 if(idxShared != idx && idx < GetTotal())
70 {
71 Iterated(idx);
72 yunseq(FetchGUIState().WidgetIdentity = idx, idxShared = idx),
73 wgt.GetView().SetLocation(GetUnitLocation(idx));
74 }
75 });
76 }
77
78
79 MTextList::MTextList(const shared_ptr<ListType>& h)
80 : AMUnitControlList(make_unique<Control>()),
81 hList(h ? h : make_shared<ListType>())
82 {
83 auto& unit(GetUnitRef());
84
85 LabelBrush.Margin = {2, 2, 1, 1},
86 unit.GetView().SetHeight(GetItemHeight()),
87 Iterated += [this](size_t idx){
88 YAssert(idx < GetTotal(), "Index is out of range.");
89 LabelBrush.Text = GetList()[idx];
90 },
91 FetchEvent<Paint>(unit) = std::ref(LabelBrush);
92 }
93
94 SDst
95 MTextList::GetItemHeightCore() const
96 {
97 const auto
98 item_h(LabelBrush.Font.GetHeight() + GetVerticalOf(LabelBrush.Margin));
99
100 YAssert(item_h != 0, "Invalid item height found.");
101 return item_h;
102 }
103 size_t
104 MTextList::GetTotal() const
105 {
106 return GetList().size();
107 }
108
109 void
110 MTextList::SetList(const shared_ptr<ListType>& h)
111 {
112 if(YB_LIKELY(h))
113 hList = h;
114 }
115
116
117 TextList::TextList(const Rect& r, const shared_ptr<ListType>& h,
118 const pair<Color, Color>& hilight_pair)
119 : Control(r, MakeBlankBrush()), MTextList(h), MHilightText(hilight_pair)
120 {
121 using namespace std::placeholders;
122 const auto invalidator([this]{
123 Invalidate(*this);
124 });
125 auto& unit(GetUnitRef());
126
127 SetContainerPtrOf(unit, make_observer(this)),
128 // TODO: Implement auto fit.
129 SetSizeOf(unit, {GetWidth(), GetItemHeight()}),
130 yunseq(
131 FetchEvent<KeyDown>(*this) += [this](KeyEventArgs&& e){
132 if(!GetList().empty())
133 {
134 using namespace KeyCodes;
135 const auto& k(e.GetKeys());
136
137 if(k.count() != 1)
138 return;
139 if(k[Up] || k[Down] || k[PgUp] || k[PgDn])
140 {
141 const auto old_sel(vwList.GetSelectedIndex());
142 const auto old_off(vwList.GetOffset());
143 const auto old_hid(vwList.GetHeadIndex());
144 const auto old_top(uTopOffset);
145
146 {
147 const bool up(k[Up] || k[PgUp]);
148
149 if(vwList.IsSelected())
150 {
151 // XXX: Conversion to 'SPos' might be
152 // implementation-defined.
153 vwList.IncreaseSelected((up ? -1 : 1) * SPos(k[Up]
154 || k[Down] ? 1 : GetHeight() / GetItemHeight()),
155 GetList().size());
156 if(old_sel == vwList.GetSelectedIndex()
157 && CyclicTraverse)
158 goto bound_select;
159 if(vwList.GetOffset()
160 == (up ? 0 : ptrdiff_t(vwList.Length - 1)))
161 AdjustOffsetForHeight(GetHeight(), up);
162 }
163 else
164 bound_select:
165 up ? SelectLast() : SelectFirst();
166 }
167
168 const auto new_off(vwList.GetOffset());
169
170 if(vwList.GetSelectedIndex() != old_sel)
171 CallSelected();
172 if(old_top != uTopOffset || vwList.GetHeadIndex() != old_hid)
173 UpdateView(*this);
174 else if(old_off != new_off)
175 InvalidateSelected2(old_off, new_off);
176 }
177 else if(vwList.IsSelected())
178 {
179 // NOTE: Do not confuse with %UI::Enter.
180 if(k[KeyCodes::Enter])
181 InvokeConfirmed(vwList.GetSelectedIndex());
182 else if(k[Esc])
183 {
184 InvalidateSelected(vwList.GetOffset());
185 ClearSelected();
186 // TODO: Create new event for canceling selection.
187 CallSelected();
188 }
189 }
190 }
191 e.Handled = true;
192 },
193 FetchEvent<KeyHeld>(*this) += OnKeyHeld,
194 FetchEvent<CursorOver>(*this) += [this](CursorEventArgs&& e){
195 if(SelectionOptions[SelectOnHover]
196 && e.Strategy != RoutedEventArgs::Bubble
197 && FetchGUIState().IsCursorMoved())
198 {
199 const auto idx(CheckPoint(GetSizeOf(*this), e));
200
201 if(idx != size_t(-1))
202 SetSelected(idx);
203 }
204 },
205 FetchEvent<Paint>(*this).Add(BorderBrush(), BoundaryPriority),
206 FetchEvent<GotFocus>(*this) += invalidator,
207 FetchEvent<LostFocus>(*this) += invalidator,
208 FetchEvent<Leave>(*this)
209 += std::bind(&TextList::ClearSelectedOnLeave, this, _1),
210 FetchEvent<Click>(unit) += [this]{
211 InvokeConfirmed(idxShared);
212 },
213 FetchEvent<TouchDown>(unit) += [this]{
214 SetSelected(idxShared);
215 },
216 FetchEvent<TouchHeld>(unit) += [this](CursorEventArgs&& e){
217 if(&e.GetSender() == &GetUnitRef())
218 SetSelected(idxShared);
219 },
220 FetchEvent<Paint>(unit).Add([this](PaintEventArgs&& e){
221 auto& u(GetUnitRef());
222
223 if(vwList.CheckSelected(idxShared))
224 LabelBrush.ForeColor = HilightTextColor,
225 FillRect(e.Target, e.ClipArea, Rect(e.Location.X + 1, e.Location.Y,
226 GetSizeOf(u).Width - 2, GetSizeOf(u).Height),
227 HilightBackColor);
228 else
229 LabelBrush.ForeColor = ForeColor;
230 }, BackgroundPriority),
231 FetchEvent<Leave>(unit)
232 += std::bind(&TextList::ClearSelectedOnLeave, this, _1)
233 );
234 AdjustViewLength();
235 }
236
237 void
238 TextList::ClearSelectedOnLeave(CursorEventArgs&& e)
239 {
240 if(SelectionOptions[ClearSelectionOnLeave])
241 {
242 auto& sender(e.GetSender());
243
244 if(&sender != this && &sender != &GetUnitRef()
245 && !(IsRelated && IsRelated(sender)))
246 {
247 const auto old_off(vwList.GetOffset());
248
249 if(old_off != -1)
250 {
251 InvalidateSelected(old_off, 1);
252 ClearSelected();
253 }
254 }
255 }
256 }
257
258 void
259 TextList::SetList(const shared_ptr<ListType>& h)
260 {
261 if(h)
262 {
263 MTextList::SetList(h);
264 AdjustViewLength();
265 }
266 }
267
268 size_t
269 TextList::GetLastLabelIndex() const
270 {
271 return GetLastLabelIndexClipped(0, GetHeight());
272 }
273
274 void
275 TextList::SetSelected(ListType::size_type i)
276 {
277 if(vwList.Contains(i))
278 {
279 const auto old_off(vwList.GetOffset());
280
281 if(vwList.SetSelectedIndex(i, GetList().size()))
282 {
283 CallSelected();
284 InvalidateSelected2(old_off, vwList.GetOffset());
285 }
286 }
287 }
288
289 void
290 TextList::CallSelected()
291 {
292 Selected(IndexEventArgs(*this, vwList.GetSelectedIndex()));
293 }
294
295 void
296 TextList::InvalidateSelected(ListType::difference_type offset,
297 ListType::size_type n)
298 {
299 if(offset >= 0 && n != 0)
300 {
301 const auto item_h(GetItemHeight());
302 Rect r(0, SPos(ptrdiff_t(item_h) * offset - SPos(uTopOffset)),
303 GetWidth(), SDst(item_h * n));
304
305 if(r.Y < 0 || SDst(r.Y) < GetHeight())
306 {
307 r.Y = ystdex::max<SPos>(0, r.Y);
308 // XXX: Conversion to 'SPos' might be implementation-defined.
309 RestrictUnsignedStrict(r.Height, SDst(SPos(GetHeight()) - r.Y));
310 Invalidate(*this, r);
311 }
312 }
313 }
314
315 void
316 TextList::InvalidateSelected2(ListType::difference_type x,
317 ListType::difference_type y)
318 {
319 if(y < x)
320 std::swap(x, y);
321 InvalidateSelected(x < 0 ? 0 : x, size_t(y - x + 1));
322 }
323
324 void
325 TextList::InvokeConfirmed(ListType::size_type idx)
326 {
327 if(vwList.CheckSelected(idx))
328 {
329 Confirmed(IndexEventArgs(*this, idx));
330 if(SelectionOptions[ClearSelectionOnConfirm]
331 && !(IsRelated && IsRelated(*this)))
332 ClearSelected();
333 }
334 }
335
336 void
337 TextList::LocateViewPosition(SDst h)
338 {
339 const SDst fvh(GetFullViewHeight()), height(GetHeight());
340
341 if(fvh <= height)
342 return;
343 RestrictUnsignedStrict(h, SDst(fvh - height - 1));
344 if(GetViewPosition() != h)
345 {
346 const SDst item_h(GetItemHeight());
347
348 // NOTE: Prevent out-of-bounds partially displayed items first, then
349 // adjust the view.
350 AdjustViewLength();
351 vwList.SetHeadIndex(h / item_h, GetList().size());
352 uTopOffset = h % item_h;
353 UpdateView(*this, true);
354 }
355 }
356
357 void
358 TextList::Refresh(PaintEventArgs&& e)
359 {
360 if(GetHeight() != 0)
361 {
362 const Rect& bounds(e.ClipArea);
363
364 if(!bounds.IsUnstrictlyEmpty() && !GetList().empty())
365 {
366 // NOTE: View length could be already changed by contents.
367 AdjustViewLength();
368 SetSizeOf(GetUnitRef(), {GetWidth(), GetItemHeight()});
369 for(WidgetIterator first(begin()), last(MakeIterator(
370 GetLastLabelIndexClipped(e.Location.Y - bounds.Y,
371 bounds.Height))); first != last; ++first)
372 PaintVisibleChildAndCommit(*first, e);
373 }
374 }
375 }
376
377 void
378 TextList::ResetView()
379 {
380 MTextList::ResetView();
381 UpdateView(*this);
382 }
383
384 void
385 TextList::SelectFirst()
386 {
387 vwList.SetSelectedIndex(0, GetList().size());
388 AdjustOffsetForHeight(GetHeight(), true);
389 }
390
391 void
392 TextList::SelectLast()
393 {
394 const auto s(GetList().size());
395
396 vwList.SetSelectedIndex(s - 1, s);
397 AdjustOffsetForHeight(GetHeight(), {});
398 }
399
400 WidgetIterator
401 TextList::begin()
402 {
403 return MakeIterator(GetHeadIndex());
404 }
405
406 WidgetIterator
407 TextList::end()
408 {
409 return MakeIterator(GetLastLabelIndexClipped(0, GetHeight()));
410 }
411
412
413 void
414 ResizeForContent(TextList& tl)
415 {
416 const auto& lst(tl.GetList());
417
418 SetSizeOf(tl, Size(FetchMaxTextWidth(tl.LabelBrush.Font, lst.cbegin(),
419 lst.cend()) + GetHorizontalOf(tl.LabelBrush.Margin),
420 tl.GetFullViewHeight()));
421 tl.AdjustViewLength();
422 }
423
424 void
425 UpdateView(TextList& tl, bool is_active)
426 {
427 tl.ViewChanged(TextList::ViewArgs(tl, is_active));
428 tl.AdjustViewLength();
429 SetInvalidationOf(tl.GetUnitRef()),
430 Invalidate(tl);
431 }
432
433 } // namespace UI;
434
435 } // namespace YSLib;
436
YSLib::UI::AMUnitControlList::GetFullViewHeight
YB_ATTR_nodiscard SDst GetFullViewHeight() const
Definition: Viewer.cpp:161
cast.hpp
C++ 转换模板。
YSLib::UI::TextList::GetLastLabelIndex
ListType::size_type i const ynothrow vwList size_t GetLastLabelIndex() const
Definition: ListControl.cpp:269
YSLib::UI::MHilightText::HilightTextColor
Color HilightTextColor
高亮文本色。
Definition: Label.h:217
size
size_t size
Definition: memory_resource.cpp:295
ystdex::cpp2017::swap
void swap(optional< _type > &x, optional< _type > &y)
Definition: optional.h:888
YSLib::UI::TextList::ForeColor
Color ForeColor
默认前景色。
Definition: ListControl.h:233
YSLib::UI::UpdateView
YF_API void UpdateView(TextList &, bool is_active={})
更新文本列表视图。
Definition: ListControl.cpp:425
YSLib::UI::TextList::ClearSelectionOnLeave
@ ClearSelectionOnLeave
离开时自动清空选择。
Definition: ListControl.h:215
YSLib::Drawing::Size
屏幕区域大小。
Definition: YGDIBase.h:536
YSLib::Drawing::FillRect
c YF_API void FillRect(const Graphics &g, const Rect &r, Color c)
填充标准矩形。
Definition: YDraw.cpp:150
YSLib::UI::MHilightText::HilightBackColor
Color HilightBackColor
高亮背景色。
Definition: Label.h:215
YSLib::UI::AMUnitList
单元部件列表模块。
Definition: Viewer.h:201
YSLib::UI::AMUnitList::GetItemHeightCore
virtual YB_ATTR_nodiscard SDst GetItemHeightCore() const
取默认行高：实现。
Definition: Viewer.cpp:175
YSLib::UI::TextList::SelectOnHover
@ SelectOnHover
悬停时自动选择。
Definition: ListControl.h:217
YSLib::UI::AMUnitList::uTopOffset
SDst uTopOffset
列表视图首项目超出上边界的竖直偏移量。
Definition: Viewer.h:209
YSLib::UI::GValueEventArgs
简单 UI 事件参数类。
Definition: YWidgetEvent.h:306
platform::KeyCodes::DS::Esc
static yconstexpr const NativeSet Esc
Definition: Keys.h:238
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::Drawing::GGraphics::Height
const SizeType sGraphics Height
Definition: YGraphics.h:136
YSLib::UI::MTextList::hList
shared_ptr< ListType > hList
文本列表句柄。
Definition: ListControl.h:149
YSLib::UI::MTextList
文本列表模块。
Definition: ListControl.h:138
YSLib::UI::BoundaryPriority
yconstexpr const EventPriority BoundaryPriority(0x60)
ystdex::make_shared
std::shared_ptr< _type > make_shared(std::initializer_list< _tValue > il)
使用指定类型的初始化列表构造指定类型的 std::shared_ptr 对象。
Definition: memory.hpp:855
YSLib::UI::AMUnitControlList::Iterated
GEvent< void(size_t)> Iterated
迭代器迭代事件。
Definition: ListControl.h:90
YSLib::UI::Control
控件。
Definition: YControl.h:271
YSLib::UI::CursorEventArgs
指针设备输入事件参数类。
Definition: YWidgetEvent.h:216
YSLib::UI::TextList::TextList
TextList(const Rect &={}, const shared_ptr< ListType > &={}, const pair< Color, Color > &=FetchGUIConfiguration().Colors.GetPair(Styles::Highlight, Styles::HighlightText))
构造：使用指定边界、文本列表和高亮背景色/文本色对。
Definition: ListControl.cpp:117
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::BorderBrush
边框画刷。
Definition: Border.h:69
YSLib::UI::Widget::SPos
Renderer AView SPos
Definition: YWidget.h:463
YSLib::UI::TextList::SetSelected
void SetSelected(ListType::size_type)
按指定项目索引设置选中项目。
Definition: ListControl.cpp:275
YSLib::UI::AMUnitControlList::GetUnitRef
YB_ATTR_nodiscard YB_PURE IWidget & GetUnitRef() const ImplI(AMUnitList)
Definition: ListControl.cpp:50
YSLib::UI::AMUnitList::vwList
SequenceViewer vwList
列表视图。
Definition: Viewer.h:204
YSLib::UI::TextList::Refresh
void Refresh(PaintEventArgs &&) override
刷新：按指定参数绘制界面并更新状态。
Definition: ListControl.cpp:358
YSLib::UI::AMUnitList::idxShared
size_t idxShared
Definition: Viewer.h:211
YSLib::UI::AMUnitList::GetLastLabelIndexClipped
YB_ATTR_nodiscard size_t GetLastLabelIndexClipped(SPos, SDst) const
Definition: Viewer.cpp:180
YSLib::UI::RoutedEventArgs::Bubble
@ Bubble
气泡事件：向上遍历视图树时触发。
Definition: YWidgetEvent.h:109
YSLib::UI::AMUnitControlList
控件列表模块。
Definition: ListControl.h:56
YSLib::UI::AMUnitControlList::ViewChanged
GEvent< void(ViewArgs)> ViewChanged
视图变更事件。
Definition: ListControl.h:71
YSLib::UI::BackgroundPriority
yconstexpr const EventPriority BackgroundPriority(0xC0)
用户界面绘制优先级。
YSLib::UI::TextList::InvalidateSelected2
void InvalidateSelected2(ListType::difference_type, ListType::difference_type)
无效化偏移量对应的列表项区域。
Definition: ListControl.cpp:316
YSLib::UI::Invalidate
YF_API void Invalidate(IWidget &, const Rect &)
无效化：使相对部件的指定区域在直接和间接的窗口缓冲区中无效。
Definition: YWidget.cpp:108
YSLib::Drawing::FetchMaxTextWidth
YB_ATTR_nodiscard YB_PURE SDst FetchMaxTextWidth(const Font &font, _tIn first, _tIn last)
取指定字体显示的迭代器范围中的文本的最大宽度。
Definition: TextLayout.h:334
YSLib::UI::TextList::end
WidgetIterator end()
Definition: ListControl.cpp:407
YSLib::YAssert
YAssert(!(v< Deref(a)), "Value less than lower bound found.")
YSLib::UI::MTextList::SetList
void SetList(const shared_ptr< ListType > &)
设置文本列表。
Definition: ListControl.cpp:110
ystdex::make_observer
observer_ptr< _type > make_observer(_type *p)
Definition: pointer.hpp:405
YSLib::UI::SequenceViewer::Length
size_t Length
视图长度：最大可视项目数。
Definition: Viewer.h:63
YSLib::UI::TextList::InvalidateSelected
void InvalidateSelected(ListType::difference_type offset, ListType::size_type diff=1)
按内容大小依次调整视图中选中和第一个项目的索引，然后按需调整竖直偏移量。
Definition: ListControl.cpp:296
YSLib::UI::TextList::ResetView
void ResetView()
复位视图：调用 MUnitList::ResetView 和 UpdateView 。
Definition: ListControl.cpp:378
platform::KeyCodes::DS::PgDn
static yconstexpr const NativeSet PgDn
Definition: Keys.h:238
YSLib::UI::TextList::InvokeConfirmed
void InvokeConfirmed(ListType::size_type)
检查和调用确认事件处理器。
Definition: ListControl.cpp:325
YSLib::UI::TextList::SelectionOptions
std::bitset< SelectionOptionMax > SelectionOptions
选择操作选项。
Definition: ListControl.h:222
YSLib::UI::TextList::begin
WidgetIterator begin()
Definition: ListControl.cpp:401
YSLib::UI::IndexEventArgs
GValueEventArgs< size_t > IndexEventArgs
索引事件。
Definition: ListControl.h:47
YSLib::UI::MLabel::Font
Drawing::Font Font
字体。
Definition: Label.h:78
YSLib::UI::AMUnitControlList::SetUnit
void SetUnit(unique_ptr< IWidget >)
设置单元部件。
Definition: ListControl.cpp:56
YSLib::UI::AMUnitList::GetViewPosition
YB_ATTR_nodiscard SDst GetViewPosition() const
取视图顶端竖直位置。
Definition: Viewer.cpp:194
std
Definition: optional.h:982
YSLib::UI::MTextList::ListType
vector< ItemType > ListType
列表类型。
Definition: ListControl.h:143
YSLib::UI::SequenceViewer::SetHeadIndex
bool SetHeadIndex(size_t t, size_t total)
设置视图中第一个项目的索引。
Definition: Viewer.cpp:52
YSLib::UI::TextList::SelectFirst
void SelectFirst()
选择第一个项目。
Definition: ListControl.cpp:385
YSLib::i
return i
Definition: YCoreUtilities.h:177
platform::KeyCodes
本机按键编码。
Definition: Keys.h:204
yunseq
#define yunseq
无序列依赖表达式组求值。
Definition: ydef.h:1535
YSLib::UI::TextList::LocateViewPosition
void LocateViewPosition(SDst)
定位视图顶端至指定竖直位置。
Definition: ListControl.cpp:337
platform::SDst
std::uint16_t SDst
屏幕坐标距离。
Definition: Video.h:44
YSLib::UI::MLabel::ForeColor
Color ForeColor
默认前景色。
Definition: Label.h:77
YSLib::UI::AMUnitList::CheckPoint
YB_ATTR_nodiscard size_t CheckPoint(const Size &, const Point &)
检查点（相对左上角）是否在选择范围内，
Definition: Viewer.cpp:262
YSLib::UI::KeyEventArgs
按键输入事件参数类。
Definition: YWidgetEvent.h:193
YSLib::UI::OnKeyHeld
YF_API void OnKeyHeld(KeyEventArgs &&)
处理键接触保持事件。
Definition: YControl.cpp:109
YSLib::UI::y
SPos SPos y
Definition: YWidget.cpp:44
YSLib::UI::AMUnitControlList::AMUnitControlList
AMUnitControlList(unique_ptr< IWidget >)
构造：使用部件指针。
Definition: ListControl.cpp:44
YSLib::UI::e
void e
Definition: YWidget.h:356
YSLib::UI::empty
!sv empty() &&sv.front() !
YSLib::UI::Widget::Width
Renderer AView Width
Definition: YWidget.h:462
YSLib::Drawing::Rect
屏幕标准矩形：表示屏幕矩形区域。
Definition: YGDIBase.h:788
YSLib
YSLib 命名空间。
Definition: AndroidHost.h:46
CHRLib::s
_tDst const _tSrc * s
Definition: CharacterProcessing.h:143
YB_LIKELY
#define YB_LIKELY(_expr)
Definition: ydef.h:827
YSLib::UI::AMUnitControlList::MakeIterator
YB_ATTR_nodiscard WidgetIterator MakeIterator(size_t)
构造共享子部件迭代器。
Definition: ListControl.cpp:65
YModules.h
YSLib 用户界面模块配置文件。
YSLib::UI::TextList
文本列表。
Definition: ListControl.h:205
YSLib::Drawing::Rect::Height
SDst Height
宽。
Definition: YGDIBase.h:545
YSLib::UI::MLabel::Margin
Drawing::Padding Margin
文本和容器的间距。
Definition: Label.h:79
platform::KeyCodes::DS::Enter
static yconstexpr const NativeSet Enter
按键别名。
Definition: Keys.h:238
YSLib::UI::AMUnitList::GetItemHeight
YB_ATTR_nodiscard SDst GetItemHeight() const
取项目行高：调用 GetItemHeightCore 取结果。
Definition: Viewer.cpp:166
YSLib::UI::Widget::Height
Height
Definition: YWidget.h:458
YSLib::UI::AMUnitControlList::Confirmed
GEvent< void(IndexEventArgs)> Confirmed
项目选中确认事件。
Definition: ListControl.h:85
YSLib::UI::MTextList::MTextList
MTextList(const shared_ptr< ListType > &={})
构造：使用文本列表句柄。
Definition: ListControl.cpp:79
platform::Deref
YB_PURE yconstfn auto Deref(_type &&p) -> decltype(*p)
断言并解引用非空指针。
Definition: Debug.h:547
YSLib::Drawing::bounds
The boundary is out of the const Rect & bounds
Definition: YDraw.h:127
YSLib::UI::wgt
IWidget & wgt
Definition: YControl.h:113
YSLib::RestrictUnsignedStrict
void RestrictUnsignedStrict(_type &u, _type b) ynothrow
约束无符号整数 u 在区间上界 b 内。
Definition: YCoreUtilities.h:237
YSLib::UI::PaintEventArgs
部件绘制参数。
Definition: YWidgetEvent.h:330
platform::KeyCodes::DS::PgUp
static yconstexpr const NativeSet PgUp
Definition: Keys.h:238
YSLib::UI::x
SPos x
Definition: YWidget.cpp:43
YSLib::UI::MHilightText
高亮文本模块。
Definition: Label.h:212
YSLib::UI::TextList::SelectLast
void SelectLast()
选择最后一个项目。
Definition: ListControl.cpp:392
YSLib::UI::AMUnitList::AdjustOffsetForHeight
SDst AdjustOffsetForHeight(SDst, bool)
调整列表视图底项目的竖直偏移量为零。
Definition: Viewer.cpp:210
YSLib::UI::SetSizeOf
YF_API void SetSizeOf(IWidget &, const Size &)
设置部件大小。
Definition: YWidget.cpp:83
YSLib::UI::TextList::IsRelated
function< bool(IWidget &)> IsRelated
判断是否为 Leave 目标时不取消选择的相关部件。
Definition: ListControl.h:227
YSLib::UI::AMUnitList::ResetView
void ResetView()
复位视图。
Definition: Viewer.cpp:269
YSLib::UI::MLabel::Text
String Text
标签文本。
Definition: Label.h:94
YSLib::UI::AMUnitControlList::Selected
GEvent< void(IndexEventArgs)> Selected
项目选择状态变更事件。
Definition: ListControl.h:78
YSLib::Drawing::GetVerticalOf
YB_ATTR_nodiscard YB_PURE const Padding &m ynothrowv GetVerticalOf
Definition: YGDI.h:151
YSLib::UI::AMUnitList::GetFullViewHeight
YB_ATTR_nodiscard SDst GetFullViewHeight() const
取完整视图高。
Definition: Viewer.cpp:161
YSLib::UI::TextList::ResizeForContent
YF_API void ResizeForContent(TextList &)
根据文本内容调整文本列表大小。
Definition: ListControl.cpp:414
YSLib::Drawing::GBinaryGroup::Y
_type Y
Definition: YGDIBase.h:305
YSLib::Drawing::GetHorizontalOf
YB_ATTR_nodiscard YB_PURE GetHorizontalOf
Definition: YGDI.h:146
YSLib::UI::SetInvalidationOf
void SetInvalidationOf(IWidget &wgt)
Definition: YWidget.cpp:63
YSLib::UI::TextList::ClearSelectionOnConfirm
@ ClearSelectionOnConfirm
确认时自动清空选择。
Definition: ListControl.h:213
ystdex::cpp2014::make_unique
enable_if_t<!is_array< _type >::value, std::unique_ptr< _type > > make_unique(_tParams &&... args)
Definition: memory.hpp:760
YSLib::UI::MTextList::LabelBrush
MLabel LabelBrush
Definition: ListControl.h:153
platform::p
return p p
Definition: YCLib/FileSystem.h:209
YSLib::Drawing::Font::GetHeight
YB_ATTR_nodiscard YB_PURE FontSize GetHeight() const ynothrow
取字体对应的字符高度。
Definition: Font.cpp:541
YSLib::Drawing::GetHeight
YB_ATTR_nodiscard YB_PURE tr GetHeight())) inline PDefH(void
按字体高度和行距调整文本区域的底边距。
YSLib::UI::MTextList::GetTotal
YB_ATTR_nodiscard YB_PURE size_t GetTotal() const ImplI(AMUnitList)
取文本列表引用。
Definition: ListControl.cpp:104
YSLib::UI::AMUnitControlList::p_unit
unique_ptr< IWidget > p_unit
Definition: ListControl.h:93
YSLib::UI::FetchGUIState
GUIState & FetchGUIState() ynothrow
Definition: YGUI.cpp:506
YSLib::UI::SequenceViewer::SetSelectedIndex
bool SetSelectedIndex(size_t t, size_t total)
设置选中项目的索引。
Definition: Viewer.cpp:67
ystdex::ref
void ref(const _type &&)=delete
YSLib::UI::SequenceViewer::IncreaseSelected
SequenceViewer & IncreaseSelected(ptrdiff_t d, size_t total)
按偏移设置选中项目的索引。
Definition: Viewer.cpp:105
YSLib::UI::Widget::SDst
SDst
Definition: YWidget.h:458
YSLib::UI::PaintVisibleChildAndCommit
void PaintVisibleChildAndCommit(IWidget &wgt, PaintEventArgs &e) ImplExpr(IsVisible(wgt) ? PaintChildAndCommit(wgt
调用可见的 PaintChild 指定子部件并提交参数的重绘区域。