1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-12-27 07:50:57 +01:00

Allow "J" and "K" to jump between files in Differential

Summary: Provide a more coarse keyboard navigation option to jump between files.
Test Plan:
  - Used "j" and "k" to jump between changes in files.
  - Used "J" and "K" to jump between files.
  - Pressed "?" and read help about this.

Reviewed By: jungejason
Reviewers: jungejason, tuomaspelkonen, aran
Commenters: fzamore
CC: aran, epriestley, jungejason, fzamore
Differential Revision: 764
This commit is contained in:
epriestley 2011-08-02 07:49:00 -07:00
parent 054ac65a9d
commit 24390d2b40

View file

@ -8,9 +8,11 @@
JX.behavior('differential-keyboard-navigation', function(config) { JX.behavior('differential-keyboard-navigation', function(config) {
var cursor = -1; var cursor = -1;
var cursor_block = null;
var changesets; var changesets;
var selection_begin = null;
var selection_end = null;
function init() { function init() {
if (changesets) { if (changesets) {
return; return;
@ -53,6 +55,10 @@ JX.behavior('differential-keyboard-navigation', function(config) {
return 'ignore'; return 'ignore';
} }
if (row.className.indexOf('differential-changeset') !== -1) {
return 'file';
}
var cells = JX.DOM.scry(row, 'td'); var cells = JX.DOM.scry(row, 'td');
for (var ii = 0; ii < cells.length; ii++) { for (var ii = 0; ii < cells.length; ii++) {
@ -67,7 +73,7 @@ JX.behavior('differential-keyboard-navigation', function(config) {
return null; return null;
} }
function jump(manager, delta) { function jump(manager, delta, jump_to_file) {
init(); init();
if (cursor < 0) { if (cursor < 0) {
@ -79,8 +85,6 @@ JX.behavior('differential-keyboard-navigation', function(config) {
} }
} }
var selected;
var extent;
while (true) { while (true) {
var blocks = getBlocks(cursor); var blocks = getBlocks(cursor);
var focus; var focus;
@ -91,31 +95,42 @@ JX.behavior('differential-keyboard-navigation', function(config) {
} }
for (var ii = 0; ii < blocks.length; ii++) { for (var ii = 0; ii < blocks.length; ii++) {
if (blocks[ii][0] == cursor_block) { if (blocks[ii][0] == selection_begin) {
focus = ii; focus = ii;
break; break;
} }
} }
focus += delta; while (true) {
focus += delta;
if (blocks[focus]) {
var row_type = getRowType(blocks[focus][0]);
if (jump_to_file && row_type != 'file') {
continue;
}
selection_begin = blocks[focus][0];
selection_end = blocks[focus][1];
manager.scrollTo(selection_begin);
manager.focusOn(selection_begin, selection_end);
if (blocks[focus]) {
selected = blocks[focus][0];
extent = blocks[focus][1];
cursor_block = selected;
break;
} else {
var adjusted = (cursor + delta);
if (adjusted < 0 || adjusted >= changesets.length) {
// Stop cursor movement when the user reaches either end.
return; return;
} else {
var adjusted = (cursor + delta);
if (adjusted < 0 || adjusted >= changesets.length) {
// Stop cursor movement when the user reaches either end.
return;
}
cursor = adjusted;
// Break the inner loop and go to the next file.
break;
} }
cursor = adjusted;
} }
} }
manager.scrollTo(selected);
manager.focusOn(selected, extent);
} }
var is_haunted = false; var is_haunted = false;
@ -137,6 +152,19 @@ JX.behavior('differential-keyboard-navigation', function(config) {
}) })
.register(); .register();
new JX.KeyboardShortcut('J', 'Jump to next file.')
.setHandler(function(manager) {
jump(manager, 1, true);
})
.register();
new JX.KeyboardShortcut('K', 'Jump to previous file.')
.setHandler(function(manager) {
jump(manager, -1, true);
})
.register();
new JX.KeyboardShortcut('z', 'Haunt / unhaunt comment panel.') new JX.KeyboardShortcut('z', 'Haunt / unhaunt comment panel.')
.setHandler(haunt) .setHandler(haunt)
.register(); .register();