diff options
author | sky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-28 21:45:47 +0000 |
---|---|---|
committer | sky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-28 21:45:47 +0000 |
commit | c8b59f972e2c4b6fa92dab4101e9ccf0a15c20b4 (patch) | |
tree | b4ff98ae72b1563fef25782c25725a0204c2fddc /chrome/browser/chromeos/frame | |
parent | f4dd4e33a3f9c38b369552efc31cfec0dc75b9e2 (diff) | |
download | chromium_src-c8b59f972e2c4b6fa92dab4101e9ccf0a15c20b4.zip chromium_src-c8b59f972e2c4b6fa92dab4101e9ccf0a15c20b4.tar.gz chromium_src-c8b59f972e2c4b6fa92dab4101e9ccf0a15c20b4.tar.bz2 |
Adds side tab layout for chromeos. As part of this I renamed the
compact location bar menu to experimental and place both items
there. The two are mutually exclusive, so toggling one untoggles the
other. Also makes the status bubble not overlap the tabstrip for side tabs.
BUG=none
TEST=none
Review URL: http://codereview.chromium.org/2340001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@48531 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/chromeos/frame')
-rw-r--r-- | chrome/browser/chromeos/frame/browser_view.cc | 99 | ||||
-rw-r--r-- | chrome/browser/chromeos/frame/browser_view.h | 18 | ||||
-rw-r--r-- | chrome/browser/chromeos/frame/normal_browser_frame_view.cc | 14 |
3 files changed, 120 insertions, 11 deletions
diff --git a/chrome/browser/chromeos/frame/browser_view.cc b/chrome/browser/chromeos/frame/browser_view.cc index 528871b..b6fd133 100644 --- a/chrome/browser/chromeos/frame/browser_view.cc +++ b/chrome/browser/chromeos/frame/browser_view.cc @@ -28,6 +28,7 @@ #include "chrome/browser/views/frame/browser_view_layout.h" #include "chrome/browser/views/tabs/tab.h" #include "chrome/browser/views/tabs/tab_strip.h" +#include "chrome/browser/views/theme_background.h" #include "chrome/browser/views/toolbar_view.h" #include "gfx/canvas.h" #include "grit/generated_resources.h" @@ -59,6 +60,9 @@ const int kCompactNavbarSpaceHeight = 3; // The padding of the app launcher to the left side of the border. const int kAppLauncherLeftPadding = 5; +// Amount to offset the toolbar by when vertical tabs are enabled. +const int kVerticalTabStripToolbarOffset = 2; + // A space we insert between the tabstrip and the content in // Compact mode. class Spacer : public views::View { @@ -165,8 +169,7 @@ class BrowserViewLayout : public ::BrowserViewLayout { // layouts compact navigation buttons and status views in the title // area. See Layout virtual int LayoutTabStrip() { - if (browser_view_->IsFullscreen() || - !browser_view_->IsTabStripVisible()) { + if (browser_view_->IsFullscreen() || !browser_view_->IsTabStripVisible()) { compact_navigation_bar_->SetVisible(false); status_area_->SetVisible(false); otr_avatar_icon_->SetVisible(false); @@ -180,10 +183,22 @@ class BrowserViewLayout : public ::BrowserViewLayout { views::View::ConvertPointToView(browser_view_->GetParent(), browser_view_, &tabstrip_origin); layout_bounds.set_origin(tabstrip_origin); + if (browser_view_->UseVerticalTabs()) + return LayoutTitlebarComponentsWithVerticalTabs(layout_bounds); return LayoutTitlebarComponents(layout_bounds); } } + virtual int LayoutToolbar(int top) { + if (!browser_view_->IsFullscreen() && browser_view_->IsTabStripVisible() && + browser_view_->UseVerticalTabs()) { + // For vertical tabs the toolbar is positioned in + // LayoutTitlebarComponentsWithVerticalTabs. + return top; + } + return ::BrowserViewLayout::LayoutToolbar(top); + } + virtual bool IsPositionInWindowCaption(const gfx::Point& point) { return ::BrowserViewLayout::IsPositionInWindowCaption(point) && !IsPointInViewsInTitleArea(point); @@ -223,6 +238,67 @@ class BrowserViewLayout : public ::BrowserViewLayout { return false; } + // Positions the titlebar, toolbar, tabstrip, tabstrip and otr icon. This is + // used when side tabs are enabled. + int LayoutTitlebarComponentsWithVerticalTabs(const gfx::Rect& bounds) { + if (bounds.IsEmpty()) + return 0; + + compact_navigation_bar_->SetVisible(false); + compact_navigation_bar_->SetBounds(0, 0, 0, 0); + spacer_->SetVisible(false); + tabstrip_->SetVisible(true); + otr_avatar_icon_->SetVisible(browser_view_->ShouldShowOffTheRecordAvatar()); + status_area_->SetVisible(true); + status_area_->Update(); + + gfx::Size status_size = status_area_->GetPreferredSize(); + int status_height = status_size.height(); + + // Layout the otr icon. + int status_x = bounds.x(); + if (!otr_avatar_icon_->IsVisible()) { + otr_avatar_icon_->SetBounds(0, 0, 0, 0); + } else { + gfx::Size otr_size = otr_avatar_icon_->GetPreferredSize(); + + status_height = std::max(status_height, otr_size.height()); + int y = bounds.bottom() - status_height; + otr_avatar_icon_->SetBounds(status_x, y, otr_size.width(), status_height); + status_x += otr_size.width(); + } + + // Layout the status area after the otr icon. + status_area_->SetBounds(status_x, bounds.bottom() - status_height, + status_size.width(), status_height); + + // The tabstrip's width is the bigger of it's preferred width and the width + // the status area. + int tabstrip_w = std::max(status_x + status_size.width(), + tabstrip_->GetPreferredSize().width()); + tabstrip_->SetBounds(bounds.x(), bounds.y(), tabstrip_w, + bounds.height() - status_height); + + // The toolbar is promoted to the title for vertical tabs. + bool toolbar_visible = browser_view_->IsToolbarVisible(); + toolbar_->SetVisible(toolbar_visible); + int toolbar_height = 0; + if (toolbar_visible) + toolbar_height = toolbar_->GetPreferredSize().height(); + int tabstrip_max_x = tabstrip_->bounds().right(); + toolbar_->SetBounds(tabstrip_max_x, + bounds.y() - kVerticalTabStripToolbarOffset, + browser_view_->width() - tabstrip_max_x, + toolbar_height); + + // Adjust the available bounds for other components. + gfx::Rect available_bounds = vertical_layout_rect(); + available_bounds.Inset(tabstrip_w, 0, 0, 0); + set_vertical_layout_rect(available_bounds); + + return bounds.y() + toolbar_height; + } + // Layouts components in the title bar area (given by // |bounds|). These include the main menu, the compact navigation // buttons (in compact navbar mode), the otr avatar icon (in @@ -412,7 +488,10 @@ void BrowserView::SetFocusToLocationBar(bool select_all) { } void BrowserView::ToggleCompactNavigationBar() { - ui_style_ = static_cast<UIStyle>((ui_style_ + 1) % 2); + UIStyle new_style = static_cast<UIStyle>((ui_style_ + 1) % 2); + if (new_style != StandardStyle && UseVerticalTabs()) + browser()->ExecuteCommand(IDC_TOGGLE_VERTICAL_TABS); + ui_style_ = new_style; compact_location_bar_host_->SetEnabled(is_compact_style()); compact_location_bar_host_->Hide(false); Layout(); @@ -422,6 +501,13 @@ views::LayoutManager* BrowserView::CreateLayoutManager() const { return new BrowserViewLayout(); } +void BrowserView::InitTabStrip(TabStripModel* tab_strip_model) { + if (UseVerticalTabs() && is_compact_style()) + ToggleCompactNavigationBar(); + ::BrowserView::InitTabStrip(tab_strip_model); + UpdateOTRBackground(); +} + void BrowserView::ChildPreferredSizeChanged(View* child) { Layout(); SchedulePaint(); @@ -518,6 +604,13 @@ void BrowserView::InitSystemMenu() { system_menu_menu_.reset(new views::Menu2(system_menu_contents_.get())); } +void BrowserView::UpdateOTRBackground() { + if (UseVerticalTabs()) + otr_avatar_icon_->set_background(new ThemeBackground(this)); + else + otr_avatar_icon_->set_background(NULL); +} + } // namespace chromeos // static diff --git a/chrome/browser/chromeos/frame/browser_view.h b/chrome/browser/chromeos/frame/browser_view.h index 8665859..2bdb029 100644 --- a/chrome/browser/chromeos/frame/browser_view.h +++ b/chrome/browser/chromeos/frame/browser_view.h @@ -40,16 +40,15 @@ class BrowserView : public ::BrowserView, public views::ContextMenuController, public StatusAreaHost { public: - // There are 3 ui styles, standard, compact and sidebar. - // Standard uses the same layout as chromium/chrome browser. - // Compact mode hides the omnibox/toolbar to save the vertical real estate, - // and uses QSB (compact nav bar) to launch/switch url. In sidebar mode, - // the tabstrip is moved to the side and the omnibox is moved on top of - // the tabstrip. + // There are three distinct ui styles: + // . Standards uses the same layout as chrome. Within standard the user can + // turn on side tabs. Side tabs are still represented by the constant + // StandardStyle. + // . Compact mode hides the omnibox/toolbar to save the vertical real estate, + // and uses QSB (compact nav bar) to launch/switch url. enum UIStyle { StandardStyle = 0, CompactStyle, - SidebarStyle, }; explicit BrowserView(Browser* browser); @@ -62,6 +61,7 @@ class BrowserView : public ::BrowserView, virtual void SetFocusToLocationBar(bool select_all); virtual void ToggleCompactNavigationBar(); virtual views::LayoutManager* CreateLayoutManager() const; + virtual void InitTabStrip(TabStripModel* tab_strip_model); virtual void ChildPreferredSizeChanged(View* child); virtual bool GetSavedWindowBounds(gfx::Rect* bounds) const; @@ -97,6 +97,10 @@ class BrowserView : public ::BrowserView, void InitSystemMenu(); + // Updates the background of the otr icon. The background differs for vertical + // tabs. + void UpdateOTRBackground(); + // Status Area view. BrowserStatusAreaView* status_area_; diff --git a/chrome/browser/chromeos/frame/normal_browser_frame_view.cc b/chrome/browser/chromeos/frame/normal_browser_frame_view.cc index 7b80753..3aca16a 100644 --- a/chrome/browser/chromeos/frame/normal_browser_frame_view.cc +++ b/chrome/browser/chromeos/frame/normal_browser_frame_view.cc @@ -86,6 +86,13 @@ NormalBrowserFrameView::~NormalBrowserFrameView() { gfx::Rect NormalBrowserFrameView::GetBoundsForTabStrip( BaseTabStrip* tabstrip) const { int border_thickness = FrameBorderThickness(); + if (browser_view_->UseVerticalTabs()) { + // BrowserViewLayout adjusts the height/width based on the status area and + // otr icon. + gfx::Size ps = tabstrip->GetPreferredSize(); + return gfx::Rect(border_thickness, NonClientTopBorderHeight(), + ps.width(), browser_view_->height()); + } return gfx::Rect(border_thickness, NonClientTopBorderHeight(), std::max(0, width() - (2 * border_thickness)), tabstrip->GetPreferredHeight()); @@ -185,8 +192,13 @@ bool NormalBrowserFrameView::HitTest(const gfx::Point& l) const { return true; // Otherwise claim it only if it's in a non-tab portion of the tabstrip. - if (l.y() > browser_view_->tabstrip()->bounds().bottom()) + bool vertical_tabs = browser_view_->UseVerticalTabs(); + const gfx::Rect& tabstrip_bounds = browser_view_->tabstrip()->bounds(); + if ((!vertical_tabs && l.y() > tabstrip_bounds.bottom()) || + (vertical_tabs && (l.x() > tabstrip_bounds.right() || + l.y() > tabstrip_bounds.bottom()))) { return false; + } // We convert from our parent's coordinates since we assume we fill its bounds // completely. We need to do this since we're not a parent of the tabstrip, |