Skip to content

Commit d323ddd

Browse files
committed
feat: git scroll bar markers
1 parent 2997946 commit d323ddd

File tree

2 files changed

+77
-7
lines changed

2 files changed

+77
-7
lines changed

src/extensions/default/Git/src/GutterManager.js

Lines changed: 54 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ define(function (require, exports) {
88
CommandManager = brackets.getModule("command/CommandManager"),
99
DocumentManager = brackets.getModule("document/DocumentManager"),
1010
EditorManager = brackets.getModule("editor/EditorManager"),
11+
ScrollTrackMarkers = brackets.getModule("search/ScrollTrackMarkers"),
1112
MainViewManager = brackets.getModule("view/MainViewManager"),
1213
ErrorHandler = require("src/ErrorHandler"),
1314
Events = require("src/Events"),
@@ -16,6 +17,8 @@ define(function (require, exports) {
1617
Preferences = require("./Preferences"),
1718
Strings = brackets.getModule("strings");
1819

20+
const GIT_SCROLL_MARKS = "git_marks";
21+
1922
var gitAvailable = false,
2023
gutterName = "brackets-git-gutter",
2124
editorsWithGutters = [],
@@ -125,7 +128,7 @@ define(function (require, exports) {
125128
}
126129
}
127130

128-
function showGutters(editor, _results) {
131+
function _showGutters(editor, _results) {
129132
prepareGutter(editor);
130133

131134
var cm = editor._codeMirror;
@@ -137,8 +140,8 @@ define(function (require, exports) {
137140
cm.clearGutter(gutterName);
138141
cm.gitGutters.forEach(function (obj) {
139142
var $marker = $("<div>")
140-
.addClass(gutterName + "-" + obj.type + " gitline-" + (obj.line + 1))
141-
.html("&nbsp;");
143+
.addClass(gutterName + "-" + obj.type + " gitline-" + (obj.line + 1))
144+
.html("&nbsp;");
142145
cm.setGutterMarker(obj.line, gutterName, $marker[0]);
143146
});
144147
_cursorActivity(null, editor);
@@ -214,6 +217,48 @@ define(function (require, exports) {
214217
return doc && doc._masterEditor;
215218
}
216219

220+
function hasVerticalScrollbar(editor) {
221+
const cm = editor._codeMirror;
222+
const scrollEl = cm.getScrollerElement();
223+
return scrollEl.scrollHeight > scrollEl.clientHeight;
224+
}
225+
226+
227+
function _markScrollbar(editor, allChanges) {
228+
ScrollTrackMarkers.clear(editor, GIT_SCROLL_MARKS);
229+
if(!hasVerticalScrollbar(editor)){
230+
return;
231+
}
232+
const added = allChanges
233+
.filter(item => item.type === "added")
234+
.map(({ line }) => ({ line, ch: 0 }));
235+
236+
const removed = allChanges
237+
.filter(item => item.type === "removed")
238+
.map(({ line }) => ({ line, ch: 0 }));
239+
240+
const modified = allChanges
241+
.filter(item => item.type === "modified")
242+
.map(({ line }) => ({ line, ch: 0 }));
243+
244+
const trackers = [
245+
{arr: added, css: "brackets-git-added"},
246+
{arr: removed, css: "brackets-git-removed"},
247+
{arr: modified, css: "brackets-git-modified"}
248+
];
249+
for(let tracker of trackers) {
250+
if( !tracker.arr.length ){
251+
continue;
252+
}
253+
let posArray = tracker.arr.map(item => ({ line: item.line, ch: 0 }));
254+
ScrollTrackMarkers.addTickmarks(editor, posArray, {
255+
trackStyle: ScrollTrackMarkers.TRACK_STYLES.ON_LEFT,
256+
name: GIT_SCROLL_MARKS,
257+
cssColorClass: tracker.css
258+
});
259+
}
260+
}
261+
217262
function processDiffResults(editor, diff) {
218263
var added = [],
219264
removed = [],
@@ -239,9 +284,9 @@ define(function (require, exports) {
239284
type: "removed",
240285
line: lineRemovedFrom,
241286
content: str.split("\n")
242-
.filter(function (l) { return l.indexOf("-") === 0; })
243-
.map(function (l) { return l.substring(1); })
244-
.join("\n")
287+
.filter(function (l) { return l.indexOf("-") === 0; })
288+
.map(function (l) { return l.substring(1); })
289+
.join("\n")
245290
});
246291
}
247292

@@ -279,7 +324,9 @@ define(function (require, exports) {
279324
o.line = o.line + 1;
280325
});
281326

282-
showGutters(editor, [].concat(added, removed, modified));
327+
const allChanges = [].concat(added, removed, modified);
328+
_showGutters(editor, allChanges);
329+
_markScrollbar(editor, allChanges);
283330
}
284331

285332
function refresh() {

src/extensions/default/Git/styles/git-styles.less

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,29 @@
292292
// codemirror
293293
// main: brackets-git.less
294294

295+
.tickmark-track {
296+
.brackets-git-added {
297+
--mark-color: @git-green;
298+
.dark & {
299+
--mark-color: @dark-git-green;
300+
}
301+
}
302+
303+
.brackets-git-modified {
304+
--mark-color: @git-orange;
305+
.dark & {
306+
--mark-color: @dark-git-orange;
307+
}
308+
}
309+
310+
.brackets-git-removed {
311+
--mark-color: @git-red;
312+
.dark & {
313+
--mark-color: @dark-git-red;
314+
}
315+
}
316+
}
317+
295318
.CodeMirror {
296319
.brackets-git-gutter {
297320
pointer-events: auto;

0 commit comments

Comments
 (0)