From 4a490aafbf9fb5d6268115730340aabaf5528baf Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Fri, 8 Sep 2017 10:42:54 +0100 Subject: [PATCH] Improve UX of triggering autocompile. If a user is making infrequent edits (i.e. if reading and making small changes), then waiting 5 seconds for a recompile is bad. Therefore we track the time since the last recompile and use this to decide whether a recompile should be run. This reduces the time to recompile, unless the user is typing for a significant amount of time. --- .../ide/pdf/controllers/PdfController.coffee | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee index 65b0263163..d55203c267 100644 --- a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee +++ b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee @@ -6,6 +6,7 @@ define [ "services/log-hints-feedback" ], (App, Ace, HumanReadableLogs, BibLogParser) -> AUTO_COMPILE_TIMEOUT = 5000 + OP_ACKNOWLEDGEMENT_TIMEOUT = 1100 App.controller "PdfController", ($scope, $http, ide, $modal, synctex, event_tracking, logHintsFeedback, localStorage) -> # enable per-user containers by default @@ -74,14 +75,26 @@ define [ $scope.pdf.view = 'errors' $scope.pdf.renderingError = true + autoCompileTimeout = null triggerAutoCompile = () -> - if (!ide.$scope.hasLintingError) - $scope.recompile(isBackgroundAutoCompile: true) + return if autoCompileTimeout + + timeSinceLastCompile = Date.now() - $scope.recompiledAt + + if timeSinceLastCompile >= AUTO_COMPILE_TIMEOUT + if (!ide.$scope.hasLintingError) + $scope.recompile(isBackgroundAutoCompile: true) + else + # Extend remainder of timeout + autoCompileTimeout = setTimeout () -> + autoCompileTimeout = null + triggerAutoCompile() + , AUTO_COMPILE_TIMEOUT - timeSinceLastCompile autoCompileListener = null toggleAutoCompile = (enabling) -> if enabling - autoCompileListener = ide.$scope.$on "ide:opAcknowledged", _.debounce(triggerAutoCompile, AUTO_COMPILE_TIMEOUT) + autoCompileListener = ide.$scope.$on "ide:opAcknowledged", _.debounce(triggerAutoCompile, OP_ACKNOWLEDGEMENT_TIMEOUT) else autoCompileListener() if autoCompileListener autoCompileListener = null @@ -422,6 +435,8 @@ define [ $scope.pdf.renderingError = false $scope.pdf.error = true $scope.pdf.view = 'errors' + .finally () -> + $scope.recompiledAt = Date.now() # This needs to be public. ide.$scope.recompile = $scope.recompile