24) : GroupItem{ stringId }
25 , WholeMenu{ caption.empty() }
37 : pUserData{ pUserData_ } {}
41 void Popup( wxWindow &window,
const wxPoint &pos )
override;
55 , mpUserData{ pUserData }
61 void DoSeparator()
override;
63 std::vector< std::unique_ptr<PopupMenuImpl> >
mMenus;
71 if ( !pItem->caption.empty() ) {
73 std::make_unique<PopupMenuImpl>( mMenu->pUserData );
74 mMenu = newMenu.get();
75 mMenus.push_back( std::move( newMenu ) );
83 if ( !pItem->caption.empty() ) {
84 auto subMenu = std::move( mMenus.back() );
86 mMenu = mMenus.empty() ? mRoot : mMenus.back().get();
87 mMenu->AppendSubMenu( subMenu.release(), pItem->caption.Translation());
95 switch (pEntry->type) {
98 mMenu->Append(pEntry->id, pEntry->caption.Translation());
103 mMenu->AppendRadioItem(pEntry->id, pEntry->caption.Translation());
108 mMenu->AppendCheckItem(pEntry->id, pEntry->caption.Translation());
118 pEntry->handler.InitUserData( mpUserData );
121 pEntry->init( pEntry->handler, *mMenu, pEntry->id );
124 wxEVT_COMMAND_MENU_SELECTED, pEntry->func, &pEntry->handler, pEntry->id);
127void PopupMenuBuilder::DoSeparator()
129 mMenu->AppendSeparator();
132PopupMenuImpl::~PopupMenuImpl()
139void PopupMenuImpl::Popup( wxWindow &window,
const wxPoint &pos )
149 auto &theMenu =
dynamic_cast<PopupMenuImpl&
>(menu);
151 PopupMenuBuilder visitor{ table, theMenu, theMenu.pUserData };
153 visitor, table.
Get( theMenu.pUserData ).get(), table.
GetRegistry() );
164 mStack.back()->items.push_back( std::move( pItem ) );
172 Append( std::make_unique<Entry>(
173 stringId, type,
id,
string, memFn, *
this, init ) );
178 auto uSection = std::make_unique< PopupMenuSection >(
name );
179 auto section = uSection.get();
180 mStack.back()->items.push_back( std::move( uSection ) );
181 mStack.push_back( section );
194 auto theMenu = std::make_unique<PopupMenuImpl>( pUserData );
const TranslatableString name
void Popup(const BasicUI::WindowPlacement &window, const Point &pos={})
Display the menu at pos, invoke at most one action, then hide it.
An explicitly nonlocalized string, not meant for the user to see.
std::vector< Identifier > Path
Holds a msgid for the translation catalog; may also bind format arguments.
void RegisterItem(GroupItemBase ®istry, const Placement &placement, BaseItemPtr pItem)
std::unique_ptr< BaseItem > BaseItemPtr
void Visit(Visitor &visitor, BaseItem *pTopItem, const GroupItemBase *pRegistry)
Common abstract base class for items that group other items.