summaryrefslogtreecommitdiff
path: root/src/interface
diff options
context:
space:
mode:
authorSimon Robertshaw <simon@hardwired.org.uk>2012-07-29 19:17:51 (GMT)
committer Simon Robertshaw <simon@hardwired.org.uk>2012-07-29 19:17:51 (GMT)
commitd138b2de544ab6ccdd7ec72bb5051e0bc437a1a9 (patch)
tree05792ec51751bbe3ad62a124500738b0bb6381ea /src/interface
parent418373a3cd6cf93ee1e41ffa502b8f4754831349 (diff)
downloadpowder-d138b2de544ab6ccdd7ec72bb5051e0bc437a1a9.zip
powder-d138b2de544ab6ccdd7ec72bb5051e0bc437a1a9.tar.gz
Number type for text fields, addresses some of issue #39
Diffstat (limited to 'src/interface')
-rw-r--r--src/interface/Textbox.cpp66
-rw-r--r--src/interface/Textbox.h34
2 files changed, 81 insertions, 19 deletions
diff --git a/src/interface/Textbox.cpp b/src/interface/Textbox.cpp
index ad5597f..f190322 100644
--- a/src/interface/Textbox.cpp
+++ b/src/interface/Textbox.cpp
@@ -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())
- {
- backingText += character;
- }
- else
+ if(limit==std::string::npos || backingText.length() < limit)
{
- 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)
diff --git a/src/interface/Textbox.h b/src/interface/Textbox.h
index f975bd7..9f00139 100644
--- a/src/interface/Textbox.h
+++ b/src/interface/Textbox.h
@@ -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