Added wxGridSize::GetEffective{Cols,Rows}Count().
These functions return the number of columns or rows being currently used and not 0, unlike the existing Get{Cols,Rows}(), if the corresponding number is determined dynamically. Closes #10254. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61750 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -757,18 +757,49 @@ public:
|
|||||||
int GetVGap() const { return m_vgap; }
|
int GetVGap() const { return m_vgap; }
|
||||||
int GetHGap() const { return m_hgap; }
|
int GetHGap() const { return m_hgap; }
|
||||||
|
|
||||||
|
int GetEffectiveColsCount() const { return m_cols ? m_cols : CalcCols(); }
|
||||||
|
int GetEffectiveRowsCount() const { return m_rows ? m_rows : CalcRows(); }
|
||||||
|
|
||||||
// return the number of total items and the number of columns and rows
|
// return the number of total items and the number of columns and rows
|
||||||
// (for internal use only)
|
// (for internal use only)
|
||||||
int CalcRowsCols(int& rows, int& cols) const;
|
int CalcRowsCols(int& rows, int& cols) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
// the number of rows/columns in the sizer, if 0 then it is determined
|
||||||
|
// dynamically depending on the total number of items
|
||||||
int m_rows;
|
int m_rows;
|
||||||
int m_cols;
|
int m_cols;
|
||||||
|
|
||||||
|
// gaps between rows and columns
|
||||||
int m_vgap;
|
int m_vgap;
|
||||||
int m_hgap;
|
int m_hgap;
|
||||||
|
|
||||||
void SetItemBounds( wxSizerItem *item, int x, int y, int w, int h );
|
void SetItemBounds( wxSizerItem *item, int x, int y, int w, int h );
|
||||||
|
|
||||||
|
// returns the number of columns/rows needed for the current total number
|
||||||
|
// of children (and the fixed number of rows/columns)
|
||||||
|
int CalcCols() const
|
||||||
|
{
|
||||||
|
wxCHECK_MSG
|
||||||
|
(
|
||||||
|
m_rows, 0,
|
||||||
|
"Can't calculate number of cols if number of rows is not specified"
|
||||||
|
);
|
||||||
|
|
||||||
|
return (m_children.GetCount() + m_rows - 1) / m_rows;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CalcRows() const
|
||||||
|
{
|
||||||
|
wxCHECK_MSG
|
||||||
|
(
|
||||||
|
m_cols, 0,
|
||||||
|
"Can't calculate number of cols if number of rows is not specified"
|
||||||
|
);
|
||||||
|
|
||||||
|
return (m_children.GetCount() + m_cols - 1) / m_cols;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DECLARE_CLASS(wxGridSizer)
|
DECLARE_CLASS(wxGridSizer)
|
||||||
};
|
};
|
||||||
|
@@ -1604,21 +1604,38 @@ public:
|
|||||||
wxGridSizer( int rows, int cols, const wxSize& gap );
|
wxGridSizer( int rows, int cols, const wxSize& gap );
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
|
//@{
|
||||||
/**
|
/**
|
||||||
Returns the number of columns in the sizer.
|
Returns the number of columns or rows that has been specified for the
|
||||||
|
sizer.
|
||||||
|
|
||||||
|
Returns zero if the sizer is automatically adjusting the number of
|
||||||
|
columns/rows depending on number of its children. To get the effective
|
||||||
|
number of columns or rows being currently used, see
|
||||||
|
GetEffectiveColsCount() and GetEffectiveRowsCount().
|
||||||
*/
|
*/
|
||||||
int GetCols() const;
|
int GetCols() const;
|
||||||
|
int GetRows() const;
|
||||||
|
//@}
|
||||||
|
|
||||||
|
//@{
|
||||||
|
/**
|
||||||
|
Returns the number of columns or rows currently used by the sizer.
|
||||||
|
|
||||||
|
This will depend on the number of children the sizer has if
|
||||||
|
the sizer is automatically adjusting the number of columns/rows.
|
||||||
|
|
||||||
|
@since 2.9.1
|
||||||
|
*/
|
||||||
|
int GetEffectiveColsCount() const;
|
||||||
|
int GetEffectiveRowsCount() const;
|
||||||
|
//@}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Returns the horizontal gap (in pixels) between cells in the sizer.
|
Returns the horizontal gap (in pixels) between cells in the sizer.
|
||||||
*/
|
*/
|
||||||
int GetHGap() const;
|
int GetHGap() const;
|
||||||
|
|
||||||
/**
|
|
||||||
Returns the number of rows in the sizer.
|
|
||||||
*/
|
|
||||||
int GetRows() const;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Returns the vertical gap (in pixels) between the cells in the sizer.
|
Returns the vertical gap (in pixels) between the cells in the sizer.
|
||||||
*/
|
*/
|
||||||
|
@@ -1369,7 +1369,7 @@ wxSizerItem *wxGridSizer::Insert(size_t index, wxSizerItem *item)
|
|||||||
|
|
||||||
// additionally, continuing to use the specified number of columns
|
// additionally, continuing to use the specified number of columns
|
||||||
// and rows is not a good idea as callers of CalcRowsCols() expect
|
// and rows is not a good idea as callers of CalcRowsCols() expect
|
||||||
// that all sizer items can fit into m_cols/m_rows-sized arrays
|
// that all sizer items can fit into m_cols-/m_rows-sized arrays
|
||||||
// which is not the case if there are too many items and results in
|
// which is not the case if there are too many items and results in
|
||||||
// crashes, so let it compute the number of rows automatically by
|
// crashes, so let it compute the number of rows automatically by
|
||||||
// forgetting the (wrong) number of rows specified (this also has a
|
// forgetting the (wrong) number of rows specified (this also has a
|
||||||
@@ -1385,32 +1385,13 @@ wxSizerItem *wxGridSizer::Insert(size_t index, wxSizerItem *item)
|
|||||||
int wxGridSizer::CalcRowsCols(int& nrows, int& ncols) const
|
int wxGridSizer::CalcRowsCols(int& nrows, int& ncols) const
|
||||||
{
|
{
|
||||||
const int nitems = m_children.GetCount();
|
const int nitems = m_children.GetCount();
|
||||||
if ( m_cols && m_rows )
|
|
||||||
{
|
|
||||||
ncols = m_cols;
|
|
||||||
nrows = m_rows;
|
|
||||||
|
|
||||||
// this should be impossible because the too high number of items
|
ncols = GetEffectiveColsCount();
|
||||||
// should have been detected by Insert() above
|
nrows = GetEffectiveRowsCount();
|
||||||
|
|
||||||
|
// Since Insert() checks for overpopulation, the following
|
||||||
|
// should only assert if the grid was shrunk via SetRows() / SetCols()
|
||||||
wxASSERT_MSG( nitems <= ncols*nrows, "logic error in wxGridSizer" );
|
wxASSERT_MSG( nitems <= ncols*nrows, "logic error in wxGridSizer" );
|
||||||
}
|
|
||||||
else if ( m_cols )
|
|
||||||
{
|
|
||||||
ncols = m_cols;
|
|
||||||
nrows = (nitems + m_cols - 1) / m_cols;
|
|
||||||
}
|
|
||||||
else if ( m_rows )
|
|
||||||
{
|
|
||||||
ncols = (nitems + m_rows - 1) / m_rows;
|
|
||||||
nrows = m_rows;
|
|
||||||
}
|
|
||||||
else // 0 columns, 0 rows?
|
|
||||||
{
|
|
||||||
wxFAIL_MSG( wxT("grid sizer must have either rows or columns fixed") );
|
|
||||||
|
|
||||||
nrows =
|
|
||||||
ncols = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return nitems;
|
return nitems;
|
||||||
}
|
}
|
||||||
@@ -1850,11 +1831,10 @@ void wxFlexGridSizer::AdjustForGrowables(const wxSize& sz)
|
|||||||
// comments in AddGrowableCol/Row())
|
// comments in AddGrowableCol/Row())
|
||||||
if ( !m_rows || !m_cols )
|
if ( !m_rows || !m_cols )
|
||||||
{
|
{
|
||||||
int nrows, ncols;
|
|
||||||
CalcRowsCols(nrows, ncols);
|
|
||||||
|
|
||||||
if ( !m_rows )
|
if ( !m_rows )
|
||||||
{
|
{
|
||||||
|
int nrows = CalcRows();
|
||||||
|
|
||||||
for ( size_t n = 0; n < m_growableRows.size(); n++ )
|
for ( size_t n = 0; n < m_growableRows.size(); n++ )
|
||||||
{
|
{
|
||||||
wxASSERT_MSG( m_growableRows[n] < nrows,
|
wxASSERT_MSG( m_growableRows[n] < nrows,
|
||||||
@@ -1864,6 +1844,8 @@ void wxFlexGridSizer::AdjustForGrowables(const wxSize& sz)
|
|||||||
|
|
||||||
if ( !m_cols )
|
if ( !m_cols )
|
||||||
{
|
{
|
||||||
|
int ncols = CalcCols();
|
||||||
|
|
||||||
for ( size_t n = 0; n < m_growableCols.size(); n++ )
|
for ( size_t n = 0; n < m_growableCols.size(); n++ )
|
||||||
{
|
{
|
||||||
wxASSERT_MSG( m_growableCols[n] < ncols,
|
wxASSERT_MSG( m_growableCols[n] < ncols,
|
||||||
@@ -1888,17 +1870,17 @@ void wxFlexGridSizer::AdjustForGrowables(const wxSize& sz)
|
|||||||
// This gives nested objects that benefit from knowing one size
|
// This gives nested objects that benefit from knowing one size
|
||||||
// component in advance the chance to use that.
|
// component in advance the chance to use that.
|
||||||
bool didAdjustMinSize = false;
|
bool didAdjustMinSize = false;
|
||||||
int nrows, ncols;
|
|
||||||
CalcRowsCols(nrows, ncols);
|
|
||||||
|
|
||||||
// Iterate over all items and inform about column width
|
// Iterate over all items and inform about column width
|
||||||
size_t n = 0;
|
const int ncols = GetEffectiveColsCount();
|
||||||
|
int col = 0;
|
||||||
for ( wxSizerItemList::iterator i = m_children.begin();
|
for ( wxSizerItemList::iterator i = m_children.begin();
|
||||||
i != m_children.end();
|
i != m_children.end();
|
||||||
++i, ++n )
|
++i )
|
||||||
{
|
{
|
||||||
const int col = n % ncols;
|
|
||||||
didAdjustMinSize |= (*i)->InformFirstDirection(wxHORIZONTAL, m_colWidths[col], sz.y - m_calculatedMinSize.y);
|
didAdjustMinSize |= (*i)->InformFirstDirection(wxHORIZONTAL, m_colWidths[col], sz.y - m_calculatedMinSize.y);
|
||||||
|
if ( ++col == ncols )
|
||||||
|
col = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only redo if info was actually used
|
// Only redo if info was actually used
|
||||||
@@ -1942,9 +1924,6 @@ bool wxFlexGridSizer::IsColGrowable( size_t idx )
|
|||||||
|
|
||||||
void wxFlexGridSizer::AddGrowableRow( size_t idx, int proportion )
|
void wxFlexGridSizer::AddGrowableRow( size_t idx, int proportion )
|
||||||
{
|
{
|
||||||
int nrows, ncols;
|
|
||||||
CalcRowsCols(nrows, ncols);
|
|
||||||
|
|
||||||
wxASSERT_MSG( !IsRowGrowable( idx ),
|
wxASSERT_MSG( !IsRowGrowable( idx ),
|
||||||
"AddGrowableRow() called for growable row" );
|
"AddGrowableRow() called for growable row" );
|
||||||
|
|
||||||
@@ -1960,15 +1939,12 @@ void wxFlexGridSizer::AddGrowableRow( size_t idx, int proportion )
|
|||||||
|
|
||||||
void wxFlexGridSizer::AddGrowableCol( size_t idx, int proportion )
|
void wxFlexGridSizer::AddGrowableCol( size_t idx, int proportion )
|
||||||
{
|
{
|
||||||
int nrows, ncols;
|
|
||||||
CalcRowsCols(nrows, ncols);
|
|
||||||
|
|
||||||
wxASSERT_MSG( !IsColGrowable( idx ),
|
wxASSERT_MSG( !IsColGrowable( idx ),
|
||||||
"AddGrowableCol() called for growable column" );
|
"AddGrowableCol() called for growable column" );
|
||||||
|
|
||||||
// see comment in AddGrowableRow(): although it's less common to omit the
|
// see comment in AddGrowableRow(): although it's less common to omit the
|
||||||
// specification of the number of columns, it still can also happen
|
// specification of the number of columns, it still can also happen
|
||||||
wxCHECK_RET( !m_cols || idx < (size_t)ncols, "invalid column index" );
|
wxCHECK_RET( !m_cols || idx < (size_t)m_cols, "invalid column index" );
|
||||||
|
|
||||||
m_growableCols.Add( idx );
|
m_growableCols.Add( idx );
|
||||||
m_growableColsProportions.Add( proportion );
|
m_growableColsProportions.Add( proportion );
|
||||||
|
Reference in New Issue
Block a user