From 1703fb8651c702fe849b067a93aabb11ae0fa7e3 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Mon, 12 Apr 2021 19:25:21 +0100 Subject: [PATCH] js: Break out mouse_predicate Signed-off-by: Ian Jackson --- templates/script.ts | 68 +++++++++++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 27 deletions(-) diff --git a/templates/script.ts b/templates/script.ts index a1ec969c..40c66248 100644 --- a/templates/script.ts +++ b/templates/script.ts @@ -847,6 +847,43 @@ function mouse_clicked_one(piece: PieceId): MouseFindClicked { return { clicked: [piece], held, pinned }; } +function mouse_find_predicate( + wanted: number | null, + predicate: (p: PieceInfo) => boolean +): MouseFindClicked { + let clicked: PieceId[]; + let held; + let pinned; + + clicked = []; + let uelem = defs_marker; + while (wanted == null || clicked.length < wanted) { + let i = clicked.length; + uelem = uelem.previousElementSibling as any; + if (uelem == pieces_marker) { + add_log_message(`Not enough pieces! Stopped after ${i}.`); + return null; + } + let piece = uelem.dataset.piece!; + let p = pieces[piece]; + if (!predicate(p)) { + continue; + } + if (i > 0) { + if (p.pinned != pinned || + p.held != held) { + add_log_message(`Mixed pinned/held states! Stopped after ${i}`); + return null; + } + } + clicked.push(piece); + pinned = p.pinned; + held = p.held; + } + if (clicked.length == 0) return null; + else return { clicked, held: held!, pinned: pinned! }; +} + function mouse_find_clicked(e: MouseEvent, target: SVGGraphicsElement, piece: PieceId): MouseFindClicked { @@ -872,33 +909,10 @@ function mouse_find_clicked(e: MouseEvent, target: SVGGraphicsElement, } else { // special_count > 0 let clickpos = mouseevent_pos(e); - clicked = []; - let uelem = defs_marker; - while (clicked.length < special_count) { - let i = clicked.length; - uelem = uelem.previousElementSibling as any; - if (uelem == pieces_marker) { - add_log_message(`Not enough pieces! Stopped after ${i}.`); - return null; - } - let piece = uelem.dataset.piece!; - let p = pieces[piece]; - if (!p_bbox_contains(p, clickpos)) { - continue; - } - if (i > 0) { - if (p.pinned != pinned || - p.held != held) { - add_log_message(`Mixed pinned/held states! Stopped after ${i}`); - return null; - } - } - clicked.push(piece); - pinned = p.pinned; - held = p.held; - } - held = held!; - pinned = pinned!; + return mouse_find_predicate( + special_count, + function(p) { return p_bbox_contains(p, clickpos); } + ) } return { clicked, held, pinned }; -- 2.30.2