summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorxiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-08-17 16:39:33 +0000
committerxiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-08-17 16:39:33 +0000
commit2dbe3b46526ed24c0dac17644cd3ae28bf4ef705 (patch)
treeedcc03a3dedc7e830e86fe63356f2a7376eaab5b
parent863145ff033e1a3b43be8203afdd0cd160d389b6 (diff)
downloadchromium_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.cc16
-rw-r--r--chrome/browser/chromeos/status/clock_menu_button.h3
-rw-r--r--chrome/browser/chromeos/status/language_menu_button.cc9
-rw-r--r--chrome/browser/chromeos/status/language_menu_button.h2
-rw-r--r--chrome/browser/chromeos/status/status_area_button.cc52
-rw-r--r--chrome/browser/chromeos/status/status_area_button.h15
-rw-r--r--chrome/browser/chromeos/status/status_area_view.cc3
-rw-r--r--views/controls/button/menu_button.cc9
-rw-r--r--views/controls/button/menu_button.h12
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;