Merge branch 'generic-initial-state-fixes'

Fixes for the initial state of generic wx{List,Spin}Ctrl.

See https://github.com/wxWidgets/wxWidgets/pull/2469
This commit is contained in:
Vadim Zeitlin
2021-08-20 21:28:35 +02:00
8 changed files with 41 additions and 18 deletions

View File

@@ -1379,7 +1379,7 @@ following properties (all of them optional):
@row3col{text, @ref overview_xrcformat_type_text, @row3col{text, @ref overview_xrcformat_type_text,
The title of the column. } The title of the column. }
@row3col{width, integer, @row3col{width, integer,
The column width. } The column width. @c wxLIST_DEFAULT_COL_WIDTH is used by default. }
@row3col{image, integer, @row3col{image, integer,
The zero-based index of the image associated with the item in the 'small' image list. } The zero-based index of the image associated with the item in the 'small' image list. }
@endTable @endTable

View File

@@ -145,6 +145,9 @@ protected:
// check if the value is in range // check if the value is in range
bool InRange(double n) const { return (n >= m_min) && (n <= m_max); } bool InRange(double n) const { return (n >= m_min) && (n <= m_max); }
// adjust the value to fit the range and snap it to ticks if necessary
double AdjustAndSnap(double value) const;
// ensure that the value is in range wrapping it round if necessary // ensure that the value is in range wrapping it round if necessary
double AdjustToFitInRange(double value) const; double AdjustToFitInRange(double value) const;

View File

@@ -135,11 +135,12 @@ enum wxListColumnFormat
wxLIST_FORMAT_CENTER = wxLIST_FORMAT_CENTRE wxLIST_FORMAT_CENTER = wxLIST_FORMAT_CENTRE
}; };
// Autosize values for SetColumnWidth // Values for SetColumnWidth()
enum enum
{ {
wxLIST_AUTOSIZE = -1, wxLIST_AUTOSIZE = -1,
wxLIST_AUTOSIZE_USEHEADER = -2 // partly supported by generic version wxLIST_AUTOSIZE_USEHEADER = -2, // partly supported by generic version
wxLIST_DEFAULT_COL_WIDTH = 80
}; };
// Flag values for GetItemRect // Flag values for GetItemRect

View File

