[gitg] Improve expand/collapse behavior of diff-view
- From: Jesse van den Kieboom <jessevdk src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gitg] Improve expand/collapse behavior of diff-view
- Date: Thu, 6 Aug 2015 18:28:55 +0000 (UTC)
commit ed790cde07679bb02ebe6b0ea4df7428046a1675
Author: Jesse van den Kieboom <jessevdk gnome org>
Date: Thu Aug 6 20:28:33 2015 +0200
Improve expand/collapse behavior of diff-view
libgitg/resources/ui/diff-view/diff-view.css | 55 ++++++++++---
libgitg/resources/ui/diff-view/diff-view.html | 5 +-
libgitg/resources/ui/diff-view/diff-view.js | 100 ++++++++++++++++++++++++-
3 files changed, 142 insertions(+), 18 deletions(-)
---
diff --git a/libgitg/resources/ui/diff-view/diff-view.css b/libgitg/resources/ui/diff-view/diff-view.css
index 1bbdd54..389cea4 100644
--- a/libgitg/resources/ui/diff-view/diff-view.css
+++ b/libgitg/resources/ui/diff-view/diff-view.css
@@ -134,23 +134,43 @@ div#diff div.file table tr.file_header td {
border-top: 1px solid #ccc;
border-bottom: 1px solid #ccc;
background: #d3d7cf;
+ vertical-align: middle;
+ transition: background-color 200ms, color 200ms;
+ cursor: pointer;
+}
+
+div#diff div.file table tr.file_header td:hover {
+ background: #ddd;
}
span.expander {
- background-color: #ececec;
- border-radius: 5px;
- box-shadow: 1px 1px #ccc inset;
- margin: 5px;
display: inline-block;
vertical-align: middle;
+ text-align: center;
+ cursor: pointer;
padding: 3px;
- padding-left: 6px;
padding-right: 6px;
- cursor: pointer;
+ margin-left: 6px;
+ font-size: 0.8em;
}
tbody.collapsed > :not(.file_header) {
- display:none;
+ display: none;
+}
+
+div#diff div.file table tbody.collapsed tr.file_header td {
+ border: 0;
+ background-color: #f3f3f3;
+}
+
+div#diff_content div.file tbody.collapsed.after-uncollapsed tr.file_header td {
+ border-top: 1px solid #ccc;
+ padding-top: 5px;
+}
+
+div#diff_content div.file tbody.collapsed.before-uncollapsed tr.file_header td {
+ border-bottom: 1px solid #ccc;
+ padding-bottom: 5px;
}
span.file_stats {
@@ -159,11 +179,16 @@ span.file_stats {
padding: 3px;
border-radius: 5px;
box-shadow: 1px 1px #ccc inset;
- margin: 5px;
+ margin: 5px 8px 5px 3px;
display: inline-block;
vertical-align: middle;
}
+div#diff div.file table tbody.collapsed span.file_stats {
+ margin-top: 1px;
+ margin-bottom: 1px;
+}
+
span.file_stats .number, span.file_stats .bar {
display: table-cell;
vertical-align: middle;
@@ -188,10 +213,6 @@ span.file_stats .removed {
background-color: #cc3333;
}
-div#diff div.file table tr.file_header td {
- vertical-align: middle;
-}
-
div#diff div.file table tr.file_header + tr.hunk_header td.hunk_header {
border-top: 0px;
}
@@ -229,7 +250,8 @@ div.commit {
position: relative;
}
-div.commit .date, div.commit .sha1 {
+div.commit .date,
+div.commit .sha1 {
color: #888a85;
font-size: 0.8em;
}
@@ -249,6 +271,13 @@ div.commit .sha1 {
text-align: right;
}
+div.commit .expander-all {
+ float: right;
+ padding: 0px 0px 2px 6px;
+ vertical-align: middle;
+ cursor: pointer;
+}
+
div.commit .message {
white-space: pre-wrap;
margin-bottom: 5px;
diff --git a/libgitg/resources/ui/diff-view/diff-view.html b/libgitg/resources/ui/diff-view/diff-view.html
index c96c09a..15b40a1 100644
--- a/libgitg/resources/ui/diff-view/diff-view.html
+++ b/libgitg/resources/ui/diff-view/diff-view.html
@@ -23,9 +23,7 @@
<tr class="file_header">
<td colspan="4">
<!-- BLACK DOWN-POINTING TRIANGLE -->
- <span class="expander">▼</span>
- <!-- ${FILE_STATS} -->
- <span class="file_path"><!-- ${FILE_PATH} --></span>
+ <span class="expander">▼</span><!-- ${FILE_STATS} --><span class="file_path"><!--
${FILE_PATH} --></span>
</td>
</tr>
<!-- ${FILE_BODY} -->
@@ -51,6 +49,7 @@
</p>
<p class="parents" data-id="parents">
</p>
+ <div class="expander-all" data-id="expander-all">▼</div>
<div class="sha1" data-id="sha1"></div>
</div>
</div>
diff --git a/libgitg/resources/ui/diff-view/diff-view.js b/libgitg/resources/ui/diff-view/diff-view.js
index a1ca965..89c3096 100644
--- a/libgitg/resources/ui/diff-view/diff-view.js
+++ b/libgitg/resources/ui/diff-view/diff-view.js
@@ -137,7 +137,7 @@ function write_avatar(avatar, commit)
avatar_cache[h] = avc;
avatarLoader = null;
}.bind(avatarLoader));
-
+
avatarLoader.image.attr('src', gravatar);
}
}
@@ -332,6 +332,66 @@ function expand_collapse()
}
expander.closest('tbody').toggleClass("collapsed");
+
+ var all = $("#diff_content div.file tbody");
+ var prevCollapsed = false;
+ var allUncollapsed = true;
+
+ all.each(function(i, tbody) {
+ tbody = $(tbody);
+
+ var nextCollapsed = false;
+
+ var beforeCollapsed = true;
+ var afterCollapsed = false;
+
+ if (tbody.hasClass("collapsed"))
+ {
+ if (i < all.length - 1)
+ {
+ nextCollapsed = $(all[i + 1]).hasClass("collapsed");
+ }
+
+ afterCollapsed = prevCollapsed;
+ beforeCollapsed = nextCollapsed;
+
+ prevCollapsed = true;
+ allUncollapsed = false;
+ }
+ else
+ {
+ prevCollapsed = false;
+ }
+
+ if (!beforeCollapsed)
+ {
+ tbody.addClass("before-uncollapsed");
+ }
+ else
+ {
+ tbody.removeClass("before-uncollapsed");
+ }
+
+ if (!afterCollapsed)
+ {
+ tbody.addClass("after-uncollapsed");
+ }
+ else
+ {
+ tbody.removeClass("after-uncollapsed");
+ }
+ });
+
+ var expanderAll = $("#diff .expander-all");
+
+ if (!allUncollapsed)
+ {
+ expanderAll.text("\u25B6");
+ }
+ else
+ {
+ expanderAll.text("\u25BC");
+ }
}
function next_element(elem)
@@ -531,6 +591,26 @@ function update_tab_width(width)
tab_width_rule.style.tabSize = width;
}
+function expand_collapse_all()
+{
+ var collapse = ($(this).text() === "\u25BC");
+
+ var allbodies = document.querySelectorAll("#diff_content div.file:not(.background) table.file tbody");
+
+ for (var i = 0; i < allbodies.length; i++)
+ {
+ var tbody = $(allbodies[i]);
+ var isCollapsed = tbody.hasClass("collapsed");
+
+ if (isCollapsed !== collapse)
+ {
+ expand_collapse.call(tbody.find(".expander"));
+ }
+ }
+
+ $(this).text(collapse ? "\u25B6" : "\u25BC")
+}
+
function update_diff(id, lsettings)
{
if (html_builder_worker)
@@ -608,7 +688,20 @@ function update_diff(id, lsettings)
content.html(event.data.diff_html);
update_has_selection();
- $(".expander").click(expand_collapse);
+ var expanders = document.querySelectorAll("#diff_content div.file:not(.background)
.expander");
+
+ // Collapse by default if more than one file
+ if (expanders && expanders.length > 1)
+ {
+ for (var i = 0; i < expanders.length; i++)
+ {
+ expand_collapse.call(expanders[i]);
+ }
+ }
+
+ $("#diff_content div.file tr.file_header td").click(function() {
+ expand_collapse.call($(this).find(".expander"));
+ });
if (settings.staged || settings.unstaged)
{
@@ -650,6 +743,9 @@ function update_diff(id, lsettings)
}
addEventListener('DOMContentLoaded', function () {
+ var expanderAll = $("#diff .expander-all");
+ expanderAll.click(expand_collapse_all);
+
xhr_get('internal', {action: 'loaded'});
}, false);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]