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

Unified Diff: chrome/browser/cocoa/location_bar/bubble_decoration.mm

Issue 3046029: [Mac] First pass at final sizing of toolbar items. (Closed) Base URL: git://codf21.jail/chromium.git
Patch Set: Don't disable unit tests for realz, sorry. Created 10 years, 5 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/cocoa/location_bar/bubble_decoration.mm
diff --git a/chrome/browser/cocoa/location_bar/bubble_decoration.mm b/chrome/browser/cocoa/location_bar/bubble_decoration.mm
index 6e109605cd04ba4a2d164c13760679780d92ca23..60c5da2e6e70ad6dfd1bd28aaf03ae0e603aa2fa 100644
--- a/chrome/browser/cocoa/location_bar/bubble_decoration.mm
+++ b/chrome/browser/cocoa/location_bar/bubble_decoration.mm
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include <cmath>
+
#import "chrome/browser/cocoa/location_bar/bubble_decoration.h"
#include "base/logging.h"
@@ -10,10 +12,27 @@
namespace {
// Padding between the icon/label and bubble edges.
-const CGFloat kBubblePadding = 7.0;
+const CGFloat kBubblePadding = 3.0;
+
+// The image needs to be in the same position as for the location
+// icon, which implies that the bubble's padding in the Omnibox needs
+// to differ from the location icon's. Indeed, that's how the views
+// implementation handles the problem. This draws the bubble edge a
+// little bit further left, which is easier but no less hacky.
+const CGFloat kLeftSideOverdraw = 1.0;
+
+// Omnibox corner radius is |4.0|, this needs to look tight WRT that.
+const CGFloat kBubbleCornerRadius = 2.0;
+
+// How far to inset the bubble from the top and bottom of the drawing
+// frame.
+// TODO(shess): Would be nicer to have the drawing code factor out the
+// space outside the border, and perhaps the border. Then this could
+// reflect the single pixel space w/in that.
+const CGFloat kBubbleYInset = 4.0;
-// How far to inset the keywork token from sides.
-const NSInteger kKeywordYInset = 4;
+// How far to inset the text from the edge of the bubble.
+const CGFloat kTextYInset = 1.0;
} // namespace
@@ -39,14 +58,23 @@ CGFloat BubbleDecoration::GetWidthForImageAndLabel(NSImage* image,
if (!label)
return kBubblePadding + image_width;
- const CGFloat label_width = [label sizeWithAttributes:attributes_].width;
+ // The bubble needs to take up an integral number of pixels.
+ // Generally -sizeWithAttributes: seems to overestimate rather than
+ // underestimate, so floor() seems to work better.
+ const CGFloat label_width =
+ std::floor([label sizeWithAttributes:attributes_].width);
return kBubblePadding + image_width + label_width;
}
NSRect BubbleDecoration::GetImageRectInFrame(NSRect frame) {
- NSRect imageRect = NSInsetRect(frame, 0.0, kKeywordYInset);
- if (image_)
- imageRect.size = [image_ size];
+ NSRect imageRect = NSInsetRect(frame, 0.0, kBubbleYInset);
+ if (image_) {
+ // Center the image vertically.
+ const NSSize imageSize = [image_ size];
+ imageRect.origin.y +=
+ std::floor((NSHeight(frame) - imageSize.height) / 2.0);
+ imageRect.size = imageSize;
+ }
return imageRect;
}
@@ -63,13 +91,16 @@ CGFloat BubbleDecoration::GetWidthForSpace(CGFloat width) {
}
void BubbleDecoration::DrawInFrame(NSRect frame, NSView* control_view) {
- const NSRect decorationFrame = NSInsetRect(frame, 0.0, kKeywordYInset);
+ const NSRect decorationFrame = NSInsetRect(frame, 0.0, kBubbleYInset);
- const NSRect bubbleFrame = NSInsetRect(decorationFrame, 0.5, 0.5);
+ // The inset is to put the border down the middle of the pixel.
+ NSRect bubbleFrame = NSInsetRect(decorationFrame, 0.5, 0.5);
+ bubbleFrame.origin.x -= kLeftSideOverdraw;
+ bubbleFrame.size.width += kLeftSideOverdraw;
NSBezierPath* path =
[NSBezierPath bezierPathWithRoundedRect:bubbleFrame
- xRadius:4.0
- yRadius:4.0];
+ xRadius:kBubbleCornerRadius
+ yRadius:kBubbleCornerRadius];
[background_color_ setFill];
[path fill];
@@ -80,7 +111,11 @@ void BubbleDecoration::DrawInFrame(NSRect frame, NSView* control_view) {
NSRect imageRect = decorationFrame;
if (image_) {
- imageRect.size = [image_ size];
+ // Center the image vertically.
+ const NSSize imageSize = [image_ size];
+ imageRect.origin.y +=
+ std::floor((NSHeight(decorationFrame) - imageSize.height) / 2.0);
+ imageRect.size = imageSize;
[image_ drawInRect:imageRect
fromRect:NSZeroRect // Entire image
operation:NSCompositeSourceOver
@@ -94,7 +129,7 @@ void BubbleDecoration::DrawInFrame(NSRect frame, NSView* control_view) {
NSRect textRect = decorationFrame;
textRect.origin.x = NSMaxX(imageRect);
textRect.size.width = NSMaxX(decorationFrame) - NSMinX(textRect);
- [text_color_ set];
+ textRect.origin.y += kTextYInset;
[label_ drawInRect:textRect withAttributes:attributes_];
}
}
@@ -120,5 +155,8 @@ void BubbleDecoration::SetColors(NSColor* border_color,
NSColor* text_color) {
border_color_.reset([border_color retain]);
background_color_.reset([background_color retain]);
- text_color_.reset([text_color retain]);
+
+ scoped_nsobject<NSMutableDictionary> attributes([attributes_ mutableCopy]);
+ [attributes setObject:text_color forKey:NSForegroundColorAttributeName];
+ attributes_.reset([attributes copy]);
}

Powered by Google App Engine
This is Rietveld 408576698