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

Unified Diff: chrome/browser/ui/cocoa/tabs/tab_controller.mm

Issue 2488833002: [Mac] Reverse tabs in RTL mode (Closed)
Patch Set: Update icon mask and add force RTL direction Created 4 years, 1 month 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/tabs/tab_controller.mm
diff --git a/chrome/browser/ui/cocoa/tabs/tab_controller.mm b/chrome/browser/ui/cocoa/tabs/tab_controller.mm
index b0c5deaf1b0b8bd4199a9d6ac3d308db0ae2d350..240d109a1015dbd751eaa87b74e9ce2841d969b1 100644
--- a/chrome/browser/ui/cocoa/tabs/tab_controller.mm
+++ b/chrome/browser/ui/cocoa/tabs/tab_controller.mm
@@ -11,6 +11,7 @@
#include "base/mac/bundle_locations.h"
#import "chrome/browser/themes/theme_properties.h"
#import "chrome/browser/themes/theme_service.h"
+#include "chrome/browser/ui/cocoa/l10n_util.h"
#import "chrome/browser/ui/cocoa/sprite_view.h"
#import "chrome/browser/ui/cocoa/tabs/alert_indicator_button_cocoa.h"
#import "chrome/browser/ui/cocoa/tabs/tab_controller_target.h"
@@ -60,6 +61,17 @@ class MenuDelegate : public ui::SimpleMenuModel::Delegate {
} // TabControllerInternal namespace
+namespace {
+static const CGFloat kTabLeadingPadding = 18;
+static const CGFloat kTabTrailingPadding = 15;
+static const CGFloat kIconSize = 16;
+static const CGFloat kCloseButtonSize = 16;
+static const CGFloat kInitialTabWidth = 160;
+static const CGFloat kTitleLeadingPadding = 4;
+static const CGFloat kInitialTitleWidth = 92;
+static const CGFloat kTabElementYOrigin = 6;
+} // namespace
+
+ (CGFloat)defaultTabHeight {
return 29;
}
@@ -81,31 +93,41 @@ class MenuDelegate : public ui::SimpleMenuModel::Delegate {
- (id)init {
if ((self = [super init])) {
+ BOOL isRTL = cocoa_l10n_util::ShouldDoExperimentalRTLLayout();
// Icon.
- // Remember the icon's frame, so that if the icon is ever removed, a new
- // one can later replace it in the proper location.
- originalIconFrame_ = NSMakeRect(18, 6, 16, 16);
- iconView_.reset([[SpriteView alloc] initWithFrame:originalIconFrame_]);
- [iconView_ setAutoresizingMask:NSViewMaxXMargin | NSViewMinYMargin];
-
- // When the icon is removed, the title expands to the left to fill the
- // space left by the icon. When the close button is removed, the title
- // expands to the right to fill its space. These are the amounts to expand
- // and contract the title frame under those conditions. We don't have to
- // explicilty save the offset between the title and the close button since
- // we can just get that value for the close button's frame.
- NSRect titleFrame = NSMakeRect(35, 6, 92, 17);
+ const CGFloat iconOrigin =
+ isRTL ? kInitialTabWidth - kTabLeadingPadding - kIconSize
+ : kTabLeadingPadding;
+ NSRect iconFrame =
+ NSMakeRect(iconOrigin, kTabElementYOrigin, kIconSize, kIconSize);
+ iconView_.reset([[SpriteView alloc] initWithFrame:iconFrame]);
+ [iconView_ setAutoresizingMask:isRTL ? NSViewMinXMargin | NSViewMinYMargin
+ : NSViewMaxXMargin | NSViewMinYMargin];
+
+ const CGFloat titleOrigin =
+ isRTL
+ ? NSMinX([iconView_ frame]) - kTitleLeadingPadding -
+ kInitialTitleWidth
+ : NSMaxX([iconView_ frame]) + kTitleLeadingPadding;
+ NSRect titleFrame =
+ NSMakeRect(titleOrigin, kTabElementYOrigin, kInitialTitleWidth, 17);
// Close button.
- NSRect closeButtonFrame = NSMakeRect(129, 6, 16, 16);
+ const CGFloat closeButtonOrigin =
+ isRTL ? kTabTrailingPadding
+ : kInitialTabWidth - kCloseButtonSize - kTabTrailingPadding;
+ NSRect closeButtonFrame = NSMakeRect(closeButtonOrigin, kTabElementYOrigin,
+ kCloseButtonSize, kCloseButtonSize);
closeButton_.reset([[HoverCloseButton alloc] initWithFrame:
closeButtonFrame]);
- [closeButton_ setAutoresizingMask:NSViewMinXMargin];
+ [closeButton_
+ setAutoresizingMask:isRTL ? NSViewMaxXMargin : NSViewMinXMargin];
[closeButton_ setTarget:self];
[closeButton_ setAction:@selector(closeTab:)];
base::scoped_nsobject<TabView> view([[TabView alloc]
- initWithFrame:NSMakeRect(0, 0, 160, [TabController defaultTabHeight])
+ initWithFrame:NSMakeRect(0, 0, kInitialTabWidth,
+ [TabController defaultTabHeight])
controller:self
closeButton:closeButton_]);
[view setAutoresizingMask:NSViewMaxXMargin | NSViewMinYMargin];
@@ -284,9 +306,10 @@ class MenuDelegate : public ui::SimpleMenuModel::Delegate {
// tab. We never actually do this, but it's a helpful guide for determining
// how much space we have available.
- (int)iconCapacity {
- const CGFloat availableWidth = std::max<CGFloat>(
- 0, NSMaxX([closeButton_ frame]) - NSMinX(originalIconFrame_));
- const CGFloat widthPerIcon = NSWidth(originalIconFrame_);
+ const CGFloat availableWidth =
+ std::max<CGFloat>(0, NSWidth([[self tabView] frame]) -
+ kTabLeadingPadding - kTabTrailingPadding);
+ const CGFloat widthPerIcon = kIconSize;
const int kPaddingBetweenIcons = 2;
if (availableWidth >= widthPerIcon &&
availableWidth < (widthPerIcon + kPaddingBetweenIcons)) {
@@ -322,9 +345,12 @@ class MenuDelegate : public ui::SimpleMenuModel::Delegate {
if (image == nil) {
[self setIconView:nil];
} else {
+ BOOL isRTL = cocoa_l10n_util::ShouldDoExperimentalRTLLayout();
if (iconView_.get() == nil) {
base::scoped_nsobject<SpriteView> iconView([[SpriteView alloc] init]);
- [iconView setAutoresizingMask:NSViewMaxXMargin | NSViewMinYMargin];
+ [iconView setAutoresizingMask:isRTL
+ ? NSViewMinXMargin | NSViewMinYMargin
+ : NSViewMaxXMargin | NSViewMinYMargin];
[self setIconView:iconView];
}
@@ -332,16 +358,21 @@ class MenuDelegate : public ui::SimpleMenuModel::Delegate {
if ([self pinned]) {
NSRect appIconFrame = [iconView_ frame];
- appIconFrame.origin = originalIconFrame_.origin;
const CGFloat tabWidth = [TabController pinnedTabWidth];
// Center the icon.
- appIconFrame.origin.x =
- std::floor((tabWidth - NSWidth(appIconFrame)) / 2.0);
+ appIconFrame.origin = NSMakePoint(
+ std::floor((tabWidth - kIconSize) / 2.0), kTabElementYOrigin);
[iconView_ setFrame:appIconFrame];
} else {
- [iconView_ setFrame:originalIconFrame_];
+ const CGFloat tabWidth = NSWidth([[self tabView] frame]);
+ const CGFloat iconOrigin = isRTL
+ ? tabWidth - kIconSize - kTabLeadingPadding
+ : kTabLeadingPadding;
+ NSRect iconFrame =
+ NSMakeRect(iconOrigin, kTabElementYOrigin, kIconSize, kIconSize);
+ [iconView_ setFrame:iconFrame];
}
}
}
@@ -367,6 +398,8 @@ class MenuDelegate : public ui::SimpleMenuModel::Delegate {
[alertIndicatorButton_ setHidden:!newShowAlertIndicator];
+ BOOL isRTL = cocoa_l10n_util::ShouldDoExperimentalRTLLayout();
+
if (newShowAlertIndicator) {
NSRect newFrame = [alertIndicatorButton_ frame];
newFrame.size = [[alertIndicatorButton_ image] size];
@@ -374,16 +407,16 @@ class MenuDelegate : public ui::SimpleMenuModel::Delegate {
// Tab is pinned: Position the alert indicator in the center.
const CGFloat tabWidth = [TabController pinnedTabWidth];
newFrame.origin.x = std::floor((tabWidth - NSWidth(newFrame)) / 2);
- newFrame.origin.y = NSMinY(originalIconFrame_) -
- std::floor((NSHeight(newFrame) - NSHeight(originalIconFrame_)) / 2);
+ newFrame.origin.y =
+ kTabElementYOrigin - std::floor((NSHeight(newFrame) - kIconSize) / 2);
} else {
// The Frame for the alertIndicatorButton_ depends on whether iconView_
// and/or closeButton_ are visible, and where they have been positioned.
const NSRect closeButtonFrame = [closeButton_ frame];
newFrame.origin.x = NSMinX(closeButtonFrame);
- // Position to the left of the close button when it is showing.
+ // Position before the close button when it is showing.
if (newShowCloseButton)
- newFrame.origin.x -= NSWidth(newFrame);
+ newFrame.origin.x += isRTL ? NSWidth(newFrame) : -NSWidth(newFrame);
// Alert indicator is centered vertically, with respect to closeButton_.
newFrame.origin.y = NSMinY(closeButtonFrame) -
std::floor((NSHeight(newFrame) - NSHeight(closeButtonFrame)) / 2);
@@ -399,22 +432,32 @@ class MenuDelegate : public ui::SimpleMenuModel::Delegate {
newTitleFrame.size.height = oldTitleFrame.size.height;
newTitleFrame.origin.y = oldTitleFrame.origin.y;
- if (newShowIcon) {
- newTitleFrame.origin.x = NSMaxX([iconView_ frame]) + 4;
+ CGFloat titleLeft, titleRight;
+ if (isRTL) {
+ if (newShowAlertIndicator) {
+ titleLeft = NSMaxX([alertIndicatorButton_ frame]);
+ } else if (newShowCloseButton) {
+ titleLeft = NSMaxX([closeButton_ frame]);
+ } else {
+ titleLeft = kTabLeadingPadding;
+ }
+ titleRight = newShowIcon
+ ? NSMinX([iconView_ frame]) - kTitleLeadingPadding
+ : NSWidth([[self tabView] frame]) - kTabLeadingPadding;
} else {
- newTitleFrame.origin.x = originalIconFrame_.origin.x;
+ titleLeft = newShowIcon ? NSMaxX([iconView_ frame]) + kTitleLeadingPadding
+ : kTabLeadingPadding;
+ if (newShowAlertIndicator) {
+ titleRight = NSMinX([alertIndicatorButton_ frame]);
+ } else if (newShowCloseButton) {
+ titleRight = NSMinX([closeButton_ frame]);
+ } else {
+ titleRight = NSWidth([[self tabView] frame]) - kTabTrailingPadding;
+ }
}
- if (newShowAlertIndicator) {
- newTitleFrame.size.width = NSMinX([alertIndicatorButton_ frame]) -
- newTitleFrame.origin.x;
- } else if (newShowCloseButton) {
- newTitleFrame.size.width = NSMinX([closeButton_ frame]) -
- newTitleFrame.origin.x;
- } else {
- newTitleFrame.size.width = NSMaxX([closeButton_ frame]) -
- newTitleFrame.origin.x;
- }
+ newTitleFrame.size.width = titleRight - titleLeft;
+ newTitleFrame.origin.x = titleLeft;
[tabView setTitleFrame:newTitleFrame];
}
« no previous file with comments | « chrome/browser/ui/cocoa/tabs/tab_controller.h ('k') | chrome/browser/ui/cocoa/tabs/tab_controller_unittest.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698