From d138b2de544ab6ccdd7ec72bb5051e0bc437a1a9 Mon Sep 17 00:00:00 2001 From: Simon Robertshaw Date: Sun, 29 Jul 2012 20:17:51 +0100 Subject: [PATCH] Number type for text fields, addresses some of issue #39 --- src/game/GameView.cpp | 8 +++++ src/interface/Textbox.cpp | 66 ++++++++++++++++++++++++++++++++++----- src/interface/Textbox.h | 34 +++++++++++++------- 3 files changed, 89 insertions(+), 19 deletions(-) diff --git a/src/game/GameView.cpp b/src/game/GameView.cpp index d7d0a5010..5c4ecee04 100644 --- a/src/game/GameView.cpp +++ b/src/game/GameView.cpp @@ -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 { diff --git a/src/interface/Textbox.cpp b/src/interface/Textbox.cpp index ad5597fe2..f190322d2 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()) + 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) diff --git a/src/interface/Textbox.h b/src/interface/Textbox.h index f975bd7f2..9f001391e 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