From 9f8eeca3bfaf8efa55c9ab9afa22b6a9896a9063 Mon Sep 17 00:00:00 2001 From: Arpad Borsos Date: Sun, 18 Apr 2021 23:01:47 +0200 Subject: [PATCH] rustdoc: Convert sub-variant toggle to HTML Instead of creating a JS toggle, this injects details/summary for sub-variants of enums. This also fixes the CSS so that the toggle button does not jump when expanding/collapsing. --- src/librustdoc/html/render/print_item.rs | 2 ++ src/librustdoc/html/static/main.js | 16 ++++++++++++---- src/librustdoc/html/static/rustdoc.css | 5 +++-- src/test/rustdoc/item-hide-threshold.rs | 3 ++- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/librustdoc/html/render/print_item.rs b/src/librustdoc/html/render/print_item.rs index ff9e4d031da18..8e77d3d014fab 100644 --- a/src/librustdoc/html/render/print_item.rs +++ b/src/librustdoc/html/render/print_item.rs @@ -934,6 +934,7 @@ fn item_enum(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, e: &clean::Enum use crate::clean::Variant; if let clean::VariantItem(Variant::Struct(ref s)) = *variant.kind { + toggle_open(w, "fields"); let variant_id = cx.derive_id(format!( "{}.{}.fields", ItemType::Variant, @@ -967,6 +968,7 @@ fn item_enum(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, e: &clean::Enum } } w.write_str(""); + toggle_close(w); } render_stability_since(w, variant, it, cx.tcx()); } diff --git a/src/librustdoc/html/static/main.js b/src/librustdoc/html/static/main.js index d71cc15a4576f..ab341a647a820 100644 --- a/src/librustdoc/html/static/main.js +++ b/src/librustdoc/html/static/main.js @@ -428,6 +428,15 @@ function hideThemeButtonState() { handleHashes(ev); } + function openParentDetails(elem) { + while (elem) { + if (elem.tagName === "DETAILS") { + elem.open = true; + } + elem = elem.parentNode; + } + } + function expandSection(id) { var elem = document.getElementById(id); if (elem && isHidden(elem)) { @@ -442,6 +451,8 @@ function hideThemeButtonState() { // The element is not visible, we need to make it appear! collapseDocs(collapses[0], "show"); } + // In case this is a sub-variant, toggle the
open. + openParentDetails(h3.parentNode); } } } @@ -2418,7 +2429,7 @@ function hideThemeButtonState() { if (hasClass(relatedDoc, "item-info")) { relatedDoc = relatedDoc.nextElementSibling; } - if (hasClass(relatedDoc, "docblock") || hasClass(relatedDoc, "sub-variant")) { + if (hasClass(relatedDoc, "docblock")) { if (mode === "toggle") { if (hasClass(relatedDoc, "hidden-by-usual-hider")) { action = "show"; @@ -2727,8 +2738,6 @@ function hideThemeButtonState() { if (hasClass(e, "type-decl")) { // We do something special for these return; - } else if (hasClass(e, "sub-variant")) { - otherMessage = " Show fields"; } else if (hasClass(e, "non-exhaustive")) { otherMessage = " This "; if (hasClass(e, "non-exhaustive-struct")) { @@ -2760,7 +2769,6 @@ function hideThemeButtonState() { } onEachLazy(document.getElementsByClassName("docblock"), buildToggleWrapper); - onEachLazy(document.getElementsByClassName("sub-variant"), buildToggleWrapper); autoCollapse(getSettingValue("collapse") === "true"); diff --git a/src/librustdoc/html/static/rustdoc.css b/src/librustdoc/html/static/rustdoc.css index 427564cd7794a..243df79ac4229 100644 --- a/src/librustdoc/html/static/rustdoc.css +++ b/src/librustdoc/html/static/rustdoc.css @@ -1031,10 +1031,11 @@ h3 > .collapse-toggle, h4 > .collapse-toggle { } .sub-variant, .sub-variant > h3 { - margin-top: 1px !important; + margin-top: 0px !important; + padding-top: 1px; } -#main > .sub-variant > h3 { +#main > details > .sub-variant > h3 { font-size: 15px; margin-left: 25px; margin-bottom: 5px; diff --git a/src/test/rustdoc/item-hide-threshold.rs b/src/test/rustdoc/item-hide-threshold.rs index 616eef95662ef..8986f72636a40 100644 --- a/src/test/rustdoc/item-hide-threshold.rs +++ b/src/test/rustdoc/item-hide-threshold.rs @@ -62,7 +62,8 @@ pub struct PrivStruct { } // @has 'item_hide_threshold/enum.Enum.html' -// @count - '//details[@class="rustdoc-toggle type-contents-toggle"]' 0 +// @count - '//details[@class="rustdoc-toggle type-contents-toggle"]' 1 +// @has - '//details[@class="rustdoc-toggle type-contents-toggle"]' 'Show fields' pub enum Enum { A, B, C, D {