| Index: chrome/browser/views/frame/opaque_browser_frame_view.cc
|
| ===================================================================
|
| --- chrome/browser/views/frame/opaque_browser_frame_view.cc (revision 56738)
|
| +++ chrome/browser/views/frame/opaque_browser_frame_view.cc (working copy)
|
| @@ -36,10 +36,6 @@
|
| #include "views/window/hit_test.h"
|
| #endif
|
|
|
| -#if defined(OS_CHROMEOS)
|
| -const int kCustomFrameBackgroundVerticalOffset = 15;
|
| -#endif
|
| -
|
| namespace {
|
| // The frame border is only visible in restored mode and is hardcoded to 4 px on
|
| // each side regardless of the system window border size.
|
| @@ -71,9 +67,6 @@
|
| const int kIconTitleSpacing = 4;
|
| // There is a 5 px gap between the title text and the caption buttons.
|
| const int kTitleLogoSpacing = 5;
|
| -// In maximized mode, the OTR avatar starts 2 px below the top of the screen, so
|
| -// that it doesn't extend into the "3D edge" portion of the titlebar.
|
| -const int kOTRMaximizedTopSpacing = 2;
|
| // The OTR avatar ends 2 px above the bottom of the tabstrip (which, given the
|
| // way the tabstrip draws its bottom edge, will appear like a 1 px gap to the
|
| // user).
|
| @@ -97,8 +90,6 @@
|
| const int kTabStripIndent = 1;
|
| // Spacing between extension app icon/title and tab strip.
|
| const int kExtensionAppTabStripLeftSpacing = 10;
|
| -// Padding between the caption and start of vertical tabs.
|
| -const int kVerticalTabPadding = 6;
|
| // Inset from the top of the toolbar/tabstrip to the shadow. Used only for
|
| // vertical tabs.
|
| const int kVerticalTabBorderInset = 3;
|
| @@ -110,7 +101,6 @@
|
| OpaqueBrowserFrameView::OpaqueBrowserFrameView(BrowserFrame* frame,
|
| BrowserView* browser_view)
|
| : BrowserNonClientFrameView(),
|
| - otr_avatar_icon_(new views::ImageView()),
|
| ALLOW_THIS_IN_INITIALIZER_LIST(
|
| minimize_button_(new views::ImageButton(this))),
|
| ALLOW_THIS_IN_INITIALIZER_LIST(
|
| @@ -180,8 +170,6 @@
|
| close_button_->SetAccessibleName(l10n_util::GetString(IDS_ACCNAME_CLOSE));
|
| AddChildView(close_button_);
|
|
|
| - otr_avatar_icon_->SetImage(browser_view_->GetOTRAvatarIcon());
|
| - AddChildView(otr_avatar_icon_);
|
| // Initializing the TabIconView is expensive, so only do it if we need to.
|
| if (browser_view_->ShouldShowWindowIcon()) {
|
| window_icon_ = new TabIconView(this);
|
| @@ -201,17 +189,13 @@
|
| BaseTabStrip* tabstrip) const {
|
| if (browser_view_->UseVerticalTabs()) {
|
| gfx::Size ps = tabstrip->GetPreferredSize();
|
| - return gfx::Rect(NonClientBorderThickness(), NonClientTopBorderHeight(),
|
| - ps.width(), browser_view_->height());
|
| + return gfx::Rect(NonClientBorderThickness(),
|
| + NonClientTopBorderHeight(false, false), ps.width(),
|
| + browser_view_->height());
|
| }
|
|
|
| - int tabstrip_y = NonClientTopBorderHeight();
|
| - if (!frame_->GetWindow()->IsMaximized() &&
|
| - !frame_->GetWindow()->IsFullscreen())
|
| - tabstrip_y += kNonClientRestoredExtraThickness;
|
| -
|
| int tabstrip_x = browser_view_->ShouldShowOffTheRecordAvatar() ?
|
| - (otr_avatar_icon_->bounds().right() + kOTRSideSpacing) :
|
| + (otr_avatar_bounds_.right() + kOTRSideSpacing) :
|
| NonClientBorderThickness() + kTabStripIndent;
|
|
|
| int tabstrip_width = minimize_button_->x() - tabstrip_x -
|
| @@ -227,10 +211,18 @@
|
| tabstrip_width -= tabstrip_offset;
|
| }
|
|
|
| - return gfx::Rect(tabstrip_x, tabstrip_y,
|
| + return gfx::Rect(tabstrip_x, GetHorizontalTabStripVerticalOffset(false),
|
| std::max(0, tabstrip_width), tabstrip->GetPreferredHeight());
|
| }
|
|
|
| +int OpaqueBrowserFrameView::GetHorizontalTabStripVerticalOffset(
|
| + bool restored) const {
|
| + return NonClientTopBorderHeight(restored, true) + ((!restored &&
|
| + (frame_->GetWindow()->IsMaximized() ||
|
| + frame_->GetWindow()->IsFullscreen())) ?
|
| + 0 : kNonClientRestoredExtraThickness);
|
| +}
|
| +
|
| void OpaqueBrowserFrameView::UpdateThrobber(bool running) {
|
| if (window_icon_)
|
| window_icon_->Update();
|
| @@ -240,10 +232,11 @@
|
| gfx::Size min_size(browser_view_->GetMinimumSize());
|
| int border_thickness = NonClientBorderThickness();
|
| min_size.Enlarge(2 * border_thickness,
|
| - NonClientTopBorderHeight() + border_thickness);
|
| + NonClientTopBorderHeight(false, false) + border_thickness);
|
|
|
| views::WindowDelegate* d = frame_->GetWindow()->GetDelegate();
|
| - int min_titlebar_width = (2 * FrameBorderThickness()) + kIconLeftSpacing +
|
| + int min_titlebar_width = (2 * FrameBorderThickness(false)) +
|
| + kIconLeftSpacing +
|
| (d->ShouldShowWindowIcon() ? (IconSize() + kTitleLogoSpacing) : 0);
|
| #if !defined(OS_CHROMEOS)
|
| min_titlebar_width +=
|
| @@ -272,7 +265,7 @@
|
|
|
| gfx::Rect OpaqueBrowserFrameView::GetWindowBoundsForClientBounds(
|
| const gfx::Rect& client_bounds) const {
|
| - int top_height = NonClientTopBorderHeight();
|
| + int top_height = NonClientTopBorderHeight(false, false);
|
| int border_thickness = NonClientBorderThickness();
|
| return gfx::Rect(std::max(0, client_bounds.x() - border_thickness),
|
| std::max(0, client_bounds.y() - top_height),
|
| @@ -361,34 +354,12 @@
|
| PaintTitleBar(canvas);
|
| if (browser_view_->IsToolbarVisible())
|
| PaintToolbarBackground(canvas);
|
| + if (browser_view_->ShouldShowOffTheRecordAvatar())
|
| + PaintOTRAvatar(canvas);
|
| if (!window->IsMaximized())
|
| PaintRestoredClientEdge(canvas);
|
| }
|
|
|
| -void OpaqueBrowserFrameView::PaintChildren(gfx::Canvas* canvas) {
|
| - if (!browser_view_->UseVerticalTabs() || !otr_avatar_icon_->IsVisible()) {
|
| - View::PaintChildren(canvas);
|
| - return;
|
| - }
|
| -
|
| - // The otr icon is clipped for side tabs.
|
| - for (int i = 0, count = GetChildViewCount(); i < count; ++i) {
|
| - View* child = GetChildViewAt(i);
|
| - if (!child) {
|
| - NOTREACHED() << "Should not have a NULL child View for index in bounds";
|
| - continue;
|
| - }
|
| - if (child == otr_avatar_icon_) {
|
| - canvas->Save();
|
| - canvas->ClipRectInt(0, 2, width(), otr_avatar_icon_->height() - 10);
|
| - child->ProcessPaint(canvas);
|
| - canvas->Restore();
|
| - } else {
|
| - child->ProcessPaint(canvas);
|
| - }
|
| - }
|
| -}
|
| -
|
| void OpaqueBrowserFrameView::Layout() {
|
| LayoutWindowControls();
|
| LayoutTitleBar();
|
| @@ -463,56 +434,52 @@
|
| ///////////////////////////////////////////////////////////////////////////////
|
| // OpaqueBrowserFrameView, private:
|
|
|
| -int OpaqueBrowserFrameView::FrameBorderThickness() const {
|
| +int OpaqueBrowserFrameView::FrameBorderThickness(bool restored) const {
|
| views::Window* window = frame_->GetWindow();
|
| - return (window->IsMaximized() || window->IsFullscreen()) ?
|
| + return (!restored && (window->IsMaximized() || window->IsFullscreen())) ?
|
| 0 : kFrameBorderThickness;
|
| }
|
|
|
| int OpaqueBrowserFrameView::TopResizeHeight() const {
|
| - return FrameBorderThickness() - kTopResizeAdjust;
|
| + return FrameBorderThickness(false) - kTopResizeAdjust;
|
| }
|
|
|
| int OpaqueBrowserFrameView::NonClientBorderThickness() const {
|
| // When we fill the screen, we don't show a client edge.
|
| views::Window* window = frame_->GetWindow();
|
| - return FrameBorderThickness() +
|
| + return FrameBorderThickness(false) +
|
| ((window->IsMaximized() || window->IsFullscreen()) ?
|
| 0 : kClientEdgeThickness);
|
| }
|
|
|
| -int OpaqueBrowserFrameView::NonClientTopBorderHeight() const {
|
| +int OpaqueBrowserFrameView::NonClientTopBorderHeight(
|
| + bool restored,
|
| + bool ignore_vertical_tabs) const {
|
| views::Window* window = frame_->GetWindow();
|
| - if (window->GetDelegate()->ShouldShowWindowTitle()) {
|
| - return std::max(FrameBorderThickness() + IconSize(),
|
| - CaptionButtonY() + kCaptionButtonHeightWithPadding) +
|
| - TitlebarBottomThickness();
|
| + if (window->GetDelegate()->ShouldShowWindowTitle() ||
|
| + (browser_view_->IsTabStripVisible() && !ignore_vertical_tabs &&
|
| + browser_view_->UseVerticalTabs())) {
|
| + return std::max(FrameBorderThickness(restored) + IconSize(),
|
| + CaptionButtonY(restored) + kCaptionButtonHeightWithPadding) +
|
| + TitlebarBottomThickness(restored);
|
| }
|
|
|
| - if (browser_view_->IsTabStripVisible() && browser_view_->UseVerticalTabs()) {
|
| - return CaptionButtonY() + minimize_button_->GetPreferredSize().height() +
|
| - kVerticalTabPadding;
|
| - }
|
| -
|
| - return FrameBorderThickness() -
|
| - ((browser_view_->IsTabStripVisible() && window->IsMaximized()) ?
|
| - kTabstripTopShadowThickness : 0);
|
| + return FrameBorderThickness(restored) -
|
| + ((browser_view_->IsTabStripVisible() && !restored &&
|
| + window->IsMaximized()) ? kTabstripTopShadowThickness : 0);
|
| }
|
|
|
| -int OpaqueBrowserFrameView::CaptionButtonY() const {
|
| +int OpaqueBrowserFrameView::CaptionButtonY(bool restored) const {
|
| // Maximized buttons start at window top so that even if their images aren't
|
| // drawn flush with the screen edge, they still obey Fitts' Law.
|
| - return frame_->GetWindow()->IsMaximized() ?
|
| - FrameBorderThickness() : kFrameShadowThickness;
|
| + return (!restored && frame_->GetWindow()->IsMaximized()) ?
|
| + FrameBorderThickness(false) : kFrameShadowThickness;
|
| }
|
|
|
| -int OpaqueBrowserFrameView::TitlebarBottomThickness() const {
|
| - // When a toolbar is edging the titlebar, it draws its own bottom edge.
|
| - if (browser_view_->IsToolbarVisible())
|
| - return 0;
|
| -
|
| +int OpaqueBrowserFrameView::TitlebarBottomThickness(bool restored) const {
|
| return kTitlebarTopAndBottomEdgeThickness +
|
| - (frame_->GetWindow()->IsMaximized() ? 0 : kClientEdgeThickness);
|
| + ((!restored && frame_->GetWindow()->IsMaximized()) ?
|
| + 0 : kClientEdgeThickness);
|
| }
|
|
|
| int OpaqueBrowserFrameView::IconSize() const {
|
| @@ -527,7 +494,7 @@
|
|
|
| gfx::Rect OpaqueBrowserFrameView::IconBounds() const {
|
| int size = IconSize();
|
| - int frame_thickness = FrameBorderThickness();
|
| + int frame_thickness = FrameBorderThickness(false);
|
| int y;
|
| views::WindowDelegate* d = frame_->GetWindow()->GetDelegate();
|
| if (d->ShouldShowWindowIcon() || d->ShouldShowWindowTitle()) {
|
| @@ -547,8 +514,8 @@
|
| // restored windows) below looks (to the eye) more like additional space
|
| // than does the 3D edge (or nothing at all, for maximized windows) above;
|
| // hence the +1.
|
| - y = unavailable_px_at_top + (NonClientTopBorderHeight() -
|
| - unavailable_px_at_top - size - TitlebarBottomThickness() + 1) / 2;
|
| + y = unavailable_px_at_top + (NonClientTopBorderHeight(false, false) -
|
| + unavailable_px_at_top - size - TitlebarBottomThickness(false) + 1) / 2;
|
| } else {
|
| // For "browser mode" windows, we use the native positioning, which is just
|
| // below the top frame border.
|
| @@ -681,7 +648,6 @@
|
|
|
| // Window frame mode and color
|
| SkBitmap* theme_frame;
|
| - int y = 0;
|
| // Never theme app and popup windows.
|
| if (!browser_view_->IsBrowserTypeNormal()) {
|
| ResourceBundle& rb = ResourceBundle::GetSharedInstance();
|
| @@ -690,30 +656,24 @@
|
| } else if (!browser_view_->IsOffTheRecord()) {
|
| theme_frame = tp->GetBitmapNamed(ShouldPaintAsActive() ?
|
| IDR_THEME_FRAME : IDR_THEME_FRAME_INACTIVE);
|
| -#if defined(OS_CHROMEOS)
|
| - // TODO:(oshima): gtk based CHROMEOS is using non custom frame
|
| - // mode which does this adjustment. This should be removed
|
| - // once it's fully migrated to views. -1 is due to the layout
|
| - // difference between views and gtk and will be removed.
|
| - // See http://crbug.com/28580.
|
| - y = -kCustomFrameBackgroundVerticalOffset - 1;
|
| -#endif
|
| } else {
|
| theme_frame = tp->GetBitmapNamed(ShouldPaintAsActive() ?
|
| IDR_THEME_FRAME_INCOGNITO : IDR_THEME_FRAME_INCOGNITO_INACTIVE);
|
| -#if defined(OS_CHROMEOS)
|
| - y = -kCustomFrameBackgroundVerticalOffset - 1;
|
| -#endif
|
| }
|
| - // Draw the theme frame.
|
| - canvas->TileImageInt(*theme_frame, 0, y, width(), theme_frame->height());
|
| + // Draw the theme frame. It must be aligned with the tabstrip as if we were
|
| + // in restored mode. Note that the top of the tabstrip is
|
| + // kTabstripTopShadowThickness px off the top of the screen.
|
| + int theme_background_y = -(GetHorizontalTabStripVerticalOffset(true) +
|
| + kTabstripTopShadowThickness);
|
| + canvas->TileImageInt(*theme_frame, 0, theme_background_y, width(),
|
| + theme_frame->height());
|
|
|
| // Draw the theme frame overlay
|
| if (tp->HasCustomImage(IDR_THEME_FRAME_OVERLAY) &&
|
| browser_view_->IsBrowserTypeNormal()) {
|
| SkBitmap* theme_overlay = tp->GetBitmapNamed(ShouldPaintAsActive() ?
|
| IDR_THEME_FRAME_OVERLAY : IDR_THEME_FRAME_OVERLAY_INACTIVE);
|
| - canvas->DrawBitmapInt(*theme_overlay, 0, 0);
|
| + canvas->DrawBitmapInt(*theme_overlay, 0, theme_background_y);
|
| }
|
|
|
| if (!browser_view_->IsToolbarVisible()) {
|
| @@ -745,20 +705,22 @@
|
| }
|
|
|
| void OpaqueBrowserFrameView::PaintToolbarBackground(gfx::Canvas* canvas) {
|
| - gfx::Rect toolbar_bounds = GetViewBounds(browser_view_->toolbar(), this);
|
| + gfx::Rect toolbar_bounds(browser_view_->GetToolbarBounds());
|
| if (toolbar_bounds.IsEmpty())
|
| return;
|
| + gfx::Point toolbar_origin(toolbar_bounds.origin());
|
| + ConvertPointToView(browser_view_, this, &toolbar_origin);
|
| + toolbar_bounds.set_origin(toolbar_origin);
|
|
|
| - int x, y, w, h;
|
| + int x = toolbar_bounds.x();
|
| + int w = toolbar_bounds.width();
|
| + int y, h;
|
| if (browser_view_->UseVerticalTabs()) {
|
| - gfx::Rect tabstrip_bounds = GetViewBounds(browser_view_->tabstrip(), this);
|
| - x = tabstrip_bounds.x();
|
| - w = toolbar_bounds.right() - x;
|
| - y = tabstrip_bounds.y() - kVerticalTabBorderInset;
|
| + gfx::Point tabstrip_origin(browser_view_->tabstrip()->bounds().origin());
|
| + ConvertPointToView(browser_view_, this, &tabstrip_origin);
|
| + y = tabstrip_origin.y() - kVerticalTabBorderInset;
|
| h = toolbar_bounds.bottom() - y;
|
| } else {
|
| - x = toolbar_bounds.x();
|
| - w = toolbar_bounds.width();
|
| y = toolbar_bounds.y();
|
| h = toolbar_bounds.bottom();
|
| }
|
| @@ -784,11 +746,12 @@
|
| tp->GetColor(BrowserThemeProvider::COLOR_TOOLBAR);
|
| canvas->FillRectInt(theme_toolbar_color, x, bottom_y, w, bottom_edge_height);
|
|
|
| + // Tile the toolbar image starting at the frame edge on the left and where the
|
| + // horizontal tabstrip is (or would be) on the top.
|
| SkBitmap* theme_toolbar = tp->GetBitmapNamed(IDR_THEME_TOOLBAR);
|
| - int strip_height = browser_view_->GetTabStripHeight();
|
| - canvas->TileImageInt(*theme_toolbar, x - kClientEdgeThickness,
|
| - strip_height - kFrameShadowThickness, x - kClientEdgeThickness, bottom_y,
|
| - w + (2 * kClientEdgeThickness), theme_toolbar->height());
|
| + canvas->TileImageInt(*theme_toolbar, x,
|
| + bottom_y - GetHorizontalTabStripVerticalOffset(false), x,
|
| + bottom_y, w, theme_toolbar->height());
|
|
|
| // Draw rounded corners for the tab.
|
| SkBitmap* toolbar_left_mask =
|
| @@ -813,8 +776,8 @@
|
| toolbar_left_mask->width(), bottom_edge_height, false, paint);
|
|
|
| // Mask the right edge.
|
| - int right_x = x + w - toolbar_right_mask->width() + kClientEdgeThickness +
|
| - kContentEdgeShadowThickness;
|
| + int right_x =
|
| + x + w - toolbar_right_mask->width() + kContentEdgeShadowThickness;
|
| canvas->DrawBitmapInt(*toolbar_right_mask, 0, 0, toolbar_right_mask->width(),
|
| split_point, right_x, y, toolbar_right_mask->width(),
|
| split_point, false, paint);
|
| @@ -847,26 +810,52 @@
|
|
|
| // Draw the content/toolbar separator.
|
| canvas->FillRectInt(ResourceBundle::toolbar_separator_color,
|
| - toolbar_bounds.x(), toolbar_bounds.bottom() - kClientEdgeThickness,
|
| - toolbar_bounds.width(), kClientEdgeThickness);
|
| + x + kClientEdgeThickness, toolbar_bounds.bottom() - kClientEdgeThickness,
|
| + w - (2 * kClientEdgeThickness), kClientEdgeThickness);
|
| }
|
|
|
| +void OpaqueBrowserFrameView::PaintOTRAvatar(gfx::Canvas* canvas) {
|
| + // In RTL mode, the avatar icon should be looking the opposite direction.
|
| + canvas->Save();
|
| + if (base::i18n::IsRTL()) {
|
| + canvas->TranslateInt(width(), 0);
|
| + canvas->ScaleInt(-1, 1);
|
| + }
|
| +
|
| + SkBitmap otr_avatar_icon = browser_view_->GetOTRAvatarIcon();
|
| + int w = otr_avatar_bounds_.width();
|
| + int h = otr_avatar_bounds_.height();
|
| + canvas->DrawBitmapInt(otr_avatar_icon, 0,
|
| + // Bias the rounding to select a region that's lower rather than higher,
|
| + // as the shadows at the image top mean the apparent center is below the
|
| + // real center.
|
| + ((otr_avatar_icon.height() - otr_avatar_bounds_.height()) + 1) / 2, w, h,
|
| + otr_avatar_bounds_.x(), otr_avatar_bounds_.y(), w, h, false);
|
| +
|
| + canvas->Restore();
|
| +}
|
| +
|
| void OpaqueBrowserFrameView::PaintRestoredClientEdge(gfx::Canvas* canvas) {
|
| ThemeProvider* tp = GetThemeProvider();
|
| int client_area_top = frame_->GetWindow()->GetClientView()->y();
|
| + int image_top = client_area_top;
|
|
|
| gfx::Rect client_area_bounds = CalculateClientAreaBounds(width(), height());
|
| SkColor toolbar_color = tp->GetColor(BrowserThemeProvider::COLOR_TOOLBAR);
|
|
|
| if (browser_view_->IsToolbarVisible()) {
|
| - // The client edges start below the toolbar or its corner images, whichever
|
| - // is shorter.
|
| + // The client edge images always start below the toolbar corner images. The
|
| + // client edge filled rects start there or at the bottom of the tooolbar,
|
| + // whichever is shorter.
|
| gfx::Rect toolbar_bounds(browser_view_->GetToolbarBounds());
|
| - client_area_top += browser_view_->GetToolbarBounds().y() +
|
| - std::min(tp->GetBitmapNamed(IDR_CONTENT_TOP_LEFT_CORNER)->height(),
|
| - toolbar_bounds.height());
|
| - if (browser_view_->UseVerticalTabs())
|
| + image_top += toolbar_bounds.y() +
|
| + tp->GetBitmapNamed(IDR_CONTENT_TOP_LEFT_CORNER)->height();
|
| + client_area_top = std::min(image_top,
|
| + client_area_top + toolbar_bounds.bottom() - kClientEdgeThickness);
|
| + if (browser_view_->UseVerticalTabs()) {
|
| client_area_top -= kVerticalTabBorderInset;
|
| + image_top -= kVerticalTabBorderInset;
|
| + }
|
| } else if (!browser_view_->IsTabStripVisible()) {
|
| // The toolbar isn't going to draw a client edge for us, so draw one
|
| // ourselves.
|
| @@ -895,24 +884,13 @@
|
|
|
| int client_area_bottom =
|
| std::max(client_area_top, height() - NonClientBorderThickness());
|
| - int client_area_height = client_area_bottom - client_area_top;
|
| + int image_height = client_area_bottom - image_top;
|
|
|
| - // Draw the toolbar color so that the client edges show the right color even
|
| - // where not covered by the toolbar image.
|
| - canvas->FillRectInt(toolbar_color,
|
| - client_area_bounds.x() - kClientEdgeThickness, client_area_top,
|
| - kClientEdgeThickness,
|
| - client_area_bottom + kClientEdgeThickness - client_area_top);
|
| - canvas->FillRectInt(toolbar_color, client_area_bounds.x(), client_area_bottom,
|
| - client_area_bounds.width(), kClientEdgeThickness);
|
| - canvas->FillRectInt(toolbar_color, client_area_bounds.right(),
|
| - client_area_top, kClientEdgeThickness,
|
| - client_area_bottom + kClientEdgeThickness - client_area_top);
|
| -
|
| // Draw the client edge images.
|
| + // Draw the client edge images.
|
| SkBitmap* right = tp->GetBitmapNamed(IDR_CONTENT_RIGHT_SIDE);
|
| - canvas->TileImageInt(*right, client_area_bounds.right(), client_area_top,
|
| - right->width(), client_area_height);
|
| + canvas->TileImageInt(*right, client_area_bounds.right(), image_top,
|
| + right->width(), image_height);
|
| canvas->DrawBitmapInt(
|
| *tp->GetBitmapNamed(IDR_CONTENT_BOTTOM_RIGHT_CORNER),
|
| client_area_bounds.right(), client_area_bottom);
|
| @@ -926,21 +904,35 @@
|
| client_area_bounds.x() - bottom_left->width(), client_area_bottom);
|
| SkBitmap* left = tp->GetBitmapNamed(IDR_CONTENT_LEFT_SIDE);
|
| canvas->TileImageInt(*left, client_area_bounds.x() - left->width(),
|
| - client_area_top, left->width(), client_area_height);
|
| + image_top, left->width(), image_height);
|
| +
|
| + // Draw the toolbar color so that the client edges show the right color even
|
| + // where not covered by the toolbar image. NOTE: We do this after drawing the
|
| + // images because the images are meant to alpha-blend atop the frame whereas
|
| + // these rects are meant to be fully opaque, without anything overlaid.
|
| + canvas->FillRectInt(toolbar_color,
|
| + client_area_bounds.x() - kClientEdgeThickness, client_area_top,
|
| + kClientEdgeThickness,
|
| + client_area_bottom + kClientEdgeThickness - client_area_top);
|
| + canvas->FillRectInt(toolbar_color, client_area_bounds.x(), client_area_bottom,
|
| + client_area_bounds.width(), kClientEdgeThickness);
|
| + canvas->FillRectInt(toolbar_color, client_area_bounds.right(),
|
| + client_area_top, kClientEdgeThickness,
|
| + client_area_bottom + kClientEdgeThickness - client_area_top);
|
| }
|
|
|
| void OpaqueBrowserFrameView::LayoutWindowControls() {
|
| bool is_maximized = frame_->GetWindow()->IsMaximized();
|
| close_button_->SetImageAlignment(views::ImageButton::ALIGN_LEFT,
|
| views::ImageButton::ALIGN_BOTTOM);
|
| - int caption_y = CaptionButtonY();
|
| + int caption_y = CaptionButtonY(false);
|
| // There should always be the same number of non-shadow pixels visible to the
|
| // side of the caption buttons. In maximized mode we extend the rightmost
|
| // button to the screen corner to obey Fitts' Law.
|
| int right_extra_width = is_maximized ?
|
| (kFrameBorderThickness - kFrameShadowThickness) : 0;
|
| gfx::Size close_button_size = close_button_->GetPreferredSize();
|
| - close_button_->SetBounds(width() - FrameBorderThickness() -
|
| + close_button_->SetBounds(width() - FrameBorderThickness(false) -
|
| right_extra_width - close_button_size.width(), caption_y,
|
| close_button_size.width() + right_extra_width,
|
| close_button_size.height());
|
| @@ -960,9 +952,8 @@
|
| // other places that rely on the bounds. Put it slightly to the right
|
| // of the edge of the view, so that when we remove the spacing it lines
|
| // up with the edge.
|
| - minimize_button_->SetBounds(
|
| - width() - FrameBorderThickness() + kNewTabCaptionMaximizedSpacing, 0, 0,
|
| - 0);
|
| + minimize_button_->SetBounds(width() - FrameBorderThickness(false) +
|
| + kNewTabCaptionMaximizedSpacing, 0, 0, 0);
|
| return;
|
| }
|
| #endif
|
| @@ -1020,50 +1011,29 @@
|
| }
|
|
|
| void OpaqueBrowserFrameView::LayoutOTRAvatar() {
|
| - int otr_y = NonClientTopBorderHeight();
|
| - if (!frame_->GetWindow()->IsMaximized() &&
|
| - !frame_->GetWindow()->IsFullscreen()) {
|
| - otr_y += kNonClientRestoredExtraThickness;
|
| - }
|
| - bool visible = browser_view_->ShouldShowOffTheRecordAvatar();
|
| - gfx::Size preferred_size = otr_avatar_icon_->GetPreferredSize();
|
| - int otr_height = 0;
|
| - if (browser_view_->IsTabStripVisible()) {
|
| - if (browser_view_->UseVerticalTabs()) {
|
| - otr_height = preferred_size.height();
|
| - otr_y = -2;
|
| - } else {
|
| - int tabstrip_height =
|
| - browser_view_->GetTabStripHeight() - kOTRBottomSpacing;
|
| - otr_height = frame_->GetWindow()->IsMaximized() ?
|
| - (tabstrip_height - kOTRMaximizedTopSpacing) :
|
| - preferred_size.height();
|
| - otr_y += tabstrip_height - otr_height;
|
| - }
|
| + SkBitmap otr_avatar_icon = browser_view_->GetOTRAvatarIcon();
|
| + int otr_bottom, otr_restored_y;
|
| + if (browser_view_->UseVerticalTabs()) {
|
| + otr_bottom = NonClientTopBorderHeight(false, false) - kOTRBottomSpacing;
|
| + otr_restored_y = kFrameShadowThickness;
|
| } else {
|
| - visible = false;
|
| + otr_bottom = GetHorizontalTabStripVerticalOffset(false) +
|
| + browser_view_->GetTabStripHeight() - kOTRBottomSpacing;
|
| + otr_restored_y = otr_bottom - otr_avatar_icon.height();
|
| }
|
| - otr_avatar_icon_->SetVisible(visible);
|
| - otr_avatar_icon_->SetBounds(NonClientBorderThickness() + kOTRSideSpacing,
|
| - otr_y, preferred_size.width(), otr_height);
|
| + int otr_y = frame_->GetWindow()->IsMaximized() ?
|
| + (NonClientTopBorderHeight(false, true) + kTabstripTopShadowThickness) :
|
| + otr_restored_y;
|
| + otr_avatar_bounds_.SetRect(NonClientBorderThickness() + kOTRSideSpacing,
|
| + otr_y, otr_avatar_icon.width(),
|
| + browser_view_->ShouldShowOffTheRecordAvatar() ? (otr_bottom - otr_y) : 0);
|
| }
|
|
|
| gfx::Rect OpaqueBrowserFrameView::CalculateClientAreaBounds(int width,
|
| int height) const {
|
| - int top_height = NonClientTopBorderHeight();
|
| + int top_height = NonClientTopBorderHeight(false, false);
|
| int border_thickness = NonClientBorderThickness();
|
| return gfx::Rect(border_thickness, top_height,
|
| std::max(0, width - (2 * border_thickness)),
|
| std::max(0, height - top_height - border_thickness));
|
| }
|
| -
|
| -// static
|
| -gfx::Rect OpaqueBrowserFrameView::GetViewBounds(views::View* src,
|
| - views::View* dst) {
|
| - gfx::Rect bounds(src->bounds());
|
| -
|
| - gfx::Point origin_in_dst(bounds.origin());
|
| - View::ConvertPointToView(src->GetParent(), dst, &origin_in_dst);
|
| - bounds.set_origin(origin_in_dst);
|
| - return bounds;
|
| -}
|
|
|