forked from mia/Aegisub
Replaced some numeric validators with a new, improved one... It still allows wrong data on paste, though.
Originally committed to SVN as r1239.
This commit is contained in:
parent
f3c9b2ca79
commit
673a818e49
3 changed files with 182 additions and 25 deletions
|
@ -125,7 +125,7 @@ DialogStyleEditor::DialogStyleEditor (wxWindow *parent, AssStyle *_style, Subtit
|
||||||
performance_timer.Start();
|
performance_timer.Start();
|
||||||
FontName = new wxComboBox(this,TEXT_FONT_NAME,style->font,wxDefaultPosition,wxSize(150,20),0,0,wxCB_DROPDOWN | wxTE_PROCESS_ENTER);
|
FontName = new wxComboBox(this,TEXT_FONT_NAME,style->font,wxDefaultPosition,wxSize(150,20),0,0,wxCB_DROPDOWN | wxTE_PROCESS_ENTER);
|
||||||
wxLogDebug(_T("Time to create font face listbox: %d"), performance_timer.Time());
|
wxLogDebug(_T("Time to create font face listbox: %d"), performance_timer.Time());
|
||||||
FontSize = new wxTextCtrl(this,TEXT_FONT_SIZE,_T(""),wxDefaultPosition,wxSize(50,20),0,wxTextValidator(wxFILTER_NUMERIC,&FontSizeValue));
|
FontSize = new wxTextCtrl(this,TEXT_FONT_SIZE,_T(""),wxDefaultPosition,wxSize(50,20),0,NumValidator(&FontSizeValue,true,false));
|
||||||
//wxButton *FontButton = new wxButton(this,BUTTON_STYLE_FONT,_("Choose"));
|
//wxButton *FontButton = new wxButton(this,BUTTON_STYLE_FONT,_("Choose"));
|
||||||
BoxBold = new wxCheckBox(this,CHECKBOX_STYLE_BOLD,_("Bold"));
|
BoxBold = new wxCheckBox(this,CHECKBOX_STYLE_BOLD,_("Bold"));
|
||||||
BoxItalic = new wxCheckBox(this,CHECKBOX_STYLE_ITALIC,_("Italic"));
|
BoxItalic = new wxCheckBox(this,CHECKBOX_STYLE_ITALIC,_("Italic"));
|
||||||
|
@ -142,13 +142,13 @@ DialogStyleEditor::DialogStyleEditor (wxWindow *parent, AssStyle *_style, Subtit
|
||||||
for (int i=0;i<3;i++) margin[i] = new wxSpinCtrl(this,TEXT_MARGIN_L+i,_T(""),wxDefaultPosition,wxSize(60,20),wxSP_ARROW_KEYS,0,9999,style->Margin[i]);
|
for (int i=0;i<3;i++) margin[i] = new wxSpinCtrl(this,TEXT_MARGIN_L+i,_T(""),wxDefaultPosition,wxSize(60,20),wxSP_ARROW_KEYS,0,9999,style->Margin[i]);
|
||||||
margin[3] = 0;
|
margin[3] = 0;
|
||||||
Alignment = new wxRadioBox(this, RADIO_ALIGNMENT, _("Alignment"), wxDefaultPosition, wxDefaultSize, 9, alignValues, 3, wxRA_SPECIFY_COLS);
|
Alignment = new wxRadioBox(this, RADIO_ALIGNMENT, _("Alignment"), wxDefaultPosition, wxDefaultSize, 9, alignValues, 3, wxRA_SPECIFY_COLS);
|
||||||
Outline = new wxTextCtrl(this,TEXT_OUTLINE,_T(""),wxDefaultPosition,wxSize(40,20),0,wxTextValidator(wxFILTER_NUMERIC,&OutlineValue));
|
Outline = new wxTextCtrl(this,TEXT_OUTLINE,_T(""),wxDefaultPosition,wxSize(40,20),0,NumValidator(&OutlineValue,true,false));
|
||||||
Shadow = new wxTextCtrl(this,TEXT_SHADOW,_T(""),wxDefaultPosition,wxSize(40,20),0,wxTextValidator(wxFILTER_NUMERIC,&ShadowValue));
|
Shadow = new wxTextCtrl(this,TEXT_SHADOW,_T(""),wxDefaultPosition,wxSize(40,20),0,NumValidator(&ShadowValue,true,false));
|
||||||
OutlineType = new wxCheckBox(this,CHECKBOX_OUTLINE,_("Opaque box"));
|
OutlineType = new wxCheckBox(this,CHECKBOX_OUTLINE,_("Opaque box"));
|
||||||
ScaleX = new wxTextCtrl(this,TEXT_SCALE_X,_T(""),wxDefaultPosition, wxSize(70,20),0,wxTextValidator(wxFILTER_NUMERIC,&ScaleXValue));
|
ScaleX = new wxTextCtrl(this,TEXT_SCALE_X,_T(""),wxDefaultPosition, wxSize(70,20),0,NumValidator(&ScaleXValue,true,false));
|
||||||
ScaleY = new wxTextCtrl(this,TEXT_SCALE_Y,_T(""),wxDefaultPosition, wxSize(70,20),0,wxTextValidator(wxFILTER_NUMERIC,&ScaleYValue));
|
ScaleY = new wxTextCtrl(this,TEXT_SCALE_Y,_T(""),wxDefaultPosition, wxSize(70,20),0,NumValidator(&ScaleYValue,true,false));
|
||||||
Angle = new wxTextCtrl(this,TEXT_ANGLE,_T(""),wxDefaultPosition, wxSize(40,20),0,wxTextValidator(wxFILTER_NUMERIC,&AngleValue));
|
Angle = new wxTextCtrl(this,TEXT_ANGLE,_T(""),wxDefaultPosition, wxSize(40,20),0,NumValidator(&AngleValue,true,true));
|
||||||
Spacing = new wxTextCtrl(this,TEXT_SPACING,_T(""),wxDefaultPosition,wxSize(40,20),0,wxTextValidator(wxFILTER_NUMERIC,&SpacingValue));
|
Spacing = new wxTextCtrl(this,TEXT_SPACING,_T(""),wxDefaultPosition,wxSize(40,20),0,NumValidator(&SpacingValue,true,true));
|
||||||
Encoding = new wxComboBox(this,COMBO_ENCODING,_T(""),wxDefaultPosition, wxDefaultSize, encodingStrings,wxCB_READONLY);
|
Encoding = new wxComboBox(this,COMBO_ENCODING,_T(""),wxDefaultPosition, wxDefaultSize, encodingStrings,wxCB_READONLY);
|
||||||
|
|
||||||
// Set control tooltips
|
// Set control tooltips
|
||||||
|
|
|
@ -37,25 +37,164 @@
|
||||||
///////////
|
///////////
|
||||||
// Headers
|
// Headers
|
||||||
#include "validators.h"
|
#include "validators.h"
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
|
||||||
///////////////
|
///////////////
|
||||||
// Constructor
|
// Constructor
|
||||||
NumValidator::NumValidator(wxString* valPtr,bool isfloat,bool issigned)
|
NumValidator::NumValidator(wxString* _valPtr,bool isfloat,bool issigned) {
|
||||||
: wxTextValidator(wxFILTER_INCLUDE_CHAR_LIST,valPtr)
|
isFloat = isfloat;
|
||||||
{
|
isSigned = issigned;
|
||||||
wxArrayString list;
|
valPtr = _valPtr;
|
||||||
list.Add(_T("0"));
|
|
||||||
list.Add(_T("1"));
|
// Get value
|
||||||
list.Add(_T("2"));
|
if (valPtr) {
|
||||||
list.Add(_T("3"));
|
if (isFloat) {
|
||||||
list.Add(_T("4"));
|
valPtr->ToDouble(&fValue);
|
||||||
list.Add(_T("5"));
|
}
|
||||||
list.Add(_T("6"));
|
else {
|
||||||
list.Add(_T("7"));
|
long tLong;
|
||||||
list.Add(_T("8"));
|
valPtr->ToLong(&tLong);
|
||||||
list.Add(_T("9"));
|
iValue = tLong;
|
||||||
if (isfloat) list.Add(_T("."));
|
}
|
||||||
if (issigned) list.Add(_T("-"));
|
}
|
||||||
SetIncludes(list);
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////
|
||||||
|
// Event table
|
||||||
|
BEGIN_EVENT_TABLE(NumValidator, wxValidator)
|
||||||
|
EVT_CHAR(NumValidator::OnChar)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
|
||||||
|
/////////
|
||||||
|
// Clone
|
||||||
|
wxObject* NumValidator::Clone() const {
|
||||||
|
NumValidator *clone = new NumValidator(valPtr,isFloat,isSigned);
|
||||||
|
return clone;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////
|
||||||
|
// Validate
|
||||||
|
bool NumValidator::Validate(wxWindow* parent) {
|
||||||
|
wxTextCtrl *ctrl = (wxTextCtrl*) GetWindow();
|
||||||
|
wxString value = ctrl->GetValue();
|
||||||
|
|
||||||
|
// Is the control enabled?
|
||||||
|
if (!ctrl->IsEnabled()) return true;
|
||||||
|
|
||||||
|
// Check length
|
||||||
|
if (value.Length() < 1) return false;
|
||||||
|
|
||||||
|
// Check each character
|
||||||
|
bool gotDecimal = false;
|
||||||
|
for (size_t i=0;i<value.Length();i++) {
|
||||||
|
if (!CheckCharacter(value[i],i==0,gotDecimal)) return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// All clear
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////
|
||||||
|
// Check if a given character is valid
|
||||||
|
bool NumValidator::CheckCharacter(int chr,bool isFirst,bool &gotDecimal) {
|
||||||
|
// Check sign
|
||||||
|
if (chr == _T('-') || chr == _T('+')) {
|
||||||
|
if (!isFirst || !isSigned) return false;
|
||||||
|
else return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check decimal point
|
||||||
|
if (chr == _T('.') || chr == _T(',')) {
|
||||||
|
if (!isFloat || gotDecimal) return false;
|
||||||
|
else {
|
||||||
|
gotDecimal = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check digit
|
||||||
|
if (chr < _T('0') || chr > _T('9')) return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////
|
||||||
|
// Filter keypresses
|
||||||
|
void NumValidator::OnChar(wxKeyEvent& event) {
|
||||||
|
wxTextCtrl *ctrl = (wxTextCtrl*) GetWindow();
|
||||||
|
wxString value = ctrl->GetValue();
|
||||||
|
int chr = event.GetKeyCode();
|
||||||
|
|
||||||
|
// Special keys
|
||||||
|
if (chr < WXK_SPACE || chr == WXK_DELETE || chr > WXK_START) {
|
||||||
|
event.Skip();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get selection
|
||||||
|
long from,to;
|
||||||
|
ctrl->GetSelection(&from,&to);
|
||||||
|
|
||||||
|
// Count decimal points and signs outside selection
|
||||||
|
int decimals = 0;
|
||||||
|
int signs = 0;
|
||||||
|
wxChar curchr;
|
||||||
|
for (size_t i=0;i<value.Length();i++) {
|
||||||
|
if (i >= (unsigned)from && i < (unsigned)to) continue;
|
||||||
|
curchr = value[i];
|
||||||
|
if (curchr == _T('.') || curchr == _T(',')) decimals++;
|
||||||
|
if (curchr == _T('+') || curchr == _T('-')) signs++;
|
||||||
|
}
|
||||||
|
bool gotDecimal = decimals > 0;
|
||||||
|
bool canSign = from == 0 && signs == 0;
|
||||||
|
|
||||||
|
// Check character
|
||||||
|
if (!CheckCharacter(chr,canSign,gotDecimal)) {
|
||||||
|
if (!wxValidator::IsSilent()) wxBell();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// OK
|
||||||
|
event.Skip();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////
|
||||||
|
// Transfer to window
|
||||||
|
bool NumValidator::TransferToWindow() {
|
||||||
|
wxTextCtrl *ctrl = (wxTextCtrl*) GetWindow();
|
||||||
|
if (isFloat) ctrl->SetValue(PrettyFloatD(fValue));
|
||||||
|
else ctrl->SetValue(wxString::Format(_T("%d"),iValue));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////
|
||||||
|
// Receive from window
|
||||||
|
bool NumValidator::TransferFromWindow() {
|
||||||
|
wxTextCtrl *ctrl = (wxTextCtrl*) GetWindow();
|
||||||
|
wxString value = ctrl->GetValue();
|
||||||
|
|
||||||
|
// Validate
|
||||||
|
bool ok = Validate(ctrl);
|
||||||
|
if (!ok) return false;
|
||||||
|
|
||||||
|
// Transfer
|
||||||
|
if (isFloat) {
|
||||||
|
value.ToDouble(&fValue);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
long tLong;
|
||||||
|
value.ToLong(&tLong);
|
||||||
|
iValue = tLong;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,9 +45,27 @@
|
||||||
|
|
||||||
/////////////////////
|
/////////////////////
|
||||||
// Numeric validator
|
// Numeric validator
|
||||||
class NumValidator : public wxTextValidator {
|
class NumValidator : public wxValidator {
|
||||||
|
private:
|
||||||
|
double fValue;
|
||||||
|
int iValue;
|
||||||
|
wxString* valPtr;
|
||||||
|
|
||||||
|
bool isFloat;
|
||||||
|
bool isSigned;
|
||||||
|
wxObject* Clone() const;
|
||||||
|
bool Validate(wxWindow* parent);
|
||||||
|
bool TransferToWindow();
|
||||||
|
bool TransferFromWindow();
|
||||||
|
|
||||||
|
bool CheckCharacter(int chr,bool isFirst,bool &gotDecimal);
|
||||||
|
|
||||||
|
void OnChar(wxKeyEvent& event);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
NumValidator(wxString* valPtr = NULL,bool isfloat=false,bool issigned=false);
|
NumValidator(wxString* valPtr = NULL,bool isfloat=false,bool issigned=false);
|
||||||
|
|
||||||
|
DECLARE_EVENT_TABLE();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue