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
|
// no more buttons in group
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
return prevBtn;
|
return prevBtn;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxRadioButton* wxGetNextButtonInGroup(wxRadioButton *btn)
|
wxRadioButton* wxGetNextButtonInGroup(wxRadioButton *btn)
|
||||||
@ -215,8 +215,8 @@ wxRadioButton* wxGetNextButtonInGroup(wxRadioButton *btn)
|
|||||||
// no more buttons or the first button of the next group
|
// no more buttons or the first button of the next group
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
return nextBtn;
|
return nextBtn;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxRadioButton* wxGetFirstButtonInGroup(wxRadioButton *btn)
|
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)
|
wxRadioButton* wxGetSelectedButtonInGroup(wxRadioButton *btn)
|
||||||
{
|
{
|
||||||
// Find currently selected button
|
// Find currently selected button
|
||||||
@ -402,39 +414,62 @@ void wxControlContainer::HandleOnNavigationKey( wxNavigationKeyEvent& event )
|
|||||||
wxWindow *child = node->GetData();
|
wxWindow *child = node->GetData();
|
||||||
|
|
||||||
#ifdef __WXMSW__
|
#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 ( wxIsKindOf(child, wxRadioButton) )
|
||||||
if (m_winLastFocused && wxIsKindOf(m_winLastFocused, 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 ?
|
// need to tab into the active button within a group
|
||||||
wxGetNextButtonInGroup((wxRadioButton*)m_winLastFocused) :
|
wxRadioButton *rb = wxGetSelectedButtonInGroup((wxRadioButton*)child);
|
||||||
wxGetPreviousButtonInGroup((wxRadioButton*)m_winLastFocused);
|
if ( rb )
|
||||||
if (!child)
|
child = rb;
|
||||||
{
|
}
|
||||||
event.Skip(false);
|
else if ( !child->HasFlag(wxRB_SINGLE) )
|
||||||
return;
|
{
|
||||||
}
|
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.
|
// cursor keys don't navigate out of a radio button group so
|
||||||
if (wxIsKindOf(child, wxRadioButton))
|
// find the correct radio button to focus
|
||||||
|
if ( forward )
|
||||||
{
|
{
|
||||||
if (wxGetPreviousButtonInGroup((wxRadioButton*)child))
|
child = wxGetNextButtonInGroup((wxRadioButton*)m_winLastFocused);
|
||||||
canSelectRadioButton = false;
|
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
|
#endif // __WXMSW__
|
||||||
static bool canSelectRadioButton = true;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if ( child->AcceptsFocusFromKeyboard() && canSelectRadioButton )
|
if ( child->AcceptsFocusFromKeyboard() )
|
||||||
{
|
{
|
||||||
// if we're setting the focus to a child panel we should prevent it
|
// 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
|
// 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
|
// direction we're coming
|
||||||
event.SetEventObject(m_winParent);
|
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
|
// disable propagation for this call as otherwise the event might
|
||||||
// bounce back to us.
|
// bounce back to us.
|
||||||
wxPropagationDisabler disableProp(event);
|
wxPropagationDisabler disableProp(event);
|
||||||
|
Loading…
Reference in New Issue
Block a user