]> git.sesse.net Git - remoteglot/blobdiff - www/js/remoteglot.js
Keep track of whether the board is animating (not used for anything yet).
[remoteglot] / www / js / remoteglot.js
index b2b80ebc672c4a9c6b4ce558469c9963817bdccc..da9f70a17f49522d464f8ba6236d47beaeccf8c1 100644 (file)
@@ -20,6 +20,9 @@ var backend_url = "/analysis.pl";
 /** @type {window.ChessBoard} @private */
 var board = null;
 
+/** @type {boolean} @private */
+var board_is_animating = false;
+
 /**
  * The most recent analysis data we have from the server
  * (about the most recent position).
@@ -119,9 +122,7 @@ var fen = null;
 
 /** @typedef {{
  *    start_fen: string,
- *    uci_pv: Array.<string>,
  *    pretty_pv: Array.<string>,
- *    line_num: number
  * }} DisplayLine
  */
 
@@ -218,7 +219,7 @@ var request_update = function() {
 
                possibly_play_sound(current_analysis_data, new_data);
                current_analysis_data = new_data;
-               update_board(current_analysis_data, displayed_analysis_data);
+               update_board();
                update_num_viewers(num_viewers);
 
                // Next update.
@@ -572,7 +573,6 @@ var add_pv = function(fen, pretty_pv, move_num, toplay, opt_limit, opt_showlast)
        display_lines.push({
                start_fen: fen,
                pretty_pv: pretty_pv,
-               line_number: display_lines.length
        });
        return print_pv(display_lines.length - 1, pretty_pv, move_num, toplay, opt_limit, opt_showlast);
 }
@@ -723,6 +723,9 @@ var update_refutation_lines = function() {
                $("#sortbyscore0").html("<strong>Move</strong>");
                $("#sortbyscore1").html("<a href=\"javascript:resort_refutation_lines(true)\">Score</a>");
        }
+
+       // Update the move highlight, as we've rewritten all the HTML.
+       update_move_highlight();
 }
 
 /**
@@ -795,12 +798,11 @@ var possibly_switch_game_from_hash = function() {
        }
 }
 
-/**
- * @param {Object} data
- * @param {?Object} display_data
+/** Update all the HTML on the page, based on current global state.
  */
