chiark / gitweb /
raise seems to work
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 8 Jul 2020 01:51:03 +0000 (02:51 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 8 Jul 2020 01:51:03 +0000 (02:51 +0100)
src/bin/server.rs
src/global.rs
templates/script.ts

index d63b7f5b9ddfadbe3a965335c189e841b5498a9e..e8e0775cec66b939128ef7a98320318b89556593 100644 (file)
@@ -87,7 +87,7 @@ fn session(form : Json<SessionForm>) -> Result<Template,OE> {
 
     let mut pieces : Vec<_> = ig.gs.pieces.iter().collect();
 
-    pieces.sort_by_key(|(_,pr)| !pr.raised.0);
+    pieces.sort_by_key(|(_,pr)| pr.raised);
 
     for (gpid, pr) in pieces {
       let pri = PieceRenderInstructions {
@@ -329,7 +329,7 @@ impl ApiPieceOp for ApiPieceRaise {
         -> (PieceUpdateOp<()>, Vec<LogEntry>) {
     let pc = gs.pieces.byid_mut(piece).unwrap();
     pc.raised = gs.gen;
-    let update = PieceUpdateOp::Raise;
+    let update = PieceUpdateOp::Raise();
     (update, vec![])
   }
 }
index 4e6aee4c515b7f6b2a592f7cdee99e305e31a667..69f6aac779c323512d1c8e555ffab02f0c8d34a5 100644 (file)
@@ -55,32 +55,32 @@ impl PreparedUpdate {
 
 #[derive(Debug,Serialize)]
 pub enum PieceUpdateOp<NS> {
-  Delete,
+  Delete(),
   Insert(NS),
   Modify(NS),
   Move(Pos),
-  Raise,
+  Raise(),
 }
 impl<NS> PieceUpdateOp<NS> {
   pub fn new_state(&self) -> Option<&NS> {
     use PieceUpdateOp::*;
     match self {
-      Delete => None,
+      Delete() => None,
       Insert(ns) => Some(ns),
       Modify(ns) => Some(ns),
       Move(_) => None,
-      Raise => None,
+      Raise() => None,
     }
   }
   pub fn map_new_state<NS2,F: FnOnce(NS) -> NS2>(self, f:F)
                             -> PieceUpdateOp<NS2> {
     use PieceUpdateOp::*;
     match self {
-      Delete => Delete,
+      Delete() => Delete(),
       Insert(ns) => Insert(f(ns)),
       Modify(ns) => Modify(f(ns)),
       Move(pos) => Move(pos),
-      Raise => Raise,
+      Raise() => Raise(),
     }
   }
 }      
index f8b670daae62ad575f2bc7c1f1c2337a56cad4e4..da9ee8148c584ba40807c4fa4674568dbbe5c646 100644 (file)
@@ -232,6 +232,14 @@ function drag_mouseup(e: MouseEvent) {
   let dragraise = +pelem.dataset.dragraise!;
   console.log('CHECK RAISE ', dragraise, dragraise*dragraise, ddr2);
   if (dragraise > 0 && ddr2 >= dragraise*dragraise) {
+    let marker = piece_element('raisemarker',piece);
+    if (marker == null) {
+      marker = document.createElementNS(svg_ns,'defs')! as
+                   SVGGraphicsElement;
+      marker.setAttributeNS(null,'id','raisemarker'+piece);
+      drag_uelem!.parentNode!.insertBefore(marker, drag_uelem!);
+    }
+    raise_piece(drag_uelem!);
     api_piece(api, "raise", piece, drag_uelem!, { });
   }
   if (dragging == DRAGGING.MAYBE_UNGRAB ||
@@ -307,6 +315,16 @@ pieceops.Modify = <PieceHandler>function
   console.log('MODIFY DONE');
 }
 
+function raise_piece(uelem: SVGGraphicsElement) {
+  uelem.parentElement!.appendChild(uelem);
+}
+
+pieceops.Raise = <PieceHandler>function
+(piece, info: { } ) {
+  var uelem = piece_element('use',piece)!;
+  raise_piece(uelem);
+}
+
 pieceops.Move = <PieceHandler>function
 (piece, info: Pos ) {
   var uelem = piece_element('use',piece)!;
@@ -317,9 +335,14 @@ pieceops.Move = <PieceHandler>function
 
 messages.Recorded = <MessageHandler>function
 (j: { piece: PieceId, cseq: ClientSeq, gen: Generation } ) {
-  var uelem = document.getElementById('use'+j.piece)!;
+  let piece = j.piece;
+  var uelem = document.getElementById('use'+piece)!;
   if (uelem.dataset.cseq != null && j.cseq >= +uelem.dataset.cseq) {
     delete uelem.dataset.cseq;
+    let marker = piece_element('raisemarker',piece);
+    if (marker != null) {
+      marker.remove();
+    }
   }
   gen = j.gen;
 }
@@ -327,6 +350,11 @@ messages.Recorded = <MessageHandler>function
 function uelem_checkconflict(piece: PieceId, uelem: SVGGraphicsElement) {
   if (uelem.dataset.cseq == null) { return; }
   delete uelem.dataset.cseq;
+  let marker = piece_element('raisemarker',piece);
+  if (marker != null) {
+    uelem.parentElement!.insertBefore(marker,uelem);
+    marker.remove();
+  }
   add_log_message('Conflict! - simultaneous update');
 }