Page 1 of 1

Limiting numbers in editbox window

Posted: Wed Jun 04, 2008 18:29
by Jmiller
I had been searching the forums for this topic and saw that some people had similar questions, but I didn't find a whole lot about how to implement it.

My problem was when creating an editbox window, I wanted to limit the characters being entered and specifically I wanted only numeric values in the range of 0-359. Here's how I was able to do it after reading up on regular expression syntax.

First it has been explained that you can limit what kind of input is acceptable in the editbox via the setValidationString function. The string this takes in is based on regular expression or regex. You can do a google search on regex and see all the nifty things that can be done with it.

Now here is how I solved my specific problem, only numbers 0 - 359.

"(3[0-5][0-9]|[0-2]?[0-9]?[0-9]?)"

Pass that into setValidationString() and you'll get the proper results.

I hope this helps someone save some time. I'm sure that you can do the research on your own and figure it out, but that's what I've come up with. Now all I need to know is why the number pad doesn't seem to inject input. Anyone know a solution for that?

Posted: Thu Jun 05, 2008 08:53
by CrazyEddie
Cool. Thanks for sharing your solution :)

CE.

Posted: Thu Jun 05, 2008 14:16
by jaguillard
For negative numbers, here's what I pieced together. If the range is the same on both sides, eg -128 to 128, then you just need an optional - sign (marked by the ? postfix). In this situation, you are telling Regex that the "-" is allowed, but not required.

Code: Select all

-?1[0-2][0-8]|-?[0-9]?[0-9]?


If the range is not even, like -30 to 40, you'll have to make conditional statements for both sides of zero. The negative range needs to come first in the statement, and the negative sign non-optional. In this situation, you are telling Regex that for statements starting with "-", this is the ranges allowed.

Code: Select all

-[3][0]|-[0-2]?[0-9]?|[4][0]|[0-3]?[0-9]?


If you don't put the negative statements first, you won't be able to add a negative sign into the editbox. The Regex checks from left to right, and it would fail you on the [0-2]?[0-9]?, since the two ? marks both character slots as optional, but neither accepts a "-". It won't check any further.

To clarify what JMiller wrote (we worked together on figuring this out), there are some necessary parts you need to add to your statements. He described a range of 0-359. Note that the " | " is an OR operator, like in C++.

Code: Select all

3[0-5][0-9]|[0-2]?[0-9]?[0-9]?

The trick to this is creating the multiple ranges that will make up the whole range. The first statement allows the range between 300-359. This needs to come first in the case "3" is the first character, the Regex will match the following characters with it first. It will block any input that would create a value over 359, eg 371, the "1" won't get inputted.

The next statements allows for 0-299, filling out the range. However, each character is postfix with the ?. This makes both character slot optional. This is necessary because now it allows for a blank editbox, too. Otherwise, you'd have to highlight your text to change it.

Hope this helps people out with making some number-only editboxes.

Re: Limiting numbers in editbox window

Posted: Thu Jun 05, 2008 18:14
by CrazyEddie
Jmiller wrote:Now all I need to know is why the number pad doesn't seem to inject input. Anyone know a solution for that?

Not sure about this, are you sure your input system is generating character inputs in response to those key presses?

Re: Limiting numbers in editbox window

Posted: Thu Jun 05, 2008 18:29
by jaguillard
CrazyEddie wrote:
Jmiller wrote:Now all I need to know is why the number pad doesn't seem to inject input. Anyone know a solution for that?

Not sure about this, are you sure your input system is generating character inputs in response to those key presses?


We looked into this and it's just a matter of how OIS deals with the keypad numbers it seems. None of the numbers were mapped to the font map (value of 0, so undefined basically). He got around it by manually mapping them in code. It had nothing to do with CEGUI.

Posted: Thu Jun 05, 2008 18:43
by CrazyEddie
Thanks for the update :) It's useful in case someone else has the issue.

CE.

Re: Limiting numbers in editbox window

Posted: Sun Mar 29, 2009 13:50
by westpointer
jaguillard wrote:
CrazyEddie wrote:
Jmiller wrote:Now all I need to know is why the number pad doesn't seem to inject input. Anyone know a solution for that?

Not sure about this, are you sure your input system is generating character inputs in response to those key presses?


We looked into this and it's just a matter of how OIS deals with the keypad numbers it seems. None of the numbers were mapped to the font map (value of 0, so undefined basically). He got around it by manually mapping them in code. It had nothing to do with CEGUI.


I also want OIS keypad work for CEGUI input, but I still don't know how.
Anyone shed light on how to do this?

Re: Limiting numbers in editbox window

Posted: Tue Oct 19, 2010 17:06
by lonestarr
in case someone still cares about that, here is the code:

Code: Select all

static CEGUI::uint _considerNumpadKey(OIS::KeyCode argkey,unsigned int* text=NULL)
{
    switch (argkey)
    {
    case OIS::KC_NUMPAD0: if (text) *text=48; return 1;
    case OIS::KC_NUMPAD1: if (text) *text=49; return 2;
    case OIS::KC_NUMPAD2: if (text) *text=50; return 3;
    case OIS::KC_NUMPAD3: if (text) *text=51; return 4;
    case OIS::KC_NUMPAD4: if (text) *text=52; return 5;
    case OIS::KC_NUMPAD5: if (text) *text=53; return 6;
    case OIS::KC_NUMPAD6: if (text) *text=54; return 7;
    case OIS::KC_NUMPAD7: if (text) *text=55; return 8;
    case OIS::KC_NUMPAD8: if (text) *text=56; return 9;
    case OIS::KC_NUMPAD9: if (text) *text=57; return 10;
    }

    return argkey;
}

// KeyListener
bool MyListener::keyPressed(const OIS::KeyEvent &arg)
{
    CEGUI::System &sys = CEGUI::System::getSingleton();
    unsigned int text = arg.text;
    sys.injectKeyDown(_considerNumpadKey(arg.key,&text));
    sys.injectChar(text);
    return true;
}

bool MyListener::keyReleased(const OIS::KeyEvent &arg)
{
    CEGUI::System::getSingleton().injectKeyUp(_considerNumpadKey(arg.key));
    return true;
}