added wxSizerSpacer and modified wxSizerItem to contain a pointer to either

wxWindow, wxSizer or wxSizerSpacer (instead of containing either a pointer or
just wxSize for spacers) and implement IsShown() and Show() by forwarding it
to the appropriate pointer: this means that now you can directly hide/show
windows/sizers/spacers instead of having to pass by containing sizers
Show(child) method


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@32865 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2005-03-17 21:17:38 +00:00
parent 9d9ad67384
commit 50c06297bd
2 changed files with 321 additions and 167 deletions

View File

@@ -102,29 +102,36 @@ private:
}; };
//--------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// wxSizerItem // wxSizerSpacer: used by wxSizerItem to represent a spacer
//--------------------------------------------------------------------------- // ----------------------------------------------------------------------------
class WXDLLEXPORT wxSizerItem: public wxObject class WXDLLEXPORT wxSizerSpacer
{ {
public: public:
// window with flags wxSizerSpacer(const wxSize& size) : m_size(size), m_isShown(true) { }
wxSizerItem(wxWindow *window, const wxSizerFlags& flags)
{
Init(flags);
m_window = window; void SetSize(const wxSize& size) { m_size = size; }
} const wxSize& GetSize() const { return m_size; }
// sizer with flags void Show(bool show) { m_isShown = show; }
wxSizerItem(wxSizer *sizer, const wxSizerFlags& flags) bool IsShown() const { return m_isShown; }
{
Init(flags);
m_sizer = sizer; private:
} // the size, in pixel
wxSize m_size;
// is the spacer currently shown?
bool m_isShown;
};
// ----------------------------------------------------------------------------
// wxSizerItem
// ----------------------------------------------------------------------------
class WXDLLEXPORT wxSizerItem : public wxObject
{
public:
// window // window
wxSizerItem( wxWindow *window, wxSizerItem( wxWindow *window,
int proportion, int proportion,
@@ -132,6 +139,14 @@ public:
int border, int border,
wxObject* userData ); wxObject* userData );
// window with flags
wxSizerItem(wxWindow *window, const wxSizerFlags& flags)
{
Init(flags);
SetWindow(window);
}
// subsizer // subsizer
wxSizerItem( wxSizer *sizer, wxSizerItem( wxSizer *sizer,
int proportion, int proportion,
@@ -139,6 +154,14 @@ public:
int border, int border,
wxObject* userData ); wxObject* userData );
// sizer with flags
wxSizerItem(wxSizer *sizer, const wxSizerFlags& flags)
{
Init(flags);
SetSizer(sizer);
}
// spacer // spacer
wxSizerItem( int width, wxSizerItem( int width,
int height, int height,
@@ -147,14 +170,21 @@ public:
int border, int border,
wxObject* userData); wxObject* userData);
// spacer with flags
wxSizerItem(int width, int height, const wxSizerFlags& flags)
{
Init(flags);
SetSpacer(width, height);
}
wxSizerItem(); wxSizerItem();
virtual ~wxSizerItem(); virtual ~wxSizerItem();
virtual void DeleteWindows(); virtual void DeleteWindows();
// Enable deleting the SizerItem without destroying the contained sizer. // Enable deleting the SizerItem without destroying the contained sizer.
void DetachSizer() void DetachSizer() { m_sizer = NULL; }
{ m_sizer = 0; }
virtual wxSize GetSize() const; virtual wxSize GetSize() const;
virtual wxSize CalcMin(); virtual wxSize CalcMin();
@@ -165,31 +195,32 @@ public:
wxSize GetMinSizeWithBorder() const; wxSize GetMinSizeWithBorder() const;
void SetMinSize(const wxSize& size) void SetMinSize(const wxSize& size)
{ {
if (IsWindow()) m_window->SetMinSize(size); if ( IsWindow() )
m_minSize = size; m_window->SetMinSize(size);
} m_minSize = size;
}
void SetMinSize( int x, int y ) void SetMinSize( int x, int y )
{ SetMinSize(wxSize(x, y)); } { SetMinSize(wxSize(x, y)); }
void SetInitSize( int x, int y ) void SetInitSize( int x, int y )
{ SetMinSize(wxSize(x, y)); } { SetMinSize(wxSize(x, y)); }
void SetRatio( int width, int height ) // if either of dimensions is zero, ratio is assumed to be 1
// if either of dimensions is zero, ratio is assumed to be 1 // to avoid "divide by zero" errors
// to avoid "divide by zero" errors void SetRatio(int width, int height)
{ m_ratio = (width && height) ? ((float) width / (float) height) : 1; } { m_ratio = (width && height) ? ((float) width / (float) height) : 1; }
void SetRatio( wxSize size ) void SetRatio(const wxSize& size)
{ m_ratio = (size.x && size.y) ? ((float) size.x / (float) size.y) : 1; } { SetRatio(size.x, size.y); }
void SetRatio( float ratio ) void SetRatio(float ratio)
{ m_ratio = ratio; } { m_ratio = ratio; }
float GetRatio() const float GetRatio() const
{ return m_ratio; } { return m_ratio; }
virtual wxRect GetRect() { return m_zoneRect; } virtual wxRect GetRect() { return m_rect; }
bool IsWindow() const; bool IsWindow() const { return m_kind == Item_Window; }
bool IsSizer() const; bool IsSizer() const { return m_kind == Item_Sizer; }
bool IsSpacer() const; bool IsSpacer() const { return m_kind == Item_Spacer; }
// Deprecated in 2.6, use {G,S}etProportion instead. // Deprecated in 2.6, use {G,S}etProportion instead.
wxDEPRECATED( void SetOption( int option ) ); wxDEPRECATED( void SetOption( int option ) );
@@ -209,48 +240,56 @@ public:
{ return m_border; } { return m_border; }
wxWindow *GetWindow() const wxWindow *GetWindow() const
{ return m_window; } { return m_kind == Item_Window ? m_window : NULL; }
void SetWindow( wxWindow *window )
{ m_window = window; m_minSize = window->GetSize(); }
wxSizer *GetSizer() const wxSizer *GetSizer() const
{ return m_sizer; } { return m_kind == Item_Sizer ? m_sizer : NULL; }
void SetSizer( wxSizer *sizer ) wxSize GetSpacer() const;
{ m_sizer = sizer; }
const wxSize &GetSpacer() const
{ return m_size; }
void SetSpacer( const wxSize &size )
{ m_size = size; m_minSize = size; }
void Show ( bool show ); void Show(bool show);
bool IsShown() const bool IsShown() const;
{ return m_show; }
wxObject* GetUserData() const wxObject* GetUserData() const
{ return m_userData; } { return m_userData; }
wxPoint GetPosition() const wxPoint GetPosition() const
{ return m_pos; } { return m_pos; }
// these functions do not free old sizer/spacer
void SetWindow(wxWindow *window);
void SetSizer(wxSizer *sizer);
void SetSpacer(const wxSize& size);
void SetSpacer(int width, int height) { SetSpacer(wxSize(width, height)); }
protected: protected:
// common part of several ctors // common part of several ctors
void Init(); void Init() { m_userData = NULL; }
// common part of ctors taking wxSizerFlags // common part of ctors taking wxSizerFlags
void Init(const wxSizerFlags& flags); void Init(const wxSizerFlags& flags);
enum
{
Item_None,
Item_Window,
Item_Sizer,
Item_Spacer,
Item_Max
} m_kind;
union
{
wxWindow *m_window;
wxSizer *m_sizer;
wxSizerSpacer *m_spacer;
};
wxWindow *m_window;
wxSizer *m_sizer;
wxSize m_size;
wxPoint m_pos; wxPoint m_pos;
wxSize m_minSize; wxSize m_minSize;
int m_proportion; int m_proportion;
int m_border; int m_border;
int m_flag; int m_flag;
wxRect m_zoneRect; // Rectangle for window or item (not including borders)
// If true, then this item is considered in the layout // on screen rectangle of this item (not including borders)
// calculation. Otherwise, it is skipped over. wxRect m_rect;
bool m_show;
// Aspect ratio can always be calculated from m_size, // Aspect ratio can always be calculated from m_size,
// but this would cause precision loss when the window // but this would cause precision loss when the window
@@ -374,13 +413,13 @@ public:
void SetMinSize( wxSize size ) void SetMinSize( wxSize size )
{ DoSetMinSize( size.x, size.y ); } { DoSetMinSize( size.x, size.y ); }
/* Searches recursively */ // Searches recursively
bool SetItemMinSize( wxWindow *window, int width, int height ) bool SetItemMinSize( wxWindow *window, int width, int height )
{ return DoSetItemMinSize( window, width, height ); } { return DoSetItemMinSize( window, width, height ); }
bool SetItemMinSize( wxWindow *window, wxSize size ) bool SetItemMinSize( wxWindow *window, wxSize size )
{ return DoSetItemMinSize( window, size.x, size.y ); } { return DoSetItemMinSize( window, size.x, size.y ); }
/* Searches recursively */ // Searches recursively
bool SetItemMinSize( wxSizer *sizer, int width, int height ) bool SetItemMinSize( wxSizer *sizer, int width, int height )
{ return DoSetItemMinSize( sizer, width, height ); } { return DoSetItemMinSize( sizer, width, height ); }
bool SetItemMinSize( wxSizer *sizer, wxSize size ) bool SetItemMinSize( wxSizer *sizer, wxSize size )
@@ -396,7 +435,7 @@ public:
wxPoint GetPosition() const wxPoint GetPosition() const
{ return m_position; } { return m_position; }
/* Calculate the minimal size or return m_minSize if bigger. */ // Calculate the minimal size or return m_minSize if bigger.
wxSize GetMinSize(); wxSize GetMinSize();
virtual void RecalcSizes() = 0; virtual void RecalcSizes() = 0;
@@ -438,11 +477,15 @@ public:
// Recursively call wxWindow::Show () on all sizer items. // Recursively call wxWindow::Show () on all sizer items.
virtual void ShowItems (bool show); virtual void ShowItems (bool show);
void Show(bool show) { m_isShown = show; }
bool IsShown() const { return m_isShown; }
protected: protected:
wxSize m_size; wxSize m_size;
wxSize m_minSize; wxSize m_minSize;
wxPoint m_position; wxPoint m_position;
wxSizerItemList m_children; wxSizerItemList m_children;
bool m_isShown;
wxSize GetMaxWindowSize( wxWindow *window ) const; wxSize GetMaxWindowSize( wxWindow *window ) const;
wxSize GetMinWindowSize( wxWindow *window ); wxSize GetMinWindowSize( wxWindow *window );

View File

@@ -85,18 +85,9 @@ WX_DEFINE_EXPORTED_LIST( wxSizerItemList );
minsize minsize
*/ */
//--------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// wxSizerItem // wxSizerItem
//--------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void wxSizerItem::Init()
{
m_window = NULL;
m_sizer = NULL;
m_show = true;
m_userData = NULL;
m_zoneRect = wxRect(0,0,0,0);
}
void wxSizerItem::Init(const wxSizerFlags& flags) void wxSizerItem::Init(const wxSizerFlags& flags)
{ {
@@ -107,56 +98,6 @@ void wxSizerItem::Init(const wxSizerFlags& flags)
m_border = flags.GetBorderInPixels(); m_border = flags.GetBorderInPixels();
} }
wxSizerItem::wxSizerItem( int width, int height, int proportion, int flag, int border, wxObject* userData )
: m_window( NULL )
, m_sizer( NULL )
, m_size( wxSize( width, height ) ) // size is set directly
, m_minSize( m_size ) // minimal size is the initial size
, m_proportion( proportion )
, m_border( border )
, m_flag( flag )
, m_zoneRect()
, m_show( true )
, m_userData( userData )
{
SetRatio( m_size );
}
wxSizerItem::wxSizerItem( wxWindow *window, int proportion, int flag, int border, wxObject* userData )
: m_window( window )
, m_sizer( NULL )
, m_proportion( proportion )
, m_border( border )
, m_flag( flag )
, m_zoneRect()
, m_show( true )
, m_userData( userData )
{
if (flag & wxFIXED_MINSIZE)
window->SetMinSize(window->GetSize());
m_minSize = window->GetSize();
// aspect ratio calculated from initial size
SetRatio( m_minSize );
// m_size is calculated later
}
wxSizerItem::wxSizerItem( wxSizer *sizer, int proportion, int flag, int border, wxObject* userData )
: m_window( NULL )
, m_sizer( sizer )
, m_proportion( proportion )
, m_border( border )
, m_flag( flag )
, m_zoneRect()
, m_show( true )
, m_ratio( 0.0 )
, m_userData( userData )
{
// m_minSize is calculated later
// m_size is calculated later
}
wxSizerItem::wxSizerItem() wxSizerItem::wxSizerItem()
{ {
Init(); Init();
@@ -164,32 +105,149 @@ wxSizerItem::wxSizerItem()
m_proportion = 0; m_proportion = 0;
m_border = 0; m_border = 0;
m_flag = 0; m_flag = 0;
m_kind = Item_None;
}
// window item
void wxSizerItem::SetWindow(wxWindow *window)
{
wxCHECK_RET( window, _T("NULL window in wxSizerItem::SetWindow()") );
m_kind = Item_Window;
m_window = window;
// window doesn't become smaller than its initial size, whatever happens
m_minSize = window->GetSize();
if ( m_flag & wxFIXED_MINSIZE )
window->SetMinSize(m_minSize);
// aspect ratio calculated from initial size
SetRatio(m_minSize);
}
wxSizerItem::wxSizerItem(wxWindow *window,
int proportion,
int flag,
int border,
wxObject* userData)
: m_proportion(proportion),
m_border(border),
m_flag(flag),
m_userData(userData)
{
SetWindow(window);
}
// sizer item
void wxSizerItem::SetSizer(wxSizer *sizer)
{
m_kind = Item_Sizer;
m_sizer = sizer;
}
wxSizerItem::wxSizerItem(wxSizer *sizer,
int proportion,
int flag,
int border,
wxObject* userData)
: m_proportion(proportion),
m_border(border),
m_flag(flag),
m_ratio(0.0),
m_userData(userData)
{
SetSizer(sizer);
// m_minSize is set later
}
// spacer item
void wxSizerItem::SetSpacer(const wxSize& size)
{
m_kind = Item_Spacer;
m_spacer = new wxSizerSpacer(size);
m_minSize = size;
SetRatio(size);
}
wxSizerItem::wxSizerItem(int width,
int height,
int proportion,
int flag,
int border,
wxObject* userData)
: m_minSize(width, height), // minimal size is the initial size
m_proportion(proportion),
m_border(border),
m_flag(flag),
m_userData(userData)
{
SetSpacer(width, height);
} }
wxSizerItem::~wxSizerItem() wxSizerItem::~wxSizerItem()
{ {
delete m_userData; delete m_userData;
if ( m_window ) switch ( m_kind )
{ {
m_window->SetContainingSizer(NULL); case Item_None:
} break;
else // we must be a sizer
{ case Item_Window:
delete m_sizer; m_window->SetContainingSizer(NULL);
break;
case Item_Sizer:
delete m_sizer;
break;
case Item_Spacer:
delete m_spacer;
break;
case Item_Max:
default:
wxFAIL_MSG( _T("unexpected wxSizerItem::m_kind") );
} }
} }
wxSize wxSizerItem::GetSpacer() const
{
wxSize size;
if ( m_kind == Item_Spacer )
size = m_spacer->GetSize();
return size;
}
wxSize wxSizerItem::GetSize() const wxSize wxSizerItem::GetSize() const
{ {
wxSize ret; wxSize ret;
if (IsSizer()) switch ( m_kind )
ret = m_sizer->GetSize(); {
else case Item_None:
if (IsWindow()) break;
ret = m_window->GetSize();
else ret = m_size; case Item_Window:
ret = m_window->GetSize();
break;
case Item_Sizer:
ret = m_sizer->GetSize();
break;
case Item_Spacer:
ret = m_spacer->GetSize();
break;
case Item_Max:
default:
wxFAIL_MSG( _T("unexpected wxSizerItem::m_kind") );
}
if (m_flag & wxWEST) if (m_flag & wxWEST)
ret.x += m_border; ret.x += m_border;
@@ -294,53 +352,106 @@ void wxSizerItem::SetDimension( wxPoint pos, wxSize size )
size.y -= m_border; size.y -= m_border;
} }
if (IsSizer()) m_rect = wxRect(pos, size);
m_sizer->SetDimension( pos.x, pos.y, size.x, size.y );
m_zoneRect = wxRect(pos, size); switch ( m_kind )
if (IsWindow()) {
m_window->SetSize( pos.x, pos.y, size.x, size.y, wxSIZE_ALLOW_MINUS_ONE ); case Item_None:
wxFAIL_MSG( _T("can't set size of uninitialized sizer item") );
break;
m_size = size; case Item_Window:
m_window->SetSize(pos.x, pos.y, size.x, size.y,
wxSIZE_ALLOW_MINUS_ONE);
break;
case Item_Sizer:
m_sizer->SetDimension(pos.x, pos.y, size.x, size.y);
break;
case Item_Spacer:
m_spacer->SetSize(size);
break;
case Item_Max:
default:
wxFAIL_MSG( _T("unexpected wxSizerItem::m_kind") );
}
} }
void wxSizerItem::DeleteWindows() void wxSizerItem::DeleteWindows()
{ {
if (m_window) switch ( m_kind )
{ {
m_window->Destroy(); case Item_None:
m_window = NULL; case Item_Spacer:
break;
case Item_Window:
m_window->Destroy();
break;
case Item_Sizer:
m_sizer->DeleteWindows();
break;
case Item_Max:
default:
wxFAIL_MSG( _T("unexpected wxSizerItem::m_kind") );
} }
if (m_sizer) m_kind = Item_None;
m_sizer->DeleteWindows();
}
bool wxSizerItem::IsWindow() const
{
return (m_window != NULL);
}
bool wxSizerItem::IsSizer() const
{
return (m_sizer != NULL);
}
bool wxSizerItem::IsSpacer() const
{
return (m_window == NULL) && (m_sizer == NULL);
} }
void wxSizerItem::Show( bool show ) void wxSizerItem::Show( bool show )
{ {
m_show = show; switch ( m_kind )
{
case Item_None:
wxFAIL_MSG( _T("can't show uninitialized sizer item") );
break;
if( IsWindow() ) case Item_Window:
m_window->Show( show ); m_window->Show(show);
else if( IsSizer() ) break;
m_sizer->ShowItems( show );
// ... nothing else to do to hide/show spacers case Item_Sizer:
m_sizer->ShowItems(show);
break;
case Item_Spacer:
m_spacer->Show(show);
break;
case Item_Max:
default:
wxFAIL_MSG( _T("unexpected wxSizerItem::m_kind") );
}
}
bool wxSizerItem::IsShown() const
{
switch ( m_kind )
{
case Item_None:
wxFAIL_MSG( _T("uninitialized sizer item") );
break;
case Item_Window:
return m_window->IsShown();
case Item_Sizer:
return m_sizer->IsShown();
case Item_Spacer:
return m_spacer->IsShown();
case Item_Max:
default:
wxFAIL_MSG( _T("unexpected wxSizerItem::m_kind") );
}
return false;
} }
void wxSizerItem::SetOption( int option ) void wxSizerItem::SetOption( int option )
@@ -359,8 +470,8 @@ int wxSizerItem::GetOption() const
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
wxSizer::wxSizer() wxSizer::wxSizer()
:m_minSize()
{ {
m_isShown = true;
} }
wxSizer::~wxSizer() wxSizer::~wxSizer()
@@ -372,7 +483,7 @@ wxSizerItem* wxSizer::Insert( size_t index, wxSizerItem *item )
{ {
m_children.Insert( index, item ); m_children.Insert( index, item );
if( item->GetWindow() ) if ( item->GetWindow() )
item->GetWindow()->SetContainingSizer( this ); item->GetWindow()->SetContainingSizer( this );
return item; return item;
@@ -417,7 +528,7 @@ bool wxSizer::Remove( int index )
wxSizerItem *item = node->GetData(); wxSizerItem *item = node->GetData();
if( item->IsWindow() ) if ( item->IsWindow() )
item->GetWindow()->SetContainingSizer( NULL ); item->GetWindow()->SetContainingSizer( NULL );
delete item; delete item;
@@ -481,9 +592,9 @@ bool wxSizer::Detach( int index )
wxSizerItem *item = node->GetData(); wxSizerItem *item = node->GetData();
if( item->IsSizer() ) if ( item->IsSizer() )
item->DetachSizer(); item->DetachSizer();
else if( item->IsWindow() ) else if ( item->IsWindow() )
item->GetWindow()->SetContainingSizer( NULL ); item->GetWindow()->SetContainingSizer( NULL );
delete item; delete item;
@@ -620,7 +731,7 @@ wxSize wxSizer::GetMaxClientSize( wxWindow *window ) const
{ {
wxSize maxSize( window->GetMaxSize() ); wxSize maxSize( window->GetMaxSize() );
if( maxSize != wxDefaultSize ) if ( maxSize != wxDefaultSize )
{ {
wxSize size( window->GetSize() ); wxSize size( window->GetSize() );
wxSize client_size( window->GetClientSize() ); wxSize client_size( window->GetClientSize() );