-var update_board = function(current_data, display_data) {
-       var data = display_data || current_data;
+var update_board = function() {
+       var data = displayed_analysis_data || current_analysis_data;
+       var current_data = current_analysis_data;  // Convenience alias.
 
        display_lines = [];
 
@@ -880,7 +882,7 @@ var update_board = function(current_data, display_data) {
        }
 
        var last_move;
-       if (display_data) {
+       if (displayed_analysis_data) {
                // Displaying some non-current position, pick out the last move
                // from the history. This will work even if the fetch failed.
                last_move = format_halfmove_with_number(
@@ -933,6 +935,7 @@ var update_board = function(current_data, display_data) {
 
        if (data['failed']) {
                $("#score").text("No analysis for this move");
+               $("#pvtitle").text("PV:");
                $("#pv").empty();
                $("#searchstats").html("&nbsp;");
                $("#refutationlines").empty();
@@ -942,6 +945,7 @@ var update_board = function(current_data, display_data) {
                update_refutation_lines();
                clear_arrows();
                update_displayed_line();
+               update_move_highlight();
                return;
        }
 
@@ -978,6 +982,7 @@ var update_board = function(current_data, display_data) {
        update_displayed_line();
 
        // Print the PV.
+       $("#pvtitle").text("PV:");
        $("#pv").html(add_pv(data['position']['fen'], data['pv_pretty'], data['position']['move_num'], data['position']['toplay']));
 
        // Update the PV arrow.
@@ -1332,10 +1337,10 @@ var show_line = function(line_num, move_num) {
                        // TODO: Support exiting to history position if we are in an
                        // analysis line of a history position.
                        displayed_analysis_data = null;
-                       update_board(current_analysis_data, displayed_analysis_data);
+                       update_board();
                }
        } else {
-               current_display_line = display_lines[line_num];
+               current_display_line = jQuery.extend({}, display_lines[line_num]);  // Shallow clone.
                current_display_move = move_num;
        }
        current_display_line_is_history = (line_num == 0);
@@ -1343,6 +1348,7 @@ var show_line = function(line_num, move_num) {
        update_historic_analysis();
        update_displayed_line();
        update_board_highlight();
+       update_move_highlight();
        redraw_arrows();
 }
 window['show_line'] = show_line;
@@ -1353,6 +1359,7 @@ var prev_move = function() {
        }
        update_historic_analysis();
        update_displayed_line();
+       update_move_highlight();
 }
 window['prev_move'] = prev_move;
 
@@ -1362,6 +1369,7 @@ var next_move = function() {
        }
        update_historic_analysis();
        update_displayed_line();
+       update_move_highlight();
 }
 window['next_move'] = next_move;
 
@@ -1371,7 +1379,7 @@ var update_historic_analysis = function() {
        }
        if (current_display_move == current_display_line.pretty_pv.length - 1) {
                displayed_analysis_data = null;
-               update_board(current_analysis_data, displayed_analysis_data);
+               update_board();
        }
 
        // Fetch old analysis for this line if it exists.
@@ -1383,14 +1391,14 @@ var update_historic_analysis = function() {
                url: filename
        }).done(function(data, textstatus, xhr) {
                displayed_analysis_data = data;
-               update_board(current_analysis_data, displayed_analysis_data);
+               update_board();
        }).fail(function(jqXHR, textStatus, errorThrown) {
                if (textStatus === "abort") {
                        // Aborted because we are switching backends. Don't do anything;
                        // we will already have been cleared.
                } else {
                        displayed_analysis_data = {'failed': true};
-                       update_board(current_analysis_data, displayed_analysis_data);
+                       update_board();
                }
        });
 }
@@ -1430,10 +1438,37 @@ var update_imbalance = function(fen) {
        $('#blackimbalance').html(black_imbalance);
 }
 
-var update_displayed_line = function() {
+/** Mark the currently selected move in red.
+ */
+var update_move_highlight = function() {
        if (highlighted_move !== null) {
                highlighted_move.removeClass('highlight'); 
        }
+       if (current_display_line) {
+               // See if the current displayed line is identical to any of the ones
+               // we have on screen. (It might not be if e.g. the analysis reloaded
+               // since we started looking.)
+               for (var i = 0; i < display_lines.length; ++i) {
+                       var line = display_lines[i];
+                       if (current_display_line.start_fen !== line.start_fen) continue;
+                       if (current_display_line.pretty_pv.length !== line.pretty_pv.length) continue;
+                       var ok = true;
+                       for (var j = 0; j < line.pretty_pv.length; ++j) {
+                               if (current_display_line.pretty_pv[j] !== line.pretty_pv[j]) {
+                                       ok = false;
+                                       break;
+                               }
+                       }
+                       if (ok) {
+                               highlighted_move = $("#automove" + i + "-" + current_display_move);
+                               highlighted_move.addClass('highlight');
+                               break;
+                       }
+               }
+       }
+}
+
+var update_displayed_line = function() {
        if (current_display_line === null) {
                $("#linenav").hide();
                $("#linemsg").show();
@@ -1456,11 +1491,11 @@ var update_displayed_line = function() {
                $("#nextmove").html("<a href=\"javascript:next_move();\">Next</a></span>");
        }
 
-       highlighted_move = $("#automove" + current_display_line.line_number + "-" + current_display_move);
-       highlighted_move.addClass('highlight'); 
-
        var hiddenboard = chess_from(current_display_line.start_fen, current_display_line.pretty_pv, current_display_move);
+       board_is_animating = true;
+       var old_fen = board.fen();
        board.position(hiddenboard.fen());
+       if (board.fen() === old_fen) board_is_animating = false;
        update_imbalance(hiddenboard.fen());
 }
 
@@ -1538,7 +1573,9 @@ var init = function() {
        }
 
        // Create board.
-       board = new window.ChessBoard('board', 'start');
+       board = new window.ChessBoard('board', {
+               onMoveEnd: function() { board_is_animating = false; }
+       });
 
        request_update();
        $(window).resize(function() {