diff options
Diffstat (limited to 'web/web_prompt.c')
-rw-r--r-- | web/web_prompt.c | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/web/web_prompt.c b/web/web_prompt.c new file mode 100644 index 0000000..64a23fd --- /dev/null +++ b/web/web_prompt.c @@ -0,0 +1,168 @@ +#include "web_prompt.h" +#include "web_match.h" +#include "web_ui.h" + +#include <stdlib.h> +#include <string.h> + +#include <emscripten/emscripten.h> + +// FIXME forward declaring these until the code is better modularised +void start_match(int mode); +void user_num_darts(int n); +void user_visit(int points); +void user_visit_to_rem(int rem); +void end_match(); +void update_user_rem_from_pts(int pts); +void user_undo(); + +enum prompt_mode pm; + +char *prompt_get() +{ + return (char *)EM_ASM_INT({return promptGet()}); +} + +void prompt_handle_pre(char *command) +{ + if (pm == PM_DARTBOARD) + return; + + EM_ASM(clearOi()); + + if ((pm == PM_VISIT || pm == PM_NUM_DARTS || pm == PM_END_MATCH) && + strcmp(command, "undo")) + deactivate_key("undo"); + + if (pm == PM_END_MATCH && strcmp(command, "rem")) + deactivate_key("rem"); + + if (pm == PM_END_MATCH && strcmp(command, "submit")) + deactivate_key("submit"); +} + +void prompt_handle_on_change() +{ + if (pm != PM_VISIT) + return; + + char *str = prompt_get(); + update_user_rem_from_pts(atoi(str)); + free(str); +} + +void prompt_handle_append(char *data) +{ + if (pm != PM_SELECT_MODE && pm != PM_VISIT && pm != PM_NUM_DARTS) + return; + + char *str = prompt_get(); + size_t len_str = strlen(str); + size_t len_data = strlen(data); + if (len_str < 3) { + str = realloc(str, len_str + len_data + 1); + memcpy(str + len_str, data, len_data + 1); + EM_ASM({setPromptInput($0)}, str); + prompt_handle_on_change(); + } + free(str); +} + +void prompt_handle_backspace() +{ + if (pm == PM_DARTBOARD) + return; + + char *str = prompt_get(); + size_t len_str = strlen(str); + if (len_str > 0) { + str[len_str-1] = 0; + EM_ASM({setPromptInput($0)}, str); + prompt_handle_on_change(); + } + free(str); +} + +void prompt_handle_clear() +{ + if (pm == PM_DARTBOARD) + return; + + EM_ASM({setPromptInput($0)}, ""); + prompt_handle_on_change(); +} + +void prompt_handle_submit() +{ + if (pm == PM_END_MATCH) { + if (is_key_active("submit")) + end_match(); + toggle_key("submit"); + return; + } + + if (pm != PM_VISIT && pm != PM_NUM_DARTS && pm != PM_SELECT_MODE) + return; + + char *str = prompt_get(); + prompt_handle_clear(); + if (*str) { + if (pm == PM_VISIT) + user_visit(atoi(str)); + else if (pm == PM_NUM_DARTS) + user_num_darts(atoi(str)); + else if (pm == PM_SELECT_MODE) + start_match(atoi(str)); + } + + free(str); +} + +void prompt_handle_rem() +{ + if (pm == PM_END_MATCH) { + if (is_key_active("rem")) + start_match(state->mode); + toggle_key("rem"); + return; + } + + if (pm != PM_VISIT) + return; + + char *str = prompt_get(); + prompt_handle_clear(); + if (*str) + user_visit_to_rem(atoi(str)); + free(str); +} + +void prompt_handle_undo() +{ + if (pm != PM_VISIT && pm != PM_NUM_DARTS && pm != PM_END_MATCH) + return; + + prompt_handle_clear(); + if (is_key_active("undo")) + user_undo(); + toggle_key("undo"); +} + +EMSCRIPTEN_KEEPALIVE +void prompt_handle(char *command, char *data) +{ + prompt_handle_pre(command); + + if (!strcmp(command, "append")) + prompt_handle_append(data); + else if (!strcmp(command, "backspace")) + prompt_handle_backspace(); + else if (!strcmp(command, "clear")) + prompt_handle_clear(); + else if (!strcmp(command, "submit")) + prompt_handle_submit(); + else if (!strcmp(command, "rem")) + prompt_handle_rem(); + else if (!strcmp(command, "undo")) + prompt_handle_undo(); +} |