fixes to radio menu items
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14759 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -112,8 +112,8 @@ wxMenuItem::wxMenuItem(wxMenu *parentMenu,
|
||||
|
||||
void wxMenuItem::Init()
|
||||
{
|
||||
m_startRadioGroup =
|
||||
m_endRadioGroup = -1;
|
||||
m_radioGroup.start = -1;
|
||||
m_isRadioGroupStart = FALSE;
|
||||
|
||||
#if wxUSE_OWNER_DRAWN
|
||||
// set default menu colors
|
||||
@@ -161,6 +161,30 @@ wxString wxMenuItemBase::GetLabelFromText(const wxString& text)
|
||||
return wxStripMenuCodes(text);
|
||||
}
|
||||
|
||||
// radio group stuff
|
||||
// -----------------
|
||||
|
||||
void wxMenuItem::SetAsRadioGroupStart()
|
||||
{
|
||||
m_isRadioGroupStart = TRUE;
|
||||
}
|
||||
|
||||
void wxMenuItem::SetRadioGroupStart(int start)
|
||||
{
|
||||
wxASSERT_MSG( !m_isRadioGroupStart,
|
||||
_T("should only be called for the next radio items") );
|
||||
|
||||
m_radioGroup.start = start;
|
||||
}
|
||||
|
||||
void wxMenuItem::SetRadioGroupEnd(int end)
|
||||
{
|
||||
wxASSERT_MSG( m_isRadioGroupStart,
|
||||
_T("should only be called for the first radio item") );
|
||||
|
||||
m_radioGroup.end = end;
|
||||
}
|
||||
|
||||
// change item state
|
||||
// -----------------
|
||||
|
||||
@@ -197,16 +221,40 @@ void wxMenuItem::Check(bool check)
|
||||
if ( !check )
|
||||
return;
|
||||
|
||||
// get the index of this item in the menu
|
||||
const wxMenuItemList& items = m_parentMenu->GetMenuItems();
|
||||
int pos = items.IndexOf(this);
|
||||
wxCHECK_RET( pos != wxNOT_FOUND,
|
||||
_T("menuitem not found in the menu items list?") );
|
||||
|
||||
// get the radio group range
|
||||
int start,
|
||||
end;
|
||||
|
||||
if ( m_isRadioGroupStart )
|
||||
{
|
||||
// we already have all information we need
|
||||
start = pos;
|
||||
end = m_radioGroup.end;
|
||||
}
|
||||
else // next radio group item
|
||||
{
|
||||
// get the radio group end from the start item
|
||||
start = m_radioGroup.start;
|
||||
end = items.Item(start)->GetData()->m_radioGroup.end;
|
||||
}
|
||||
|
||||
#ifdef __WIN32__
|
||||
// calling CheckMenuRadioItem() with such parameters hangs my system
|
||||
// (NT4 SP6) and I suspect this could happen to the others as well - so
|
||||
// don't do it!
|
||||
wxCHECK_RET( start != -1 && end != -1,
|
||||
_T("invalid ::CheckMenuRadioItem() parameter(s)") );
|
||||
|
||||
if ( !::CheckMenuRadioItem(hmenu,
|
||||
m_startRadioGroup, // first group item
|
||||
m_endRadioGroup, // last one
|
||||
pos, // the one to check
|
||||
start, // the first radio group item
|
||||
end, // the last one
|
||||
pos, // the one to check
|
||||
MF_BYPOSITION | flags) )
|
||||
{
|
||||
wxLogLastError(_T("CheckMenuRadioItem"));
|
||||
@@ -214,8 +262,8 @@ void wxMenuItem::Check(bool check)
|
||||
#endif // __WIN32__
|
||||
|
||||
// also uncheck all the other items in this radio group
|
||||
wxMenuItemList::Node *node = items.Item(m_startRadioGroup);
|
||||
for ( int n = m_startRadioGroup; n <= m_endRadioGroup && node; n++ )
|
||||
wxMenuItemList::Node *node = items.Item(start);
|
||||
for ( int n = start; n <= end && node; n++ )
|
||||
{
|
||||
if ( n != pos )
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user