Fix keyboard navigation in wxGrid with hidden columns.
The hidden columns (i.e. those whose size was set to 0) should be skipped when find the previous/next column to select when the user presses Left/Right cursor arrow keys in wxGrid, otherwise the focus could completely disappear as it was invisible when it was set to a hidden column. Closes #13281. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@68303 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
3e88d48700
commit
b64bb3ca1b
@ -440,6 +440,7 @@ Major new features in this release
|
|||||||
All (GUI):
|
All (GUI):
|
||||||
|
|
||||||
- Support float, double and file name values in wxGenericValidator (troelsk).
|
- Support float, double and file name values in wxGenericValidator (troelsk).
|
||||||
|
- Fix keyboard navigation in wxGrid with hidden columns (ivan_14_32).
|
||||||
|
|
||||||
OSX:
|
OSX:
|
||||||
|
|
||||||
|
@ -760,6 +760,12 @@ protected:
|
|||||||
return m_oper.GetLineAt(m_grid, pos);
|
return m_oper.GetLineAt(m_grid, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check if the given line is visible, i.e. has non 0 size.
|
||||||
|
bool IsLineVisible(int line) const
|
||||||
|
{
|
||||||
|
return m_oper.GetLineSize(m_grid, line) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
wxGrid * const m_grid;
|
wxGrid * const m_grid;
|
||||||
const wxGridOperations& m_oper;
|
const wxGridOperations& m_oper;
|
||||||
@ -777,14 +783,38 @@ public:
|
|||||||
{
|
{
|
||||||
wxASSERT_MSG( m_oper.Select(coords) >= 0, "invalid row/column" );
|
wxASSERT_MSG( m_oper.Select(coords) >= 0, "invalid row/column" );
|
||||||
|
|
||||||
return GetLinePos(coords) == 0;
|
int pos = GetLinePos(coords);
|
||||||
|
while ( pos )
|
||||||
|
{
|
||||||
|
// Check the previous line.
|
||||||
|
int line = GetLineAt(--pos);
|
||||||
|
if ( IsLineVisible(line) )
|
||||||
|
{
|
||||||
|
// There is another visible line before this one, hence it's
|
||||||
|
// not at boundary.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// We reached the boundary without finding any visible lines.
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void Advance(wxGridCellCoords& coords) const
|
virtual void Advance(wxGridCellCoords& coords) const
|
||||||
{
|
{
|
||||||
wxASSERT( !IsAtBoundary(coords) );
|
int pos = GetLinePos(coords);
|
||||||
|
for ( ;; )
|
||||||
|
{
|
||||||
|
// This is not supposed to happen if IsAtBoundary() returned false.
|
||||||
|
wxCHECK_RET( pos, "can't advance when already at boundary" );
|
||||||
|
|
||||||
m_oper.Set(coords, GetLineAt(GetLinePos(coords) - 1));
|
int line = GetLineAt(--pos);
|
||||||
|
if ( IsLineVisible(line) )
|
||||||
|
{
|
||||||
|
m_oper.Set(coords, line);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual int MoveByPixelDistance(int line, int distance) const
|
virtual int MoveByPixelDistance(int line, int distance) const
|
||||||
@ -794,6 +824,8 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Please refer to the comments above when reading this class code, it's
|
||||||
|
// absolutely symmetrical to wxGridBackwardOperations.
|
||||||
class wxGridForwardOperations : public wxGridDirectionOperations
|
class wxGridForwardOperations : public wxGridDirectionOperations
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -807,14 +839,32 @@ public:
|
|||||||
{
|
{
|
||||||
wxASSERT_MSG( m_oper.Select(coords) < m_numLines, "invalid row/column" );
|
wxASSERT_MSG( m_oper.Select(coords) < m_numLines, "invalid row/column" );
|
||||||
|
|
||||||
return GetLinePos(coords) == m_numLines - 1;
|
int pos = GetLinePos(coords);
|
||||||
|
while ( pos < m_numLines - 1 )
|
||||||
|
{
|
||||||
|
int line = GetLineAt(++pos);
|
||||||
|
if ( IsLineVisible(line) )
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void Advance(wxGridCellCoords& coords) const
|
virtual void Advance(wxGridCellCoords& coords) const
|
||||||
{
|
{
|
||||||
wxASSERT( !IsAtBoundary(coords) );
|
int pos = GetLinePos(coords);
|
||||||
|
for ( ;; )
|
||||||
|
{
|
||||||
|
wxCHECK_RET( pos < m_numLines - 1,
|
||||||
|
"can't advance when already at boundary" );
|
||||||
|
|
||||||
m_oper.Set(coords, GetLineAt(GetLinePos(coords) + 1));
|
int line = GetLineAt(++pos);
|
||||||
|
if ( IsLineVisible(line) )
|
||||||
|
{
|
||||||
|
m_oper.Set(coords, line);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual int MoveByPixelDistance(int line, int distance) const
|
virtual int MoveByPixelDistance(int line, int distance) const
|
||||||
|
Loading…
Reference in New Issue
Block a user