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

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

Issue 1971333002: Views: factor out Combobox background and const-ify style (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix ios build break 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
« no previous file with comments | « ui/views/controls/combobox/combobox.h ('k') | ui/views/controls/combobox/combobox_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/views/controls/combobox/combobox.cc
diff --git a/ui/views/controls/combobox/combobox.cc b/ui/views/controls/combobox/combobox.cc
index 278b4c3bada9a75727e048a8048ef91c1d21e97d..dc7797936b73c56c043e2d2873986603ab04804f 100644
--- a/ui/views/controls/combobox/combobox.cc
+++ b/ui/views/controls/combobox/combobox.cc
@@ -46,6 +46,10 @@ namespace views {
namespace {
+// Action style arrow container padding widths
+const int kActionLeftPadding = 12;
+const int kActionRightPadding = 11;
+
// Menu border widths
const int kMenuBorderWidthLeft = 1;
const int kMenuBorderWidthTop = 1;
@@ -54,12 +58,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;
@@ -89,6 +87,22 @@ const int kFocusedPressedMenuButtonImages[] =
#undef MENU_IMAGE_GRID
+gfx::Rect PositionArrowWithinContainer(const gfx::Rect& container_bounds,
+ const gfx::Size& arrow_size,
+ Combobox::Style style) {
+ gfx::Rect bounds(container_bounds);
+ if (style == Combobox::STYLE_ACTION) {
+ // This positions the arrow horizontally. The later call to
+ // ClampToCenteredSize will position it vertically without touching the
+ // horizontal position.
+ bounds.Inset(kActionLeftPadding, 0, kActionRightPadding, 0);
+ DCHECK_EQ(bounds.width(), arrow_size.width());
+ }
+
+ bounds.ClampToCenteredSize(arrow_size);
+ return bounds;
+}
+
// The transparent button which holds a button state but is not rendered.
class TransparentButton : public CustomButton {
public:
@@ -343,11 +357,11 @@ 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()),
+ selected_index_(style == STYLE_ACTION ? 0 : model_->GetDefaultIndex()),
invalid_(false),
menu_model_adapter_(new ComboboxMenuModelAdapter(this, model)),
text_button_(new TransparentButton(this)),
@@ -361,8 +375,10 @@ Combobox::Combobox(ui::ComboboxModel* model)
#endif
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(GetArrowContainerWidth());
set_background(b.release());
// Initialize the button images.
@@ -404,19 +420,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.
@@ -465,12 +468,6 @@ void Combobox::SetInvalid(bool invalid) {
SchedulePaint();
}
-int Combobox::GetArrowButtonWidth() const {
- return GetDisclosureArrowLeftPadding() +
- ArrowSize().width() +
- GetDisclosureArrowRightPadding();
-}
-
void Combobox::Layout() {
PrefixDelegate::Layout();
@@ -484,9 +481,7 @@ void Combobox::Layout() {
break;
}
case STYLE_ACTION: {
- arrow_button_width = GetDisclosureArrowLeftPadding() +
- ArrowSize().width() +
- GetDisclosureArrowRightPadding();
+ arrow_button_width = GetArrowContainerWidth();
text_button_width = width() - arrow_button_width;
break;
}
@@ -497,6 +492,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();
}
@@ -529,8 +529,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() + GetArrowContainerWidth();
return gfx::Size(total_width, content_size_.height() + insets.height());
}
@@ -738,8 +737,7 @@ void Combobox::PaintText(gfx::Canvas* canvas) {
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() - GetArrowContainerWidth();
const gfx::FontList& font_list = Combobox::GetFontList();
int text_width = gfx::GetStringWidth(text, font_list);
@@ -750,26 +748,19 @@ 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, GetArrowContainerWidth(),
+ height());
+ arrow_bounds =
+ PositionArrowWithinContainer(arrow_bounds, ArrowSize(), style_);
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 =
@@ -877,30 +868,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 {
@@ -926,4 +895,12 @@ PrefixSelector* Combobox::GetPrefixSelector() {
return selector_.get();
}
+int Combobox::GetArrowContainerWidth() const {
+ const int kNormalPadding = 7;
+ int padding = style_ == STYLE_NORMAL
+ ? kNormalPadding * 2
+ : kActionLeftPadding + kActionRightPadding;
+ return ArrowSize().width() + padding;
+}
+
} // namespace views
« no previous file with comments | « ui/views/controls/combobox/combobox.h ('k') | ui/views/controls/combobox/combobox_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698