X-Git-Url: https://git.sesse.net/?p=remoteglot;a=blobdiff_plain;f=www%2Fjs%2Fremoteglot.js;h=8b16f7c3a8d8fc51a07bbbb660c42cb11f74646c;hp=33ae193cbe42ccc51696060d666e6c5da8b8dd9a;hb=5dbc2990d8211d8422b474a69b0ea379e6fe198e;hpb=b41084f89311bcd25493642953eb675432e2bb63 diff --git a/www/js/remoteglot.js b/www/js/remoteglot.js index 33ae193..8b16f7c 100644 --- a/www/js/remoteglot.js +++ b/www/js/remoteglot.js @@ -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., * pretty_pv: Array., - * 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. @@ -561,31 +562,35 @@ var thousands = function(x) { } /** - * @param {!string} fen + * @param {!string} start_fen * @param {Array.} pretty_pv * @param {number} move_num * @param {!string} toplay * @param {number=} opt_limit * @param {boolean=} opt_showlast */ -var add_pv = function(fen, pretty_pv, move_num, toplay, opt_limit, opt_showlast) { +var add_pv = function(start_fen, pretty_pv, move_num, toplay, start_display_move_num, opt_limit, opt_showlast) { display_lines.push({ - start_fen: fen, + start_fen: start_fen, pretty_pv: pretty_pv, - line_number: display_lines.length + move_num: parseInt(move_num), + toplay: toplay, + start_display_move_num: start_display_move_num, }); - return print_pv(display_lines.length - 1, pretty_pv, move_num, toplay, opt_limit, opt_showlast); + return print_pv(display_lines.length - 1, opt_limit, opt_showlast); } /** * @param {number} line_num - * @param {Array.} pretty_pv - * @param {number} move_num - * @param {!string} toplay * @param {number=} opt_limit * @param {boolean=} opt_showlast */ -var print_pv = function(line_num, pretty_pv, move_num, toplay, opt_limit, opt_showlast) { +var print_pv = function(line_num, opt_limit, opt_showlast) { + var display_line = display_lines[line_num]; + var pretty_pv = display_line.pretty_pv; + var move_num = display_line.move_num; + var toplay = display_line.toplay; + var pv = ''; var i = 0; if (opt_limit && opt_showlast && pretty_pv.length > opt_limit) { @@ -643,11 +648,11 @@ var update_history = function() { if (display_lines[0] === null || display_lines[0].pretty_pv.length == 0) { $("#history").html("No history"); } else if (truncate_display_history) { - $("#history").html(print_pv(0, display_lines[0].pretty_pv, 1, 'W', 8, true)); + $("#history").html(print_pv(0, 8, true)); } else { $("#history").html( '(collapse) ' + - print_pv(0, display_lines[0].pretty_pv, 1, 'W')); + print_pv(0, 1, 'W')); } } @@ -723,6 +728,9 @@ var update_refutation_lines = function() { $("#sortbyscore0").html("Move"); $("#sortbyscore1").html("Score"); } + + // Update the move highlight, as we've rewritten all the HTML. + update_move_highlight(); } /** @@ -795,12 +803,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 +887,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 +940,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(" "); $("#refutationlines").empty(); @@ -977,9 +985,9 @@ var update_board = function(current_data, display_data) { // Update the board itself. fen = data['position']['fen']; update_displayed_line(); - update_move_highlight(); // 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. @@ -1334,10 +1342,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); @@ -1345,6 +1353,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; @@ -1375,7 +1384,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. @@ -1387,14 +1396,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(); } }); } @@ -1440,9 +1449,27 @@ var update_move_highlight = function() { if (highlighted_move !== null) { highlighted_move.removeClass('highlight'); } - if (current_display_line !== null) { - highlighted_move = $("#automove" + current_display_line.line_number + "-" + current_display_move); - highlighted_move.addClass('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; + } + } } } @@ -1470,7 +1497,10 @@ var update_displayed_line = function() { } 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()); } @@ -1548,7 +1578,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() {