X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fcomponents%2FBoard.vue;h=1c259f9a28f292e78f62799870bd0d982be2f92b;hb=d8b1800bcec983faabc34bdb1057ef880488a160;hp=6a20d54bffe4bfb4b2d27731f7d9b7face122183;hpb=dfeb96ea90e880a2557cbb5953dbb7258c912283;p=vchess.git diff --git a/client/src/components/Board.vue b/client/src/components/Board.vue index 6a20d54b..1c259f9a 100644 --- a/client/src/components/Board.vue +++ b/client/src/components/Board.vue @@ -2,20 +2,19 @@ import { getSquareId, getSquareFromId } from "@/utils/squareId"; import { ArrayFun } from "@/utils/array"; import { store } from "@/store"; - export default { name: 'my-board', // Last move cannot be guessed from here, and is required to highlight squares // vr: object to check moves, print board... // userColor is left undefined for an external observer - props: ["vr","lastMove","analyze","orientation","userColor","vname"], + props: ["vr","lastMove","analyze","incheck","orientation","userColor","vname"], data: function () { return { possibleMoves: [], //filled after each valid click/dragstart choices: [], //promotion pieces, or checkered captures... (as moves) selectedPiece: null, //moving piece (or clicked piece) - incheck: [], start: {}, //pixels coordinates + id of starting square (click or drag) + currentSquare: null, settings: store.state.settings, }; }, @@ -42,6 +41,9 @@ export default { const squareWidth = (!!boardElt ? boardElt.offsetWidth / sizeY : 40); //arbitrary value (not relevant) + const offset = (!!boardElt + ? [boardElt.offsetTop, boardElt.offsetLeft] + : [0, 0]); const choices = h( 'div', { @@ -49,7 +51,8 @@ export default { 'class': { 'row': true }, style: { "display": (this.choices.length > 0 ? "block" : "none"), - "top": ((sizeY/2)*squareWidth+squareWidth/2) + "px", + "top": (offset[0] + (sizeY/2)*squareWidth-squareWidth/2) + "px", + "left": (offset[1] + squareWidth*(sizeY - this.choices.length)/2) + "px", "width": (this.choices.length * squareWidth) + "px", "height": squareWidth + "px", }, @@ -279,26 +282,30 @@ export default { e.preventDefault(); //disable native drag & drop if (!this.selectedPiece && e.target.classList.contains("piece")) { + let parent = e.target.parentNode; + // Mark selected square + this.currentSquare = parent; + this.currentSquare.classList.add("selected"); // Next few lines to center the piece on mouse cursor - let rect = e.target.parentNode.getBoundingClientRect(); + let rect = parent.getBoundingClientRect(); this.start = { x: rect.x + rect.width/2, y: rect.y + rect.width/2, - id: e.target.parentNode.id + id: parent.id }; this.selectedPiece = e.target.cloneNode(); this.selectedPiece.style.position = "absolute"; this.selectedPiece.style.top = 0; this.selectedPiece.style.display = "inline-block"; this.selectedPiece.style.zIndex = 3000; - const startSquare = getSquareFromId(e.target.parentNode.id); + const startSquare = getSquareFromId(parent.id); this.possibleMoves = []; const color = (this.analyze ? this.vr.turn : this.userColor); if (this.vr.canIplay(color,startSquare)) this.possibleMoves = this.vr.getPossibleMovesFrom(startSquare); // Next line add moving piece just after current image // (required for Crazyhouse reserve) - e.target.parentNode.insertBefore(this.selectedPiece, e.target.nextSibling); + parent.insertBefore(this.selectedPiece, e.target.nextSibling); } }, mousemove: function(e) { @@ -308,6 +315,12 @@ export default { // If there is an active element, move it around if (!!this.selectedPiece) { + // Mousemove => drag & drop, no need to keep initial square highlighted + if (!!this.currentSquare) + { + this.currentSquare.classList.remove("selected"); + this.currentSquare = null; + } const [offsetX,offsetY] = !!e.clientX ? [e.clientX,e.clientY] //desktop browser : [e.changedTouches[0].pageX, e.changedTouches[0].pageY]; //smartphone @@ -319,7 +332,7 @@ export default { if (!this.selectedPiece) return; e = e || window.event; - // Read drop target (or parentElement, parentNode... if type == "img") + // Read drop target (or iterate parentNode if type == "img") this.selectedPiece.style.zIndex = -3000; //HACK to find square from final coords const [offsetX,offsetY] = !!e.clientX ? [e.clientX,e.clientY] @@ -334,6 +347,12 @@ export default { // A click: selectedPiece and possibleMoves are already filled return; } + // Reset initial square color (if not mousemove: smartphone) + if (!!this.currentSquare) + { + this.currentSquare.classList.remove("selected"); + this.currentSquare = null; + } // OK: process move attempt let endSquare = getSquareFromId(landing.id); let moves = this.findMatchingMoves(endSquare); @@ -375,24 +394,6 @@ export default { // NOTE: no variants with reserve of size != 8 -div.board - float: left - height: 0 - display: inline-block - position: relative - -div.board8 - width: 12.5% - padding-bottom: 12.5% - -div.board10 - width: 10% - padding-bottom: 10% - -div.board11 - width: 9.09% - padding-bottom: 9.1% - .game width: 100% margin: 0 @@ -400,8 +401,8 @@ div.board11 cursor: pointer #choices - margin: 0 auto 0 auto - position: relative + margin: 0 + position: absolute z-index: 300 overflow-y: inherit background-color: rgba(0,0,0,0) @@ -415,22 +416,6 @@ div.board11 height: auto display: block -img.piece - width: 100% - -img.piece, img.mark-square - max-width: 100% - height: auto - display: block - -img.mark-square - opacity: 0.6 - width: 76% - position: absolute - top: 12% - left: 12% - opacity: .7 - img.ghost position: absolute opacity: 0.4 @@ -439,12 +424,12 @@ img.ghost .highlight background-color: #00cc66 !important -.in-shadow - filter: brightness(50%) - .incheck background-color: #cc3300 !important +.selected + background-color: #f7acf7 !important + .light-square.lichess background-color: #f0d9b5; .dark-square.lichess