Add wxFloatingPointValidator::SetFactor()
This allows displaying values in percents (or also currency units and subunits, for example) without changing the actually stored value.
This commit is contained in:
@@ -175,6 +175,7 @@ All (GUI):
|
|||||||
- Add Scintilla FineTicker methods to wxSTC (NewPagodi).
|
- Add Scintilla FineTicker methods to wxSTC (NewPagodi).
|
||||||
- Add wxFontPickerCtrl::SetMinPointSize() (Andreas Falkenhahn).
|
- Add wxFontPickerCtrl::SetMinPointSize() (Andreas Falkenhahn).
|
||||||
- Add Set/GetFooter/Text/Icon() to wxRichMessageDialog (Tobias Taschner)
|
- Add Set/GetFooter/Text/Icon() to wxRichMessageDialog (Tobias Taschner)
|
||||||
|
- Add wxFloatingPointValidator::SetFactor().
|
||||||
|
|
||||||
wxGTK:
|
wxGTK:
|
||||||
|
|
||||||
|
@@ -352,6 +352,11 @@ public:
|
|||||||
// supported by the type handled by the validator.
|
// supported by the type handled by the validator.
|
||||||
void SetPrecision(unsigned precision) { m_precision = precision; }
|
void SetPrecision(unsigned precision) { m_precision = precision; }
|
||||||
|
|
||||||
|
// Set multiplier applied for displaying the value, e.g. 100 if the value
|
||||||
|
// should be displayed in percents, so that the variable containing 0.5
|
||||||
|
// would be displayed as 50.
|
||||||
|
void SetFactor(double factor) { m_factor = factor; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Notice that we can't use "long double" here because it's not supported
|
// Notice that we can't use "long double" here because it's not supported
|
||||||
// by wxNumberFormatter yet, so restrict ourselves to just double (and
|
// by wxNumberFormatter yet, so restrict ourselves to just double (and
|
||||||
@@ -361,12 +366,14 @@ protected:
|
|||||||
wxFloatingPointValidatorBase(int style)
|
wxFloatingPointValidatorBase(int style)
|
||||||
: wxNumValidatorBase(style)
|
: wxNumValidatorBase(style)
|
||||||
{
|
{
|
||||||
|
m_factor = 1.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxFloatingPointValidatorBase(const wxFloatingPointValidatorBase& other)
|
wxFloatingPointValidatorBase(const wxFloatingPointValidatorBase& other)
|
||||||
: wxNumValidatorBase(other)
|
: wxNumValidatorBase(other)
|
||||||
{
|
{
|
||||||
m_precision = other.m_precision;
|
m_precision = other.m_precision;
|
||||||
|
m_factor = other.m_factor;
|
||||||
|
|
||||||
m_min = other.m_min;
|
m_min = other.m_min;
|
||||||
m_max = other.m_max;
|
m_max = other.m_max;
|
||||||
@@ -374,7 +381,7 @@ protected:
|
|||||||
|
|
||||||
// Provide methods for wxNumValidator use.
|
// Provide methods for wxNumValidator use.
|
||||||
wxString ToString(LongestValueType value) const;
|
wxString ToString(LongestValueType value) const;
|
||||||
static bool FromString(const wxString& s, LongestValueType *value);
|
bool FromString(const wxString& s, LongestValueType *value) const;
|
||||||
|
|
||||||
void DoSetMin(LongestValueType min) { m_min = min; }
|
void DoSetMin(LongestValueType min) { m_min = min; }
|
||||||
void DoSetMax(LongestValueType max) { m_max = max; }
|
void DoSetMax(LongestValueType max) { m_max = max; }
|
||||||
@@ -391,6 +398,9 @@ private:
|
|||||||
// Maximum number of decimals digits after the decimal separator.
|
// Maximum number of decimals digits after the decimal separator.
|
||||||
unsigned m_precision;
|
unsigned m_precision;
|
||||||
|
|
||||||
|
// Factor applied for the displayed the value.
|
||||||
|
double m_factor;
|
||||||
|
|
||||||
// Minimal and maximal values accepted (inclusive).
|
// Minimal and maximal values accepted (inclusive).
|
||||||
LongestValueType m_min, m_max;
|
LongestValueType m_min, m_max;
|
||||||
|
|
||||||
|
@@ -346,6 +346,19 @@ public:
|
|||||||
constructor.
|
constructor.
|
||||||
*/
|
*/
|
||||||
void SetPrecision(unsigned precision);
|
void SetPrecision(unsigned precision);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Set factor used for displaying the value.
|
||||||
|
|
||||||
|
The value associated with the validator is multiplied by the factor
|
||||||
|
before displaying it and divided by it when retrieving its value from
|
||||||
|
the control. By default, the @a factor is 1, so the actual value is not
|
||||||
|
affected by it, but it can be set to, for example, 100, to display the
|
||||||
|
value in percents while still storing it as absolute value.
|
||||||
|
|
||||||
|
@since 3.1.1
|
||||||
|
*/
|
||||||
|
void SetFactor(double factor);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -64,7 +64,9 @@ MyData::MyData()
|
|||||||
m_string2 = "Valid text";
|
m_string2 = "Valid text";
|
||||||
m_listbox_choices.Add(0);
|
m_listbox_choices.Add(0);
|
||||||
m_intValue = 0;
|
m_intValue = 0;
|
||||||
|
m_smallIntValue = 3;
|
||||||
m_doubleValue = 12354.31;
|
m_doubleValue = 12354.31;
|
||||||
|
m_percentValue = 0.25;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -219,7 +221,9 @@ void MyFrame::OnTestDialog(wxCommandEvent& WXUNUSED(event))
|
|||||||
m_listbox->Append(wxString(wxT("radiobox: ")) + g_radiobox_choices[g_data.m_radiobox_choice]);
|
m_listbox->Append(wxString(wxT("radiobox: ")) + g_radiobox_choices[g_data.m_radiobox_choice]);
|
||||||
|
|
||||||
m_listbox->Append(wxString::Format("integer value: %d", g_data.m_intValue));
|
m_listbox->Append(wxString::Format("integer value: %d", g_data.m_intValue));
|
||||||
|
m_listbox->Append(wxString::Format("small int value: %u", g_data.m_smallIntValue));
|
||||||
m_listbox->Append(wxString::Format("double value: %.3f", g_data.m_doubleValue));
|
m_listbox->Append(wxString::Format("double value: %.3f", g_data.m_doubleValue));
|
||||||
|
m_listbox->Append(wxString::Format("percent value: %.4f", g_data.m_percentValue));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -304,6 +308,11 @@ MyDialog::MyDialog( wxWindow *parent, const wxString& title,
|
|||||||
// setup a sizer with the controls for numeric validators
|
// setup a sizer with the controls for numeric validators
|
||||||
// ------------------------------------------------------
|
// ------------------------------------------------------
|
||||||
|
|
||||||
|
wxFlexGridSizer* const
|
||||||
|
numSizer = new wxFlexGridSizer(5, FromDIP(wxSize(5, 5)));
|
||||||
|
|
||||||
|
const wxSizerFlags center = wxSizerFlags().CenterVertical();
|
||||||
|
|
||||||
wxIntegerValidator<int> valInt(&g_data.m_intValue,
|
wxIntegerValidator<int> valInt(&g_data.m_intValue,
|
||||||
wxNUM_VAL_THOUSANDS_SEPARATOR |
|
wxNUM_VAL_THOUSANDS_SEPARATOR |
|
||||||
wxNUM_VAL_ZERO_AS_BLANK);
|
wxNUM_VAL_ZERO_AS_BLANK);
|
||||||
@@ -319,8 +328,11 @@ MyDialog::MyDialog( wxWindow *parent, const wxString& title,
|
|||||||
wxTE_RIGHT,
|
wxTE_RIGHT,
|
||||||
valInt
|
valInt
|
||||||
);
|
);
|
||||||
m_numericTextInt->SetToolTip("uses wxIntegerValidator to accept positive "
|
numSizer->Add(new wxStaticText(this, wxID_ANY, "Positive integer:"),
|
||||||
"integers only");
|
center);
|
||||||
|
numSizer->Add(m_numericTextInt, wxSizerFlags(center).Expand());
|
||||||
|
|
||||||
|
numSizer->AddSpacer(FromDIP(10));
|
||||||
|
|
||||||
m_numericTextDouble = new wxTextCtrl
|
m_numericTextDouble = new wxTextCtrl
|
||||||
(
|
(
|
||||||
@@ -338,12 +350,31 @@ MyDialog::MyDialog( wxWindow *parent, const wxString& title,
|
|||||||
wxNUM_VAL_NO_TRAILING_ZEROES
|
wxNUM_VAL_NO_TRAILING_ZEROES
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
m_numericTextDouble->SetToolTip("uses wxFloatingPointValidator with 3 decimals");
|
numSizer->Add(new wxStaticText(this, wxID_ANY, "Up to 3 decimals:"),
|
||||||
wxBoxSizer *numSizer = new wxBoxSizer( wxHORIZONTAL );
|
center);
|
||||||
numSizer->Add( m_numericTextInt, 1, wxALL, 10 );
|
numSizer->Add(m_numericTextDouble, wxSizerFlags(center).Expand());
|
||||||
numSizer->Add( m_numericTextDouble, 1, wxALL, 10 );
|
|
||||||
|
|
||||||
|
wxIntegerValidator<unsigned short> smallIntVal(&g_data.m_smallIntValue);
|
||||||
|
smallIntVal.SetRange(1, 5);
|
||||||
|
numSizer->Add(new wxStaticText(this, wxID_ANY, "Int between 1 and 5:"),
|
||||||
|
center);
|
||||||
|
numSizer->Add(new wxTextCtrl(this, wxID_ANY, "",
|
||||||
|
wxDefaultPosition, wxDefaultSize, wxTE_RIGHT,
|
||||||
|
smallIntVal),
|
||||||
|
wxSizerFlags(center).Expand());
|
||||||
|
|
||||||
|
numSizer->AddSpacer(FromDIP(10));
|
||||||
|
|
||||||
|
wxFloatingPointValidator<float> percentVal(&g_data.m_percentValue);
|
||||||
|
percentVal.SetPrecision(2);
|
||||||
|
percentVal.SetFactor(100.0);
|
||||||
|
|
||||||
|
numSizer->Add(new wxStaticText(this, wxID_ANY, "Value displayed in %:"),
|
||||||
|
center);
|
||||||
|
numSizer->Add(new wxTextCtrl(this, wxID_ANY, "",
|
||||||
|
wxDefaultPosition, wxDefaultSize, wxTE_RIGHT,
|
||||||
|
percentVal),
|
||||||
|
wxSizerFlags(center).Expand());
|
||||||
|
|
||||||
// setup the main sizer
|
// setup the main sizer
|
||||||
// --------------------
|
// --------------------
|
||||||
@@ -358,7 +389,7 @@ MyDialog::MyDialog( wxWindow *parent, const wxString& title,
|
|||||||
wxGenericValidator(&g_data.m_radiobox_choice)),
|
wxGenericValidator(&g_data.m_radiobox_choice)),
|
||||||
0, wxGROW | wxLEFT|wxBOTTOM|wxRIGHT, 10);
|
0, wxGROW | wxLEFT|wxBOTTOM|wxRIGHT, 10);
|
||||||
|
|
||||||
mainsizer->Add( numSizer, 0, wxGROW | wxALL );
|
mainsizer->Add( numSizer, wxSizerFlags().Expand().DoubleBorder() );
|
||||||
|
|
||||||
mainsizer->Add(btn, 0, wxGROW | wxALL, 10);
|
mainsizer->Add(btn, 0, wxGROW | wxALL, 10);
|
||||||
|
|
||||||
|
@@ -76,7 +76,9 @@ public:
|
|||||||
|
|
||||||
// variables handled by wxNumericTextValidator
|
// variables handled by wxNumericTextValidator
|
||||||
int m_intValue;
|
int m_intValue;
|
||||||
|
unsigned short m_smallIntValue;
|
||||||
double m_doubleValue;
|
double m_doubleValue;
|
||||||
|
float m_percentValue;
|
||||||
|
|
||||||
bool m_checkbox_state;
|
bool m_checkbox_state;
|
||||||
int m_radiobox_choice;
|
int m_radiobox_choice;
|
||||||
|
@@ -251,14 +251,21 @@ wxIntegerValidatorBase::IsCharOk(const wxString& val, int pos, wxChar ch) const
|
|||||||
|
|
||||||
wxString wxFloatingPointValidatorBase::ToString(LongestValueType value) const
|
wxString wxFloatingPointValidatorBase::ToString(LongestValueType value) const
|
||||||
{
|
{
|
||||||
return wxNumberFormatter::ToString(value, m_precision, GetFormatFlags());
|
return wxNumberFormatter::ToString(value*m_factor,
|
||||||
|
m_precision,
|
||||||
|
GetFormatFlags());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
wxFloatingPointValidatorBase::FromString(const wxString& s,
|
wxFloatingPointValidatorBase::FromString(const wxString& s,
|
||||||
LongestValueType *value)
|
LongestValueType *value) const
|
||||||
{
|
{
|
||||||
return wxNumberFormatter::FromString(s, value);
|
if ( !wxNumberFormatter::FromString(s, value) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
*value /= m_factor;
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
Reference in New Issue
Block a user