about summary refs log tree commit diff
diff options
context:
space:
mode:
authorManish Goregaokar <manishsmail@gmail.com>2021-03-20 19:02:25 -0700
committerManish Goregaokar <manishsmail@gmail.com>2021-04-12 08:45:45 -0700
commit71c52acf32efb48975edb86a1cef1df810f60c45 (patch)
tree543f4b7e4050a60f67576fec2ee636f6139a83e9
parentc96f86de3026f864e78397aff9097e885f2f8fdf (diff)
downloadrust-71c52acf32efb48975edb86a1cef1df810f60c45.tar.gz
rust-71c52acf32efb48975edb86a1cef1df810f60c45.zip
rustdoc: hide variants of enums > 5
-rw-r--r--src/librustdoc/html/render/print_item.rs24
-rw-r--r--src/librustdoc/html/static/main.js4
-rw-r--r--src/librustdoc/html/static/rustdoc.css13
3 files changed, 34 insertions, 7 deletions
diff --git a/src/librustdoc/html/render/print_item.rs b/src/librustdoc/html/render/print_item.rs
index 6c0c8a01014..3b9750a8d63 100644
--- a/src/librustdoc/html/render/print_item.rs
+++ b/src/librustdoc/html/render/print_item.rs
@@ -131,6 +131,23 @@ pub(super) fn print_item(cx: &Context<'_>, item: &clean::Item, buf: &mut Buffer)
     }
 }
 
+/// For large structs, enums, unions, etc, determine whether to hide their fields
+fn should_hide_fields(n_fields: usize) -> bool {
+    // todo: figure out what this should be
+    n_fields > 5
+}
+
+fn toggle_open(w: &mut Buffer, text: &str)
+{
+    write!(w, "<div class=\"docblock type-contents-toggle\" data-toggle-text=\"{}\">", text);
+}
+
+fn toggle_close(w: &mut Buffer)
+{
+    w.write_str("</div>");
+}
+
+
 fn item_module(w: &mut Buffer, cx: &Context<'_>, item: &clean::Item, items: &[clean::Item]) {
     document(w, cx, item, None);
 
@@ -816,6 +833,10 @@ fn item_enum(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, e: &clean::Enum
             w.write_str(" {}");
         } else {
             w.write_str(" {\n");
+            let toggle = should_hide_fields(e.variants.len());
+            if toggle {
+                toggle_open(w, "variants");
+            }
             for v in &e.variants {
                 w.write_str("    ");
                 let name = v.name.as_ref().unwrap();
@@ -844,6 +865,9 @@ fn item_enum(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, e: &clean::Enum
             if e.variants_stripped {
                 w.write_str("    // some variants omitted\n");
             }
+            if toggle {
+                toggle_close(w);
+            }
             w.write_str("}");
         }
         w.write_str("</pre>")
diff --git a/src/librustdoc/html/static/main.js b/src/librustdoc/html/static/main.js
index 0abfe18a19f..f112a113adc 100644
--- a/src/librustdoc/html/static/main.js
+++ b/src/librustdoc/html/static/main.js
@@ -2703,6 +2703,10 @@ function hideThemeButtonState() {
                         }
                     });
                 }
+            } else if (hasClass(e, "type-contents-toggle")) {
+                let text = e.getAttribute("data-toggle-text");
+                let tog = createToggle(toggle, `Show ${text}`, null, "", true);
+                e.parentNode.insertBefore(tog,  e);
             }
             if (e.parentNode.id === "main") {
                 var otherMessage = "";
diff --git a/src/librustdoc/html/static/rustdoc.css b/src/librustdoc/html/static/rustdoc.css
index 585b7459bd7..3a171a1d652 100644
--- a/src/librustdoc/html/static/rustdoc.css
+++ b/src/librustdoc/html/static/rustdoc.css
@@ -970,6 +970,10 @@ a.test-arrow:hover{
 	position: absolute;
 	left: -23px;
 	top: 0;
+
+	/* The click event for this is defined on the document,
+	   so bubbling does not work. See https://github.com/rust-lang/rust/issues/83332 */
+	z-index: 10;
 }
 
 h3 > .collapse-toggle, h4 > .collapse-toggle {
@@ -1054,10 +1058,9 @@ h3 > .collapse-toggle, h4 > .collapse-toggle {
 	margin-top: 3px;
 }
 
+/* for enum and struct fields */
 .enum > .toggle-wrapper + .docblock, .struct > .toggle-wrapper + .docblock {
-	margin-left: 30px;
-	margin-bottom: 20px;
-	margin-top: 5px;
+	margin-left: 0px;
 }
 
 .docblock > .section-header:first-child {
@@ -1069,10 +1072,6 @@ h3 > .collapse-toggle, h4 > .collapse-toggle {
 	left: -10px;
 }
 
-.enum > .collapsed, .struct > .collapsed {
-	margin-bottom: 25px;
-}
-
 #main > .variant, #main > .structfield {
 	display: block;
 }