Number type for text fields, addresses some of issue #39

This commit is contained in:
Simon Robertshaw 2012-07-29 20:17:51 +01:00
parent 418373a3cd
commit d138b2de54
3 changed files with 89 additions and 19 deletions

View File

@ -253,21 +253,29 @@ GameView::GameView():
colourRSlider->SetActionCallback(new ColourChange(this));
colourRValue = new ui::Textbox(ui::Point(60, Size.Y-41), ui::Point(25, 17), "255");
colourRValue->SetActionCallback(new ColourChange(this));
colourRValue->SetLimit(3);
colourRValue->SetInputType(ui::Textbox::Number);
colourGSlider = new ui::Slider(ui::Point(95, Size.Y-39), ui::Point(50, 14), 255);
colourGSlider->SetActionCallback(new ColourChange(this));
colourGValue = new ui::Textbox(ui::Point(150, Size.Y-41), ui::Point(25, 17), "255");
colourGValue->SetActionCallback(new ColourChange(this));
colourGValue->SetLimit(3);
colourGValue->SetInputType(ui::Textbox::Number);
colourBSlider = new ui::Slider(ui::Point(185, Size.Y-39), ui::Point(50, 14), 255);
colourBSlider->SetActionCallback(new ColourChange(this));
colourBValue = new ui::Textbox(ui::Point(240, Size.Y-41), ui::Point(25, 17), "255");
colourBValue->SetActionCallback(new ColourChange(this));
colourBValue->SetLimit(3);
colourBValue->SetInputType(ui::Textbox::Number);
colourASlider = new ui::Slider(ui::Point(275, Size.Y-39), ui::Point(50, 14), 255);
colourASlider->SetActionCallback(new ColourChange(this));
colourAValue = new ui::Textbox(ui::Point(330, Size.Y-41), ui::Point(25, 17), "255");
colourAValue->SetActionCallback(new ColourChange(this));
colourAValue->SetLimit(3);
colourAValue->SetInputType(ui::Textbox::Number);
class ElementSearchAction : public ui::ButtonAction
{

View File

@ -15,7 +15,8 @@ Textbox::Textbox(Point position, Point size, std::string textboxText, std::strin
masked(false),
border(true),
mouseDown(false),
limit(0)
limit(std::string::npos),
inputType(All)
{
placeHolder = textboxPlaceholder;
@ -74,6 +75,26 @@ void Textbox::SetText(std::string newText)
}
}
Textbox::ValidInput Textbox::GetInputType()
{
return inputType;
}
void Textbox::SetInputType(ValidInput input)
{
inputType = input;
}
void Textbox::SetLimit(size_t limit)
{
this->limit = limit;
}
size_t Textbox::GetLimit()
{
return limit;
}
void Textbox::SetDisplayText(std::string newText)
{
Label::SetText(text);
@ -194,6 +215,20 @@ void Textbox::pasteIntoSelection()
}
}
bool Textbox::CharacterValid(Uint16 character)
{
switch(inputType)
{
case Number:
case Numeric:
return (character >= '0' && character <= '9');
case All:
default:
return (character >= ' ' && character < 127);
}
return false;
}
void Textbox::OnKeyPress(int key, Uint16 character, bool shift, bool ctrl, bool alt)
{
bool changed = false;
@ -274,7 +309,7 @@ void Textbox::OnKeyPress(int key, Uint16 character, bool shift, bool ctrl, bool
}
break;
}
if(character >= ' ' && character < 127)
if(CharacterValid(character))
{
if(HasSelection())
{
@ -284,13 +319,16 @@ void Textbox::OnKeyPress(int key, Uint16 character, bool shift, bool ctrl, bool
cursor = getLowerSelectionBound();
}
if(cursor == backingText.length())
if(limit==std::string::npos || backingText.length() < limit)
{
backingText += character;
}
else
{
backingText.insert(cursor, 1, (char)character);
if(cursor == backingText.length())
{
backingText += character;
}
else
{
backingText.insert(cursor, 1, (char)character);
}
}
cursor++;
changed = true;
@ -302,6 +340,18 @@ void Textbox::OnKeyPress(int key, Uint16 character, bool shift, bool ctrl, bool
cursor = 0;
backingText = "";
}
if(inputType == Number)
{
if(backingText.length()>1)
{
while(backingText[0] == '0')
backingText.erase(backingText.begin());
}
if(!backingText.length())
backingText = "0";
}
if(cursor >= backingText.length())
cursor = backingText.length()-1;
if(changed)
{
if(masked)

View File

@ -19,18 +19,8 @@ public:
class Textbox : public Label
{
friend class TextboxAction;
protected:
size_t limit;
bool mouseDown;
bool masked, border;
int cursor, cursorPositionX, cursorPositionY;
TextboxAction *actionCallback;
std::string backingText;
std::string placeHolder;
virtual void cutSelection();
virtual void pasteIntoSelection();
public:
enum ValidInput { All, Numeric, Number };
Textbox(Point position, Point size, std::string textboxText = "", std::string textboxPlaceholder = "");
virtual ~Textbox();
@ -45,12 +35,34 @@ public:
bool GetHidden() { return masked; }
void SetActionCallback(TextboxAction * action) { actionCallback = action; }
void SetLimit(size_t limit);
size_t GetLimit();
ValidInput GetInputType();
void SetInputType(ValidInput input);
//Determines if the given character is valid given the input type
bool CharacterValid(Uint16 character);
virtual void OnContextMenuAction(int item);
virtual void OnMouseClick(int x, int y, unsigned button);
virtual void OnMouseUp(int x, int y, unsigned button);
virtual void OnMouseMoved(int localx, int localy, int dx, int dy);
virtual void OnKeyPress(int key, Uint16 character, bool shift, bool ctrl, bool alt);
virtual void Draw(const Point& screenPos);
protected:
ValidInput inputType;
size_t limit;
bool mouseDown;
bool masked, border;
int cursor, cursorPositionX, cursorPositionY;
TextboxAction *actionCallback;
std::string backingText;
std::string placeHolder;
virtual void cutSelection();
virtual void pasteIntoSelection();
};
/*class Textbox : public Component