Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(47)

Unified Diff: chrome/browser/ui/cocoa/browser/avatar_menu_bubble_controller.mm

Issue 8332008: Cocoa: Support keyboard navigation in avatar menu (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/cocoa/browser/avatar_menu_bubble_controller.mm
diff --git a/chrome/browser/ui/cocoa/browser/avatar_menu_bubble_controller.mm b/chrome/browser/ui/cocoa/browser/avatar_menu_bubble_controller.mm
index c75fcd2a562bc4940fa8ae1d2cc022c02af4e2c6..58e3ecd0c764b2485ef04b17e0647db235e09796 100644
--- a/chrome/browser/ui/cocoa/browser/avatar_menu_bubble_controller.mm
+++ b/chrome/browser/ui/cocoa/browser/avatar_menu_bubble_controller.mm
@@ -27,6 +27,12 @@
@interface AvatarMenuBubbleController (Private)
- (AvatarMenuModel*)model;
- (NSButton*)configureNewUserButton:(CGFloat)yOffset;
+- (void)keyDown:(NSEvent *)theEvent;
+- (void)moveDown:(id)sender;
+- (void)moveUp:(id)sender;
+- (void)insertNewline:(id)sender;
+- (void)highlightNextItemByDelta:(int)delta;
+- (void)highlightItem:(AvatarMenuItemController*)newItem;
@end
namespace AvatarMenuInternal {
@@ -227,6 +233,70 @@ const CGFloat kLabelInset = 49.0;
return items_.get();
}
+- (void)keyDown:(NSEvent *)theEvent {
+ [self interpretKeyEvents:[NSArray arrayWithObject:theEvent]];
+}
+
+- (void)moveDown:(id)sender {
+ [self highlightNextItemByDelta:-1];
+}
+
+- (void)moveUp:(id)sender {
+ [self highlightNextItemByDelta:1];
+}
+
+- (void)insertNewline:(id)sender {
+ for (AvatarMenuItemController* item in items_.get()) {
+ if ([item isHighlighted]) {
+ [self switchToProfile:item];
+ return;
+ }
+ }
+}
+
+- (void)highlightNextItemByDelta:(int)delta {
Robert Sesek 2011/10/24 19:07:04 NSInteger
sail 2011/10/24 19:16:38 Done.
+ int count = [items_ count];
Robert Sesek 2011/10/24 19:07:04 NSUInteger
sail 2011/10/24 19:16:38 Done.
+ if (count == 0)
+ return;
+
+ int old_index = -1;
Robert Sesek 2011/10/24 19:07:04 NSInteger
sail 2011/10/24 19:16:38 Done.
+ for (int i = 0; i < count; i++) {
Robert Sesek 2011/10/24 19:07:04 NSUInteger
sail 2011/10/24 19:16:38 Done.
+ if ([[items_ objectAtIndex:i] isHighlighted]) {
+ old_index = i;
+ break;
+ }
+ }
+
+ int new_index;
+ // If nothing is selected then start at the top if we're going down and start
+ // at the bottom if we're going up.
+ if (old_index == -1)
+ new_index = delta < 0 ? (count - 1) : 0;
+ else
+ new_index = old_index + delta;
+ // Cap the index. We don't wrap around to match the behavior of Mac menus.
+ new_index = std::min(std::max(0, new_index), count - 1);
+
+ [self highlightItem:[items_ objectAtIndex:new_index]];
+}
+
+- (void)highlightItem:(AvatarMenuItemController*)newItem {
+ AvatarMenuItemController* oldItem = nil;
Robert Sesek 2011/10/24 19:07:04 No need to initialize.
sail 2011/10/24 19:16:38 Are stack variables automatically initialized to n
Robert Sesek 2011/10/24 19:25:53 Oops, no. Only global scope variables and instance
+ for (AvatarMenuItemController* item in items_.get()) {
+ if ([item isHighlighted]) {
+ oldItem = item;
+ break;
+ }
+ }
+
+ if (oldItem == newItem)
+ return;
+
+ [oldItem setIsHighlighted:NO];
+ [newItem setIsHighlighted:YES];
+}
+
+
@end
// Menu Item Controller ////////////////////////////////////////////////////////
@@ -238,6 +308,7 @@ const CGFloat kLabelInset = 49.0;
@implementation AvatarMenuItemController
@synthesize modelIndex = modelIndex_;
+@synthesize isHighlighted = isHighlighted_;
@synthesize iconView = iconView_;
@synthesize activeView = activeView_;
@synthesize nameField = nameField_;
@@ -274,16 +345,13 @@ const CGFloat kLabelInset = 49.0;
}
- (void)highlightForEventType:(NSEventType)type {
- BOOL active = !self.activeView.isHidden;
switch (type) {
case NSMouseEntered:
- if (active)
- [self animateFromView:self.emailField toView:self.editButton];
+ [controller_ highlightItem:self];
break;
case NSMouseExited:
- if (active)
- [self animateFromView:self.editButton toView:self.emailField];
+ [controller_ highlightItem:nil];
break;
default:
@@ -291,6 +359,21 @@ const CGFloat kLabelInset = 49.0;
};
}
+- (void)setIsHighlighted:(BOOL)isHighlighted {
+ if (isHighlighted_ == isHighlighted)
+ return;
+
+ isHighlighted_ = isHighlighted;
+ [[self view] setNeedsDisplay:YES];
+
+ if (!self.activeView.isHidden) {
+ if (isHighlighted_)
+ [self animateFromView:self.emailField toView:self.editButton];
+ else
+ [self animateFromView:self.editButton toView:self.emailField];
+ }
+}
+
- (void)animateFromView:(NSView*)outView toView:(NSView*)inView {
const NSTimeInterval kAnimationDuration = 0.175;
@@ -345,13 +428,11 @@ const CGFloat kLabelInset = 49.0;
- (void)mouseEntered:(id)sender {
[viewController_ highlightForEventType:[[NSApp currentEvent] type]];
- mouseInside_ = YES;
[self setNeedsDisplay:YES];
}
- (void)mouseExited:(id)sender {
[viewController_ highlightForEventType:[[NSApp currentEvent] type]];
- mouseInside_ = NO;
[self setNeedsDisplay:YES];
}
@@ -361,7 +442,7 @@ const CGFloat kLabelInset = 49.0;
- (void)drawRect:(NSRect)dirtyRect {
NSColor* backgroundColor = nil;
- if (mouseInside_) {
+ if ([viewController_ isHighlighted]) {
backgroundColor = [NSColor colorWithCalibratedRed:223.0/255
green:238.0/255
blue:246.0/255

Powered by Google App Engine
This is Rietveld 408576698