622deec262
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_
|