diff --git a/src/main/webapp/js/controllers.js b/src/main/webapp/js/controllers.js index 57f13311..0dbb78f8 100644 --- a/src/main/webapp/js/controllers.js +++ b/src/main/webapp/js/controllers.js @@ -7,12 +7,6 @@ module.run(['$rootScope', function($rootScope) { $rootScope.$on('emitNextEntry', function(event, args) { $rootScope.$broadcast('nextEntry', args); }); - $rootScope.$on('emitFocusPreviousEntry', function(event, args) { - $rootScope.$broadcast('focusPreviousEntry', args); - }); - $rootScope.$on('emitFocusNextEntry', function(event, args) { - $rootScope.$broadcast('focusNextEntry', args); - }); $rootScope.$on('emitMark', function(event, args) { // args.entry - the entry $rootScope.$broadcast('mark', args); @@ -487,13 +481,6 @@ function($scope, $http, $state, $stateParams, $route, $location, $scope.$emit('emitNextEntry'); }; - $scope.focusPreviousEntry = function() { - $scope.$emit('emitFocusPreviousEntry'); - }; - $scope.focusNextEntry = function() { - $scope.$emit('emitFocusNextEntry'); - }; - $scope.refresh = function() { if($stateParams._type == 'feed'){ FeedService.refresh({ @@ -783,13 +770,13 @@ function($scope, $stateParams, $http, $route, $window, EntryService, SettingsSer }; $scope.isOpen = SettingsService.settings.viewMode == 'expanded'; - $scope.entryClicked = function(entry, event) { + + var openEntry = function(entry, event) { if (event && event.which === 3) { // right click return; } - $scope.navigationMode = 'click'; if (!event || (!event.ctrlKey && event.which != 2)) { if ($scope.current != entry || SettingsService.settings.viewMode == 'expanded') { $scope.isOpen = true; @@ -800,21 +787,25 @@ function($scope, $stateParams, $http, $route, $window, EntryService, SettingsSer $scope.mark(entry, true); } $scope.current = entry; - if(event) { + if (event) { event.preventDefault(); event.stopPropagation(); } } else { $scope.mark(entry, true); } + } + $scope.entryClicked = function(entry, event) { + $scope.navigationMode = 'click'; + openEntry(entry, event); }; + $scope.bodyClicked = function(entry, event) { if (SettingsService.settings.viewMode == 'expanded' && $scope.current != entry) { $scope.entryClicked(entry, event); } }; - $scope.noop = function(event) { if (!event.ctrlKey && event.which != 2) { event.preventDefault(); @@ -859,21 +850,20 @@ function($scope, $stateParams, $http, $route, $window, EntryService, SettingsSer var openNextEntry = function(event) { var entry = getNextEntry(); if (entry) { - $scope.entryClicked(entry, event); + openEntry(entry, event); } }; var openPreviousEntry = function(event) { var entry = getPreviousEntry(); if (entry) { - $scope.entryClicked(entry, event); + openEntry(entry, event); } }; var focusNextEntry = function(event) { var entry = getNextEntry(); if (entry) { - $scope.navigationMode = 'click'; $scope.current = entry; } }; @@ -881,7 +871,6 @@ function($scope, $stateParams, $http, $route, $window, EntryService, SettingsSer var focusPreviousEntry = function(event) { var entry = getPreviousEntry(); if (entry) { - $scope.navigationMode = 'click'; $scope.current = entry; } }; @@ -898,35 +887,41 @@ function($scope, $stateParams, $http, $route, $window, EntryService, SettingsSer Mousetrap.bind('j', function(e) { $scope.$apply(function() { + $scope.navigationMode = 'keyboard'; openNextEntry(e); }); }); Mousetrap.bind('n', function(e) { $scope.$apply(function() { + $scope.navigationMode = 'keyboard'; focusNextEntry(e); }); }); Mousetrap.bind('k', function(e) { $scope.$apply(function() { + $scope.navigationMode = 'keyboard'; openPreviousEntry(e); }); }); Mousetrap.bind('p', function(e) { $scope.$apply(function() { + $scope.navigationMode = 'keyboard'; focusPreviousEntry(e); }); }); Mousetrap.bind('o', function(e) { $scope.$apply(function() { + $scope.navigationMode = 'keyboard'; if ($scope.current) { - $scope.entryClicked($scope.current, e); + openEntry($scope.current, e); } }); }); Mousetrap.bind('enter', function(e) { $scope.$apply(function() { + $scope.navigationMode = 'keyboard'; if ($scope.current) { - $scope.entryClicked($scope.current, e); + openEntry($scope.current, e); } }); }); @@ -979,17 +974,13 @@ function($scope, $stateParams, $http, $route, $window, EntryService, SettingsSer }); $scope.$on('previousEntry', function(event, args) { + $scope.navigationMode = 'keyboard'; openPreviousEntry(); }); $scope.$on('nextEntry', function(event, args) { + $scope.navigationMode = 'keyboard'; openNextEntry(); }); - $scope.$on('focusPreviousEntry', function(event, args) { - focusPreviousEntry(); - }); - $scope.$on('focusNextEntry', function(event, args) { - focusNextEntry(); - }); $scope.$on('markAll', function(event, args) { $scope.markAll(args.olderThan); }); diff --git a/src/main/webapp/js/directives.js b/src/main/webapp/js/directives.js index 638c9c4b..56742af7 100644 --- a/src/main/webapp/js/directives.js +++ b/src/main/webapp/js/directives.js @@ -124,7 +124,8 @@ module.directive('onScrollMiddle', function() { }); /** - * Scrolls to the element if the value is true + * Scrolls to the element if the value is true and the attribute is not fully visible, + * unless the attribute scroll-to-force is true */ module.directive('scrollTo', [ '$timeout', function($timeout) { return { @@ -133,6 +134,9 @@ module.directive('scrollTo', [ '$timeout', function($timeout) { scope.$watch(attrs.scrollTo, function(value) { if (!value) return; + var force = scope.$eval(attrs.scrollToForce); + + // timeout here to execute after dom update $timeout(function() { var docTop = $(window).scrollTop(); var docBottom = docTop + $(window).height(); @@ -140,12 +144,16 @@ module.directive('scrollTo', [ '$timeout', function($timeout) { var elemTop = $(element).offset().top; var elemBottom = elemTop + $(element).height(); - var offset = parseInt(attrs.scrollToOffset, 10); - var scrollTop = $(element).offset().top + offset; - $('html, body').animate({ - scrollTop : scrollTop - }, 0); - + if (!force && (elemTop > docTop) && (elemBottom < docBottom)) { + // element is entirely visible + return; + } else { + var offset = parseInt(attrs.scrollToOffset, 10); + var scrollTop = $(element).offset().top + offset; + $('html, body').animate({ + scrollTop : scrollTop + }, 0); + } }); }); } diff --git a/src/main/webapp/templates/feeds.view.html b/src/main/webapp/templates/feeds.view.html index af1b0d48..647e5bcd 100644 --- a/src/main/webapp/templates/feeds.view.html +++ b/src/main/webapp/templates/feeds.view.html @@ -14,8 +14,8 @@