@@ -89,7 +89,7 @@ enum wxListColumnFormat
wxLIST_FORMAT_CENTER = wxLIST_FORMAT_CENTRE wxLIST_FORMAT_CENTER = wxLIST_FORMAT_CENTRE
}; };
/// Autosize values for SetColumnWidth /// Values for SetColumnWidth()
enum enum
{ {
wxLIST_AUTOSIZE = -1, wxLIST_AUTOSIZE = -1,

View File

@@ -96,9 +96,6 @@ static const int MARGIN_BETWEEN_ROWS = 6;
// when autosizing the columns, add some slack // when autosizing the columns, add some slack
static const int AUTOSIZE_COL_MARGIN = 10; static const int AUTOSIZE_COL_MARGIN = 10;
// default width for the header columns
static const int WIDTH_COL_DEFAULT = 80;
// the space between the image and the text in the report mode // the space between the image and the text in the report mode
static const int IMAGE_MARGIN_IN_REPORT_MODE = 5; static const int IMAGE_MARGIN_IN_REPORT_MODE = 5;
@@ -316,8 +313,9 @@ void wxListHeaderData::SetItem( const wxListItem &item )
if ( m_mask & wxLIST_MASK_FORMAT ) if ( m_mask & wxLIST_MASK_FORMAT )
m_format = item.m_format; m_format = item.m_format;
if ( m_mask & wxLIST_MASK_WIDTH ) // Always give some initial width to the new columns (it's still possible
SetWidth(item.m_width); // to set the width to 0 explicitly, however).
SetWidth(m_mask & wxLIST_MASK_WIDTH ? item.m_width : wxLIST_DEFAULT_COL_WIDTH);
if ( m_mask & wxLIST_MASK_STATE ) if ( m_mask & wxLIST_MASK_STATE )
SetState(item.m_state); SetState(item.m_state);
@@ -336,7 +334,7 @@ void wxListHeaderData::SetHeight( int h )
void wxListHeaderData::SetWidth( int w ) void wxListHeaderData::SetWidth( int w )
{ {
m_width = w < 0 ? WIDTH_COL_DEFAULT : w; m_width = w < 0 ? wxLIST_DEFAULT_COL_WIDTH : w;
} }
void wxListHeaderData::SetState( int flag ) void wxListHeaderData::SetState( int flag )

View File

@@ -222,11 +222,14 @@ bool wxSpinCtrlGenericBase::Create(wxWindow *parent,
return false; return false;
} }
m_value = initial; m_min = min;
m_min = min; m_max = max;
m_max = max;
m_increment = increment; m_increment = increment;
// Note that AdjustAndSnap() uses the variables set above, so only call it
// after assigning the values to them.
m_value = AdjustAndSnap(initial);
// the string value overrides the numeric one (for backwards compatibility // the string value overrides the numeric one (for backwards compatibility
// reasons and also because it is simpler to specify the string value which // reasons and also because it is simpler to specify the string value which
// comes much sooner in the list of arguments and leave the initial // comes much sooner in the list of arguments and leave the initial
@@ -235,7 +238,7 @@ bool wxSpinCtrlGenericBase::Create(wxWindow *parent,
{ {
double d; double d;
if ( DoTextToValue(value, &d) ) if ( DoTextToValue(value, &d) )
m_value = d; m_value = AdjustAndSnap(d);
} }
m_textCtrl = new wxSpinCtrlTextGeneric(this, DoValueToText(m_value), style); m_textCtrl = new wxSpinCtrlTextGeneric(this, DoValueToText(m_value), style);
@@ -529,10 +532,8 @@ void wxSpinCtrlGenericBase::SetValue(const wxString& text)
} }
} }
bool wxSpinCtrlGenericBase::DoSetValue(double val, SendEvent sendEvent) double wxSpinCtrlGenericBase::AdjustAndSnap(double val) const
{ {
wxCHECK_MSG( m_textCtrl, false, wxT("invalid call to wxSpinCtrl::SetValue") );
if ( val < m_min ) if ( val < m_min )
val = m_min; val = m_min;
if ( val > m_max ) if ( val > m_max )
@@ -551,6 +552,15 @@ bool wxSpinCtrlGenericBase::DoSetValue(double val, SendEvent sendEvent)
} }
} }
return val;
}
bool wxSpinCtrlGenericBase::DoSetValue(double val, SendEvent sendEvent)
{
wxCHECK_MSG( m_textCtrl, false, wxT("invalid call to wxSpinCtrl::SetValue") );
val = AdjustAndSnap(val);
wxString str(DoValueToText(val)); wxString str(DoValueToText(val));
if ((val != m_value) || (str != m_textCtrl->GetValue())) if ((val != m_value) || (str != m_textCtrl->GetValue()))

View File

@@ -2057,7 +2057,7 @@ long wxListCtrl::DoInsertColumn(long col, const wxListItem& item)
// always give some width to the new column: this one is compatible // always give some width to the new column: this one is compatible
// with the generic version // with the generic version
lvCol.mask |= LVCF_WIDTH; lvCol.mask |= LVCF_WIDTH;
lvCol.cx = 80; lvCol.cx = wxLIST_DEFAULT_COL_WIDTH;
} }
long n = ListView_InsertColumn(GetHwnd(), col, &lvCol); long n = ListView_InsertColumn(GetHwnd(), col, &lvCol);

View File

@@ -124,6 +124,17 @@ TEST_CASE_METHOD(SpinCtrlTestCase1, "SpinCtrl::Init4", "[spinctrl]")
CHECK(m_spin->GetValue() == 99); CHECK(m_spin->GetValue() == 99);
} }
TEST_CASE_METHOD(SpinCtrlTestCase1, "SpinCtrl::InitOutOfRange", "[spinctrl]")
{
m_spin->Create(wxTheApp->GetTopWindow(), wxID_ANY, "",
wxDefaultPosition, wxDefaultSize, 0,
10, 20, 0);
// Recreate the control with another "initial" outside of the valid range:
// it shouldn't be taken into account.
CHECK(m_spin->GetValue() == 10);
}
TEST_CASE_METHOD(SpinCtrlTestCase1, "SpinCtrl::NoEventsInCtor", "[spinctrl]") TEST_CASE_METHOD(SpinCtrlTestCase1, "SpinCtrl::NoEventsInCtor", "[spinctrl]")
{ {
// Verify that creating the control does not generate any events. This is // Verify that creating the control does not generate any events. This is