improvement of the text input and added some documentation

main
Martin Felis (berta) 2010-09-11 14:32:31 +02:00
parent 3f962163b3
commit 61275239ce
6 changed files with 80 additions and 16 deletions

View File

@ -536,11 +536,12 @@ void EnterPlayernameOverlay::Init () {
} }
bool EnterPlayernameOverlay::OnKeyDown (const SDL_keysym &keysym) { bool EnterPlayernameOverlay::OnKeyDown (const SDL_keysym &keysym) {
if (keysym.sym == SDLK_ESCAPE) { /* if (keysym.sym == SDLK_ESCAPE) {
GetModel()->SetGameState(GameStateMainMenu); GetModel()->SetGameState(GameStateMainMenu);
GetController()->uistate.hotitem = 0; GetController()->uistate.hotitem = 0;
return true; return true;
} }
*/
return false; return false;
} }
@ -569,18 +570,43 @@ void EnterPlayernameOverlay::Draw () {
GetView()->SelectFont("console.ttf"); GetView()->SelectFont("console.ttf");
Engine::GUI::Label (4, "A s t e r o i d s", right * 0.5 - 100, 180); // If ESC, we want to go back to the main menu (warning: OpenGL cleanup has
// still to be performed!
if (Engine::GUI::CheckKeyPress(SDLK_ESCAPE)) {
GetModel()->SetGameState(GameStateMainMenu);
glPopMatrix ();
Engine::GUI::Label (1, "Enter your name: ", right * 0.5 - 100, 250); glMatrixMode (GL_PROJECTION);
glPopMatrix ();
glMatrixMode (GL_MODELVIEW);
return;
}
Engine::GUI::Label (4, "A s t e r o i d s", right * 0.5 - 100, 180);
// Make sure we have UNICODE processing enabled! // Make sure we have UNICODE processing enabled!
GetController()->EnableTextinput(true); GetController()->EnableTextinput(true);
// Enter your name
std::string player_name = GetModel()->GetPlayerName(); std::string player_name = GetModel()->GetPlayerName();
Engine::GUI::Label (1, "Enter your name: ", right * 0.5 - 100, 250);
if (Engine::GUI::LineEdit (2, right * 0.5 + 20, 238, player_name, 16)) { if (Engine::GUI::LineEdit (2, right * 0.5 + 20, 238, player_name, 16)) {
GetModel()->SetPlayerName(player_name); GetModel()->SetPlayerName(player_name);
} }
// some test
static std::string otherstring("25blabla");
Engine::GUI::Label (6, "Enter your age : ", right * 0.5 - 100, 280);
if (Engine::GUI::LineEdit (7, right * 0.5 + 20, 268, otherstring, 16)) {
// GetModel()->SetPlayerName(player_name);
}
if (Engine::GUI::Button (3, "Start Game", right - 150 - 20, 500, 150, 40)) { if (Engine::GUI::Button (3, "Start Game", right - 150 - 20, 500, 150, 40)) {
GetModel()->SetGameState(GameStateRunning); GetModel()->SetGameState(GameStateRunning);
} }

View File

@ -270,6 +270,18 @@ int convert_keystring (const char *key_val) {
return 0; return 0;
} }
const char* convert_keycode (const int &keycode) {
int i = 0;
while (key_table[i].keynum != keytable_last) {
if (key_table[i].keynum == keycode)
return key_table[i].keystr;
i++;
}
return NULL;
}
/* /*
* Commands for the ControllerBase * Commands for the ControllerBase
*/ */

View File

@ -13,7 +13,7 @@ class Module;
* *
* See also http://sol.gfxile.net/imgui/ * See also http://sol.gfxile.net/imgui/
*/ */
struct UIState { struct IMGUIState {
int hotitem; int hotitem;
int activeitem; int activeitem;
@ -34,6 +34,8 @@ struct UIState {
/** \brief Converts a string into the corresponding keycode */ /** \brief Converts a string into the corresponding keycode */
int convert_keystring (const char *key_val); int convert_keystring (const char *key_val);
/** \brief Converts a key code value to the string that describes the value */
const char* convert_keycode (const int &keycode);
/** \brief All input is sent here and distributed from here /** \brief All input is sent here and distributed from here
* *
@ -74,13 +76,12 @@ class ControllerBase : public Module {
uistate.hotitem = 0; uistate.hotitem = 0;
} }
void IMGUIClear () { void IMGUIClear () {
LogMessage ("Called IMGUIClear()");
uistate.hotitem = 0; uistate.hotitem = 0;
uistate.kbditem = 0; uistate.kbditem = 0;
} }
void IMGUIFinish (); void IMGUIFinish ();
UIState uistate; IMGUIState uistate;
protected: protected:
/** \brief Initializes the system */ /** \brief Initializes the system */

View File

@ -123,6 +123,9 @@ bool Button (int id, const char* caption, int x, int y, int w, int h) {
// Keyboard Logic // Keyboard Logic
if (controller->uistate.kbditem == id) { if (controller->uistate.kbditem == id) {
// Any unicode keys that were sent get cleared
controller->uistate.last_unicode = 0;
// We have to make sure, that we always clear the uistate.last_keysym // We have to make sure, that we always clear the uistate.last_keysym
// value, otherwise the same action might be repeated over and over. // value, otherwise the same action might be repeated over and over.
switch (controller->uistate.last_keysym) { switch (controller->uistate.last_keysym) {
@ -165,32 +168,30 @@ bool LineEdit (int id, int x, int y, std::string &text_value, const int &maxleng
int w = maxlength * 16; int w = maxlength * 16;
int h = 16; int h = 16;
// LogMessage ("id = %d hotitem = %d activeitem = %d kbditem = %d", id, controller->uistate.hotitem, controller->uistate.activeitem, controller->uistate.kbditem); // LogMessage ("id = %d hotitem = %d activeitem = %d kbditem = %d key = %s", id, controller->uistate.hotitem, controller->uistate.activeitem, controller->uistate.kbditem, convert_keycode (controller->uistate.last_keysym));
// Check for hotness // Check for hotness
if (regionhit (x, y, w, h)) { if (regionhit (x, y, w, h)) {
controller->uistate.hotitem = id; controller->uistate.hotitem = id;
if (controller->uistate.activeitem == 0 if (controller->uistate.activeitem == 0
&& controller->GetButtonState(MouseButtonLeft)) && controller->GetButtonState(MouseButtonLeft)) {
controller->uistate.activeitem = id; controller->uistate.activeitem = id;
} }
// If nothing is selected
if (controller->uistate.hotitem != 0) {
controller->uistate.kbditem = controller->uistate.hotitem;
} }
if (controller->uistate.kbditem == 0) { if (controller->uistate.kbditem == 0) {
controller->uistate.hotitem = id; controller->uistate.hotitem = id;
controller->uistate.kbditem = id; controller->uistate.kbditem = id;
controller->uistate.last_unicode = 0;
return false;
} }
// Render // Render
glColor3f (0.2, 0.2, 0.2); glColor3f (0.2, 0.2, 0.2);
DrawRect2D (x + 4, y + 4, w, h); DrawRect2D (x + 4, y + 4, w, h);
if (controller->uistate.hotitem == id // If we have keyboard focus, we highlight the widget
|| controller->uistate.kbditem == id) { if ( controller->uistate.kbditem == id) {
if (controller->uistate.activeitem == id) { if (controller->uistate.activeitem == id) {
glColor3f (0.8, 0.8, 0.8); glColor3f (0.8, 0.8, 0.8);
DrawRect2D (x, y, w, h); DrawRect2D (x, y, w, h);
@ -284,10 +285,18 @@ bool LineEdit (int id, int x, int y, std::string &text_value, const int &maxleng
&& controller->uistate.hotitem == id && controller->uistate.hotitem == id
&& controller->uistate.activeitem == id) { && controller->uistate.activeitem == id) {
controller->uistate.kbditem = id; controller->uistate.kbditem = id;
controller->uistate.last_unicode = 0;
} }
return false; return false;
} }
bool CheckKeyPress (int keycode) {
if (controller->uistate.last_keysym == keycode)
return true;
return false;
}
}; };
}; };

View File

@ -1,10 +1,17 @@
/** \brief Header file for the IMGUI widgets
*
* \todo [med] Cyclying through widgets via tab and shift-tab
*/
#ifndef _IMGUICONTROLS_H #ifndef _IMGUICONTROLS_H
#define _IMGUICONTROLS_H #define _IMGUICONTROLS_H
#include <SDL/SDL.h>
#include <string> #include <string>
namespace Engine { namespace Engine {
/** \brief IMGUI widgets and functions
*/
namespace GUI { namespace GUI {
/** \brief Checks whether the mouse is in the given rectangle */ /** \brief Checks whether the mouse is in the given rectangle */
@ -24,6 +31,14 @@ bool Button (int id, const char* caption, int x, int y, int w, int h);
bool LineEdit (int id, int x, int y, std::string &text_value, const int &maxlength); bool LineEdit (int id, int x, int y, std::string &text_value, const int &maxlength);
/** \brief Checks whether a given key was pressed
*
* This function can be used to check whether a single key (e.g. ESC) was
* pressed. This is useful when one wants to abort an action or quit from the
* main screen by pressing a single key.
*/
bool CheckKeyPress (int keycode);
}; };
}; };

View File

@ -72,6 +72,7 @@
* todos within the code have a look at the \ref todo. * todos within the code have a look at the \ref todo.
* *
* \todo [high] Create a simple racing or asteroids game * \todo [high] Create a simple racing or asteroids game
* \todo [high] Since introduction of the IMGUI pressing 'space' in the menu crashes the game
* \todo [med] Clear all references of EntityVisualState and EntityGameState * \todo [med] Clear all references of EntityVisualState and EntityGameState
* \todo [med] Clarify functionalities of CreateEntity, KillEntity, RegisterEntity, UnregisterEntity (which frees memory, which does only change the state of the Model?) * \todo [med] Clarify functionalities of CreateEntity, KillEntity, RegisterEntity, UnregisterEntity (which frees memory, which does only change the state of the Model?)
* \todo [med] Add basic networking * \todo [med] Add basic networking