Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(33)

Unified Diff: ui/views/controls/combobox/combobox.cc

Issue 1904753002: MenuButton: support Mac look & feel (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add basic tests Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/views/controls/combobox/combobox.cc
diff --git a/ui/views/controls/combobox/combobox.cc b/ui/views/controls/combobox/combobox.cc
index af0caa6be92b60086508c9893db05a0bed266e65..f5e1867dd2a4743ec6936bb9ae26474a1df9a786 100644
--- a/ui/views/controls/combobox/combobox.cc
+++ b/ui/views/controls/combobox/combobox.cc
@@ -54,12 +54,6 @@ const int kMenuBorderWidthRight = 1;
// Limit how small a combobox can be.
const int kMinComboboxWidth = 25;
-// Size of the combobox arrow margins
-const int kDisclosureArrowLeftPadding = 7;
-const int kDisclosureArrowRightPadding = 7;
-const int kDisclosureArrowButtonLeftPadding = 11;
-const int kDisclosureArrowButtonRightPadding = 12;
-
// Define the id of the first item in the menu (since it needs to be > 0)
const int kFirstMenuItemId = 1000;
@@ -342,9 +336,9 @@ class Combobox::ComboboxMenuModelAdapter : public ui::MenuModel,
////////////////////////////////////////////////////////////////////////////////
// Combobox, public:
-Combobox::Combobox(ui::ComboboxModel* model)
+Combobox::Combobox(ui::ComboboxModel* model, Style style)
: model_(model),
- style_(STYLE_NORMAL),
+ style_(style),
listener_(NULL),
selected_index_(model_->GetDefaultIndex()),
invalid_(false),
@@ -352,11 +346,16 @@ Combobox::Combobox(ui::ComboboxModel* model)
text_button_(new TransparentButton(this)),
arrow_button_(new TransparentButton(this)),
weak_ptr_factory_(this) {
+ if (style_ == STYLE_ACTION)
+ selected_index_ = 0;
+
ModelChanged();
SetFocusable(true);
UpdateBorder();
+ arrow_image_ = PlatformStyle::CreateComboboxArrow(enabled(), style);
// set_background() takes ownership but takes a raw pointer.
- std::unique_ptr<Background> b = PlatformStyle::CreateComboboxBackground();
+ std::unique_ptr<Background> b =
+ PlatformStyle::CreateComboboxBackground(GetShoulderWidth());
set_background(b.release());
// Initialize the button images.
@@ -400,19 +399,6 @@ const gfx::FontList& Combobox::GetFontList() {
return rb.GetFontListWithDelta(ui::kLabelFontSizeDelta);
}
-void Combobox::SetStyle(Style style) {
- if (style_ == style)
- return;
-
- style_ = style;
- if (style_ == STYLE_ACTION)
- selected_index_ = 0;
-
- UpdateBorder();
- content_size_ = GetContentSize();
- PreferredSizeChanged();
-}
-
void Combobox::ModelChanged() {
// If the selection is no longer valid (or the model is empty), restore the
// default index.
@@ -461,12 +447,6 @@ void Combobox::SetInvalid(bool invalid) {
SchedulePaint();
}
-int Combobox::GetArrowButtonWidth() const {
- return GetDisclosureArrowLeftPadding() +
- ArrowSize().width() +
- GetDisclosureArrowRightPadding();
-}
-
void Combobox::Layout() {
PrefixDelegate::Layout();
@@ -480,9 +460,7 @@ void Combobox::Layout() {
break;
}
case STYLE_ACTION: {
- arrow_button_width = GetDisclosureArrowLeftPadding() +
- ArrowSize().width() +
- GetDisclosureArrowRightPadding();
+ arrow_button_width = GetShoulderWidth();
text_button_width = width() - arrow_button_width;
break;
}
@@ -493,6 +471,11 @@ void Combobox::Layout() {
arrow_button_->SetBounds(arrow_button_x, 0, arrow_button_width, height());
}
+void Combobox::OnEnabledChanged() {
+ PrefixDelegate::OnEnabledChanged();
+ arrow_image_ = PlatformStyle::CreateComboboxArrow(enabled(), style_);
+}
+
int Combobox::GetRowCount() {
return model()->GetItemCount();
}
@@ -525,8 +508,7 @@ gfx::Size Combobox::GetPreferredSize() const {
Textfield::kTextPadding,
Textfield::kTextPadding);
int total_width = std::max(kMinComboboxWidth, content_size_.width()) +
- insets.width() + GetDisclosureArrowLeftPadding() +
- ArrowSize().width() + GetDisclosureArrowRightPadding();
+ insets.width() + GetShoulderWidth();
return gfx::Size(total_width, content_size_.height() + insets.height());
}
@@ -733,9 +715,7 @@ void Combobox::PaintText(gfx::Canvas* canvas) {
selected_index_ = 0;
base::string16 text = model()->GetItemAt(selected_index_);
- gfx::Size arrow_size = ArrowSize();
- int disclosure_arrow_offset = width() - arrow_size.width() -
- GetDisclosureArrowLeftPadding() - GetDisclosureArrowRightPadding();
+ int disclosure_arrow_offset = width() - GetShoulderWidth();
const gfx::FontList& font_list = Combobox::GetFontList();
int text_width = gfx::GetStringWidth(text, font_list);
@@ -746,26 +726,18 @@ void Combobox::PaintText(gfx::Canvas* canvas) {
AdjustBoundsForRTLUI(&text_bounds);
canvas->DrawStringRect(text, font_list, text_color, text_bounds);
- int arrow_x = disclosure_arrow_offset + GetDisclosureArrowLeftPadding();
- gfx::Rect arrow_bounds(arrow_x,
- height() / 2 - arrow_size.height() / 2,
- arrow_size.width(),
- arrow_size.height());
+ gfx::Rect arrow_bounds(disclosure_arrow_offset, 0, GetShoulderWidth(),
+ height());
+ arrow_bounds.ClampToCenteredSize(ArrowSize());
AdjustBoundsForRTLUI(&arrow_bounds);
- gfx::ImageSkia arrow_image = PlatformStyle::CreateComboboxArrow(
- enabled(), style_);
- canvas->DrawImageInt(arrow_image, arrow_bounds.x(), arrow_bounds.y());
+ canvas->DrawImageInt(arrow_image_, arrow_bounds.x(), arrow_bounds.y());
}
void Combobox::PaintButtons(gfx::Canvas* canvas) {
DCHECK(style_ == STYLE_ACTION);
- gfx::ScopedCanvas scoped_canvas(canvas);
- if (base::i18n::IsRTL()) {
- canvas->Translate(gfx::Vector2d(width(), 0));
- canvas->Scale(-1, 1);
- }
+ gfx::ScopedRTLFlipCanvas scoped_canvas(canvas, bounds());
bool focused = HasFocus();
const std::vector<const gfx::ImageSkia*>& arrow_button_images =
@@ -873,30 +845,8 @@ void Combobox::OnPerformAction() {
selected_index_ = 0;
}
-int Combobox::GetDisclosureArrowLeftPadding() const {
- switch (style_) {
- case STYLE_NORMAL:
- return kDisclosureArrowLeftPadding;
- case STYLE_ACTION:
- return kDisclosureArrowButtonLeftPadding;
- }
- NOTREACHED();
- return 0;
-}
-
-int Combobox::GetDisclosureArrowRightPadding() const {
- switch (style_) {
- case STYLE_NORMAL:
- return kDisclosureArrowRightPadding;
- case STYLE_ACTION:
- return kDisclosureArrowButtonRightPadding;
- }
- NOTREACHED();
- return 0;
-}
-
gfx::Size Combobox::ArrowSize() const {
- return PlatformStyle::CreateComboboxArrow(enabled(), style_).size();
+ return arrow_image_.size();
}
gfx::Size Combobox::GetContentSize() const {
@@ -922,4 +872,11 @@ PrefixSelector* Combobox::GetPrefixSelector() {
return selector_.get();
}
+int Combobox::GetShoulderWidth() const {
+ const int kNormalPadding = 7;
+ const int kActionPadding = 11;
+ int padding = style_ == STYLE_NORMAL ? kNormalPadding : kActionPadding;
+ return ArrowSize().width() + 2 * padding;
+}
+
} // namespace views

Powered by Google App Engine
This is Rietveld 408576698