From: Ian Jackson Date: Mon, 6 Jul 2020 17:58:40 +0000 (+0100) Subject: wip lens move etc. X-Git-Tag: otter-0.2.0~1419 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=c162c3575aa62f46b3ddc943e0cdddc7920f58a7;p=otter.git wip lens move etc. --- diff --git a/src/bin/server.rs b/src/bin/server.rs index 8b4bddd8..837b84c6 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -124,7 +124,7 @@ struct ApiPiece { trait ApiPieceOp : Debug { #[throws(GameError)] fn op(&self, gs: &mut GameState, player: PlayerId, piece: PieceId, - lens: &dyn Lens) + lens: &dyn Lens /* used for LogEntry and PieceId but not Pos */) -> (PieceUpdateOp<()>, Vec); } @@ -133,6 +133,7 @@ trait Lens { -> PieceRenderInstructions; fn svg_pri(&self, piece: PieceId, pc: &PieceRecord, player: PlayerId) -> PieceRenderInstructions; + fn massage_prep_piecestate(&self, ns : &mut PreparedPieceState); fn decode_visible_pieceid(&self, vpiece: VisiblePieceId, player: PlayerId) -> PieceId; } @@ -153,6 +154,7 @@ impl Lens for TransparentLens { let kd : slotmap::KeyData = vpiece.into(); PieceId::from(kd) } + fn massage_prep_piecestate(&self, _ns : &mut PreparedPieceState) { } } #[throws(OE)] @@ -201,7 +203,9 @@ fn api_piece_op(form : Json>) let pri_for_all = lens.svg_pri(piece,pc,Default::default()); let update = update.map_new_state(|_|{ - pc.prep_piecestate(&pri_for_all) + let mut ns = pc.prep_piecestate(&pri_for_all); + lens.massage_prep_piecestate(&mut ns); + ns }); let mut us = Vec::with_capacity(1 + logents.len()); @@ -299,16 +303,23 @@ impl ApiPieceOp for ApiPieceUngrab { } #[derive(Debug,Serialize,Deserialize)] -struct ApiMove { - t : String, - p : VisiblePieceId, - l : Pos, -} +struct ApiPieceMove (Pos); #[post("/_/api/m", format="json", data="
")] #[throws(OE)] -fn api_move(form : Json) -> impl response::Responder<'static> { - eprintln!("API {:?}", &form); - "" +fn api_move(form : Json>) -> impl response::Responder<'static> { + api_piece_op(form) +} +impl ApiPieceOp for ApiPieceMove { + #[throws(GameError)] + fn op(&self, gs: &mut GameState, _: PlayerId, piece: PieceId, + _lens: &dyn Lens) + -> (PieceUpdateOp<()>, Vec) { + let pc = gs.pieces.byid_mut(piece).unwrap(); + + pc.pos = self.0; + let update = PieceUpdateOp::Move(self.0); + (update, vec![]) + } } #[get("/_/updates//")] diff --git a/templates/script.js b/templates/script.js index 1b1ab39a..9f888727 100644 --- a/templates/script.js +++ b/templates/script.js @@ -96,10 +96,10 @@ function api_posted() { api_check(); } -function api_piece(meth, piece, pelem, op) { +function api_piece(f, meth, piece, pelem, op) { cseq += 1; pelem.dataset.cseq = cseq; - api(meth, { + f(meth, { ctoken : ctoken, piece : piece, gen : gen, @@ -138,7 +138,7 @@ function drag_mousedown(e) { } else { dragging = DRAGGING.MAYBE_GRAB; pelem = set_grab(drag_uelem, piece, us); - api_piece('grab', piece, pelem, { }); + api_piece(api, 'grab', piece, pelem, { }); } window.addEventListener('mousemove', drag_mousemove, true); @@ -186,7 +186,7 @@ function drag_mousemove(e) { drag_uelem.setAttributeNS(null, "x", x); drag_uelem.setAttributeNS(null, "y", y); //console.log(drag_uelem); - api_delay('m',{ + api_piece(api_delay ('m',{ t : token, p : drag_uelem.dataset.piece, l : [x, y], @@ -202,7 +202,7 @@ function drag_mouseup(e) { dragging == (DRAGGING.MAYBE_GRAB | DRAGGING.YES)) { piece = drag_uelem.dataset.piece; var pelem = set_ungrab(drag_uelem, piece); - api_piece('ungrab', drag_uelem.dataset.piece, pelem, { }); + api_piece(f, 'ungrab', drag_uelem.dataset.piece, pelem, { }); } drag_cancel(e); }