29 #include YFM_YSLib_UI_Menu
30 #include YFM_YSLib_UI_YWindow
31 #include YFM_YSLib_UI_YBrush
32 #include YFM_YSLib_Service_TextRenderer
37 using namespace Drawing;
45 id(id), pParent(
nullptr), mSubMenus(), vDisabled(h ? h->size() : 0)
54 const auto& k(e.GetKeys());
61 if(
const auto p_mnu =
ShowSub(GetSelectedIndex()))
66 if(
const auto p_mnu = GetParentPtr())
68 else if(k[KeyCodes::Esc])
74 FetchEvent<LostFocus>(*this) += [
this](
UIEventArgs&& e){
78 const auto i(
pHost->
Roots.find(&e.GetSender()));
84 while(
const auto pParent = p_mnu->GetParentPtr())
86 if(i->second == p_mnu->id)
90 if(
const auto p_mnu = dynamic_cast<Menu*>(&e.GetSender()))
92 if(p_mnu->GetParentPtr() !=
this)
109 Menu::operator+=(
const ValueType& val)
111 if(val.second &&
IsInInterval(val.first, GetList().size()))
113 val.second->pParent =
this;
127 i->second->pParent = {};
155 const auto list_size(GetList().size());
187 auto& mnu(*i->second);
210 ListType::size_type i)
212 Color t(tsList.Color);
231 src.GetY() + src.GetItemHeight() * idx));
236 :
Frame(frm), mMenus(), Roots()
249 val.second->id = val.first, val.second->pHost =
this);
262 const auto i(
mMenus.find(
id));
266 auto& mnu(*i->second);
278 const auto i(
mMenus.find(
id));
302 const auto i(
mMenus.find(
id));
332 const auto i(
mMenus.find(
id));
366 while(p_mnu && p_mnu != &mnuParent)
368 const auto i(
mMenus.find(p_mnu->GetID()));
372 p_mnu = p_mnu->GetParentPtr();
bool operator-=(IndexType)
向菜单组移除指定子菜单索引项。
void Hide(Menu::ID)
隐藏菜单组中菜单标识指定的菜单。
void DrawItem(const Graphics &, const Rect &mask, const Rect &, ListType::size_type) override
绘制菜单项。
YF_API void SetLocationOf(IWidget &, const Point &)
设置部件左上角所在位置(相对于容器的偏移坐标)。
YF_API GUIState & FetchGUIState()
取默认图形用户界面公共状态。
YF_API void Invalidate(IWidget &, const Rect &)
无效化:使相对于部件的指定区域在直接和间接的窗口缓冲区中无效。
bool Contains(IWidget &)
判断是否包含指定部件。
#define delete_second_mem
bool Show(ZOrderType=DefaultMenuZOrder)
按指定 Z 顺序显示菜单。
const class ystdex::nullptr_t nullptr
YF_API void LocateMenu(Menu &, const Menu &, Menu::IndexType)
定位菜单:以第二个参数作为参考父菜单,按指定参考偏移索引定位菜单。
Menu pParent void SetItemEnabled(ListType::size_type idx, bool=true)
设置 idx 指定的菜单项的可用性。
bool IsItemEnabled(ListType::size_type) const
判断菜单项是否有效。
Menu is not ShowRaw(mnu, z)) void ShowAll(ZOrderType
按指定 Z 顺序显示菜单组中的所有菜单。
void Add(IWidget &, ZOrderType=DefaultZOrder) override
virtual bool CheckConfirmed(ListType::size_type) const
检查列表中的指定项是否有效。
bool CheckConfirmed(ListType::size_type) const override
检查列表中的指定项是否可用。
void HideUnrelated(Menu &mnu, Menu &mnuParent)
隐藏从 mnu 起向上层遍历菜单树的过程中不相关的菜单。
const second_tag get_value
bool CyclicTraverse
循环选择遍历。
GBinaryGroup< SPos > Point
屏幕二维点(直角坐标表示)。
#define yunseq
无序列依赖表达式组求值。
void operator+=(const ValueType &)
向菜单组添加标识和指针指定的菜单。
MenuMap::value_type ValueType
void Show(Menu::ID, ZOrderType=DefaultMenuZOrder)
按指定 Z 顺序显示菜单组中菜单标识指定的菜单。
map< IWidget *, Menu::ID > Roots
根菜单关联映射。
Menu * ItemType
菜单组项目类型:记录菜单控件指针。
Menu is not HideRaw(mnu)) void HideAll()
隐藏菜单组中的所有菜单。
Styles::Palette Colors
调色板。
#define YAssertNonnull(_expr)
PDefHOp(Menu &,[], Menu::ID id) ImplRet(*mMenus.at(id)) bool IsShowing(Menu PDefH(bool, Contains, Menu::ID id) ImplRet(ystdex voi Clear)()
访问菜单标识指定的菜单。 异常中立:由 at 抛出。
virtual void DrawItem(const Graphics &, const Rect &mask, const Rect &, ListType::size_type)
绘制列表项。
Menu * ShowSub(IndexType, ZOrderType=DefaultMenuZOrder)
按指定 Z 顺序显示索引指定的子菜单。
bool operator-=(Menu::ID)
从菜单组移除菜单标识指定的菜单。
vector< bool > vDisabled
未启用菜单项。
MenuMap mMenus
菜单组:存储非空菜单指针。
Selected const shared_ptr< ListType > const pair< Color, Color > viewer Contains
YF_API void DrawArrow(const Graphics &, const Rect &, SDst=4, Rotation=RDeg0, Color=ColorSpace::Black)
在指定图形接口上下文上描画箭头。
bool exists(const _tCon &con, const _tKey &key)
判断指定的容器中存在指定的键。
void AdjustSize() const
调整 vDisabled 大小。
bool IsInInterval(_type i, _type b) ynothrow
判断 i 是否在左闭右开区间 [FetchZero<_type>(), b) 中。
SubMap mSubMenus
子菜单映射表:存储非空子菜单指针。
#define YAssert(_expr, _msg)
Menu(const Rect &={}, const shared_ptr< ListType > &={}, ID=0)
构造:使用指定边界、文本列表和菜单标识。