You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
projet-tut/Pontu/src/engine/InputProcessor.c

102 lines
3.1 KiB

#include "engine/InputProcessor.h"
InputProcessor createInputProcessor() {
InputProcessor inputProcessor = {
.tabButton = array_P_Button_Create(),
.tabTextInput = array_TextInput_Create(),
.selectedTextInput = NULL
};
SDL_StopTextInput();
return inputProcessor;
}
void freeInputProcessor(InputProcessor* inputProcessor) {
array_P_Button_Free(&inputProcessor->tabButton);
}
InputElement proccessInput(InputProcessor *inputProcessor)
{
SDL_Event event;
if (!SDL_PollEvent(&event))
{
return createInputElementNone();
}
switch (event.type)
{
case SDL_QUIT:
return createInputElementUIQuit();
case SDL_MOUSEBUTTONUP:
{
const SDL_Point mousePoint = {.x = event.button.x, .y = event.button.y};
for (size_t i = 0; i<inputProcessor->tabButton.size; ++i) {
P_Button* b = &inputProcessor->tabButton.elems[i];
if (isHover(b)) {
b->onClick(b);
break;
}
}
bool textInputClicked = false;
for (size_t i = 0; i<inputProcessor->tabTextInput.size; ++i) {
TextInput* ti = &inputProcessor->tabTextInput.elems[i];
if (SDL_PointInRect(&mousePoint, &ti->size)) {
if (inputProcessor->selectedTextInput == NULL) {
SDL_StartTextInput();
}
else {
inputProcessor->selectedTextInput->isActive = false;
}
inputProcessor->selectedTextInput = ti;
textInputClicked = true;
inputProcessor->selectedTextInput->isActive = true;
inputProcessor->selectedTextInput->cursorPosition = strlen(inputProcessor->selectedTextInput->value);
break;
}
}
if (!textInputClicked && inputProcessor->selectedTextInput != NULL) {
inputProcessor->selectedTextInput->isActive = false;
inputProcessor->selectedTextInput = NULL;
SDL_StopTextInput();
}
return createInputElementNone();
}
case SDL_MOUSEMOTION:
{
for (size_t i = 0; i<inputProcessor->tabButton.size; ++i) {
P_Button* b = &inputProcessor->tabButton.elems[i];
int res = isButtonInteractWithCursor(b, event.motion.x, event.motion.y);
if (res != BUTTON_NOTHING) {
return createInputElementButtonClicked(b, res);
}
}
break;
}
case SDL_WINDOWEVENT:
if (event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) {
return createInputElementResizeWindow(event.window.data1, event.window.data2);
}
if (event.window.event == SDL_WINDOWEVENT_CLOSE) {
return createInputElementCloseWindow();
}
break;
case SDL_TEXTINPUT:
addStringToInputTextValue(inputProcessor->selectedTextInput, event.text.text);
return createInputElementTextInput(inputProcessor->selectedTextInput);
break;
case SDL_TEXTEDITING:
inputProcessor->selectedTextInput->cursorPosition = event.edit.start;
return createInputElementTextInput(inputProcessor->selectedTextInput);
break;
case SDL_KEYDOWN:
if (inputProcessor->selectedTextInput != NULL && event.key.keysym.sym == SDLK_BACKSPACE) {
removeCharacterToInputTextValueAtCursor(inputProcessor->selectedTextInput);
return createInputElementTextInput(inputProcessor->selectedTextInput);
}
break;
}
return createInputElementNone();
}