diff options
author | xiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-08-17 16:39:33 +0000 |
---|---|---|
committer | xiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-08-17 16:39:33 +0000 |
commit | 2dbe3b46526ed24c0dac17644cd3ae28bf4ef705 (patch) | |
tree | edcc03a3dedc7e830e86fe63356f2a7376eaab5b | |
parent | 863145ff033e1a3b43be8203afdd0cd160d389b6 (diff) | |
download | chromium_src-2dbe3b46526ed24c0dac17644cd3ae28bf4ef705.zip chromium_src-2dbe3b46526ed24c0dac17644cd3ae28bf4ef705.tar.gz chromium_src-2dbe3b46526ed24c0dac17644cd3ae28bf4ef705.tar.bz2 |
Status menu change per chromium-os:5517
- Apply 10% white to selected menu button;
- Remove the menu offset so that the menu is top aligned with toolbar;
- Make all status area buttons derive from StatusAreaButton;
- Move ClockMenuButton's text size logic into StatusAreaButton to share the
logic with LanguageMenuButton;
- Strip unused space from LanguageMenuButton so that it looks good with 10%
white highlight;
- Make LanguageMenuButton and ClockMenuButton center aligned;
- Add 1-pixel padding at top when the vertical space is odd number so that text
looks properly aligned with the icons;
BUG=chromium-os:5517
TEST=Verify fix for chromium-os:5517.
Review URL: http://codereview.chromium.org/3141019
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@56369 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/chromeos/status/clock_menu_button.cc | 16 | ||||
-rw-r--r-- | chrome/browser/chromeos/status/clock_menu_button.h | 3 | ||||
-rw-r--r-- | chrome/browser/chromeos/status/language_menu_button.cc | 9 | ||||
-rw-r--r-- | chrome/browser/chromeos/status/language_menu_button.h | 2 | ||||
-rw-r--r-- | chrome/browser/chromeos/status/status_area_button.cc | 52 | ||||
-rw-r--r-- | chrome/browser/chromeos/status/status_area_button.h | 15 | ||||
-rw-r--r-- | chrome/browser/chromeos/status/status_area_view.cc | 3 | ||||
-rw-r--r-- | views/controls/button/menu_button.cc | 9 | ||||
-rw-r--r-- | views/controls/button/menu_button.h | 12 |
9 files changed, 91 insertions, 30 deletions
diff --git a/chrome/browser/chromeos/status/clock_menu_button.cc b/chrome/browser/chromeos/status/clock_menu_button.cc index 7a174d4..434f323 100644 --- a/chrome/browser/chromeos/status/clock_menu_button.cc +++ b/chrome/browser/chromeos/status/clock_menu_button.cc @@ -26,17 +26,18 @@ namespace chromeos { const int kTimerSlopSeconds = 1; ClockMenuButton::ClockMenuButton(StatusAreaHost* host) - : MenuButton(NULL, std::wstring(), this, false), + : StatusAreaButton(this), host_(host) { // Add as SystemLibrary observer. We update the clock if timezone changes. CrosLibrary::Get()->GetSystemLibrary()->AddObserver(this); set_border(NULL); + set_use_menu_button_paint(true); SetFont(ResourceBundle::GetSharedInstance().GetFont( ResourceBundle::BaseFont).DeriveFont(1, gfx::Font::BOLD)); SetEnabledColor(0xB3FFFFFF); // White with 70% Alpha SetShowMultipleIconStates(false); - set_alignment(TextButton::ALIGN_RIGHT); + set_alignment(TextButton::ALIGN_CENTER); UpdateTextAndSetNextTimer(); } @@ -69,18 +70,7 @@ void ClockMenuButton::UpdateTextAndSetNextTimer() { } void ClockMenuButton::UpdateText() { - int cur_width = GetPreferredSize().width(); SetText(base::TimeFormatTimeOfDay(base::Time::Now())); - // TextButtons normally remember the max text size, so the button's preferred - // size will always be as large as the largest text ever put in it. - // We clear that max text size, so we can adjust the size to fit the text. - ClearMaxTextSize(); - int new_width = GetPreferredSize().width(); - - // If width has changed, we want to relayout the StatusAreaView. - if (new_width != cur_width) - PreferredSizeChanged(); - SchedulePaint(); } diff --git a/chrome/browser/chromeos/status/clock_menu_button.h b/chrome/browser/chromeos/status/clock_menu_button.h index 0697570..405d00a 100644 --- a/chrome/browser/chromeos/status/clock_menu_button.h +++ b/chrome/browser/chromeos/status/clock_menu_button.h @@ -9,6 +9,7 @@ #include "base/scoped_ptr.h" #include "base/timer.h" #include "chrome/browser/chromeos/cros/system_library.h" +#include "chrome/browser/chromeos/status/status_area_button.h" #include "chrome/common/notification_observer.h" #include "chrome/common/notification_service.h" #include "unicode/calendar.h" @@ -22,7 +23,7 @@ class StatusAreaHost; // The clock menu button in the status area. // This button shows the current time. -class ClockMenuButton : public views::MenuButton, +class ClockMenuButton : public StatusAreaButton, public views::ViewMenuDelegate, public menus::MenuModel, public SystemLibrary::Observer { diff --git a/chrome/browser/chromeos/status/language_menu_button.cc b/chrome/browser/chromeos/status/language_menu_button.cc index fe2518a..b74f4e6 100644 --- a/chrome/browser/chromeos/status/language_menu_button.cc +++ b/chrome/browser/chromeos/status/language_menu_button.cc @@ -71,7 +71,6 @@ enum { // input method list to avoid conflict. const int kRadioGroupLanguage = 1 << 16; const int kRadioGroupNone = -1; -const wchar_t kSpacer[] = L"MMM"; // A mapping from an input method id to a text for the language indicator. The // mapping is necessary since some input methods belong to the same language. @@ -120,7 +119,7 @@ namespace chromeos { // LanguageMenuButton LanguageMenuButton::LanguageMenuButton(StatusAreaHost* host) - : MenuButton(NULL, std::wstring(), this, false), + : StatusAreaButton(this), input_method_descriptors_(CrosLibrary::Get()->GetInputMethodLibrary()-> GetActiveInputMethods()), model_(NULL), @@ -133,15 +132,16 @@ LanguageMenuButton::LanguageMenuButton(StatusAreaHost* host) DCHECK(input_method_descriptors_.get() && !input_method_descriptors_->empty()); set_border(NULL); + set_use_menu_button_paint(true); SetFont(ResourceBundle::GetSharedInstance().GetFont( ResourceBundle::BaseFont).DeriveFont(1, gfx::Font::BOLD)); SetEnabledColor(0xB3FFFFFF); // White with 70% Alpha SetDisabledColor(0x00FFFFFF); // White with 00% Alpha (invisible) SetShowMultipleIconStates(false); + set_alignment(TextButton::ALIGN_CENTER); + // Update the model RebuildModel(); - // Grab the real estate. - UpdateIndicator(kSpacer, L"" /* no tooltip */); // Draw the default indicator "US". The default indicator "US" is used when // |pref_service| is not available (for example, unit tests) or |pref_service| @@ -469,7 +469,6 @@ void LanguageMenuButton::UpdateIndicator( SetTooltipText(tooltip); } SetText(name); - set_alignment(TextButton::ALIGN_RIGHT); SchedulePaint(); } diff --git a/chrome/browser/chromeos/status/language_menu_button.h b/chrome/browser/chromeos/status/language_menu_button.h index 991578f..660c753 100644 --- a/chrome/browser/chromeos/status/language_menu_button.h +++ b/chrome/browser/chromeos/status/language_menu_button.h @@ -25,7 +25,7 @@ class StatusAreaHost; // The language menu button in the status area. // This class will handle getting the IME/XKB status and populating the menu. -class LanguageMenuButton : public views::MenuButton, +class LanguageMenuButton : public StatusAreaButton, public views::ViewMenuDelegate, public menus::MenuModel, public InputMethodLibrary::Observer, diff --git a/chrome/browser/chromeos/status/status_area_button.cc b/chrome/browser/chromeos/status/status_area_button.cc index 0e91bad..d2c34e6 100644 --- a/chrome/browser/chromeos/status/status_area_button.cc +++ b/chrome/browser/chromeos/status/status_area_button.cc @@ -16,28 +16,70 @@ namespace chromeos { // StatusAreaButton StatusAreaButton::StatusAreaButton(views::ViewMenuDelegate* menu_delegate) - : MenuButton(NULL, std::wstring(), menu_delegate, false) { + : MenuButton(NULL, std::wstring(), menu_delegate, false), + use_menu_button_paint_(false) { set_border(NULL); + + // Use an offset that is top aligned with toolbar. + set_menu_offset(0, 2); } void StatusAreaButton::Paint(gfx::Canvas* canvas, bool for_drag) { if (state() == BS_PUSHED) { - DrawPressed(canvas); + // Apply 10% white when pushed down. + canvas->FillRectInt(SkColorSetARGB(0x19, 0xFF, 0xFF, 0xFF), + 0, 0, width(), height()); + } + + if (use_menu_button_paint_) { + views::MenuButton::Paint(canvas, for_drag); + } else { + if (state() == BS_PUSHED) + DrawPressed(canvas); + + DrawIcon(canvas); + PaintFocusBorder(canvas); } - DrawIcon(canvas); - PaintFocusBorder(canvas); } gfx::Size StatusAreaButton::GetPreferredSize() { // icons are 24x24 static const int kIconWidth = 24; static const int kIconHeight = 24; - gfx::Insets insets = GetInsets(); + gfx::Insets insets = views::MenuButton::GetInsets(); gfx::Size prefsize(kIconWidth + insets.width(), kIconHeight + insets.height()); + + // Adjusts size when use menu button paint. + if (use_menu_button_paint_) { + gfx::Size menu_button_size = views::MenuButton::GetPreferredSize(); + prefsize.SetSize( + std::max(prefsize.width(), menu_button_size.width()), + std::max(prefsize.height(), menu_button_size.height()) + ); + + // Shift 1-pixel down for odd number of pixels in vertical space. + if ((prefsize.height() - menu_button_size.height()) % 2) { + insets_.Set(insets.top() + 1, insets.left(), + insets.bottom(), insets.right()); + } + } + return prefsize; } +gfx::Insets StatusAreaButton::GetInsets() const { + return insets_; +} + +void StatusAreaButton::SetText(const std::wstring& text) { + // TextButtons normally remember the max text size, so the button's preferred + // size will always be as large as the largest text ever put in it. + // We clear that max text size, so we can adjust the size to fit the text. + ClearMaxTextSize(); + views::MenuButton::SetText(text); +} + void StatusAreaButton::DrawIcon(gfx::Canvas* canvas) { canvas->DrawBitmapInt(icon(), 0, 0); } diff --git a/chrome/browser/chromeos/status/status_area_button.h b/chrome/browser/chromeos/status/status_area_button.h index 9085fc2..6d57178 100644 --- a/chrome/browser/chromeos/status/status_area_button.h +++ b/chrome/browser/chromeos/status/status_area_button.h @@ -19,6 +19,15 @@ class StatusAreaButton : public views::MenuButton { virtual ~StatusAreaButton() {} virtual void Paint(gfx::Canvas* canvas, bool for_drag); virtual gfx::Size GetPreferredSize(); + virtual gfx::Insets GetInsets() const; + + // Overrides TextButton's SetText to clear max text size before seting new + // text content so that the button size would fit the new text size. + virtual void SetText(const std::wstring& text); + + void set_use_menu_button_paint(bool use_menu_button_paint) { + use_menu_button_paint_ = use_menu_button_paint; + } protected: // Draws the pressed icon. This is called before DrawIcon if the state is @@ -31,6 +40,12 @@ class StatusAreaButton : public views::MenuButton { // Otherwise, just call SetIcon() and the it will be handled for you. virtual void DrawIcon(gfx::Canvas* canvas); + // True if the button wants to use views::MenuButton drawings. + bool use_menu_button_paint_; + + // Insets to use for this button. + gfx::Insets insets_; + DISALLOW_COPY_AND_ASSIGN(StatusAreaButton); }; diff --git a/chrome/browser/chromeos/status/status_area_view.cc b/chrome/browser/chromeos/status/status_area_view.cc index 4f08452..27a3a54 100644 --- a/chrome/browser/chromeos/status/status_area_view.cc +++ b/chrome/browser/chromeos/status/status_area_view.cc @@ -19,9 +19,6 @@ namespace chromeos { // Number of pixels to separate each icon. const int kSeparation = 6; -// BrowserWindowGtk tiles its image with this offset -const int kCustomFrameBackgroundVerticalOffset = 15; - StatusAreaView::StatusAreaView(StatusAreaHost* host) : host_(host), clock_view_(NULL), diff --git a/views/controls/button/menu_button.cc b/views/controls/button/menu_button.cc index 2a63124..f09b2d4 100644 --- a/views/controls/button/menu_button.cc +++ b/views/controls/button/menu_button.cc @@ -31,6 +31,10 @@ static const int64 kMinimumTimeBetweenButtonClicks = 100; static const int kMenuMarkerPaddingLeft = 3; static const int kMenuMarkerPaddingRight = -1; +// Default menu offset. +static const int kDefaultMenuOffsetX = -2; +static const int kDefaultMenuOffsetY = -4; + // static const char MenuButton::kViewClassName[] = "views/MenuButton"; @@ -46,6 +50,7 @@ MenuButton::MenuButton(ButtonListener* listener, bool show_menu_marker) : TextButton(listener, text), menu_visible_(false), + menu_offset_(kDefaultMenuOffsetX, kDefaultMenuOffsetY), menu_delegate_(menu_delegate), show_menu_marker_(show_menu_marker), menu_marker_(ResourceBundle::GetSharedInstance().GetBitmapNamed( @@ -130,9 +135,9 @@ bool MenuButton::Activate() { View::ConvertPointToScreen(this, &menu_position); if (base::i18n::IsRTL()) - menu_position.Offset(2, -4); + menu_position.Offset(-menu_offset_.x(), menu_offset_.y()); else - menu_position.Offset(-2, -4); + menu_position.Offset(menu_offset_.x(), menu_offset_.y()); int max_x_coordinate = GetMaximumScreenXCoordinate(); if (max_x_coordinate && max_x_coordinate <= menu_position.x()) diff --git a/views/controls/button/menu_button.h b/views/controls/button/menu_button.h index 74affeb..ac20b0f 100644 --- a/views/controls/button/menu_button.h +++ b/views/controls/button/menu_button.h @@ -66,10 +66,22 @@ class MenuButton : public TextButton { // Returns views/MenuButton. virtual std::string GetClassName() const; + // Accessors for menu_offset_. + const gfx::Point& menu_offset() const { + return menu_offset_; + } + + void set_menu_offset(int x, int y) { + menu_offset_.SetPoint(x, y); + } + protected: // True if the menu is currently visible. bool menu_visible_; + // Offset of the associated menu position. + gfx::Point menu_offset_; + private: friend class TextButtonBackground; |