diff options
| author | David Vazgenovich Shakaryan <dvshakaryan@gmail.com> | 2022-05-03 12:29:09 -0700 | 
|---|---|---|
| committer | David Vazgenovich Shakaryan <dvshakaryan@gmail.com> | 2022-05-03 12:29:09 -0700 | 
| commit | 9a0f3d15dfaac41657bb549c7e246d2ac81fdf4c (patch) | |
| tree | 662ca1cb433fd95822d5af0e27ba13388fbd6eac | |
| parent | d9add805c3b556d2fa357713bda577f4dc6f2d49 (diff) | |
| download | dartboat-9a0f3d15dfaac41657bb549c7e246d2ac81fdf4c.tar.gz dartboat-9a0f3d15dfaac41657bb549c7e246d2ac81fdf4c.tar.xz | |
web: use generic JS functions for manipulating DOM
| -rw-r--r-- | web/static/dartboat.js | 86 | ||||
| -rw-r--r-- | web/web_control.c | 2 | ||||
| -rw-r--r-- | web/web_prompt.c | 42 | ||||
| -rw-r--r-- | web/web_scoreboard.c | 39 | ||||
| -rw-r--r-- | web/web_svg.c | 18 | ||||
| -rw-r--r-- | web/web_svg.h | 1 | 
6 files changed, 91 insertions, 97 deletions
| diff --git a/web/static/dartboat.js b/web/static/dartboat.js index 359abbd..b420543 100644 --- a/web/static/dartboat.js +++ b/web/static/dartboat.js @@ -29,37 +29,37 @@ function toCString(str) { // caller must free  	return ptr;  } -function promptGet() { // caller must free -	return toCString($('#prompt-input').textContent); +function elemGetContent(sel) { // caller must free +	return toCString($(UTF8ToString(sel)).textContent);  } -function promptHandle(command, data) { -	const str_c = toCString(command); -	const str_d = data && toCString(data); -	_prompt_handle(str_c, str_d); - -	_free(str_c); -	if (str_d) _free(str_d); +function elemSetContent(sel, str) { +	$(UTF8ToString(sel)).textContent = str ? UTF8ToString(str) : '';  } -function setPromptActive() { -	$('#prompt').classList.add('active') +function elemHasClass(sel, c) { +	return $(UTF8ToString(sel)).classList.contains(UTF8ToString(c));  } -function setPromptInactive() { -	$('#prompt').classList.remove('active') +function elemAddClass(sel, c) { +	$(UTF8ToString(sel)).classList.add(UTF8ToString(c));  } -function setPromptMsgL(ptr) { -	$('#prompt-msg-l').textContent = ptr ? UTF8ToString(ptr) : ''; +function elemRemoveClass(sel, c) { +	$(UTF8ToString(sel)).classList.remove(UTF8ToString(c));  } -function setPromptMsgR(ptr) { -	$('#prompt-msg-r').textContent = ptr ? UTF8ToString(ptr) : ''; +function elemToggleClass(sel, c) { +	$(UTF8ToString(sel)).classList.toggle(UTF8ToString(c));  } -function setPromptInput(ptr) { -	$('#prompt-input').textContent = ptr ? UTF8ToString(ptr) : ''; +function promptHandle(command, data) { +	const str_c = toCString(command); +	const str_d = data && toCString(data); +	_prompt_handle(str_c, str_d); + +	_free(str_c); +	if (str_d) _free(str_d);  }  function setKeypad(keypad) { @@ -68,22 +68,6 @@ function setKeypad(keypad) {  		e.style.display = e.id === keypad_id ? '' : 'none');  } -function isKeyActive(k) { -	return $(`#key-${UTF8ToString(k)}`).classList.contains('active'); -} - -function toggleKey(k) { -	$(`#key-${UTF8ToString(k)}`).classList.toggle('active'); -} - -function deactivateKey(k) { -	$(`#key-${UTF8ToString(k)}`).classList.remove('active'); -} - -function setKeyLabel(k, ptr) { -	$(`#key-${UTF8ToString(k)}`).textContent = UTF8ToString(ptr); -} -  function setPlayerActive(n) {  	$$('[id$=-info]').forEach(e =>  		e.classList[n && e.id == `p${n}-info` ? 'add' : 'remove']('active')); @@ -97,26 +81,6 @@ function hidePlayerInfo(n) {  	$(`#p${n}-info-inner`).style.visibility = 'hidden';  } -function updatePlayerName(n, ptr) { -	$(`#p${n}-name`).textContent = ptr ? UTF8ToString(ptr) : ''; -} - -function updatePlayerRem(n, ptr) { -	$(`#p${n}-rem`).textContent = ptr ? UTF8ToString(ptr) : ''; -} - -function updatePlayerSugg(n, ptr) { -	$(`#p${n}-sugg`).textContent = ptr ? UTF8ToString(ptr) : ''; -} - -function updatePlayerAvg(n, avg) { -	$(`#p${n}-avg`).textContent = avg.toFixed(2); -} - -function clearVisits() { -	$('#visits').textContent = ''; -} -  const POINT_CLASSES = [180, 140, 100, 60, 40, 20, 0];  function drawVisit(visit_no, p1_pts, p1_rem, p2_pts, p2_rem, p2_darts) {  	const e = $('#visits'); @@ -136,8 +100,10 @@ function drawVisit(visit_no, p1_pts, p1_rem, p2_pts, p2_rem, p2_darts) {  	e.scrollTop = e.scrollHeight;  } -function svgDrawElemv(layer, elemc, elemv, off_name, off_n_attrs, off_attr_names, -	off_attr_vals, off_content) { +function svgAppendElemv(sel, elemc, elemv, off_name, off_n_attrs, +	off_attr_names,	off_attr_vals, off_content) { +	target = $(UTF8ToString(sel)); +  	for (let ptr = elemv; ptr < elemv + 4*elemc; ptr += 4) {  		const struct = HEAP32[ptr>>2]; @@ -156,14 +122,10 @@ function svgDrawElemv(layer, elemc, elemv, off_name, off_n_attrs, off_attr_names  		const content = HEAP32[(struct + off_content)>>2];  		if (content) e.textContent = UTF8ToString(content); -		$(`#dartboard .${layer ? 'overlay' : 'base'}`).appendChild(e); +		target.appendChild(e);  	}  } -function svgClearPoints() { -	$('#dartboard .overlay').textContent = ''; -} -  function updateDelay(val) {  	$('#delay').value = val;  } diff --git a/web/web_control.c b/web/web_control.c index 25f2ccb..f44315f 100644 --- a/web/web_control.c +++ b/web/web_control.c @@ -40,7 +40,7 @@ void update_user_rem_from_pts(int pts)  EMSCRIPTEN_KEEPALIVE  void end_boat_visit(int rem, double avg)  { -	EM_ASM(svgClearPoints()); +	svg_clear_points();  	update_player_rem(2, rem);  	scoreboard_set_player_avg(2, avg);  	prompt_set_input(NULL); diff --git a/web/web_prompt.c b/web/web_prompt.c index 201bd7b..7607009 100644 --- a/web/web_prompt.c +++ b/web/web_prompt.c @@ -3,6 +3,7 @@  #include "web_match.h"  #include "web_scoreboard.h" +#include <stdio.h>  #include <stdlib.h>  #include <string.h> @@ -57,11 +58,14 @@ static inline void free_flushed_str(char *flushed, char *buffered)  void prompt_flush()  {  	if (buffered_str_changed(prompt_buffered.msgl, prompt_flushed.msgl)) -		EM_ASM({setPromptMsgL($0)}, prompt_buffered.msgl); +		EM_ASM({elemSetContent($0, $1)}, +			"#prompt-msg-l", prompt_buffered.msgl);  	if (buffered_str_changed(prompt_buffered.msgr, prompt_flushed.msgr)) -		EM_ASM({setPromptMsgR($0)}, prompt_buffered.msgr); +		EM_ASM({elemSetContent($0, $1)}, +			"#prompt-msg-r", prompt_buffered.msgr);  	if (buffered_str_changed(prompt_buffered.input, prompt_flushed.input)) -		EM_ASM({setPromptInput($0)}, prompt_buffered.input); +		EM_ASM({elemSetContent($0, $1)}, +			"#prompt-input", prompt_buffered.input);  	free_flushed_str(prompt_flushed.msgl, prompt_buffered.msgl);  	free_flushed_str(prompt_flushed.msgr, prompt_buffered.msgr); @@ -75,9 +79,9 @@ void set_prompt_mode(enum prompt_mode mode)  	pm = mode;  	if (pm != PM_DARTBOARD) -		EM_ASM(setPromptActive()); +		EM_ASM({elemAddClass($0, $1)}, "#prompt", "active");  	else -		EM_ASM(setPromptInactive()); +		EM_ASM({elemRemoveClass($0, $1)}, "#prompt", "active");  	EM_ASM({setKeypad($0)}, pm == PM_DARTBOARD ? "dartboard" :  		pm == PM_SELECT_MODE ? "select_mode" : "default"); @@ -88,8 +92,8 @@ void prompt_visit()  	set_prompt_mode(PM_VISIT);  	prompt_set_msgl("Enter points:");  	prompt_set_msgr(NULL); -	EM_ASM({setKeyLabel($0, $1)}, "submit", "OK"); -	EM_ASM({setKeyLabel($0, $1)}, "rem", "REMAINING"); +	EM_ASM({elemSetContent($0, $1)}, "#key-submit", "OK"); +	EM_ASM({elemSetContent($0, $1)}, "#key-rem", "REMAINING");  }  void prompt_bot_visit() @@ -104,8 +108,8 @@ void prompt_num_darts()  	set_prompt_mode(PM_NUM_DARTS);  	prompt_set_msgl("Darts needed?");  	prompt_set_msgr(NULL); -	EM_ASM({setKeyLabel($0, $1)}, "submit", "OK"); -	EM_ASM({setKeyLabel($0, $1)}, "rem", "REMAINING"); +	EM_ASM({elemSetContent($0, $1)}, "#key-submit", "OK"); +	EM_ASM({elemSetContent($0, $1)}, "#key-rem", "REMAINING");  }  void prompt_end_match() @@ -116,8 +120,8 @@ void prompt_end_match()  		state->mode == M_PVC && state->legs[1]->rem <= 0 ? "Bot wins. :(" :  			"You win! :)");  	prompt_set_msgr(NULL); -	EM_ASM({setKeyLabel($0, $1)}, "submit", "END MATCH"); -	EM_ASM({setKeyLabel($0, $1)}, "rem", "REMATCH"); +	EM_ASM({elemSetContent($0, $1)}, "#key-submit", "OK"); +	EM_ASM({elemSetContent($0, $1)}, "#key-rem", "REMATCH");  }  void prompt_select_mode() @@ -126,7 +130,7 @@ void prompt_select_mode()  		EM_ASM({hidePlayerInfo($0)}, pn);  		clear_player_info(pn);  	} -	EM_ASM(clearVisits()); +	EM_ASM({elemSetContent($0, $1)}, "#visits", NULL);  	set_prompt_mode(PM_SELECT_MODE);  	prompt_set_msgl("Select match mode:"); @@ -135,22 +139,28 @@ void prompt_select_mode()  bool is_key_active(char *k)  { -	return (EM_ASM_INT({return isKeyActive($0)}, k)); +	char sel[64]; +	sprintf(sel, "#key-%s", k); +	return EM_ASM_INT({return elemHasClass($0, $1)}, sel, "active");  }  void toggle_key(char *k)  { -	EM_ASM({toggleKey($0)}, k); +	char sel[64]; +	sprintf(sel, "#key-%s", k); +	EM_ASM({elemToggleClass($0, $1)}, sel, "active");  }  void deactivate_key(char *k)  { -	EM_ASM({deactivateKey($0)}, k); +	char sel[64]; +	sprintf(sel, "#key-%s", k); +	EM_ASM({elemRemoveClass($0, $1)}, sel, "active");  }  char *prompt_get()  { -	return (char *)EM_ASM_INT({return promptGet()}); +	return (char *)EM_ASM_INT({return elemGetContent($0)}, "#prompt-input");  }  void prompt_handle_pre(char *command) diff --git a/web/web_scoreboard.c b/web/web_scoreboard.c index 6be1cd4..34ee4c5 100644 --- a/web/web_scoreboard.c +++ b/web/web_scoreboard.c @@ -12,8 +12,7 @@  #include <emscripten/emscripten.h>  struct player_info { -	char *name, *rem, *sugg; -	double avg; +	char *name, *rem, *sugg, *avg;  };  struct player_info buffered_info[2], flushed_info[2]; @@ -46,7 +45,9 @@ void scoreboard_set_player_sugg(int pn, char *str)  void scoreboard_set_player_avg(int pn, double avg)  { -	buffered_info[pn-1].avg = avg; +	char *str = malloc(8); +	sprintf(str, "%.2f", avg); +	buffer_str(str, &buffered_info[pn-1].avg, flushed_info[pn-1].avg);  }  static inline bool buffered_str_changed(char *buffered, char *flushed) @@ -63,24 +64,38 @@ static inline void free_flushed_str(char *flushed, char *buffered)  void scoreboard_flush_player_info(int pn)  { +	char sel[64]; +	int len = sprintf(sel, "#p%d-", pn); +  	if (buffered_str_changed(buffered_info[pn-1].name, -			flushed_info[pn-1].name)) -		EM_ASM({updatePlayerName($0, $1)}, pn, buffered_info[pn-1].name); +			flushed_info[pn-1].name)) { +		strcpy(sel + len, "name"); +		EM_ASM({elemSetContent($0, $1)}, sel, buffered_info[pn-1].name); +	}  	if (buffered_str_changed(buffered_info[pn-1].rem, -			flushed_info[pn-1].rem)) -		EM_ASM({updatePlayerRem($0, $1)}, pn, buffered_info[pn-1].rem); +			flushed_info[pn-1].rem)) { +		strcpy(sel + len, "rem"); +		EM_ASM({elemSetContent($0, $1)}, sel, buffered_info[pn-1].rem); +	}  	if (buffered_str_changed(buffered_info[pn-1].sugg, -			flushed_info[pn-1].sugg)) -		EM_ASM({updatePlayerSugg($0, $1)}, pn, buffered_info[pn-1].sugg); +			flushed_info[pn-1].sugg)) { +		strcpy(sel + len, "sugg"); +		EM_ASM({elemSetContent($0, $1)}, sel, buffered_info[pn-1].sugg); +	} -	if (buffered_info[pn-1].avg != flushed_info[pn-1].avg) -		EM_ASM({updatePlayerAvg($0, $1)}, pn, buffered_info[pn-1].avg); +	if (buffered_str_changed(buffered_info[pn-1].avg, +			flushed_info[pn-1].avg)) { +		strcpy(sel + len, "avg"); +		EM_ASM({elemSetContent($0, $1)}, sel, buffered_info[pn-1].avg); +	}  	free_flushed_str(flushed_info[pn-1].name, buffered_info[pn-1].name);  	free_flushed_str(flushed_info[pn-1].rem, buffered_info[pn-1].rem);  	free_flushed_str(flushed_info[pn-1].sugg, buffered_info[pn-1].sugg); +	free_flushed_str(flushed_info[pn-1].avg, buffered_info[pn-1].avg); +  	flushed_info[pn-1] = buffered_info[pn-1];  } @@ -144,7 +159,7 @@ void clear_player_info(int pn)  void draw_visits()  { -	EM_ASM({clearVisits()}); +	EM_ASM({elemSetContent($0, $1)}, "#visits", NULL);  	char visit_no[10], p1_pts[10], p1_rem[10],  		p2_pts[10], p2_rem[10], p2_darts[100]; diff --git a/web/web_svg.c b/web/web_svg.c index 9b8f25d..6524754 100644 --- a/web/web_svg.c +++ b/web/web_svg.c @@ -206,10 +206,10 @@ int draw_numbers(int elemc, struct elem **elemv)  	return elemc;  } -void draw_elemv(int layer, int elemc, struct elem **elemv) +void append_elemv(char *sel, int elemc, struct elem **elemv)  { -	EM_ASM({svgDrawElemv($0, $1, $2, $3, $4, $5, $6, $7)}, -		layer, elemc, elemv, +	EM_ASM({svgAppendElemv($0, $1, $2, $3, $4, $5, $6, $7)}, +		sel, elemc, elemv,  		offsetof(struct elem, name), offsetof(struct elem, n_attrs),  		offsetof(struct elem, attr_names), offsetof(struct elem, attr_vals),  		offsetof(struct elem, content)); @@ -237,20 +237,26 @@ void svg_draw_board()  	elemc = draw_spider(elemc, elemv);  	elemc = draw_numbers(elemc, elemv); -	draw_elemv(0, elemc, elemv); +	append_elemv("#dartboard .base", elemc, elemv);  	for (int i = 0; i < elemc; ++i)  		free(elemv[i]);  	free(elemv);  } -void svg_draw_point(double x, double y) { +void svg_draw_point(double x, double y) +{  	struct elem *e = gen_circle(8, "#33f");  	elem_add_attr(e, "stroke", "#ff0");  	elem_add_attr(e, "stroke-width", "2");  	elem_add_attr_double(e, "cx", x);  	elem_add_attr_double(e, "cy", y); -	draw_elemv(1, 1, &e); +	append_elemv("#dartboard .overlay", 1, &e);  	elem_free(e);  } + +void svg_clear_points() +{ +	EM_ASM({elemSetContent($0, $1)}, "#dartboard .overlay", NULL); +} diff --git a/web/web_svg.h b/web/web_svg.h index aae0b0e..5fb80b1 100644 --- a/web/web_svg.h +++ b/web/web_svg.h @@ -3,5 +3,6 @@  void svg_draw_board();  void svg_draw_point(double x, double y); +void svg_clear_points();  #endif | 
