fix textbox key repeat issue, fix numpad issue (in two ways)

This commit is contained in:
jacob1
2014-03-11 12:53:42 -04:00
parent 3f65b47a5e
commit 7ce9907f82
2 changed files with 44 additions and 32 deletions

View File

@@ -443,9 +443,16 @@ float currentWidth, currentHeight;
void EventProcess(SDL_Event event) void EventProcess(SDL_Event event)
{ {
if(event.type == SDL_KEYDOWN || event.type == SDL_KEYUP) if (event.type == SDL_KEYDOWN || event.type == SDL_KEYUP)
if(!(event.key.keysym.mod&KEY_MOD_NUM)) if (!(event.key.keysym.mod&KEY_MOD_NUM))
event.key.keysym.sym = MapNumpad(event.key.keysym.sym); {
SDLKey newKey = MapNumpad(event.key.keysym.sym);
if (newKey != event.key.keysym.sym)
{
event.key.keysym.sym = newKey;
event.key.keysym.unicode = 0;
}
}
switch (event.type) switch (event.type)
{ {
case SDL_QUIT: case SDL_QUIT:
@@ -462,7 +469,7 @@ void EventProcess(SDL_Event event)
engine->onMouseMove(event.motion.x*inputScale, event.motion.y*inputScale); engine->onMouseMove(event.motion.x*inputScale, event.motion.y*inputScale);
break; break;
case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONDOWN:
if(event.button.button == SDL_BUTTON_WHEELUP) if (event.button.button == SDL_BUTTON_WHEELUP)
{ {
engine->onMouseWheel(event.motion.x*inputScale, event.motion.y*inputScale, 1); engine->onMouseWheel(event.motion.x*inputScale, event.motion.y*inputScale, 1);
} }
@@ -476,7 +483,7 @@ void EventProcess(SDL_Event event)
} }
break; break;
case SDL_MOUSEBUTTONUP: case SDL_MOUSEBUTTONUP:
if(event.button.button != SDL_BUTTON_WHEELUP && event.button.button != SDL_BUTTON_WHEELDOWN) if (event.button.button != SDL_BUTTON_WHEELUP && event.button.button != SDL_BUTTON_WHEELDOWN)
engine->onMouseUnclick(event.motion.x*inputScale, event.motion.y*inputScale, event.button.button); engine->onMouseUnclick(event.motion.x*inputScale, event.motion.y*inputScale, event.button.button);
break; break;
#ifdef OGLI #ifdef OGLI

View File

@@ -302,8 +302,11 @@ void Textbox::Tick(float dt)
void Textbox::OnKeyRelease(int key, Uint16 character, bool shift, bool ctrl, bool alt) void Textbox::OnKeyRelease(int key, Uint16 character, bool shift, bool ctrl, bool alt)
{ {
keyDown = 0; if (keyDown == key)
characterDown = 0; {
keyDown = 0;
characterDown = 0;
}
} }
void Textbox::OnKeyPress(int key, Uint16 character, bool shift, bool ctrl, bool alt) void Textbox::OnKeyPress(int key, Uint16 character, bool shift, bool ctrl, bool alt)
@@ -408,36 +411,38 @@ void Textbox::OnVKeyPress(int key, Uint16 character, bool shift, bool ctrl, bool
} }
ClearSelection(); ClearSelection();
break; break;
} default:
if(CharacterValid(character) && !ReadOnly) if(CharacterValid(character) && !ReadOnly)
{
if(HasSelection())
{ {
if(getLowerSelectionBound() < 0 || getHigherSelectionBound() > backingText.length()) if(HasSelection())
return; {
backingText.erase(backingText.begin()+getLowerSelectionBound(), backingText.begin()+getHigherSelectionBound()); if(getLowerSelectionBound() < 0 || getHigherSelectionBound() > backingText.length())
cursor = getLowerSelectionBound(); return;
} backingText.erase(backingText.begin()+getLowerSelectionBound(), backingText.begin()+getHigherSelectionBound());
cursor = getLowerSelectionBound();
}
int regionWidth = Size.X; int regionWidth = Size.X;
if(Appearance.icon) if(Appearance.icon)
regionWidth -= 13; regionWidth -= 13;
regionWidth -= Appearance.Margin.Left; regionWidth -= Appearance.Margin.Left;
regionWidth -= Appearance.Margin.Right; regionWidth -= Appearance.Margin.Right;
if((limit==std::string::npos || backingText.length() < limit) && (Graphics::textwidth((char*)std::string(backingText+char(character)).c_str()) <= regionWidth || multiline || limit!=std::string::npos)) if((limit==std::string::npos || backingText.length() < limit) && (Graphics::textwidth((char*)std::string(backingText+char(character)).c_str()) <= regionWidth || multiline || limit!=std::string::npos))
{
if(cursor == backingText.length())
{ {
backingText += character; if(cursor == backingText.length())
{
backingText += character;
}
else
{
backingText.insert(cursor, 1, (char)character);
}
cursor++;
} }
else changed = true;
{ ClearSelection();
backingText.insert(cursor, 1, (char)character);
}
cursor++;
} }
changed = true; break;
ClearSelection();
} }
} }
catch(std::out_of_range &e) catch(std::out_of_range &e)