chiark / gitweb /
new ancillaries
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 12 Jul 2020 17:47:45 +0000 (18:47 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 12 Jul 2020 17:47:45 +0000 (18:47 +0100)
src/gamestate.rs
templates/script.ts

index 3be5c77176a7e8f535157aa061c0461edf29bbfd..b6ea93791ff41875d6f49714ba97fa03b87e91d6 100644 (file)
@@ -148,12 +148,8 @@ impl PieceState {
     pr.p.svg_piece(&mut defs, &pri)?;
     write!(defs, r##"</g>"##)?;
     write!(defs,
-           r##"<path id="select{}" stroke="black" fill="none" d="{}"/>"##,
+           r##"<path id="surround{}" d="{}"/>"##,
            pri.id, pr.p.surround_path(&pri)?)?;
-    write!(defs,
-           r##"<path id="halo{}" stroke="yellow" stroke-width="2px" fill="none" d="{}"/>"##,
-           pri.id,
-           pr.p.surround_path(&pri)?)?;
     pr.p.svg_x_defs(&mut defs, &pri)?;
     defs
   }
index f3dc7f9a352c67d148ac5b896d99c895d60e3ebe..1a9212f8f5960a1dcfa00bf7be2aa570828adb4d 100644 (file)
@@ -147,10 +147,7 @@ function api_piece(f: (meth: string, payload: Object) => void,
                   op: Object) {
   cseq += 1;
   p.cseq = cseq;
-  if (halo == piece) {
-    piece_undisplay_ancillary(p, "#halo"+halo);
-    halo = null;
-  }
+  if (halo == piece) { clear_halo(); }
   f(meth, {
     ctoken : ctoken,
     piece : piece,
@@ -224,24 +221,31 @@ function drag_mousedown(e : MouseEvent) {
 
 function set_grab(piece: PieceId, p: PieceInfo, owner: PlayerId) {
   p.held = owner;
-  display_grab(piece,p);
-}
-function display_grab(piece: PieceId, p: PieceInfo) {
-  piece_undisplay_grab(piece, p);
-  var nelem = document.createElementNS(svg_ns,'use');
-  nelem.setAttributeNS(null,'href','#select'+piece);
-  let da = players[p.held!]!.dasharray;
-  nelem.setAttributeNS(null,'stroke-dasharray',da);
-  p.pelem.appendChild(nelem);
+  redisplay_ancillaries(piece,p);
 }
 function set_ungrab(piece: PieceId, p: PieceInfo) {
   p.held = null;
-  piece_undisplay_grab(piece,p);
+  redisplay_ancillaries(piece,p);
 }
-function piece_undisplay_grab(piece: PieceId, p: PieceInfo) {
-  piece_undisplay_ancillary(p, "#select"+piece);
+function clear_halo() {
+  let piece = halo;
+  if (piece == null) { return }
+  let p = pieces[piece]!;
+  halo = null;
+  redisplay_ancillaries(piece,p);
+}
+
+function ancillary_node(piece: PieceId, stroke: string): SVGGraphicsElement {
+  var nelem = document.createElementNS(svg_ns,'use');
+  nelem.setAttributeNS(null,'href','#surround'+piece);
+  nelem.setAttributeNS(null,'stroke',stroke);
+  nelem.setAttributeNS(null,'fill','none');
+  return nelem as any;
 }
-function piece_undisplay_ancillary(p: PieceInfo, href: string) {
+
+function redisplay_ancillaries(piece: PieceId, p: PieceInfo) {
+  let href = '#surround'+piece;
+
   for (let celem = p.pelem.firstElementChild;
        celem != null;
        celem = celem.nextElementSibling) {
@@ -252,6 +256,20 @@ function piece_undisplay_ancillary(p: PieceInfo, href: string) {
       return;
     }
   }
+
+  if (piece == halo) {
+    let nelem = ancillary_node(piece, 'yellow');
+    if (p.held != null) {
+      nelem.setAttributeNS(null,'stroke-width','3px');
+    }
+    p.pelem.prepend(nelem);
+  }
+  if (p.held != null) {
+    let da = players[p.held!]!.dasharray;
+    let nelem = ancillary_node(piece, 'black');
+    nelem.setAttributeNS(null,'stroke-dasharray',da);
+    p.pelem.appendChild(nelem);
+  }
 }
 
 function drag_mousemove(e: MouseEvent) {
@@ -360,14 +378,13 @@ pieceops.Modify = <PieceHandler>function
   p.pelem= piece_element('piece',piece)!;
   p.uelem.setAttributeNS(null, "x", info.pos[0]+"");
   p.uelem.setAttributeNS(null, "y", info.pos[1]+"");
-  if (halo == piece) { halo = null }
-  piece_checkconflict(piece,p);
-  if (info.held == null) {
-    set_ungrab(piece,p);
-  } else {
-    set_grab(piece,p, info.held);
-  }
-  // xxx handle z
+  p.held = info.held;
+  piece_set_zlevel(piece,p, (oldtop_piece)=>{
+    p.z  = info.z;
+    p.zg = info.zg;
+  });
+  piece_checkconflict_nrda(piece,p);
+  redisplay_ancillaries(piece,p);
   console.log('MODIFY DONE');
 }
 
@@ -410,14 +427,14 @@ function piece_z_before(a: PieceInfo, b: PieceInfo) {
 
 pieceops.Move = <PieceHandler>function
 (piece,p, info: Pos ) {
-  piece_checkconflict(piece,p);
+  if (piece_checkconflict_nrda(piece,p))
+    redisplay_ancillaries(piece,p);
   p.uelem.setAttributeNS(null, "x", info[0]+"");
   p.uelem.setAttributeNS(null, "y", info[1]+"");
 }
 
 pieceops.SetZLevel = <PieceHandler>function
 (piece,p, info: { z: number, zg: Generation }) {
-  let uelem = piece_element('use',piece)!;
   piece_set_zlevel(piece,p, (oldtop_piece)=>{
     let oldtop_p = pieces[oldtop_piece]!;
     p.z  = info.z;
@@ -442,22 +459,18 @@ messages.Recorded = <MessageHandler>function
   gen = j.gen;
 }
 
-function piece_checkconflict(piece: PieceId, p: PieceInfo) {
+function piece_checkconflict_nrda(piece: PieceId, p: PieceInfo): boolean {
+  if (p.cseq != null) {
+    p.cseq = null;
+    add_log_message('Conflict! - simultaneous update');
+  }
+
   if (halo != piece) {
-    if (halo != null) {
-      console.log('UNHALOING',halo);
-      piece_undisplay_ancillary(pieces[halo]!, "#halo"+halo);
-    }
-    console.log('HALOING',piece);
+    clear_halo();
     halo = piece;
-    var nelem = document.createElementNS(svg_ns,'use');
-    nelem.setAttributeNS(null,'href','#halo'+piece);
-    p.pelem.prepend(nelem);
+    return true;
   }
-
-  if (p.cseq == null) { return; }
-  p.cseq = null;
-  add_log_message('Conflict! - simultaneous update');
+  return false;
 }
 
 function test_swap_stack() {
@@ -494,7 +507,7 @@ function startup() {
     p.pelem = piece_element('piece',piece);
     delete uelem.dataset.info;
     pieces[piece] = p;
-    if (p.held != null) display_grab(piece,p);
+    redisplay_ancillaries(piece,p);
   }
 
   var es = new EventSource("/_/updates/"+ctoken+'/'+gen);