Applied patch [ 1310416 ] [wxMSW] Fix radio button traversal
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@35990 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
1ca78aa1dc
commit
3d3afaecfb
@ -185,8 +185,8 @@ wxRadioButton* wxGetPreviousButtonInGroup(wxRadioButton *btn)
|
||||
// no more buttons in group
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
return prevBtn;
|
||||
|
||||
return prevBtn;
|
||||
}
|
||||
|
||||
wxRadioButton* wxGetNextButtonInGroup(wxRadioButton *btn)
|
||||
@ -215,8 +215,8 @@ wxRadioButton* wxGetNextButtonInGroup(wxRadioButton *btn)
|
||||
// no more buttons or the first button of the next group
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
return nextBtn;
|
||||
|
||||
return nextBtn;
|
||||
}
|
||||
|
||||
wxRadioButton* wxGetFirstButtonInGroup(wxRadioButton *btn)
|
||||
@ -231,6 +231,18 @@ wxRadioButton* wxGetFirstButtonInGroup(wxRadioButton *btn)
|
||||
}
|
||||
}
|
||||
|
||||
wxRadioButton* wxGetLastButtonInGroup(wxRadioButton *btn)
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
wxRadioButton* nextBtn = wxGetNextButtonInGroup(btn);
|
||||
if (!nextBtn)
|
||||
return btn;
|
||||
|
||||
btn = nextBtn;
|
||||
}
|
||||
}
|
||||
|
||||
wxRadioButton* wxGetSelectedButtonInGroup(wxRadioButton *btn)
|
||||
{
|
||||
// Find currently selected button
|
||||
@ -402,39 +414,62 @@ void wxControlContainer::HandleOnNavigationKey( wxNavigationKeyEvent& event )
|
||||
wxWindow *child = node->GetData();
|
||||
|
||||
#ifdef __WXMSW__
|
||||
bool canSelectRadioButton = true;
|
||||
if (!event.IsFromTab())
|
||||
if ( event.IsFromTab() )
|
||||
{
|
||||
// If navigating using cursor keys, make sure not to navigate out of a radio button group.
|
||||
if (m_winLastFocused && wxIsKindOf(m_winLastFocused, wxRadioButton))
|
||||
if ( wxIsKindOf(child, wxRadioButton) )
|
||||
{
|
||||
if (!wxIsKindOf(child, wxRadioButton))
|
||||
// only radio buttons with either wxRB_GROUP or wxRB_SINGLE
|
||||
// can be tabbed to
|
||||
if ( child->HasFlag(wxRB_GROUP) )
|
||||
{
|
||||
child = forward ?
|
||||
wxGetNextButtonInGroup((wxRadioButton*)m_winLastFocused) :
|
||||
wxGetPreviousButtonInGroup((wxRadioButton*)m_winLastFocused);
|
||||
if (!child)
|
||||
{
|
||||
event.Skip(false);
|
||||
return;
|
||||
}
|
||||
// need to tab into the active button within a group
|
||||
wxRadioButton *rb = wxGetSelectedButtonInGroup((wxRadioButton*)child);
|
||||
if ( rb )
|
||||
child = rb;
|
||||
}
|
||||
else if ( !child->HasFlag(wxRB_SINGLE) )
|
||||
{
|
||||
node = forward ? node->GetNext() : node->GetPrevious();
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
else if ( m_winLastFocused &&
|
||||
wxIsKindOf(m_winLastFocused, wxRadioButton) &&
|
||||
!m_winLastFocused->HasFlag(wxRB_SINGLE) )
|
||||
{
|
||||
// If navigating using tabs, skip all but the first radio button in a group.
|
||||
if (wxIsKindOf(child, wxRadioButton))
|
||||
// cursor keys don't navigate out of a radio button group so
|
||||
// find the correct radio button to focus
|
||||
if ( forward )
|
||||
{
|
||||
if (wxGetPreviousButtonInGroup((wxRadioButton*)child))
|
||||
canSelectRadioButton = false;
|
||||
child = wxGetNextButtonInGroup((wxRadioButton*)m_winLastFocused);
|
||||
if ( !child )
|
||||
{
|
||||
// no next button in group, set it to the first button
|
||||
child = wxGetFirstButtonInGroup((wxRadioButton*)m_winLastFocused);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
child = wxGetPreviousButtonInGroup((wxRadioButton*)m_winLastFocused);
|
||||
if ( !child )
|
||||
{
|
||||
// no previous button in group, set it to the last button
|
||||
child = wxGetLastButtonInGroup((wxRadioButton*)m_winLastFocused);
|
||||
}
|
||||
}
|
||||
|
||||
if ( child == m_winLastFocused )
|
||||
{
|
||||
// must be a group consisting of only one button therefore
|
||||
// no need to send a navigation event
|
||||
event.Skip(false);
|
||||
return;
|
||||
}
|
||||
}
|
||||
#else
|
||||
static bool canSelectRadioButton = true;
|
||||
#endif
|
||||
#endif // __WXMSW__
|
||||
|
||||
if ( child->AcceptsFocusFromKeyboard() && canSelectRadioButton )
|
||||
if ( child->AcceptsFocusFromKeyboard() )
|
||||
{
|
||||
// if we're setting the focus to a child panel we should prevent it
|
||||
// from giving it to the child which had the focus the last time
|
||||
@ -442,18 +477,6 @@ void wxControlContainer::HandleOnNavigationKey( wxNavigationKeyEvent& event )
|
||||
// direction we're coming
|
||||
event.SetEventObject(m_winParent);
|
||||
|
||||
#if defined(__WXMSW__)
|
||||
// we need to hop to the next activated
|
||||
// radio button, not just the next radio
|
||||
// button under MSW
|
||||
if (wxIsKindOf(child, wxRadioButton) && event.IsFromTab())
|
||||
{
|
||||
wxRadioButton *rb = wxGetSelectedButtonInGroup((wxRadioButton*)child);
|
||||
if (rb)
|
||||
child = rb;
|
||||
}
|
||||
#endif // __WXMSW__
|
||||
|
||||
// disable propagation for this call as otherwise the event might
|
||||
// bounce back to us.
|
||||
wxPropagationDisabler disableProp(event);
|
||||
|
Loading…
Reference in New Issue
Block a user