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) {