summaryrefslogtreecommitdiff
path: root/web/web_prompt.c
diff options
context:
space:
mode:
authorDavid Vazgenovich Shakaryan <dvshakaryan@gmail.com>2022-05-02 03:29:51 -0700
committerDavid Vazgenovich Shakaryan <dvshakaryan@gmail.com>2022-05-02 03:29:51 -0700
commite462a15fb8b1f5ff505153f1a3e1097a4fbf0e80 (patch)
tree4ec12048ddd90042556878a7ce0857904bdd651a /web/web_prompt.c
parent22646d963e2b0c9b5ef629aa7704158026cfa6d1 (diff)
downloaddartboat-e462a15fb8b1f5ff505153f1a3e1097a4fbf0e80.tar.gz
dartboat-e462a15fb8b1f5ff505153f1a3e1097a4fbf0e80.tar.xz
web: split opts and prompt handlers into separate files
Currently using a bunch of forward declarations in prompt.c that should be cleaned up later.
Diffstat (limited to 'web/web_prompt.c')
-rw-r--r--web/web_prompt.c168
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();
+}