From 797be76c95377cb37fe47b73e7261895370857e7 Mon Sep 17 00:00:00 2001 From: Tor Hveem Date: Mon, 9 Dec 2013 11:10:11 +0100 Subject: [PATCH 1/3] try to improve scrolling experience --- js/websockets.js | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/js/websockets.js b/js/websockets.js index 1dea75b..901edad 100644 --- a/js/websockets.js +++ b/js/websockets.js @@ -580,16 +580,11 @@ weechat.controller('WeechatCtrl', ['$rootScope', '$scope', '$store', '$timeout', $rootScope.scrollToBottom = function() { // FIXME doesn't work if the settimeout runs without a short delay var scroll = function() { - var readmarker = document.getElementById('readmarker'); - if(readmarker) { - readmarker.scrollIntoView(); - }else{ - var bl = document.getElementById('bufferlines'); - var sTop = bl.scrollTop; - var sVal = bl.scrollHeight - bl.clientHeight; - if(sTop < sVal) { - bl.scrollTop = sVal; - } + var bl = document.getElementById('bufferlines'); + var sTop = bl.scrollTop; + var sVal = bl.scrollHeight - bl.clientHeight; + if(sTop < sVal) { + bl.scrollTop = sVal; } }; // Here be scrolling dragons From fe0c070a6c496b7e039b238b3422fd2e2b4f1a15 Mon Sep 17 00:00:00 2001 From: Lorenz H-S Date: Mon, 23 Dec 2013 22:34:21 +0100 Subject: [PATCH 2/3] Only scroll when at the bottom of the buffer I think this behaviour is a lot more natural. Because it no longer "scrolls to bottom", I also renamed it. --- js/websockets.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/js/websockets.js b/js/websockets.js index 901edad..c0476af 100644 --- a/js/websockets.js +++ b/js/websockets.js @@ -35,7 +35,7 @@ weechat.factory('handlers', ['$rootScope', 'models', 'plugins', function($rootSc } if (buffer.active) { - $rootScope.scrollToBottom(); + $rootScope.scrollWithBuffer(); } if (!initial && !buffer.active) { @@ -480,7 +480,7 @@ weechat.controller('WeechatCtrl', ['$rootScope', '$scope', '$store', '$timeout', } $rootScope.$on('activeBufferChanged', function() { - $rootScope.scrollToBottom(); + $rootScope.scrollWithBuffer(); var ab = models.getActiveBuffer(); $rootScope.pageTitle = ab.shortName + ' | ' + ab.title; @@ -577,13 +577,13 @@ weechat.controller('WeechatCtrl', ['$rootScope', '$scope', '$store', '$timeout', } }; - $rootScope.scrollToBottom = function() { + $rootScope.scrollWithBuffer = function() { // FIXME doesn't work if the settimeout runs without a short delay var scroll = function() { var bl = document.getElementById('bufferlines'); var sTop = bl.scrollTop; var sVal = bl.scrollHeight - bl.clientHeight; - if(sTop < sVal) { + if(sTop == sVal) { bl.scrollTop = sVal; } }; From f38c4b020e1a48e86542d003a319a5d0f84f5c32 Mon Sep 17 00:00:00 2001 From: Lorenz H-S Date: Sat, 28 Dec 2013 16:50:31 +0100 Subject: [PATCH 3/3] Fix scrolling behaviour for good (?) --- js/websockets.js | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/js/websockets.js b/js/websockets.js index c0476af..17daf3c 100644 --- a/js/websockets.js +++ b/js/websockets.js @@ -480,7 +480,7 @@ weechat.controller('WeechatCtrl', ['$rootScope', '$scope', '$store', '$timeout', } $rootScope.$on('activeBufferChanged', function() { - $rootScope.scrollWithBuffer(); + $rootScope.scrollWithBuffer(true); var ab = models.getActiveBuffer(); $rootScope.pageTitle = ab.shortName + ' | ' + ab.title; @@ -577,14 +577,24 @@ weechat.controller('WeechatCtrl', ['$rootScope', '$scope', '$store', '$timeout', } }; - $rootScope.scrollWithBuffer = function() { - // FIXME doesn't work if the settimeout runs without a short delay + $rootScope.scrollWithBuffer = function(nonIncremental) { + // First, get scrolling status *before* modification + // This is required to determine where we were in the buffer pre-change + var bl = document.getElementById('bufferlines'); + var sVal = bl.scrollHeight - bl.clientHeight; + var scroll = function() { - var bl = document.getElementById('bufferlines'); var sTop = bl.scrollTop; - var sVal = bl.scrollHeight - bl.clientHeight; - if(sTop == sVal) { - bl.scrollTop = sVal; + // Determine if we want to scroll at all + if (nonIncremental && sTop < sVal || sTop == sVal) { + var readmarker = document.getElementById('readmarker'); + if(nonIncremental && readmarker) { + // Switching channels, scroll to read marker + readmarker.scrollIntoView(); + } else { + // New message, scroll with buffer (i.e. to bottom) + bl.scrollTop = bl.scrollHeight - bl.clientHeight; + } } }; // Here be scrolling dragons