From bc1e1f2adf7de1efdf29933a666bcce4214e132f Mon Sep 17 00:00:00 2001
From: Benjamin Auder <benjamin.auder@somewhere>
Date: Sun, 25 Apr 2021 11:05:05 +0200
Subject: [PATCH] Experimental board size auto-adjust

---
 client/src/components/BaseGame.vue |  5 +++++
 client/src/components/Board.vue    |  3 +++
 client/src/components/MoveList.vue | 25 +++++++++++--------------
 client/src/variants/Pacosako.js    |  4 ++++
 4 files changed, 23 insertions(+), 14 deletions(-)

diff --git a/client/src/components/BaseGame.vue b/client/src/components/BaseGame.vue
index 4b6529ff..ee3bea18 100644
--- a/client/src/components/BaseGame.vue
+++ b/client/src/components/BaseGame.vue
@@ -22,6 +22,7 @@ div#baseGame
         :incheck="incheck"
         @play-move="play"
         @click-square="clickSquare"
+        @rendered="adjustSize"
       )
       #turnIndicator(v-if="showTurn") {{ turn }}
       #controls.button-group
@@ -43,6 +44,7 @@ div#baseGame
       p#fenAnalyze(v-show="showFen") {{ (!!vr ? vr.getFen() : "") }}
     #movesList
       MoveList(
+        ref="moveslist"
         :show="showMoves"
         :canAnalyze="canAnalyze"
         :canDownload="allowDownloadPGN"
@@ -206,6 +208,9 @@ export default {
       if (e.deltaY < 0) this.undo();
       else if (e.deltaY > 0) this.play();
     },
+    adjustSize: function() {
+      this.$refs["moveslist"].adjustBoard("vertical");
+    },
     redrawBoard: function() {
       this.$refs["board"].re_setDrawings();
     },
diff --git a/client/src/components/Board.vue b/client/src/components/Board.vue
index 799185e4..a871dc34 100644
--- a/client/src/components/Board.vue
+++ b/client/src/components/Board.vue
@@ -31,6 +31,7 @@ export default {
       circles: {}, //object of squares' ID --> true (TODO: use a set?)
       click: "",
       clickTime: 0,
+      initialized: 0,
       settings: store.state.settings
     };
   },
@@ -463,6 +464,8 @@ export default {
         }
       };
     }
+    if (this.initialized == 1) this.$emit("rendered");
+    if (this.initialized <= 1) this.initialized++;
     return (
       h(
         "div",
diff --git a/client/src/components/MoveList.vue b/client/src/components/MoveList.vue
index 26c54719..e360cb0d 100644
--- a/client/src/components/MoveList.vue
+++ b/client/src/components/MoveList.vue
@@ -79,22 +79,16 @@ export default {
     document.getElementById("adjuster")
       .addEventListener("click", processModalClick);
     // Take full width on small screens:
-    let boardSize =
-      window.innerWidth >= 768
-        ? 0.7 * Math.min(window.innerWidth, window.innerHeight)
-        : window.innerWidth;
+    const winBound = Math.min(window.innerWidth, window.innerHeight);
+    let boardSize = (window.innerWidth >= 768 ? 0.7 : 1.0) * winBound;
     const movesWidth = window.innerWidth >= 768 ? 280 : 0;
     document.getElementById("boardContainer").style.width = boardSize + "px";
     let gameContainer = document.getElementById("gameContainer");
     gameContainer.style.width = boardSize + movesWidth + "px";
-    document.getElementById("boardSize").value =
-      (boardSize * 100) / (window.innerWidth - movesWidth);
+    const maxWidth =
+      Math.min(window.innerHeight, window.innerWidth - movesWidth);
+    document.getElementById("boardSize").value = (boardSize * 100) / maxWidth;
     window.addEventListener("resize", () => this.adjustBoard());
-    if ("ontouchstart" in window) {
-      // TODO: find something better than next height adjustment...
-      // maybe each variant could give its ratio (?!)
-      setTimeout( () => { this.adjustBoard("vertical"); }, 1000);
-    }
   },
   beforeDestroy: function() {
     window.removeEventListener("resize", this.adjustBoard);
@@ -182,11 +176,14 @@ export default {
       }
       else {
         const k = document.getElementById("boardSize").value;
-        const minBoardWidth = 160; //TODO: these 160 and 280 are arbitrary...
+        // TODO: these 160 and 280 are arbitrary...
+        const minBoardWidth =
+          (window.innerWidth <= 767 || "ontouchstart" in window) ? 160 : 240;
         // Value of 0 is board min size; 100 is window.width [- movesWidth]
+        const maxWidth =
+          Math.min(window.innerHeight, window.innerWidth - movesWidth);
         const boardSize =
-          minBoardWidth +
-          (k * (window.innerWidth - (movesWidth + minBoardWidth))) / 100;
+          minBoardWidth + (k * (maxWidth - minBoardWidth)) / 100;
         boardContainer.style.width = boardSize + "px";
         gameContainer.style.width = boardSize + movesWidth + "px";
         this.$emit("redraw-board");
diff --git a/client/src/variants/Pacosako.js b/client/src/variants/Pacosako.js
index ddf2fab8..70121c9d 100644
--- a/client/src/variants/Pacosako.js
+++ b/client/src/variants/Pacosako.js
@@ -16,6 +16,10 @@ export class PacosakoRules extends ChessRules {
     };
   }
 
+  static AbbreviateOptions(opts) {
+    return (opts["pacoplay"] ? "PP" : "");
+  }
+
   static get IMAGE_EXTENSION() {
     return ".png";
   }
-- 
2.44.0