support Show() in wxFlexGridSizer (patch 737850)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@21308 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -86,8 +86,8 @@ All GUI ports:
|
|||||||
- Wizard now validates when pressing Back or Next
|
- Wizard now validates when pressing Back or Next
|
||||||
- Implemented wxNotebook::DoGetBestSize so Fit now works
|
- Implemented wxNotebook::DoGetBestSize so Fit now works
|
||||||
- Added FindItemByPosition to wxMenu
|
- Added FindItemByPosition to wxMenu
|
||||||
- wxTimer now derives from wxEvtHandler and is its own owner
|
- wxTimer now derives from wxEvtHandler and is its own owner object by default
|
||||||
object by default
|
- implemented wxFlexGridSizer::Show() (Wade Brainerd)
|
||||||
|
|
||||||
Unix:
|
Unix:
|
||||||
|
|
||||||
|
@@ -309,3 +309,5 @@ minimal size. For windows with managed scrollbars this will set them appropriate
|
|||||||
Shows or hides the {\it window}, {\it sizer}, or item at {\it index}.
|
Shows or hides the {\it window}, {\it sizer}, or item at {\it index}.
|
||||||
To make a sizer item disappear or reappear, use Show() followed by Layout().
|
To make a sizer item disappear or reappear, use Show() followed by Layout().
|
||||||
|
|
||||||
|
Note that this only works with wxBoxSizer and wxFlexGridSizer, since they
|
||||||
|
are the only two sizer classes that can size rows/columns independently.
|
||||||
|
@@ -113,6 +113,21 @@ initial width:
|
|||||||
|
|
||||||
Within wxDesigner, this stretch factor gets set from the {\it Option} menu.
|
Within wxDesigner, this stretch factor gets set from the {\it Option} menu.
|
||||||
|
|
||||||
|
\subsubsection{Hiding controls using sizers}\label{sizershiding}
|
||||||
|
|
||||||
|
You can hide controls contained in sizers the same way you would hide any control,
|
||||||
|
using the \helpref{wxWindow::Show}{wxwindowshow} method.
|
||||||
|
|
||||||
|
However, wxSizer also offers a separate method which can tell the sizer not to
|
||||||
|
consider that control in its size calculations. To hide a window using the sizer,
|
||||||
|
call \helpref{wxSizer::Show}{wxsizershow}. You must then call Layout on the sizer
|
||||||
|
to force an update.
|
||||||
|
|
||||||
|
This is useful when hiding parts of the interface, since you can avoid removing
|
||||||
|
the controls from the sizer and having to add them back later.
|
||||||
|
|
||||||
|
Note: This is supported only by wxBoxSizer and wxFlexGridSizer.
|
||||||
|
|
||||||
\wxheading{wxBoxSizer}
|
\wxheading{wxBoxSizer}
|
||||||
|
|
||||||
\helpref{wxBoxSizer}{wxboxsizer} can lay out its children either vertically
|
\helpref{wxBoxSizer}{wxboxsizer} can lay out its children either vertically
|
||||||
|
@@ -1026,50 +1026,48 @@ void wxFlexGridSizer::RecalcSizes()
|
|||||||
wxSize sz( GetSize() );
|
wxSize sz( GetSize() );
|
||||||
wxSize minsz( CalcMin() );
|
wxSize minsz( CalcMin() );
|
||||||
wxPoint pt( GetPosition() );
|
wxPoint pt( GetPosition() );
|
||||||
int delta;
|
|
||||||
size_t idx, num;
|
|
||||||
wxArrayInt temp;
|
|
||||||
wxArrayInt temp_proportions;
|
|
||||||
int sum_proportions = 0;
|
|
||||||
int growable_space = 0;
|
|
||||||
|
|
||||||
// what to do with the rows? by default, resize them proportionally
|
// what to do with the rows? by default, resize them proportionally
|
||||||
if ( (m_flexDirection & wxVERTICAL) ||
|
if ( sz.y > minsz.y && ( (m_flexDirection & wxVERTICAL) || (m_growMode == wxFLEX_GROWMODE_SPECIFIED) ) )
|
||||||
(m_growMode == wxFLEX_GROWMODE_SPECIFIED) )
|
|
||||||
{
|
{
|
||||||
// Transfer only those rows into temp which exist in the sizer
|
int sum_proportions = 0;
|
||||||
// ignoring the superfluous ones. This prevents a segfault when
|
int growable_space = 0;
|
||||||
// calling AddGrowableRow( 3 ) if the sizer only has 2 rows.
|
int num = 0;
|
||||||
|
size_t idx;
|
||||||
for (idx = 0; idx < m_growableRows.GetCount(); idx++)
|
for (idx = 0; idx < m_growableRows.GetCount(); idx++)
|
||||||
{
|
{
|
||||||
if (m_growableRows[idx] < nrows)
|
// Since the number of rows/columns can change as items are inserted/deleted, we need
|
||||||
{
|
// to verify at runtime that the requested growable rows/columns are still valid.
|
||||||
temp.Add( m_growableRows[idx] );
|
if (m_growableRows[idx] >= nrows)
|
||||||
temp_proportions.Add( m_growableRowsProportions[idx] );
|
continue;
|
||||||
sum_proportions += m_growableRowsProportions[idx];
|
// If all items in a row/column are hidden, that row/column will have a dimension of -1.
|
||||||
growable_space += m_rowHeights[ temp[idx] ];
|
// This causes the row/column to be hidden completely.
|
||||||
}
|
if (m_rowHeights[ m_growableRows[idx] ] == -1)
|
||||||
|
continue;
|
||||||
|
sum_proportions += m_growableRowsProportions[idx];
|
||||||
|
growable_space += m_rowHeights[ m_growableRows[idx] ];
|
||||||
|
num++;
|
||||||
}
|
}
|
||||||
|
|
||||||
num = temp.GetCount();
|
if (num > 0)
|
||||||
|
|
||||||
if ((num > 0) && (sz.y > minsz.y))
|
|
||||||
{
|
{
|
||||||
for (idx = 0; idx < num; idx++)
|
for (idx = 0; idx < m_growableRows.GetCount(); idx++)
|
||||||
{
|
{
|
||||||
delta = (sz.y - minsz.y);
|
if (m_growableRows[idx] >= nrows )
|
||||||
if (sum_proportions == 0)
|
continue;
|
||||||
delta = (delta/num) + m_rowHeights[ temp[idx] ];
|
if (m_rowHeights[ m_growableRows[idx] ] == -1)
|
||||||
|
m_rowHeights[ m_growableRows[idx] ] = 0;
|
||||||
else
|
else
|
||||||
delta = ((delta+growable_space)*temp_proportions[idx])/
|
{
|
||||||
sum_proportions;
|
int delta = (sz.y - minsz.y);
|
||||||
m_rowHeights[ temp[idx] ] = delta;
|
if (sum_proportions == 0)
|
||||||
|
delta = (delta/num) + m_rowHeights[ m_growableRows[idx] ];
|
||||||
|
else
|
||||||
|
delta = ((delta+growable_space)*m_growableRowsProportions[idx]) / sum_proportions;
|
||||||
|
m_rowHeights[ m_growableRows[idx] ] = delta;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
temp.Empty();
|
|
||||||
temp_proportions.Empty();
|
|
||||||
sum_proportions = 0;
|
|
||||||
growable_space = 0;
|
|
||||||
}
|
}
|
||||||
else if ( (m_growMode == wxFLEX_GROWMODE_ALL) && (sz.y > minsz.y) )
|
else if ( (m_growMode == wxFLEX_GROWMODE_ALL) && (sz.y > minsz.y) )
|
||||||
{
|
{
|
||||||
@@ -1079,34 +1077,45 @@ void wxFlexGridSizer::RecalcSizes()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// the same logic as above but for the columns
|
// the same logic as above but for the columns
|
||||||
if ( (m_flexDirection & wxHORIZONTAL) ||
|
if ( sz.x > minsz.x && ( (m_flexDirection & wxHORIZONTAL) || (m_growMode == wxFLEX_GROWMODE_SPECIFIED) ) )
|
||||||
(m_growMode == wxFLEX_GROWMODE_SPECIFIED) )
|
|
||||||
{
|
{
|
||||||
// See above
|
int sum_proportions = 0;
|
||||||
|
int growable_space = 0;
|
||||||
|
int num = 0;
|
||||||
|
size_t idx;
|
||||||
for (idx = 0; idx < m_growableCols.GetCount(); idx++)
|
for (idx = 0; idx < m_growableCols.GetCount(); idx++)
|
||||||
{
|
{
|
||||||
if (m_growableCols[idx] < ncols)
|
// Since the number of rows/columns can change as items are inserted/deleted, we need
|
||||||
{
|
// to verify at runtime that the requested growable rows/columns are still valid.
|
||||||
temp.Add( m_growableCols[idx] );
|
if (m_growableCols[idx] >= ncols)
|
||||||
temp_proportions.Add( m_growableColsProportions[idx] );
|
continue;
|
||||||
sum_proportions += m_growableColsProportions[idx];
|
// If all items in a row/column are hidden, that row/column will have a dimension of -1.
|
||||||
growable_space += m_colWidths[idx];
|
// This causes the column to be hidden completely.
|
||||||
}
|
if (m_colWidths[ m_growableCols[idx] ] == -1)
|
||||||
|
continue;
|
||||||
|
sum_proportions += m_growableColsProportions[idx];
|
||||||
|
// wtb 5/12/02 bugfix - was m_ColWidths[idx]!!
|
||||||
|
growable_space += m_colWidths[ m_growableCols[idx] ];
|
||||||
|
num++;
|
||||||
}
|
}
|
||||||
|
|
||||||
num = temp.GetCount();
|
if (num > 0)
|
||||||
|
|
||||||
if ((num > 0) && (sz.x > minsz.x))
|
|
||||||
{
|
{
|
||||||
for (idx = 0; idx < num; idx++)
|
for (idx = 0; idx < m_growableCols.GetCount(); idx++)
|
||||||
{
|
{
|
||||||
delta = (sz.x - minsz.x);
|
if (m_growableCols[idx] >= ncols )
|
||||||
if (sum_proportions == 0)
|
continue;
|
||||||
delta = (delta/num) + m_colWidths[ temp[idx] ];
|
if (m_colWidths[ m_growableCols[idx] ] == -1)
|
||||||
else
|
m_colWidths[ m_growableCols[idx] ] = 0;
|
||||||
delta = ((delta+growable_space)*temp_proportions[idx])/
|
else
|
||||||
sum_proportions;
|
{
|
||||||
m_colWidths[ temp[idx] ] = delta;
|
int delta = (sz.x - minsz.x);
|
||||||
|
if (sum_proportions == 0)
|
||||||
|
delta = (delta/num) + m_colWidths[ m_growableCols[idx] ];
|
||||||
|
else
|
||||||
|
delta = ((delta+growable_space)*m_growableColsProportions[idx])/sum_proportions;
|
||||||
|
m_colWidths[ m_growableCols[idx] ] = delta;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1148,34 +1157,37 @@ wxSize wxFlexGridSizer::CalcMin()
|
|||||||
ncols;
|
ncols;
|
||||||
size_t i, s;
|
size_t i, s;
|
||||||
|
|
||||||
|
// Number of rows/columns can change as items are added or removed.
|
||||||
if ( !CalcRowsCols(nrows, ncols) )
|
if ( !CalcRowsCols(nrows, ncols) )
|
||||||
return wxSize(10, 10);
|
return wxSize(10, 10);
|
||||||
|
|
||||||
// We have to clear the old sizes out if any item has wxADJUST_MINSIZE
|
|
||||||
// set on it. Its probably quicker to just always do it than test for
|
|
||||||
// that though. At least do it before resizing the arrays, SetCount will
|
|
||||||
// initialise new elements to zero.
|
|
||||||
for( s = m_rowHeights.GetCount(), i = 0; i < s; ++i )
|
|
||||||
m_rowHeights[ i ] = 0;
|
|
||||||
|
|
||||||
for( s = m_colWidths.GetCount(), i = 0; i < s; ++i )
|
|
||||||
m_colWidths[ i ] = 0;
|
|
||||||
|
|
||||||
m_rowHeights.SetCount(nrows);
|
m_rowHeights.SetCount(nrows);
|
||||||
m_colWidths.SetCount(ncols);
|
m_colWidths.SetCount(ncols);
|
||||||
|
|
||||||
|
// We have to recalcuate the sizes in case an item has wxADJUST_MINSIZE, has changed
|
||||||
|
// minimum size since the previous layout, or has been hidden using wxSizer::Show().
|
||||||
|
// If all the items in a row/column are hidden, the final dimension of the row/column
|
||||||
|
// will be -1, indicating that the column itself is hidden.
|
||||||
|
for( s = m_rowHeights.GetCount(), i = 0; i < s; ++i )
|
||||||
|
m_rowHeights[ i ] = -1;
|
||||||
|
for( s = m_colWidths.GetCount(), i = 0; i < s; ++i )
|
||||||
|
m_colWidths[ i ] = -1;
|
||||||
|
|
||||||
wxSizerItemList::Node *node = m_children.GetFirst();
|
wxSizerItemList::Node *node = m_children.GetFirst();
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
wxSizerItem *item = node->GetData();
|
wxSizerItem *item = node->GetData();
|
||||||
wxSize sz( item->CalcMin() );
|
if ( item->IsShown() )
|
||||||
int row = i / ncols;
|
{
|
||||||
int col = i % ncols;
|
wxSize sz( item->CalcMin() );
|
||||||
|
int row = i / ncols;
|
||||||
|
int col = i % ncols;
|
||||||
|
|
||||||
m_rowHeights[ row ] = wxMax( sz.y, m_rowHeights[ row ] );
|
m_rowHeights[ row ] = wxMax( wxMax( 0, sz.y ), m_rowHeights[ row ] );
|
||||||
m_colWidths[ col ] = wxMax( sz.x, m_colWidths[ col ] );
|
m_colWidths[ col ] = wxMax( wxMax( 0, sz.x ), m_colWidths[ col ] );
|
||||||
|
}
|
||||||
|
|
||||||
node = node->GetNext();
|
node = node->GetNext();
|
||||||
i++;
|
i++;
|
||||||
@@ -1193,8 +1205,7 @@ wxSize wxFlexGridSizer::CalcMin()
|
|||||||
const int count = array.GetCount();
|
const int count = array.GetCount();
|
||||||
|
|
||||||
// find the largest value in this array
|
// find the largest value in this array
|
||||||
int n,
|
int n, largest = 0;
|
||||||
largest = 0;
|
|
||||||
for ( n = 0; n < count; ++n )
|
for ( n = 0; n < count; ++n )
|
||||||
{
|
{
|
||||||
if ( array[n] > largest )
|
if ( array[n] > largest )
|
||||||
@@ -1208,17 +1219,19 @@ wxSize wxFlexGridSizer::CalcMin()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Sum total minimum size, including gaps between rows/columns.
|
||||||
|
// -1 is used as a magic number meaning empty column.
|
||||||
int width = 0;
|
int width = 0;
|
||||||
for (int col = 0; col < ncols; col++)
|
for (int col = 0; col < ncols; col++)
|
||||||
width += m_colWidths[ col ];
|
if ( m_colWidths[ col ] != -1 )
|
||||||
|
width += m_colWidths[ col ] + ( col == ncols-1 ? 0 : m_hgap );
|
||||||
|
|
||||||
int height = 0;
|
int height = 0;
|
||||||
for (int row = 0; row < nrows; row++)
|
for (int row = 0; row < nrows; row++)
|
||||||
height += m_rowHeights[ row ];
|
if ( m_rowHeights[ row ] != -1 )
|
||||||
|
height += m_rowHeights[ row ] + ( row == nrows-1 ? 0 : m_vgap );
|
||||||
|
|
||||||
return wxSize( width + (ncols-1) * m_hgap,
|
return wxSize( width, height );
|
||||||
height + (nrows-1) * m_vgap);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxFlexGridSizer::AddGrowableRow( size_t idx, int proportion )
|
void wxFlexGridSizer::AddGrowableRow( size_t idx, int proportion )
|
||||||
|
Reference in New Issue
Block a user