diff --git a/GitUpKit/Interface/GIConstants.h b/GitUpKit/Interface/GIConstants.h
index 70176976..c860ddcf 100644
--- a/GitUpKit/Interface/GIConstants.h
+++ b/GitUpKit/Interface/GIConstants.h
@@ -13,6 +13,7 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
+#import
#import
typedef NS_ENUM(unsigned short, GIKeyCode) {
@@ -29,3 +30,5 @@ typedef NS_ENUM(unsigned short, GIKeyCode) {
kGIKeyCode_Return = 0x24,
kGIKeyCode_Delete = 0x33
};
+
+static const NSEventModifierFlags kGIKeyModifiersAll = NSEventModifierFlagShift | NSEventModifierFlagControl | NSEventModifierFlagCommand | NSEventModifierFlagOption;
diff --git a/GitUpKit/Views/GIAdvancedCommitViewController.m b/GitUpKit/Views/GIAdvancedCommitViewController.m
index 62d30e4f..f719d367 100644
--- a/GitUpKit/Views/GIAdvancedCommitViewController.m
+++ b/GitUpKit/Views/GIAdvancedCommitViewController.m
@@ -309,6 +309,7 @@ - (void)_diffFilesViewControllerDidPressDelete:(GIDiffFilesViewController*)contr
}
- (BOOL)diffFilesViewController:(GIDiffFilesViewController*)controller handleKeyDownEvent:(NSEvent*)event {
+ // Stage/Unstage files by Return/Delete
if (!(event.modifierFlags & NSEventModifierFlagDeviceIndependentFlagsMask)) {
if (event.keyCode == kGIKeyCode_Return) {
[self _diffFilesViewControllerDidPressReturn:controller];
@@ -319,6 +320,27 @@ - (BOOL)diffFilesViewController:(GIDiffFilesViewController*)controller handleKey
}
}
+ // Navigate beteween stated and unstaged files list by up/down arrows
+ NSEventModifierFlags modifiers = event.modifierFlags & kGIKeyModifiersAll;
+ if (controller == _workdirFilesViewController && !modifiers && event.keyCode == kGIKeyCode_Down) {
+ bool onlyLastFileSelected = (controller.selectedDeltas.count == 1) && (controller.selectedDelta == controller.deltas.lastObject);
+ bool hasIndexFiles = _indexFilesViewController.deltas.count > 0;
+ if (onlyLastFileSelected && hasIndexFiles) {
+ // move focus to next controller
+ [[controller.view window] selectNextKeyView:_workdirFilesViewController.view];
+ return YES;
+ }
+ } else if (controller == _indexFilesViewController && !modifiers && event.keyCode == kGIKeyCode_Up) {
+ bool onlyFirstFileSelected = (controller.selectedDeltas.count == 1) && (controller.selectedDelta == controller.deltas.firstObject);
+ bool hasWorkdirFiles =_workdirFilesViewController.deltas.count > 0;
+ if (onlyFirstFileSelected && hasWorkdirFiles) {
+ // move focus to previous controller
+ [[controller.view window] selectPreviousKeyView:_workdirFilesViewController.view];
+ return YES;
+ }
+ }
+
+ // Perform contextual action on a file
if (controller == _workdirFilesViewController) {
return [self handleKeyDownEvent:event forSelectedDeltas:_workdirFilesViewController.selectedDeltas withConflicts:_indexConflicts allowOpen:YES];
} else if (controller == _indexFilesViewController) {