YSTest: Menu.h 源文件

YSTest PreAlpha_b900_20201012 The YSLib Test Project

Menu.h
浏览该文件的文档.
1 /*
2 © 2011-2016, 2018-2020 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_Menu_h_
29 #define YSL_INC_UI_Menu_h_ 1
30
31 #include "YModules.h"
32 #include YFM_YSLib_UI_ListControl
33 #include YFM_YSLib_UI_YUIContainer // for UI::ZOrder;
34 #include <ystdex/cast.hpp> // for ystdex::polymorphic_downcast;
35
36 namespace YSLib
37 {
38
39 namespace UI
40 {
41
42 class MenuHost;
43
48 yconstexpr const ZOrder DefaultMenuZOrder(224);
49
50
57 class YF_API Menu : public TextList
58 {
59 friend class MenuHost;
60
61 public:
63 using SubMap = map<IndexType, observer_ptr<Menu>>;
65 using ValueType = SubMap::value_type;
66
67 protected:
69
70 observer_ptr<MenuHost> pHost{};
73 observer_ptr<Menu> pParent{};
75 SubMap mSubMenus{};
78 mutable vector<bool> vDisabled;
79
80 public:
85 explicit
86 Menu(const Rect& = {}, const shared_ptr<ListType>& = {});
92 DefDelMoveCtor(Menu)
97 ~Menu() override;
98
103 void
104 operator+=(const ValueType&);
105
110 bool
111 operator-=(IndexType);
112
118 bool
119 IsItemEnabled(ListType::size_type) const;
120
122 DefGetter(const ynothrow, observer_ptr<Menu>, ParentPtr, pParent)
123
124
130 void
131 SetItemEnabled(ListType::size_type idx, bool = true);
132
133 protected:
138 void
139 AdjustSize() const;
140
141 public:
148 bool
149 Show();
150
157 observer_ptr<Menu>
158 ShowSub(IndexType);
159
167 bool
168 TryShowingSub(IndexType);
169
174 bool
175 Hide();
176
182 PDefH(Menu&, at, size_t idx)
183 ImplRet(*mSubMenus.at(idx))
184 };
185
190 YF_API void
191 LocateMenu(Menu&, const Menu&, Menu::IndexType);
192
193
199 class YF_API MenuHost : private noncopyable
200 {
201 private:
203 set<lref<Menu>, ystdex::get_less<>> menus{};
204
205 public:
212 map<lref<IWidget>, observer_ptr<Menu>, ystdex::get_less<>> Roots{};
213
215 DefDeCtor(MenuHost)
216
217
221 void
222 operator+=(Menu&);
223
229 bool
230 operator-=(Menu&);
231
236 YB_ATTR_nodiscard YB_PURE bool
237 IsShowing(Menu&) const;
238
243 YB_ATTR_nodiscard YB_PURE PDefH(bool, Contains, Menu& mnu) const
244 ImplRet(ystdex::exists(menus, ystdex::ref(mnu)))
245
246
250 void
251 Clear();
252
258 void
259 Show(Menu&);
260
265 void
266 ShowAll();
267
268 private:
274 void
275 ShowRaw(Menu& mnu);
276
277 public:
282 void
283 Hide(Menu&);
284
288 void
289 HideAll();
290
291 private:
296 void
297 HideRaw(Menu& mnu);
298
299 public:
306 void
307 HideUnrelated(Menu& mnu, Menu& mnuParent);
308 };
309
310
316 YF_API void
317 BindTopLevelPopupMenu(MenuHost&, Menu&, IWidget&,
318 KeyIndex k = KeyCodes::Secondary);
319
320 } // namespace UI;
321
322 } // namespace YSLib;
323
324 #endif
325
YSLib::UI::MenuHost::Show
YB_ATTR_nodiscard YB_PURE PDefH(bool, Contains, Menu &mnu) const ImplRet(ystdex void Show(Menu &)
判断菜单组中是否存在指定的菜单。
Definition: Menu.h:259
cast.hpp
C++ 转换模板。
YB_ATTR_nodiscard
#define YB_ATTR_nodiscard
标记返回值不被忽略的属性。
Definition: ydef.h:715
YSLib::UI::ZOrder
std::uint8_t ZOrder
Z 顺序类型：覆盖顺序，值越大表示越接近顶层。
Definition: YUIContainer.h:179
YSLib::UI::ynothrow
AView &y ynothrow
Definition: YWidgetView.cpp:47
YSLib::UI::Hide
YF_API void Hide(IWidget &)
隐藏部件。
Definition: YWidget.cpp:100
yconstexpr
#define yconstexpr
指定编译时常量表达式。
Definition: ydef.h:1072
YB_PURE
#define YB_PURE
指示函数或函数模板实例为纯函数。
Definition: ydef.h:919
YSLib::UI::PDefH
PDefH(void, DisplayFor, IWidget &wgt, Timers::TimeSpan delay) ImplExpr(Show(wgt)
在一定时间内显示部件。
ystdex::get_less
get 成员小于仿函数。
Definition: functional.hpp:418
platform::KeyCodes::DS::Secondary
@ Secondary
Definition: Keys.h:264
YSLib::UI::MenuHost
菜单宿主。
Definition: Menu.h:200
YF_API
#define YF_API
Definition: Platform.h:56
YSLib::UI::Menu::ValueType
SubMap::value_type ValueType
子菜单映射表项目类型。
Definition: Menu.h:65
YSLib::UI::BindTopLevelPopupMenu
YF_API void BindTopLevelPopupMenu(MenuHost &, Menu &, IWidget &, KeyIndex k=KeyCodes::Secondary)
绑定顶层部件的按键事件弹出菜单。
Definition: Menu.cpp:378
platform::KeyCategory::Menu
@ Menu
表示菜单键（如 Menu 和 Win ）。
Definition: Keys.h:131
ystdex::map
映射容器。
Definition: map.hpp:79
YSLib::UI::Show
YF_API void Show(IWidget &)
显示部件。
Definition: YWidget.cpp:202
ystdex::exists
bool exists(const _tCon &con, const _tKey &key)
判断指定的容器中存在指定的键。
Definition: container.hpp:462
platform::containers::set
std::set< _tKey, _fComp, _tAlloc > set
Definition: Container.h:126
platform::containers::vector
std::vector< _type, _tAlloc > vector
Definition: Container.h:102
YSLib::Drawing::Rect
屏幕标准矩形：表示屏幕矩形区域。
Definition: YGDIBase.h:788
YSLib
YSLib 命名空间。
Definition: AndroidHost.h:46
YSLib::UI::LocateMenu
void LocateMenu(Menu &dst, const Menu &src, Menu::IndexType idx)
Definition: Menu.cpp:267
YSLib::UI::Menu
菜单。
Definition: Menu.h:58
YModules.h
YSLib 用户界面模块配置文件。
YSLib::UI::TextList
文本列表。
Definition: ListControl.h:205
YSLib::UI::MTextList::IndexType
typename ListType::size_type IndexType
索引类型。
Definition: ListControl.h:145
YSLib::UI::DefaultMenuZOrder
yconstexpr const ZOrder DefaultMenuZOrder(224)
默认菜单 Z 顺序值。
platform::KeyIndex
size_t KeyIndex
按键索引类型：标识特定的按键在按键集合中的位置。
Definition: Keys.h:42
ystdex::map::value_type
std::pair< const _tKey, _tMapped > value_type
Definition: map.hpp:86
YSLib::UI::Menu::vDisabled
vector< bool > vDisabled
未启用菜单项。
Definition: Menu.h:78
YSLib::UI::Menu::DefDelMoveCtor
DefDelMoveCtor(Menu) ~Menu() override
禁止转移构造。
YSLib::UI::MenuHost::DefDeCtor
DefDeCtor(MenuHost) void operator+
向菜单组添加菜单并隐藏。
DefGetter
#define DefGetter(_q, _t, _n,...)
Definition: YBaseMacro.h:241
YSLib::UI::Menu::operator+=
void operator+=(const ValueType &)
向子菜单组添加关联索引和指针指定的菜单。
ystdex::bases::noncopyable
不可复制对象：禁止派生类调用默认原型的复制构造函数和复制赋值操作符。
Definition: base.h:50
ystdex::ref
void ref(const _type &&)=delete
YSLib::UI::ImplRet
const IWidget &wgt ImplRet(wgt.GetView().IsVisible()) YB_ATTR_nodiscard YB_PURE bool YF_API Contains(const IWidget &
判断点是否在部件的可视区域内。