diff -r 910e293663cb Doc/tools/pydoctheme/static/pydoctheme.css --- a/Doc/tools/pydoctheme/static/pydoctheme.css Fri Sep 09 00:05:42 2016 -0700 +++ b/Doc/tools/pydoctheme/static/pydoctheme.css Mon Sep 12 10:18:58 2016 +0200 @@ -27,6 +27,7 @@ border-radius: 5px; line-height: 130%; font-size: smaller; + position: relative; } div.sphinxsidebar h3, div.sphinxsidebar h4 { @@ -41,6 +42,22 @@ margin-bottom: 0.4em; } +div.sphinxsidebarwrapper li.highligthed { + border-radius: 3px; + background-color: #fff; + color: #0072aa; +} + +div.sphinxsidebarwrapper li.div.sphinxsidebarwrapper li.highligthed { + border-radius: 3px; + background-color: #fff; + color: #0072aa; +} + a { + color: #0072aa; +} + + div.sphinxsidebar a:hover { color: #0095C4; } diff -r 910e293663cb Doc/tools/static/sidebar.js --- a/Doc/tools/static/sidebar.js Fri Sep 09 00:05:42 2016 -0700 +++ b/Doc/tools/static/sidebar.js Mon Sep 12 10:18:58 2016 +0200 @@ -5,7 +5,7 @@ * This script makes the Sphinx sidebar collapsible and implements intelligent * scrolling. * - * .sphinxsidebar contains .sphinxsidebarwrapper. This script adds in + * .sphinxsidebar contains .sphinxsidebarwrappersphinxsidebarwrapper. This script adds in * .sphixsidebar, after .sphinxsidebarwrapper, the #sidebarbutton used to * collapse and expand the sidebar. * @@ -62,7 +62,7 @@ else collapse_sidebar(); // adjust the scrolling of the sidebar - scroll_sidebar(); + snap_sidebar(); } function collapse_sidebar() { @@ -161,33 +161,80 @@ var sidebarbutton = $('#sidebarbutton'); set_position_from_cookie(); - - /* intelligent scrolling */ - function scroll_sidebar() { - var sidebar_height = sidebarwrapper.height(); - var viewport_height = get_viewport_height(); - var offset = sidebar.position()['top']; - var wintop = jwindow.scrollTop(); - var winbot = wintop + viewport_height; - var curtop = sidebarwrapper.position()['top']; - var curbot = curtop + sidebar_height; - // does sidebar fit in window? - if (sidebar_height < viewport_height) { - // yes: easy case -- always keep at the top - sidebarwrapper.css('top', $u.min([$u.max([0, wintop - offset - 10]), - jdocument.height() - sidebar_height - 200])); + var headers = $('.body h1, .body h2, .body h3, .body h4'); + function findFirstHeader() { + var i = 0, top; + for(; i 0 && top < window.innerHeight) { + return headers[i]; + } } - else { - // no: only scroll if top/bottom edge of sidebar is at - // top/bottom edge of window - if (curtop > wintop && curbot > winbot) { - sidebarwrapper.css('top', $u.max([wintop - offset - 10, 0])); - } - else if (curtop < wintop && curbot < winbot) { - sidebarwrapper.css('top', $u.min([winbot - sidebar_height - offset - 20, - jdocument.height() - sidebar_height - 200])); + i = headers.length - 1; + for(; i>0; i--) { + top = headers[i].getBoundingClientRect().top; + if(top < 0) { + return headers[i]; } } } - jwindow.scroll(scroll_sidebar); + + var overSidebar = false; + sidebar.mouseenter(function(){ + overSidebar = true; + }).mouseleave(function() { + overSidebar = false; + }); + + var initial_top = parseInt(sidebarwrapper.position().top, 10); + var sidebar_top = initial_top; + sidebarwrapper.css('position', 'absolute'); + var previous; + + $('.reference').click(function(){ + setTimeout(function(){snap_sidebar();}, 32); + }); + + function snap_sidebar() { + var header = findFirstHeader(); + if(header) { + var href = $('.headerlink', header).attr('href'); + var sidebar_link = $('.sphinxsidebar a[href$="'+href+'"]').parent(); + if(!sidebar_link[0]) { + if(previous) { + previous.removeClass('highligthed'); + } + sidebarwrapper.css('top', initial_top + 'px'); + return; + } + var yoffest = sidebar_link[0].getBoundingClientRect().top; + sidebar_top = Math.max(sidebar_top - yoffest + 50, initial_top); + + sidebarwrapper.css('top', sidebar_top + 'px'); + + var wrapper_bottom = sidebarwrapper[0].getBoundingClientRect().bottom; + var sidebar_bottom = sidebar[0].getBoundingClientRect().bottom; + + // check if the bottom of the wrapper overlap the with page + // footer and put it back in place if needed. + if(wrapper_bottom > sidebar_bottom) { + sidebar_top -= (wrapper_bottom - sidebar_bottom); + sidebarwrapper.css('top', sidebar_top + 'px'); + } + + if(previous) { + previous.removeClass('highligthed'); + } + sidebar_link.addClass('highligthed'); + previous = sidebar_link; + } + } + + var timeoutId; + jwindow.scroll(function() { + if(!overSidebar && !sidebar_is_collapsed()) { + snap_sidebar(); + } + }); + });