1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-17 08:30:06 +02:00

Validators: type safe enum arguments & can specify range in ctor

This commit is contained in:
Paul Licameli 2018-01-26 22:06:09 -05:00
commit 94b97f5c95
21 changed files with 107 additions and 96 deletions

View File

@ -217,7 +217,7 @@ void EffectAmplify::PopulateOrExchange(ShuttleGui & S)
// Amplitude // Amplitude
S.StartMultiColumn(2, wxCENTER); S.StartMultiColumn(2, wxCENTER);
{ {
FloatingPointValidator<double> vldAmp(precission, &mAmp, NUM_VAL_ONE_TRAILING_ZERO); FloatingPointValidator<double> vldAmp(precission, &mAmp, NumValidatorStyle::ONE_TRAILING_ZERO);
vldAmp.SetRange(MIN_Amp, MAX_Amp); vldAmp.SetRange(MIN_Amp, MAX_Amp);
mAmpT = S.Id(ID_Amp).AddTextBox(_("Amplification (dB):"), wxT(""), 12); mAmpT = S.Id(ID_Amp).AddTextBox(_("Amplification (dB):"), wxT(""), 12);
mAmpT->SetValidator(vldAmp); mAmpT->SetValidator(vldAmp);
@ -237,7 +237,7 @@ void EffectAmplify::PopulateOrExchange(ShuttleGui & S)
S.StartMultiColumn(2, wxCENTER); S.StartMultiColumn(2, wxCENTER);
{ {
// One extra decimal place so that rounding is visible to user (see: bug 958) // One extra decimal place so that rounding is visible to user (see: bug 958)
FloatingPointValidator<double> vldNewPeak(precission + 1, &mNewPeak, NUM_VAL_ONE_TRAILING_ZERO); FloatingPointValidator<double> vldNewPeak(precission + 1, &mNewPeak, NumValidatorStyle::ONE_TRAILING_ZERO);
double minAmp = MIN_Amp + LINEAR_TO_DB(mPeak); double minAmp = MIN_Amp + LINEAR_TO_DB(mPeak);
double maxAmp = MAX_Amp + LINEAR_TO_DB(mPeak); double maxAmp = MAX_Amp + LINEAR_TO_DB(mPeak);

View File

@ -435,37 +435,37 @@ void EffectAutoDuck::PopulateOrExchange(ShuttleGui & S)
S.StartMultiColumn(6, wxCENTER); S.StartMultiColumn(6, wxCENTER);
{ {
FloatingPointValidator<double> vldDuckAmountDb(1, &mDuckAmountDb, NUM_VAL_NO_TRAILING_ZEROES); FloatingPointValidator<double> vldDuckAmountDb(1, &mDuckAmountDb, NumValidatorStyle::NO_TRAILING_ZEROES);
vldDuckAmountDb.SetRange(MIN_DuckAmountDb, MAX_DuckAmountDb); vldDuckAmountDb.SetRange(MIN_DuckAmountDb, MAX_DuckAmountDb);
mDuckAmountDbBox = S.AddTextBox(_("Duck amount:"), wxT(""), 10); mDuckAmountDbBox = S.AddTextBox(_("Duck amount:"), wxT(""), 10);
mDuckAmountDbBox->SetValidator(vldDuckAmountDb); mDuckAmountDbBox->SetValidator(vldDuckAmountDb);
S.AddUnits(_("dB")); S.AddUnits(_("dB"));
FloatingPointValidator<double> vldMaximumPause(2, &mMaximumPause, NUM_VAL_NO_TRAILING_ZEROES); FloatingPointValidator<double> vldMaximumPause(2, &mMaximumPause, NumValidatorStyle::NO_TRAILING_ZEROES);
vldMaximumPause.SetRange(MIN_MaximumPause, MAX_MaximumPause); vldMaximumPause.SetRange(MIN_MaximumPause, MAX_MaximumPause);
mMaximumPauseBox = S.AddTextBox(_("Maximum pause:"), wxT(""), 10); mMaximumPauseBox = S.AddTextBox(_("Maximum pause:"), wxT(""), 10);
mMaximumPauseBox->SetValidator(vldMaximumPause); mMaximumPauseBox->SetValidator(vldMaximumPause);
S.AddUnits(_("seconds")); S.AddUnits(_("seconds"));
FloatingPointValidator<double> vldOuterFadeDownLen(2, &mOuterFadeDownLen, NUM_VAL_NO_TRAILING_ZEROES); FloatingPointValidator<double> vldOuterFadeDownLen(2, &mOuterFadeDownLen, NumValidatorStyle::NO_TRAILING_ZEROES);
vldOuterFadeDownLen.SetRange(MIN_OuterFadeDownLen, MAX_OuterFadeDownLen); vldOuterFadeDownLen.SetRange(MIN_OuterFadeDownLen, MAX_OuterFadeDownLen);
mOuterFadeDownLenBox = S.AddTextBox(_("Outer fade down length:"), wxT(""), 10); mOuterFadeDownLenBox = S.AddTextBox(_("Outer fade down length:"), wxT(""), 10);
mOuterFadeDownLenBox->SetValidator(vldOuterFadeDownLen); mOuterFadeDownLenBox->SetValidator(vldOuterFadeDownLen);
S.AddUnits(_("seconds")); S.AddUnits(_("seconds"));
FloatingPointValidator<double> vldOuterFadeUpLen(2, &mOuterFadeUpLen, NUM_VAL_NO_TRAILING_ZEROES); FloatingPointValidator<double> vldOuterFadeUpLen(2, &mOuterFadeUpLen, NumValidatorStyle::NO_TRAILING_ZEROES);
vldOuterFadeUpLen.SetRange(MIN_OuterFadeUpLen, MAX_OuterFadeUpLen); vldOuterFadeUpLen.SetRange(MIN_OuterFadeUpLen, MAX_OuterFadeUpLen);
mOuterFadeUpLenBox = S.AddTextBox(_("Outer fade up length:"), wxT(""), 10); mOuterFadeUpLenBox = S.AddTextBox(_("Outer fade up length:"), wxT(""), 10);
mOuterFadeUpLenBox->SetValidator(vldOuterFadeUpLen); mOuterFadeUpLenBox->SetValidator(vldOuterFadeUpLen);
S.AddUnits(_("seconds")); S.AddUnits(_("seconds"));
FloatingPointValidator<double> vldInnerFadeDownLen(2, &mInnerFadeDownLen, NUM_VAL_NO_TRAILING_ZEROES); FloatingPointValidator<double> vldInnerFadeDownLen(2, &mInnerFadeDownLen, NumValidatorStyle::NO_TRAILING_ZEROES);
vldInnerFadeDownLen.SetRange(MIN_InnerFadeDownLen, MAX_InnerFadeDownLen); vldInnerFadeDownLen.SetRange(MIN_InnerFadeDownLen, MAX_InnerFadeDownLen);
mInnerFadeDownLenBox = S.AddTextBox(_("Inner fade down length:"), wxT(""), 10); mInnerFadeDownLenBox = S.AddTextBox(_("Inner fade down length:"), wxT(""), 10);
mInnerFadeDownLenBox->SetValidator(vldInnerFadeDownLen); mInnerFadeDownLenBox->SetValidator(vldInnerFadeDownLen);
S.AddUnits(_("seconds")); S.AddUnits(_("seconds"));
FloatingPointValidator<double> vldInnerFadeUpLen(2, &mInnerFadeUpLen, NUM_VAL_NO_TRAILING_ZEROES); FloatingPointValidator<double> vldInnerFadeUpLen(2, &mInnerFadeUpLen, NumValidatorStyle::NO_TRAILING_ZEROES);
vldInnerFadeUpLen.SetRange(MIN_InnerFadeUpLen, MAX_InnerFadeUpLen); vldInnerFadeUpLen.SetRange(MIN_InnerFadeUpLen, MAX_InnerFadeUpLen);
mInnerFadeUpLenBox = S.AddTextBox(_("Inner fade up length:"), wxT(""), 10); mInnerFadeUpLenBox = S.AddTextBox(_("Inner fade up length:"), wxT(""), 10);
mInnerFadeUpLenBox->SetValidator(vldInnerFadeUpLen); mInnerFadeUpLenBox->SetValidator(vldInnerFadeUpLen);
@ -475,7 +475,7 @@ void EffectAutoDuck::PopulateOrExchange(ShuttleGui & S)
S.StartMultiColumn(3, wxCENTER); S.StartMultiColumn(3, wxCENTER);
{ {
FloatingPointValidator<double> vldThresholdDb(2, &mThresholdDb, NUM_VAL_NO_TRAILING_ZEROES); FloatingPointValidator<double> vldThresholdDb(2, &mThresholdDb, NumValidatorStyle::NO_TRAILING_ZEROES);
vldThresholdDb.SetRange(MIN_ThresholdDb, MAX_ThresholdDb); vldThresholdDb.SetRange(MIN_ThresholdDb, MAX_ThresholdDb);
mThresholdDbBox = S.AddTextBox(_("Threshold:"), wxT(""), 10); mThresholdDbBox = S.AddTextBox(_("Threshold:"), wxT(""), 10);
mThresholdDbBox->SetValidator(vldThresholdDb); mThresholdDbBox->SetValidator(vldThresholdDb);

View File

@ -268,7 +268,7 @@ void EffectChangePitch::PopulateOrExchange(ShuttleGui & S)
S.StartHorizontalLay(wxALIGN_CENTER); S.StartHorizontalLay(wxALIGN_CENTER);
{ {
FloatingPointValidator<double> vldSemitones(2, &m_dSemitonesChange, NUM_VAL_TWO_TRAILING_ZEROES); FloatingPointValidator<double> vldSemitones(2, &m_dSemitonesChange, NumValidatorStyle::TWO_TRAILING_ZEROES);
m_pTextCtrl_SemitonesChange = m_pTextCtrl_SemitonesChange =
S.Id(ID_SemitonesChange).AddTextBox(_("Semitones (half-steps):"), wxT(""), 12); S.Id(ID_SemitonesChange).AddTextBox(_("Semitones (half-steps):"), wxT(""), 12);
m_pTextCtrl_SemitonesChange->SetName(_("Semitones (half-steps)")); m_pTextCtrl_SemitonesChange->SetName(_("Semitones (half-steps)"));
@ -282,13 +282,13 @@ void EffectChangePitch::PopulateOrExchange(ShuttleGui & S)
{ {
S.StartMultiColumn(5, wxALIGN_CENTER); // 5, because AddTextBox adds a wxStaticText and a wxTextCtrl. S.StartMultiColumn(5, wxALIGN_CENTER); // 5, because AddTextBox adds a wxStaticText and a wxTextCtrl.
{ {
FloatingPointValidator<double> vldFromFrequency(3, &m_FromFrequency, NUM_VAL_THREE_TRAILING_ZEROES); FloatingPointValidator<double> vldFromFrequency(3, &m_FromFrequency, NumValidatorStyle::THREE_TRAILING_ZEROES);
vldFromFrequency.SetMin(0.0); vldFromFrequency.SetMin(0.0);
m_pTextCtrl_FromFrequency = S.Id(ID_FromFrequency).AddTextBox(_("from"), wxT(""), 12); m_pTextCtrl_FromFrequency = S.Id(ID_FromFrequency).AddTextBox(_("from"), wxT(""), 12);
m_pTextCtrl_FromFrequency->SetName(_("from (Hz)")); m_pTextCtrl_FromFrequency->SetName(_("from (Hz)"));
m_pTextCtrl_FromFrequency->SetValidator(vldFromFrequency); m_pTextCtrl_FromFrequency->SetValidator(vldFromFrequency);
FloatingPointValidator<double> vldToFrequency(3, &m_ToFrequency, NUM_VAL_THREE_TRAILING_ZEROES); FloatingPointValidator<double> vldToFrequency(3, &m_ToFrequency, NumValidatorStyle::THREE_TRAILING_ZEROES);
vldToFrequency.SetMin(0.0); vldToFrequency.SetMin(0.0);
m_pTextCtrl_ToFrequency = S.Id(ID_ToFrequency).AddTextBox(_("to"), wxT(""), 12); m_pTextCtrl_ToFrequency = S.Id(ID_ToFrequency).AddTextBox(_("to"), wxT(""), 12);
m_pTextCtrl_ToFrequency->SetName(_("to (Hz)")); m_pTextCtrl_ToFrequency->SetName(_("to (Hz)"));
@ -300,7 +300,7 @@ void EffectChangePitch::PopulateOrExchange(ShuttleGui & S)
S.StartHorizontalLay(wxALIGN_CENTER); S.StartHorizontalLay(wxALIGN_CENTER);
{ {
FloatingPointValidator<double> vldPercentage(3, &m_dPercentChange, NUM_VAL_THREE_TRAILING_ZEROES); FloatingPointValidator<double> vldPercentage(3, &m_dPercentChange, NumValidatorStyle::THREE_TRAILING_ZEROES);
vldPercentage.SetRange(MIN_Percentage, MAX_Percentage); vldPercentage.SetRange(MIN_Percentage, MAX_Percentage);
m_pTextCtrl_PercentChange = S.Id(ID_PercentChange).AddTextBox(_("Percent Change:"), wxT(""), 12); m_pTextCtrl_PercentChange = S.Id(ID_PercentChange).AddTextBox(_("Percent Change:"), wxT(""), 12);
m_pTextCtrl_PercentChange->SetValidator(vldPercentage); m_pTextCtrl_PercentChange->SetValidator(vldPercentage);

View File

@ -304,13 +304,13 @@ void EffectChangeSpeed::PopulateOrExchange(ShuttleGui & S)
// Speed multiplier and percent change controls. // Speed multiplier and percent change controls.
S.StartMultiColumn(4, wxCENTER); S.StartMultiColumn(4, wxCENTER);
{ {
FloatingPointValidator<double> vldMultiplier(3, &mMultiplier, NUM_VAL_THREE_TRAILING_ZEROES); FloatingPointValidator<double> vldMultiplier(3, &mMultiplier, NumValidatorStyle::THREE_TRAILING_ZEROES);
vldMultiplier.SetRange(MIN_Percentage / 100.0, ((MAX_Percentage / 100.0) + 1)); vldMultiplier.SetRange(MIN_Percentage / 100.0, ((MAX_Percentage / 100.0) + 1));
mpTextCtrl_Multiplier = mpTextCtrl_Multiplier =
S.Id(ID_Multiplier).AddTextBox(_("Speed Multiplier:"), wxT(""), 12); S.Id(ID_Multiplier).AddTextBox(_("Speed Multiplier:"), wxT(""), 12);
mpTextCtrl_Multiplier->SetValidator(vldMultiplier); mpTextCtrl_Multiplier->SetValidator(vldMultiplier);
FloatingPointValidator<double> vldPercentage(3, &m_PercentChange, NUM_VAL_THREE_TRAILING_ZEROES); FloatingPointValidator<double> vldPercentage(3, &m_PercentChange, NumValidatorStyle::THREE_TRAILING_ZEROES);
vldPercentage.SetRange(MIN_Percentage, MAX_Percentage); vldPercentage.SetRange(MIN_Percentage, MAX_Percentage);
mpTextCtrl_PercentChange = mpTextCtrl_PercentChange =
S.Id(ID_PercentChange).AddTextBox(_("Percent Change:"), wxT(""), 12); S.Id(ID_PercentChange).AddTextBox(_("Percent Change:"), wxT(""), 12);

View File

@ -209,7 +209,7 @@ void EffectChangeTempo::PopulateOrExchange(ShuttleGui & S)
// //
S.StartMultiColumn(2, wxCENTER); S.StartMultiColumn(2, wxCENTER);
{ {
FloatingPointValidator<double> vldPercentage(3, &m_PercentChange, NUM_VAL_THREE_TRAILING_ZEROES); FloatingPointValidator<double> vldPercentage(3, &m_PercentChange, NumValidatorStyle::THREE_TRAILING_ZEROES);
vldPercentage.SetRange(MIN_Percentage, MAX_Percentage); vldPercentage.SetRange(MIN_Percentage, MAX_Percentage);
m_pTextCtrl_PercentChange = S.Id(ID_PercentChange) m_pTextCtrl_PercentChange = S.Id(ID_PercentChange)
.AddTextBox(_("Percent Change:"), wxT(""), 12); .AddTextBox(_("Percent Change:"), wxT(""), 12);
@ -231,13 +231,13 @@ void EffectChangeTempo::PopulateOrExchange(ShuttleGui & S)
{ {
S.StartHorizontalLay(wxALIGN_CENTER); S.StartHorizontalLay(wxALIGN_CENTER);
{ {
FloatingPointValidator<double> vldFromBPM(3, &m_FromBPM, NUM_VAL_THREE_TRAILING_ZEROES | NUM_VAL_ZERO_AS_BLANK); FloatingPointValidator<double> vldFromBPM(3, &m_FromBPM, NumValidatorStyle::THREE_TRAILING_ZEROES | NumValidatorStyle::ZERO_AS_BLANK);
m_pTextCtrl_FromBPM = S.Id(ID_FromBPM) m_pTextCtrl_FromBPM = S.Id(ID_FromBPM)
.AddTextBox(_("from"), wxT(""), 12); .AddTextBox(_("from"), wxT(""), 12);
m_pTextCtrl_FromBPM->SetName(_("Beats per minute, from")); m_pTextCtrl_FromBPM->SetName(_("Beats per minute, from"));
m_pTextCtrl_FromBPM->SetValidator(vldFromBPM); m_pTextCtrl_FromBPM->SetValidator(vldFromBPM);
FloatingPointValidator<double> vldToBPM(3, &m_ToBPM, NUM_VAL_THREE_TRAILING_ZEROES | NUM_VAL_ZERO_AS_BLANK); FloatingPointValidator<double> vldToBPM(3, &m_ToBPM, NumValidatorStyle::THREE_TRAILING_ZEROES | NumValidatorStyle::ZERO_AS_BLANK);
m_pTextCtrl_ToBPM = S.Id(ID_ToBPM) m_pTextCtrl_ToBPM = S.Id(ID_ToBPM)
.AddTextBox(_("to"), wxT(""), 12); .AddTextBox(_("to"), wxT(""), 12);
m_pTextCtrl_ToBPM->SetName(_("Beats per minute, to")); m_pTextCtrl_ToBPM->SetName(_("Beats per minute, to"));
@ -253,13 +253,13 @@ void EffectChangeTempo::PopulateOrExchange(ShuttleGui & S)
S.StartHorizontalLay(wxALIGN_CENTER); S.StartHorizontalLay(wxALIGN_CENTER);
{ {
int precission = 2; int precission = 2;
FloatingPointValidator<double> vldFromLength(precission, &m_FromLength, NUM_VAL_TWO_TRAILING_ZEROES); FloatingPointValidator<double> vldFromLength(precission, &m_FromLength, NumValidatorStyle::TWO_TRAILING_ZEROES);
m_pTextCtrl_FromLength = S.Id(ID_FromLength) m_pTextCtrl_FromLength = S.Id(ID_FromLength)
.AddTextBox(_("from"), wxT(""), 12); .AddTextBox(_("from"), wxT(""), 12);
m_pTextCtrl_FromLength->SetValidator(vldFromLength); m_pTextCtrl_FromLength->SetValidator(vldFromLength);
m_pTextCtrl_FromLength->Enable(false); // Disable because the value comes from the user selection. m_pTextCtrl_FromLength->Enable(false); // Disable because the value comes from the user selection.
FloatingPointValidator<double> vldToLength(2, &m_ToLength, NUM_VAL_TWO_TRAILING_ZEROES); FloatingPointValidator<double> vldToLength(2, &m_ToLength, NumValidatorStyle::TWO_TRAILING_ZEROES);
// min and max need same precision as what we're validating (bug 963) // min and max need same precision as what we're validating (bug 963)
double minLength = (m_FromLength * 100.0) / (100.0 + MAX_Percentage); double minLength = (m_FromLength * 100.0) / (100.0 + MAX_Percentage);

View File

@ -320,7 +320,7 @@ void EffectDtmf::PopulateOrExchange(ShuttleGui & S)
mDtmfSequenceT = S.Id(ID_Sequence).AddTextBox(_("DTMF sequence:"), wxT(""), 10); mDtmfSequenceT = S.Id(ID_Sequence).AddTextBox(_("DTMF sequence:"), wxT(""), 10);
mDtmfSequenceT->SetValidator(vldDtmf); mDtmfSequenceT->SetValidator(vldDtmf);
FloatingPointValidator<double> vldAmp(3, &dtmfAmplitude, NUM_VAL_NO_TRAILING_ZEROES); FloatingPointValidator<double> vldAmp(3, &dtmfAmplitude, NumValidatorStyle::NO_TRAILING_ZEROES);
vldAmp.SetRange(MIN_Amplitude, MAX_Amplitude); vldAmp.SetRange(MIN_Amplitude, MAX_Amplitude);
S.Id(ID_Amplitude).AddTextBox(_("Amplitude (0-1):"), wxT(""), 10)->SetValidator(vldAmp); S.Id(ID_Amplitude).AddTextBox(_("Amplitude (0-1):"), wxT(""), 10)->SetValidator(vldAmp);

View File

@ -160,11 +160,11 @@ void EffectEcho::PopulateOrExchange(ShuttleGui & S)
S.StartMultiColumn(2, wxALIGN_CENTER); S.StartMultiColumn(2, wxALIGN_CENTER);
{ {
FloatingPointValidator<double> vldDelay(3, &delay, NUM_VAL_NO_TRAILING_ZEROES); FloatingPointValidator<double> vldDelay(3, &delay, NumValidatorStyle::NO_TRAILING_ZEROES);
vldDelay.SetRange(MIN_Delay, MAX_Delay); vldDelay.SetRange(MIN_Delay, MAX_Delay);
S.AddTextBox(_("Delay time (seconds):"), wxT(""), 10)->SetValidator(vldDelay); S.AddTextBox(_("Delay time (seconds):"), wxT(""), 10)->SetValidator(vldDelay);
FloatingPointValidator<double> vldDecay(3, &decay, NUM_VAL_NO_TRAILING_ZEROES); FloatingPointValidator<double> vldDecay(3, &decay, NumValidatorStyle::NO_TRAILING_ZEROES);
vldDecay.SetRange(MIN_Decay, MAX_Decay); vldDecay.SetRange(MIN_Decay, MAX_Decay);
S.AddTextBox(_("Decay factor:"), wxT(""), 10)->SetValidator(vldDecay); S.AddTextBox(_("Decay factor:"), wxT(""), 10)->SetValidator(vldDecay);
} }

View File

@ -225,7 +225,7 @@ void EffectNoise::PopulateOrExchange(ShuttleGui & S)
{ {
S.AddChoice(_("Noise type:"), wxT(""), &typeChoices)->SetValidator(wxGenericValidator(&mType)); S.AddChoice(_("Noise type:"), wxT(""), &typeChoices)->SetValidator(wxGenericValidator(&mType));
FloatingPointValidator<double> vldAmp(6, &mAmp, NUM_VAL_NO_TRAILING_ZEROES); FloatingPointValidator<double> vldAmp(6, &mAmp, NumValidatorStyle::NO_TRAILING_ZEROES);
vldAmp.SetRange(MIN_Amp, MAX_Amp); vldAmp.SetRange(MIN_Amp, MAX_Amp);
S.AddTextBox(_("Amplitude (0-1):"), wxT(""), 12)->SetValidator(vldAmp); S.AddTextBox(_("Amplitude (0-1):"), wxT(""), 12)->SetValidator(vldAmp);

View File

@ -292,7 +292,7 @@ void EffectNormalize::PopulateOrExchange(ShuttleGui & S)
mGain ? wxT("true") : wxT("false")); mGain ? wxT("true") : wxT("false"));
mGainCheckBox->SetValidator(wxGenericValidator(&mGain)); mGainCheckBox->SetValidator(wxGenericValidator(&mGain));
FloatingPointValidator<double> vldLevel(2, &mLevel, NUM_VAL_ONE_TRAILING_ZERO); FloatingPointValidator<double> vldLevel(2, &mLevel, NumValidatorStyle::ONE_TRAILING_ZERO);
vldLevel.SetRange(MIN_Level, MAX_Level); vldLevel.SetRange(MIN_Level, MAX_Level);
mLevelTextCtrl = S.AddTextBox( {}, wxT(""), 10); mLevelTextCtrl = S.AddTextBox( {}, wxT(""), 10);
mLevelTextCtrl->SetName(_("Maximum amplitude dB")); mLevelTextCtrl->SetName(_("Maximum amplitude dB"));

View File

@ -198,7 +198,7 @@ void EffectPaulstretch::PopulateOrExchange(ShuttleGui & S)
*/ */
S.AddTextBox(_("Stretch Factor:"), wxT(""), 10)->SetValidator(vldAmount); S.AddTextBox(_("Stretch Factor:"), wxT(""), 10)->SetValidator(vldAmount);
FloatingPointValidator<float> vldTime(3, &mTime_resolution, NUM_VAL_ONE_TRAILING_ZERO); FloatingPointValidator<float> vldTime(3, &mTime_resolution, NumValidatorStyle::ONE_TRAILING_ZERO);
vldTime.SetMin(MIN_Time); vldTime.SetMin(MIN_Time);
S.AddTextBox(_("Time Resolution (seconds):"), wxT(""), 10)->SetValidator(vldTime); S.AddTextBox(_("Time Resolution (seconds):"), wxT(""), 10)->SetValidator(vldTime);
} }

View File

@ -268,7 +268,7 @@ void EffectPhaser::PopulateOrExchange(ShuttleGui & S)
mDryWetS->SetName(_("Dry Wet")); mDryWetS->SetName(_("Dry Wet"));
mDryWetS->SetMinSize(wxSize(100, -1)); mDryWetS->SetMinSize(wxSize(100, -1));
FloatingPointValidator<double> vldFreq(5, &mFreq, NUM_VAL_ONE_TRAILING_ZERO); FloatingPointValidator<double> vldFreq(5, &mFreq, NumValidatorStyle::ONE_TRAILING_ZERO);
vldFreq.SetRange(MIN_Freq, MAX_Freq); vldFreq.SetRange(MIN_Freq, MAX_Freq);
mFreqT = S.Id(ID_Freq).AddTextBox(_("LFO Freq&uency (Hz):"), wxT(""), 15); mFreqT = S.Id(ID_Freq).AddTextBox(_("LFO Freq&uency (Hz):"), wxT(""), 15);
mFreqT->SetValidator(vldFreq); mFreqT->SetValidator(vldFreq);

View File

@ -202,7 +202,7 @@ void EffectTimeScale::PopulateOrExchange(ShuttleGui & S)
S.StartMultiColumn(1, wxCENTER); S.StartMultiColumn(1, wxCENTER);
{ {
FloatingPointValidator<double> FloatingPointValidator<double>
vldRatePercentChangeStart(3, &m_RatePercentChangeStart, NUM_VAL_NO_TRAILING_ZEROES); vldRatePercentChangeStart(3, &m_RatePercentChangeStart, NumValidatorStyle::NO_TRAILING_ZEROES);
vldRatePercentChangeStart.SetRange(MIN_RatePercentStart, MAX_RatePercentStart); vldRatePercentChangeStart.SetRange(MIN_RatePercentStart, MAX_RatePercentStart);
m_pTextCtrl_RatePercentChangeStart = S.Id(ID_RatePercentChangeStart) m_pTextCtrl_RatePercentChangeStart = S.Id(ID_RatePercentChangeStart)
@ -225,7 +225,7 @@ void EffectTimeScale::PopulateOrExchange(ShuttleGui & S)
S.StartMultiColumn(1, wxCENTER); S.StartMultiColumn(1, wxCENTER);
{ {
FloatingPointValidator<double> FloatingPointValidator<double>
vldRatePercentChangeEnd(3, &m_RatePercentChangeEnd, NUM_VAL_NO_TRAILING_ZEROES); vldRatePercentChangeEnd(3, &m_RatePercentChangeEnd, NumValidatorStyle::NO_TRAILING_ZEROES);
vldRatePercentChangeEnd.SetRange(MIN_RatePercentEnd, MAX_RatePercentEnd); vldRatePercentChangeEnd.SetRange(MIN_RatePercentEnd, MAX_RatePercentEnd);
m_pTextCtrl_RatePercentChangeEnd = S.Id(ID_RatePercentChangeEnd) m_pTextCtrl_RatePercentChangeEnd = S.Id(ID_RatePercentChangeEnd)
@ -249,7 +249,7 @@ void EffectTimeScale::PopulateOrExchange(ShuttleGui & S)
S.StartMultiColumn(2, wxCENTER); S.StartMultiColumn(2, wxCENTER);
{ {
FloatingPointValidator<double> FloatingPointValidator<double>
vldPitchHalfStepsStart(3, &m_PitchHalfStepsStart, NUM_VAL_NO_TRAILING_ZEROES); vldPitchHalfStepsStart(3, &m_PitchHalfStepsStart, NumValidatorStyle::NO_TRAILING_ZEROES);
vldPitchHalfStepsStart.SetRange(MIN_HalfStepsStart, MAX_HalfStepsStart); vldPitchHalfStepsStart.SetRange(MIN_HalfStepsStart, MAX_HalfStepsStart);
m_pTextCtrl_PitchHalfStepsStart = S.Id(ID_PitchHalfStepsStart) m_pTextCtrl_PitchHalfStepsStart = S.Id(ID_PitchHalfStepsStart)
@ -257,7 +257,7 @@ void EffectTimeScale::PopulateOrExchange(ShuttleGui & S)
m_pTextCtrl_PitchHalfStepsStart->SetValidator(vldPitchHalfStepsStart); m_pTextCtrl_PitchHalfStepsStart->SetValidator(vldPitchHalfStepsStart);
FloatingPointValidator<double> FloatingPointValidator<double>
vldPitchPercentChangeStart(3, &m_PitchPercentChangeStart, NUM_VAL_NO_TRAILING_ZEROES); vldPitchPercentChangeStart(3, &m_PitchPercentChangeStart, NumValidatorStyle::NO_TRAILING_ZEROES);
vldPitchPercentChangeStart.SetRange(MIN_PitchPercentStart, MAX_PitchPercentStart); vldPitchPercentChangeStart.SetRange(MIN_PitchPercentStart, MAX_PitchPercentStart);
m_pTextCtrl_PitchPercentChangeStart = S.Id(ID_PitchPercentChangeStart) m_pTextCtrl_PitchPercentChangeStart = S.Id(ID_PitchPercentChangeStart)
@ -274,7 +274,7 @@ void EffectTimeScale::PopulateOrExchange(ShuttleGui & S)
S.StartMultiColumn(2, wxCENTER); S.StartMultiColumn(2, wxCENTER);
{ {
FloatingPointValidator<double> FloatingPointValidator<double>
vldPitchHalfStepsEnd(3, &m_PitchHalfStepsEnd, NUM_VAL_NO_TRAILING_ZEROES); vldPitchHalfStepsEnd(3, &m_PitchHalfStepsEnd, NumValidatorStyle::NO_TRAILING_ZEROES);
vldPitchHalfStepsEnd.SetRange(MIN_HalfStepsEnd, MAX_HalfStepsEnd); vldPitchHalfStepsEnd.SetRange(MIN_HalfStepsEnd, MAX_HalfStepsEnd);
m_pTextCtrl_PitchHalfStepsEnd = S.Id(ID_PitchHalfStepsEnd) m_pTextCtrl_PitchHalfStepsEnd = S.Id(ID_PitchHalfStepsEnd)
@ -282,7 +282,7 @@ void EffectTimeScale::PopulateOrExchange(ShuttleGui & S)
m_pTextCtrl_PitchHalfStepsEnd->SetValidator(vldPitchHalfStepsEnd); m_pTextCtrl_PitchHalfStepsEnd->SetValidator(vldPitchHalfStepsEnd);
FloatingPointValidator<double> FloatingPointValidator<double>
vldPitchPercentChangeEnd(3, &m_PitchPercentChangeEnd, NUM_VAL_NO_TRAILING_ZEROES); vldPitchPercentChangeEnd(3, &m_PitchPercentChangeEnd, NumValidatorStyle::NO_TRAILING_ZEROES);
vldPitchPercentChangeEnd.SetRange(MIN_PitchPercentStart, MAX_PitchPercentStart); vldPitchPercentChangeEnd.SetRange(MIN_PitchPercentStart, MAX_PitchPercentStart);
m_pTextCtrl_PitchPercentChangeEnd = S.Id(ID_PitchPercentChangeEnd) m_pTextCtrl_PitchPercentChangeEnd = S.Id(ID_PitchPercentChangeEnd)

View File

@ -343,7 +343,7 @@ void EffectToneGen::PopulateOrExchange(ShuttleGui & S)
{ {
S.StartHorizontalLay(wxLEFT, 50); S.StartHorizontalLay(wxLEFT, 50);
{ {
FloatingPointValidator<double> vldStartFreq(6, &mFrequency[0], NUM_VAL_NO_TRAILING_ZEROES); FloatingPointValidator<double> vldStartFreq(6, &mFrequency[0], NumValidatorStyle::NO_TRAILING_ZEROES);
vldStartFreq.SetRange(MIN_StartFreq, GetActiveProject()->GetRate() / 2.0); vldStartFreq.SetRange(MIN_StartFreq, GetActiveProject()->GetRate() / 2.0);
t = S.AddTextBox( {}, wxT(""), 12); t = S.AddTextBox( {}, wxT(""), 12);
t->SetName(_("Frequency Hertz Start")); t->SetName(_("Frequency Hertz Start"));
@ -353,7 +353,7 @@ void EffectToneGen::PopulateOrExchange(ShuttleGui & S)
S.StartHorizontalLay(wxLEFT, 50); S.StartHorizontalLay(wxLEFT, 50);
{ {
FloatingPointValidator<double> vldEndFreq(6, &mFrequency[1], NUM_VAL_NO_TRAILING_ZEROES); FloatingPointValidator<double> vldEndFreq(6, &mFrequency[1], NumValidatorStyle::NO_TRAILING_ZEROES);
vldEndFreq.SetRange(MIN_EndFreq, GetActiveProject()->GetRate() / 2.0); vldEndFreq.SetRange(MIN_EndFreq, GetActiveProject()->GetRate() / 2.0);
t = S.AddTextBox( {}, wxT(""), 12); t = S.AddTextBox( {}, wxT(""), 12);
t->SetName(_("Frequency Hertz End")); t->SetName(_("Frequency Hertz End"));
@ -368,7 +368,7 @@ void EffectToneGen::PopulateOrExchange(ShuttleGui & S)
{ {
S.StartHorizontalLay(wxLEFT, 50); S.StartHorizontalLay(wxLEFT, 50);
{ {
FloatingPointValidator<double> vldStartAmp(6, &mAmplitude[0], NUM_VAL_NO_TRAILING_ZEROES); FloatingPointValidator<double> vldStartAmp(6, &mAmplitude[0], NumValidatorStyle::NO_TRAILING_ZEROES);
vldStartAmp.SetRange(MIN_StartAmp, MAX_StartAmp); vldStartAmp.SetRange(MIN_StartAmp, MAX_StartAmp);
t = S.AddTextBox( {}, wxT(""), 12); t = S.AddTextBox( {}, wxT(""), 12);
t->SetName(_("Amplitude Start")); t->SetName(_("Amplitude Start"));
@ -378,7 +378,7 @@ void EffectToneGen::PopulateOrExchange(ShuttleGui & S)
S.StartHorizontalLay(wxLEFT, 50); S.StartHorizontalLay(wxLEFT, 50);
{ {
FloatingPointValidator<double> vldEndAmp(6, &mAmplitude[1], NUM_VAL_NO_TRAILING_ZEROES); FloatingPointValidator<double> vldEndAmp(6, &mAmplitude[1], NumValidatorStyle::NO_TRAILING_ZEROES);
vldEndAmp.SetRange(MIN_EndAmp, MAX_EndAmp); vldEndAmp.SetRange(MIN_EndAmp, MAX_EndAmp);
t = S.AddTextBox( {}, wxT(""), 12); t = S.AddTextBox( {}, wxT(""), 12);
t->SetName(_("Amplitude End")); t->SetName(_("Amplitude End"));
@ -393,12 +393,12 @@ void EffectToneGen::PopulateOrExchange(ShuttleGui & S)
} }
else else
{ {
FloatingPointValidator<double> vldFrequency(6, &mFrequency[0], NUM_VAL_NO_TRAILING_ZEROES); FloatingPointValidator<double> vldFrequency(6, &mFrequency[0], NumValidatorStyle::NO_TRAILING_ZEROES);
vldFrequency.SetRange(MIN_Frequency, GetActiveProject()->GetRate() / 2.0); vldFrequency.SetRange(MIN_Frequency, GetActiveProject()->GetRate() / 2.0);
t = S.AddTextBox(_("Frequency (Hz):"), wxT(""), 12); t = S.AddTextBox(_("Frequency (Hz):"), wxT(""), 12);
t->SetValidator(vldFrequency); t->SetValidator(vldFrequency);
FloatingPointValidator<double> vldAmplitude(6, &mAmplitude[0], NUM_VAL_NO_TRAILING_ZEROES); FloatingPointValidator<double> vldAmplitude(6, &mAmplitude[0], NumValidatorStyle::NO_TRAILING_ZEROES);
vldAmplitude.SetRange(MIN_Amplitude, MAX_Amplitude); vldAmplitude.SetRange(MIN_Amplitude, MAX_Amplitude);
t = S.AddTextBox(_("Amplitude (0-1):"), wxT(""), 12); t = S.AddTextBox(_("Amplitude (0-1):"), wxT(""), 12);
t->SetValidator(vldAmplitude); t->SetValidator(vldAmplitude);

View File

@ -720,7 +720,7 @@ void EffectTruncSilence::PopulateOrExchange(ShuttleGui & S)
S.AddSpace(0); // 'choices' already includes units. S.AddSpace(0); // 'choices' already includes units.
// Ignored silence // Ignored silence
FloatingPointValidator<double> vldDur(3, &mInitialAllowedSilence, NUM_VAL_NO_TRAILING_ZEROES); FloatingPointValidator<double> vldDur(3, &mInitialAllowedSilence, NumValidatorStyle::NO_TRAILING_ZEROES);
vldDur.SetRange(MIN_Minimum, MAX_Minimum); vldDur.SetRange(MIN_Minimum, MAX_Minimum);
mInitialAllowedSilenceT = S.AddTextBox(_("Duration:"), wxT(""), 12); mInitialAllowedSilenceT = S.AddTextBox(_("Duration:"), wxT(""), 12);
mInitialAllowedSilenceT->SetValidator(vldDur); mInitialAllowedSilenceT->SetValidator(vldDur);
@ -744,13 +744,13 @@ void EffectTruncSilence::PopulateOrExchange(ShuttleGui & S)
{ {
// Truncation / Compression factor // Truncation / Compression factor
FloatingPointValidator<double> vldTrunc(3, &mTruncLongestAllowedSilence, NUM_VAL_NO_TRAILING_ZEROES); FloatingPointValidator<double> vldTrunc(3, &mTruncLongestAllowedSilence, NumValidatorStyle::NO_TRAILING_ZEROES);
vldTrunc.SetRange(MIN_Truncate, MAX_Truncate); vldTrunc.SetRange(MIN_Truncate, MAX_Truncate);
mTruncLongestAllowedSilenceT = S.AddTextBox(_("Truncate to:"), wxT(""), 12); mTruncLongestAllowedSilenceT = S.AddTextBox(_("Truncate to:"), wxT(""), 12);
mTruncLongestAllowedSilenceT->SetValidator(vldTrunc); mTruncLongestAllowedSilenceT->SetValidator(vldTrunc);
S.AddUnits(_("seconds")); S.AddUnits(_("seconds"));
FloatingPointValidator<double> vldComp(3, &mSilenceCompressPercent, NUM_VAL_NO_TRAILING_ZEROES); FloatingPointValidator<double> vldComp(3, &mSilenceCompressPercent, NumValidatorStyle::NO_TRAILING_ZEROES);
vldComp.SetRange(MIN_Compress, MAX_Compress); vldComp.SetRange(MIN_Compress, MAX_Compress);
mSilenceCompressPercentT = S.AddTextBox(_("Compress to:"), wxT(""), 12); mSilenceCompressPercentT = S.AddTextBox(_("Compress to:"), wxT(""), 12);
mSilenceCompressPercentT->SetValidator(vldComp); mSilenceCompressPercentT->SetValidator(vldComp);

View File

@ -231,7 +231,7 @@ void EffectWahwah::PopulateOrExchange(ShuttleGui & S)
{ {
S.SetStretchyCol(2); S.SetStretchyCol(2);
FloatingPointValidator<double> vldfreq(5, &mFreq, NUM_VAL_ONE_TRAILING_ZERO); FloatingPointValidator<double> vldfreq(5, &mFreq, NumValidatorStyle::ONE_TRAILING_ZERO);
vldfreq.SetRange(MIN_Freq, MAX_Freq); vldfreq.SetRange(MIN_Freq, MAX_Freq);
mFreqT = S.Id(ID_Freq).AddTextBox(_("LFO Freq&uency (Hz):"), wxT(""), 12); mFreqT = S.Id(ID_Freq).AddTextBox(_("LFO Freq&uency (Hz):"), wxT(""), 12);
mFreqT->SetValidator(vldfreq); mFreqT->SetValidator(vldfreq);

View File

@ -1364,15 +1364,15 @@ bool LadspaEffect::PopulateUI(wxWindow *parent)
// Set number of decimal places // Set number of decimal places
if (upper - lower < 10.0) if (upper - lower < 10.0)
{ {
vld.SetStyle(NUM_VAL_THREE_TRAILING_ZEROES); vld.SetStyle(NumValidatorStyle::THREE_TRAILING_ZEROES);
} }
else if (upper - lower < 100.0) else if (upper - lower < 100.0)
{ {
vld.SetStyle(NUM_VAL_TWO_TRAILING_ZEROES); vld.SetStyle(NumValidatorStyle::TWO_TRAILING_ZEROES);
} }
else else
{ {
vld.SetStyle(NUM_VAL_ONE_TRAILING_ZERO); vld.SetStyle(NumValidatorStyle::ONE_TRAILING_ZERO);
} }
mFields[p]->SetValidator(vld); mFields[p]->SetValidator(vld);

View File

@ -1694,9 +1694,9 @@ bool LV2Effect::BuildPlain()
// Set number of decimal places // Set number of decimal places
float range = ctrl.mHi - ctrl.mLo; float range = ctrl.mHi - ctrl.mLo;
int style = range < 10 ? NUM_VAL_THREE_TRAILING_ZEROES : auto style = range < 10 ? NumValidatorStyle::THREE_TRAILING_ZEROES :
range < 100 ? NUM_VAL_TWO_TRAILING_ZEROES : range < 100 ? NumValidatorStyle::TWO_TRAILING_ZEROES :
NUM_VAL_ONE_TRAILING_ZERO; NumValidatorStyle::ONE_TRAILING_ZERO;
vld.SetStyle(style); vld.SetStyle(style);
mFields[p]->SetValidator(vld); mFields[p]->SetValidator(vld);

View File

@ -2241,9 +2241,9 @@ void NyquistEffect::BuildEffectWindow(ShuttleGui & S)
vld.SetRange(ctrl.low, ctrl.high); vld.SetRange(ctrl.low, ctrl.high);
// Set number of decimal places // Set number of decimal places
int style = range < 10 ? NUM_VAL_THREE_TRAILING_ZEROES : auto style = range < 10 ? NumValidatorStyle::THREE_TRAILING_ZEROES :
range < 100 ? NUM_VAL_TWO_TRAILING_ZEROES : range < 100 ? NumValidatorStyle::TWO_TRAILING_ZEROES :
NUM_VAL_ONE_TRAILING_ZERO; NumValidatorStyle::ONE_TRAILING_ZERO;
vld.SetStyle(style); vld.SetStyle(style);
item->SetValidator(vld); item->SetValidator(vld);

View File

@ -671,9 +671,9 @@ void VampEffect::PopulateOrExchange(ShuttleGui & S)
vld.SetRange(mParameters[p].minValue, mParameters[p].maxValue); vld.SetRange(mParameters[p].minValue, mParameters[p].maxValue);
float range = mParameters[p].maxValue - mParameters[p].minValue; float range = mParameters[p].maxValue - mParameters[p].minValue;
int style = range < 10 ? NUM_VAL_THREE_TRAILING_ZEROES : auto style = range < 10 ? NumValidatorStyle::THREE_TRAILING_ZEROES :
range < 100 ? NUM_VAL_TWO_TRAILING_ZEROES : range < 100 ? NumValidatorStyle::TWO_TRAILING_ZEROES :
NUM_VAL_ONE_TRAILING_ZERO; NumValidatorStyle::ONE_TRAILING_ZERO;
vld.SetStyle(style); vld.SetStyle(style);
S.Id(ID_Texts + p); S.Id(ID_Texts + p);

View File

@ -55,15 +55,15 @@ END_EVENT_TABLE()
int NumValidatorBase::GetFormatFlags() const int NumValidatorBase::GetFormatFlags() const
{ {
int flags = NumberFormatter::Style_None; int flags = NumberFormatter::Style_None;
if ( m_style & NUM_VAL_THOUSANDS_SEPARATOR ) if ( m_style & NumValidatorStyle::THOUSANDS_SEPARATOR )
flags |= NumberFormatter::Style_WithThousandsSep; flags |= NumberFormatter::Style_WithThousandsSep;
if ( m_style & NUM_VAL_NO_TRAILING_ZEROES ) if ( m_style & NumValidatorStyle::NO_TRAILING_ZEROES )
flags |= NumberFormatter::Style_NoTrailingZeroes; flags |= NumberFormatter::Style_NoTrailingZeroes;
if ( m_style & NUM_VAL_ONE_TRAILING_ZERO ) if ( m_style & NumValidatorStyle::ONE_TRAILING_ZERO )
flags |= NumberFormatter::Style_OneTrailingZero; flags |= NumberFormatter::Style_OneTrailingZero;
if ( m_style & NUM_VAL_TWO_TRAILING_ZEROES ) if ( m_style & NumValidatorStyle::TWO_TRAILING_ZEROES )
flags |= NumberFormatter::Style_TwoTrailingZeroes; flags |= NumberFormatter::Style_TwoTrailingZeroes;
if ( m_style & NUM_VAL_THREE_TRAILING_ZEROES ) if ( m_style & NumValidatorStyle::THREE_TRAILING_ZEROES )
flags |= NumberFormatter::Style_ThreeTrailingZeroes; flags |= NumberFormatter::Style_ThreeTrailingZeroes;
return flags; return flags;
@ -353,7 +353,7 @@ bool IntegerValidatorBase::DoValidateNumber(wxString * errMsg) const
if ( s.empty() ) if ( s.empty() )
{ {
// Is blank, but allowed. Stop here // Is blank, but allowed. Stop here
if ( HasFlag(NUM_VAL_ZERO_AS_BLANK) ) if ( HasFlag(NumValidatorStyle::ZERO_AS_BLANK) )
{ {
return true; return true;
} }
@ -478,7 +478,7 @@ bool FloatingPointValidatorBase::DoValidateNumber(wxString * errMsg) const
if ( s.empty() ) if ( s.empty() )
{ {
if ( HasFlag(NUM_VAL_ZERO_AS_BLANK) ) if ( HasFlag(NumValidatorStyle::ZERO_AS_BLANK) )
return true; //Is blank, but allowed. Stop here return true; //Is blank, but allowed. Stop here
else else
{ {

View File

@ -24,17 +24,23 @@
#define wxTextEntry wxTextCtrl #define wxTextEntry wxTextCtrl
// Bit masks used for numeric validator styles. // Bit masks used for numeric validator styles.
enum NumValidatorStyle enum class NumValidatorStyle : int
{ {
NUM_VAL_DEFAULT = 0x0, DEFAULT = 0x0,
NUM_VAL_THOUSANDS_SEPARATOR = 0x1, THOUSANDS_SEPARATOR = 0x1,
NUM_VAL_ZERO_AS_BLANK = 0x2, ZERO_AS_BLANK = 0x2,
NUM_VAL_NO_TRAILING_ZEROES = 0x4, NO_TRAILING_ZEROES = 0x4,
NUM_VAL_ONE_TRAILING_ZERO = 0x8, ONE_TRAILING_ZERO = 0x8,
NUM_VAL_TWO_TRAILING_ZEROES = 0x10, TWO_TRAILING_ZEROES = 0x10,
NUM_VAL_THREE_TRAILING_ZEROES = 0x20 THREE_TRAILING_ZEROES = 0x20
}; };
inline NumValidatorStyle operator | (NumValidatorStyle x, NumValidatorStyle y)
{ return NumValidatorStyle( int(x) | int(y) ); }
inline int operator & (NumValidatorStyle x, NumValidatorStyle y)
{ return int(x) & int(y); }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// Base class for all numeric validators. // Base class for all numeric validators.
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@ -43,14 +49,14 @@ class NumValidatorBase /* not final */ : public wxValidator
{ {
public: public:
// Change the validator style. Usually it's specified during construction. // Change the validator style. Usually it's specified during construction.
void SetStyle(int style) { m_style = style; } void SetStyle(NumValidatorStyle style) { m_style = style; }
// Called when the value in the window must be validated. // Called when the value in the window must be validated.
// This function can pop up an error message. // This function can pop up an error message.
bool Validate(wxWindow * parent) override; bool Validate(wxWindow * parent) override;
protected: protected:
NumValidatorBase(int style) NumValidatorBase(NumValidatorStyle style)
{ {
m_style = style; m_style = style;
m_minSet = false; m_minSet = false;
@ -74,7 +80,7 @@ protected:
// still test the return value for safety. // still test the return value for safety.
wxTextEntry *GetTextEntry() const; wxTextEntry *GetTextEntry() const;
// Convert NUM_VAL_THOUSANDS_SEPARATOR and NUM_VAL_NO_TRAILING_ZEROES // Convert NumValidatorStyle::THOUSANDS_SEPARATOR and NumValidatorStyle::NO_TRAILING_ZEROES
// bits of our style to the corresponding NumberFormatter::Style values. // bits of our style to the corresponding NumberFormatter::Style values.
int GetFormatFlags() const; int GetFormatFlags() const;
@ -124,7 +130,7 @@ private:
// Combination of wxVAL_NUM_XXX values. // Combination of wxVAL_NUM_XXX values.
int m_style; NumValidatorStyle m_style;
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
@ -168,13 +174,13 @@ public:
void SetMin(ValueType min) void SetMin(ValueType min)
{ {
this->DoSetMin(min); this->DoSetMin(min);
BaseValidator::m_minSet = true; BaseValidator::m_minSet = (min != std::numeric_limits<T>::min());
} }
void SetMax(ValueType max) void SetMax(ValueType max)
{ {
this->DoSetMax(max); this->DoSetMax(max);
BaseValidator::m_maxSet = true; BaseValidator::m_maxSet = (max != std::numeric_limits<T>::max());
} }
void SetRange(ValueType min, ValueType max) void SetRange(ValueType min, ValueType max)
@ -211,7 +217,7 @@ public:
const wxString s(control->GetValue()); const wxString s(control->GetValue());
LongestValueType value; LongestValueType value;
if ( s.empty() && BaseValidator::HasFlag(NUM_VAL_ZERO_AS_BLANK) ) if ( s.empty() && BaseValidator::HasFlag(NumValidatorStyle::ZERO_AS_BLANK) )
value = 0; value = 0;
else if ( !BaseValidator::FromString(s, &value) ) else if ( !BaseValidator::FromString(s, &value) )
return false; return false;
@ -226,7 +232,7 @@ public:
} }
protected: protected:
NumValidator(ValueType *value, int style) NumValidator(ValueType *value, NumValidatorStyle style)
: BaseValidator(style), : BaseValidator(style),
m_value(value) m_value(value)
{ {
@ -244,11 +250,11 @@ protected:
private: private:
// Just a helper which is a common part of TransferToWindow() and // Just a helper which is a common part of TransferToWindow() and
// NormalizeString(): returns string representation of a number honouring // NormalizeString(): returns string representation of a number honouring
// NUM_VAL_ZERO_AS_BLANK flag. // NumValidatorStyle::ZERO_AS_BLANK flag.
wxString NormalizeValue(LongestValueType value) const wxString NormalizeValue(LongestValueType value) const
{ {
wxString s; wxString s;
if ( value != 0 || !BaseValidator::HasFlag(NUM_VAL_ZERO_AS_BLANK) ) if ( value != 0 || !BaseValidator::HasFlag(NumValidatorStyle::ZERO_AS_BLANK) )
s = this->ToString(value); s = this->ToString(value);
return s; return s;
@ -282,16 +288,16 @@ protected:
typedef long LongestValueType; typedef long LongestValueType;
#endif #endif
IntegerValidatorBase(int style) IntegerValidatorBase(NumValidatorStyle style)
: NumValidatorBase(style) : NumValidatorBase(style)
{ {
wxASSERT_MSG( !(style & NUM_VAL_NO_TRAILING_ZEROES), wxASSERT_MSG( !(style & NumValidatorStyle::NO_TRAILING_ZEROES),
wxT("This style doesn't make sense for integers.") ); wxT("This style doesn't make sense for integers.") );
wxASSERT_MSG( !(style & NUM_VAL_ONE_TRAILING_ZERO), wxASSERT_MSG( !(style & NumValidatorStyle::ONE_TRAILING_ZERO),
wxT("This style doesn't make sense for integers.") ); wxT("This style doesn't make sense for integers.") );
wxASSERT_MSG( !(style & NUM_VAL_TWO_TRAILING_ZEROES), wxASSERT_MSG( !(style & NumValidatorStyle::TWO_TRAILING_ZEROES),
wxT("This style doesn't make sense for integers.") ); wxT("This style doesn't make sense for integers.") );
wxASSERT_MSG( !(style & NUM_VAL_THREE_TRAILING_ZEROES), wxASSERT_MSG( !(style & NumValidatorStyle::THREE_TRAILING_ZEROES),
wxT("This style doesn't make sense for integers.") ); wxT("This style doesn't make sense for integers.") );
} }
@ -342,11 +348,14 @@ public:
// //
// Sets the range appropriately for the type, including setting 0 as the // Sets the range appropriately for the type, including setting 0 as the
// minimal value for the unsigned types. // minimal value for the unsigned types.
IntegerValidator(ValueType *value = NULL, int style = NUM_VAL_DEFAULT) IntegerValidator(
: Base(value, style) ValueType *value = NULL,
NumValidatorStyle style = NumValidatorStyle::DEFAULT,
ValueType min = std::numeric_limits<ValueType>::min(),
ValueType max = std::numeric_limits<ValueType>::max())
: Base(value, style)
{ {
this->DoSetMin(std::numeric_limits<ValueType>::min()); this->SetRange(min, max);
this->DoSetMax(std::numeric_limits<ValueType>::max());
} }
// Clone is required by wxwidgets; implemented via copy constructor // Clone is required by wxwidgets; implemented via copy constructor
@ -360,7 +369,7 @@ private:
// explicitly specifying the type as it deduces it from its parameter. // explicitly specifying the type as it deduces it from its parameter.
template <typename T> template <typename T>
inline IntegerValidator<T> inline IntegerValidator<T>
MakeIntegerValidator(T *value, int style = NUM_VAL_DEFAULT) MakeIntegerValidator(T *value, NumValidatorStyle style = NumValidatorStyle::DEFAULT)
{ {
return IntegerValidator<T>(value, style); return IntegerValidator<T>(value, style);
} }
@ -385,7 +394,7 @@ protected:
// float). // float).
typedef double LongestValueType; typedef double LongestValueType;
FloatingPointValidatorBase(int style) FloatingPointValidatorBase(NumValidatorStyle style)
: NumValidatorBase(style) : NumValidatorBase(style)
{ {
} }
@ -440,7 +449,7 @@ public:
// Ctor using implicit (maximal) precision for this type. // Ctor using implicit (maximal) precision for this type.
FloatingPointValidator(ValueType *value = NULL, FloatingPointValidator(ValueType *value = NULL,
int style = NUM_VAL_DEFAULT) NumValidatorStyle style = NumValidatorStyle::DEFAULT)
: Base(value, style) : Base(value, style)
{ {
DoSetMinMax(); DoSetMinMax();
@ -451,10 +460,12 @@ public:
// Ctor specifying an explicit precision. // Ctor specifying an explicit precision.
FloatingPointValidator(int precision, FloatingPointValidator(int precision,
ValueType *value = NULL, ValueType *value = NULL,
int style = NUM_VAL_DEFAULT) NumValidatorStyle style = NumValidatorStyle::DEFAULT,
ValueType min = -std::numeric_limits<ValueType>::max(),
ValueType max = std::numeric_limits<ValueType>::max())
: Base(value, style) : Base(value, style)
{ {
DoSetMinMax(); this->SetRange( min, max );
this->SetPrecision(precision); this->SetPrecision(precision);
} }
@ -483,14 +494,14 @@ private:
// do need two different functions. // do need two different functions.
template <typename T> template <typename T>
inline FloatingPointValidator<T> inline FloatingPointValidator<T>
MakeFloatingPointValidator(T *value, int style = NUM_VAL_DEFAULT) MakeFloatingPointValidator(T *value, NumValidatorStyle style = NumValidatorStyle::DEFAULT)
{ {
return FloatingPointValidator<T>(value, style); return FloatingPointValidator<T>(value, style);
} }
template <typename T> template <typename T>
inline FloatingPointValidator<T> inline FloatingPointValidator<T>
MakeFloatingPointValidator(int precision, T *value, int style = NUM_VAL_DEFAULT) MakeFloatingPointValidator(int precision, T *value, NumValidatorStyle style = NumValidatorStyle::DEFAULT)
{ {
return FloatingPointValidator<T>(precision, value, style); return FloatingPointValidator<T>(precision, value, style);
} }