diff options
Diffstat (limited to 'chrome/browser/views/constrained_window_impl.cc')
-rw-r--r-- | chrome/browser/views/constrained_window_impl.cc | 113 |
1 files changed, 83 insertions, 30 deletions
diff --git a/chrome/browser/views/constrained_window_impl.cc b/chrome/browser/views/constrained_window_impl.cc index e42a72a..dac5356 100644 --- a/chrome/browser/views/constrained_window_impl.cc +++ b/chrome/browser/views/constrained_window_impl.cc @@ -13,6 +13,7 @@ #include "chrome/browser/tab_contents/web_contents.h" #include "chrome/browser/tab_contents/web_contents_view.h" #include "chrome/browser/toolbar_model.h" +#include "chrome/browser/views/frame/browser_view.h" #include "chrome/browser/web_app.h" #include "chrome/browser/window_sizer.h" #include "chrome/common/chrome_constants.h" @@ -216,10 +217,23 @@ class ConstrainedWindowNonClientView virtual void ButtonPressed(views::BaseButton* sender); private: + // Returns the thickness of the border that makes up the window frame edges. + // This does not include any client edge. + int FrameBorderThickness() const; + + // Returns the thickness of the entire nonclient left, right, and bottom + // borders, including both the window frame and any client edge. + int NonClientBorderThickness() const; + // Returns the height of the entire nonclient top border, including the window // frame, any title area, and any connected client edge. int NonClientTopBorderHeight() const; + // Calculates multiple values related to title layout. Returns the height of + // the entire titlebar including any connected client edge. + int TitleCoordinates(int* title_top_spacing, + int* title_thickness) const; + // Paints different parts of the window to the incoming canvas. void PaintFrameBorder(ChromeCanvas* canvas); void PaintTitleBar(ChromeCanvas* canvas); @@ -252,20 +266,31 @@ class ConstrainedWindowNonClientView }; ChromeFont ConstrainedWindowNonClientView::title_font_; -static const int kWindowLeftSpacing = 5; -static const int kWindowControlsTopOffset = 1; -static const int kWindowControlsRightOffset = 4; -static const int kTitleTopOffset = 6; -static const int kTitleBottomSpacing = 5; -static const int kNoTitleTopSpacing = 8; -static const int kResizeAreaSize = 5; -static const int kResizeAreaNorthSize = 3; -static const int kResizeAreaCornerSize = 16; -static const int kWindowHorizontalBorderSize = 5; -static const int kWindowVerticalBorderSize = 5; -static const int kWindowIconSize = 16; 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. +const int kFrameBorderThickness = 4; +// Various edges of the frame border have a 1 px shadow along their edges; in a +// few cases we shift elements based on this amount for visual appeal. +const int kFrameShadowThickness = 1; +// In the window corners, the resize areas don't actually expand bigger, but the +// 16 px at the end of each edge triggers diagonal resizing. +const int kResizeAreaCornerSize = 16; +// The titlebar never shrinks to less than 20 px tall, including the height of +// the frame border and client edge. +const int kTitlebarMinimumHeight = 20; +// The icon is inset 2 px from the left frame border. +const int kIconLeftSpacing = 2; +// The title text starts 2 px below the bottom of the top frame border. +const int kTitleTopSpacing = 2; +// There is a 5 px gap between the title text and the caption buttons. +const int kTitleCaptionSpacing = 5; +// The caption buttons are always drawn 1 px down from the visible top of the +// window (the true top in restored mode, or the top of the screen in maximized +// mode). +const int kCaptionTopSpacing = 1; + const SkColor kContentsBorderShadow = SkColorSetARGB(51, 0, 0, 0); const SkColor kContentsBorderColor = SkColorSetRGB(219, 235, 255); } @@ -315,16 +340,18 @@ gfx::Rect ConstrainedWindowNonClientView::CalculateClientAreaBounds( int width, int height) const { int top_height = NonClientTopBorderHeight(); - return gfx::Rect(kWindowHorizontalBorderSize, top_height, - std::max(0, width - (2 * kWindowHorizontalBorderSize)), - std::max(0, height - top_height - kWindowVerticalBorderSize)); + 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)); } gfx::Size ConstrainedWindowNonClientView::CalculateWindowSizeForClientSize( int width, int height) const { - return gfx::Size(width + (2 * kWindowHorizontalBorderSize), - height + NonClientTopBorderHeight() + kWindowVerticalBorderSize); + int border_thickness = NonClientBorderThickness(); + return gfx::Size(width + (2 * border_thickness), + height + NonClientTopBorderHeight() + border_thickness); } CPoint ConstrainedWindowNonClientView::GetSystemMenuPoint() const { @@ -344,8 +371,8 @@ int ConstrainedWindowNonClientView::NonClientHitTest(const gfx::Point& point) { if (close_button_->GetBounds(APPLY_MIRRORING_TRANSFORMATION).Contains(point)) return HTCLOSE; - int window_component = GetHTComponentForFrame(point, kResizeAreaNorthSize, - kResizeAreaSize, kResizeAreaCornerSize, + int window_component = GetHTComponentForFrame(point, FrameBorderThickness(), + NonClientBorderThickness(), kResizeAreaCornerSize, container_->window_delegate()->CanResize()); // Fall back to the caption if no other component matches. return ((window_component == HTNOWHERE) && bounds().Contains(point)) ? @@ -396,8 +423,9 @@ void ConstrainedWindowNonClientView::Layout() { gfx::Size ConstrainedWindowNonClientView::GetPreferredSize() { gfx::Size prefsize(container_->client_view()->GetPreferredSize()); - prefsize.Enlarge(2 * kWindowHorizontalBorderSize, - NonClientTopBorderHeight() + kWindowVerticalBorderSize); + int border_thickness = NonClientBorderThickness(); + prefsize.Enlarge(2 * border_thickness, + NonClientTopBorderHeight() + border_thickness); return prefsize; } @@ -422,8 +450,31 @@ void ConstrainedWindowNonClientView::ButtonPressed(views::BaseButton* sender) { //////////////////////////////////////////////////////////////////////////////// // ConstrainedWindowNonClientView, private: +int ConstrainedWindowNonClientView::FrameBorderThickness() const { + return kFrameBorderThickness; +} + +int ConstrainedWindowNonClientView::NonClientBorderThickness() const { + return FrameBorderThickness() + kClientEdgeThickness; +} + int ConstrainedWindowNonClientView::NonClientTopBorderHeight() const { - return kTitleTopOffset + title_font_.height() + kTitleBottomSpacing; + int title_top_spacing, title_thickness; + return TitleCoordinates(&title_top_spacing, &title_thickness); +} + +int ConstrainedWindowNonClientView::TitleCoordinates( + int* title_top_spacing, + int* title_thickness) const { + int frame_thickness = FrameBorderThickness(); + int min_titlebar_height = kTitlebarMinimumHeight + frame_thickness; + *title_top_spacing = frame_thickness + kTitleTopSpacing; + // The bottom spacing should be the same apparent height as the top spacing, + // plus have the client edge tacked on. + int title_bottom_spacing = *title_top_spacing + kClientEdgeThickness; + *title_thickness = std::max(title_font_.height(), + min_titlebar_height - *title_top_spacing - title_bottom_spacing); + return *title_top_spacing + *title_thickness + title_bottom_spacing; } void ConstrainedWindowNonClientView::PaintFrameBorder(ChromeCanvas* canvas) { @@ -480,7 +531,7 @@ void ConstrainedWindowNonClientView::PaintClientEdge(ChromeCanvas* canvas) { gfx::Rect client_edge_bounds(CalculateClientAreaBounds(width(), height())); client_edge_bounds.Inset(-kClientEdgeThickness, -kClientEdgeThickness); gfx::Rect frame_shadow_bounds(client_edge_bounds); - frame_shadow_bounds.Inset(-1, -1); + frame_shadow_bounds.Inset(-kFrameShadowThickness, -kFrameShadowThickness); canvas->FillRectInt(kContentsBorderShadow, frame_shadow_bounds.x(), frame_shadow_bounds.y(), frame_shadow_bounds.width(), @@ -494,18 +545,20 @@ void ConstrainedWindowNonClientView::PaintClientEdge(ChromeCanvas* canvas) { void ConstrainedWindowNonClientView::LayoutWindowControls() { gfx::Size close_button_size = close_button_->GetPreferredSize(); close_button_->SetBounds( - width() - close_button_size.width() - kWindowControlsRightOffset, - kWindowControlsTopOffset, close_button_size.width(), + width() - close_button_size.width() - FrameBorderThickness(), + kCaptionTopSpacing, close_button_size.width(), close_button_size.height()); } void ConstrainedWindowNonClientView::LayoutTitleBar() { // Size the title. - int title_x = kWindowLeftSpacing; - int title_top_spacing = NonClientTopBorderHeight(); - title_bounds_.SetRect(title_x, kTitleTopOffset, - close_button_->x() - kWindowLeftSpacing - title_x, - title_font_.height()); + int title_x = FrameBorderThickness() + kIconLeftSpacing; + int title_top_spacing, title_thickness; + TitleCoordinates(&title_top_spacing, &title_thickness); + title_bounds_.SetRect(title_x, + title_top_spacing + ((title_thickness - title_font_.height()) / 2), + std::max(0, close_button_->x() - kTitleCaptionSpacing - title_x), + title_font_.height()); } void ConstrainedWindowNonClientView::LayoutClientView() { |