The new method takes minimal size just computed by RecalcSizes() as its
argument making it unnecessary to store it as a member variable in the derived
classes such as wx{Box,FlexGrid}Sizer.
The old method can still be overridden for compatibility and by the derived
class that don't need minimal size when updating children.
		
	
		
			
				
	
	
		
			104 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/////////////////////////////////////////////////////////////////////////////
 | 
						|
// Name:        wx/wrapsizer.h
 | 
						|
// Purpose:     provide wrapping sizer for layout (wxWrapSizer)
 | 
						|
// Author:      Arne Steinarson
 | 
						|
// Created:     2008-05-08
 | 
						|
// Copyright:   (c) Arne Steinarson
 | 
						|
// Licence:     wxWindows licence
 | 
						|
/////////////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
#ifndef _WX_WRAPSIZER_H_
 | 
						|
#define _WX_WRAPSIZER_H_
 | 
						|
 | 
						|
#include "wx/sizer.h"
 | 
						|
 | 
						|
// flags for wxWrapSizer
 | 
						|
enum
 | 
						|
{
 | 
						|
    wxEXTEND_LAST_ON_EACH_LINE = 1,
 | 
						|
    // don't leave spacers in the beginning of a new row
 | 
						|
    wxREMOVE_LEADING_SPACES = 2,
 | 
						|
 | 
						|
    wxWRAPSIZER_DEFAULT_FLAGS = wxEXTEND_LAST_ON_EACH_LINE |
 | 
						|
                                wxREMOVE_LEADING_SPACES
 | 
						|
};
 | 
						|
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
// A box sizer that can wrap items on several lines when sum of widths exceed
 | 
						|
// available line width.
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
 | 
						|
class WXDLLEXPORT wxWrapSizer : public wxBoxSizer
 | 
						|
{
 | 
						|
public:
 | 
						|
    wxWrapSizer(int orient = wxHORIZONTAL, int flags = wxWRAPSIZER_DEFAULT_FLAGS);
 | 
						|
    virtual ~wxWrapSizer();
 | 
						|
 | 
						|
    // override base class virtual methods
 | 
						|
    virtual wxSize CalcMin() wxOVERRIDE;
 | 
						|
    virtual void RepositionChildren(const wxSize& minSize) wxOVERRIDE;
 | 
						|
 | 
						|
    virtual bool InformFirstDirection(int direction,
 | 
						|
                                      int size,
 | 
						|
                                      int availableOtherDir) wxOVERRIDE;
 | 
						|
 | 
						|
protected:
 | 
						|
    // This method is called to decide if an item represents empty space or
 | 
						|
    // not. We do this to avoid having space-only items first or last on a
 | 
						|
    // wrapped line (left alignment).
 | 
						|
    //
 | 
						|
    // By default only spacers are considered to be empty items but a derived
 | 
						|
    // class may override this item if some other kind of sizer elements should
 | 
						|
    // be also considered empty for some reason.
 | 
						|
    virtual bool IsSpaceItem(wxSizerItem *item) const
 | 
						|
    {
 | 
						|
        return item->IsSpacer();
 | 
						|
    }
 | 
						|
 | 
						|
    // helpers of CalcMin()
 | 
						|
    void CalcMinFromMinor(int totMinor);
 | 
						|
    void CalcMinFromMajor(int totMajor);
 | 
						|
    void CalcMinUsingCurrentLayout();
 | 
						|
    void CalcMinFittingSize(const wxSize& szBoundary);
 | 
						|
    void CalcMaxSingleItemSize();
 | 
						|
 | 
						|
    // temporarily change the proportion of the last item of the N-th row to
 | 
						|
    // extend to the end of line if the appropriate flag is set
 | 
						|
    void AdjustLastRowItemProp(size_t n, wxSizerItem *itemLast);
 | 
						|
 | 
						|
    // remove all the items from m_rows
 | 
						|
    void ClearRows();
 | 
						|
 | 
						|
    // return the N-th row sizer from m_rows creating it if necessary
 | 
						|
    wxSizer *GetRowSizer(size_t n);
 | 
						|
 | 
						|
    // should be called after completion of each row
 | 
						|
    void FinishRow(size_t n, int rowMajor, int rowMinor, wxSizerItem *itemLast);
 | 
						|
 | 
						|
 | 
						|
    const int m_flags;       // Flags specified in the ctor
 | 
						|
 | 
						|
    int m_dirInform;         // Direction for size information
 | 
						|
    int m_availSize;         // Size available in m_dirInform direction
 | 
						|
    int m_availableOtherDir; // Size available in the other direction
 | 
						|
    bool m_lastUsed;         // Indicates whether value from InformFirst... has
 | 
						|
                             //  been used yet
 | 
						|
 | 
						|
    // The sizes below are computed by RepositionChildren(), i.e. they don't have
 | 
						|
    // valid values during the initial call to CalcMin() and they are only
 | 
						|
    // valid for the current layout (i.e. the current number of rows)
 | 
						|
    int m_minSizeMinor;      // Min size in minor direction
 | 
						|
    int m_maxSizeMajor;      // Size of longest row
 | 
						|
    int m_minItemMajor;      // Size of smallest item in major direction
 | 
						|
 | 
						|
    // the minimal size needed for this sizer as calculated by the last call to
 | 
						|
    // our CalcMin()
 | 
						|
    wxSize m_calculatedMinSize;
 | 
						|
 | 
						|
    wxBoxSizer m_rows;       // Sizer containing multiple rows of our items
 | 
						|
 | 
						|
    wxDECLARE_DYNAMIC_CLASS_NO_COPY(wxWrapSizer);
 | 
						|
};
 | 
						|
 | 
						|
#endif // _WX_WRAPSIZER_H_
 |