Commit f397a02c authored by Wei Li's avatar Wei Li Committed by Commit Bot

Add builder and metadata to ToolbarButton

Allow ToolbarButton to have metadata and builder support. Also add
support for gfx::Insets in type conversions.

Bug: 1130078
Change-Id: Ib98aede08866dc0bf88ddab1a3c0a70de3959685
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2436514
Commit-Queue: Wei Li <weili@chromium.org>
Reviewed-by: default avatarRobert Liao <robliao@chromium.org>
Reviewed-by: default avatarPeter Kasting <pkasting@chromium.org>
Cr-Commit-Position: refs/heads/master@{#813458}
parent 2c014f94
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include "ui/display/display.h" #include "ui/display/display.h"
#include "ui/display/screen.h" #include "ui/display/screen.h"
#include "ui/gfx/color_utils.h" #include "ui/gfx/color_utils.h"
#include "ui/gfx/geometry/insets.h"
#include "ui/gfx/paint_vector_icon.h" #include "ui/gfx/paint_vector_icon.h"
#include "ui/gfx/text_utils.h" #include "ui/gfx/text_utils.h"
#include "ui/views/animation/ink_drop.h" #include "ui/views/animation/ink_drop.h"
...@@ -69,6 +70,7 @@ ToolbarButton::ToolbarButton(PressedCallback callback, ...@@ -69,6 +70,7 @@ ToolbarButton::ToolbarButton(PressedCallback callback,
model_(std::move(model)), model_(std::move(model)),
tab_strip_model_(tab_strip_model), tab_strip_model_(tab_strip_model),
trigger_menu_on_long_press_(trigger_menu_on_long_press), trigger_menu_on_long_press_(trigger_menu_on_long_press),
layout_insets_(::GetLayoutInsets(TOOLBAR_BUTTON)),
highlight_color_animation_(this) { highlight_color_animation_(this) {
SetHasInkDropActionOnClick(true); SetHasInkDropActionOnClick(true);
set_context_menu_controller(this); set_context_menu_controller(this);
...@@ -147,9 +149,8 @@ void ToolbarButton::UpdateColorsAndInsets() { ...@@ -147,9 +149,8 @@ void ToolbarButton::UpdateColorsAndInsets() {
SetBackground(nullptr); SetBackground(nullptr);
} }
gfx::Insets target_insets = gfx::Insets target_insets = layout_insets_ + layout_inset_delta_ +
layout_insets_.value_or(GetLayoutInsets(TOOLBAR_BUTTON)) + *GetProperty(views::kInternalPaddingKey);
layout_inset_delta_ + *GetProperty(views::kInternalPaddingKey);
base::Optional<SkColor> border_color = base::Optional<SkColor> border_color =
highlight_color_animation_.GetBorderColor(); highlight_color_animation_.GetBorderColor();
if (!border() || target_insets != border()->GetInsets() || if (!border() || target_insets != border()->GetInsets() ||
...@@ -266,6 +267,10 @@ bool ToolbarButton::IsMenuShowing() const { ...@@ -266,6 +267,10 @@ bool ToolbarButton::IsMenuShowing() const {
return menu_showing_; return menu_showing_;
} }
gfx::Insets ToolbarButton::GetLayoutInsets() const {
return layout_insets_;
}
void ToolbarButton::SetLayoutInsets(const gfx::Insets& insets) { void ToolbarButton::SetLayoutInsets(const gfx::Insets& insets) {
if (layout_insets_ == insets) if (layout_insets_ == insets)
return; return;
...@@ -524,10 +529,6 @@ void ToolbarButton::OnMenuClosed() { ...@@ -524,10 +529,6 @@ void ToolbarButton::OnMenuClosed() {
menu_model_adapter_.reset(); menu_model_adapter_.reset();
} }
const char* ToolbarButton::GetClassName() const {
return "ToolbarButton";
}
namespace { namespace {
// The default duration does not work well for dark mode where the animation has // The default duration does not work well for dark mode where the animation has
...@@ -650,3 +651,7 @@ void ToolbarButton::HighlightColorAnimation::ClearHighlightColor() { ...@@ -650,3 +651,7 @@ void ToolbarButton::HighlightColorAnimation::ClearHighlightColor() {
highlight_color_.reset(); highlight_color_.reset();
parent_->UpdateColorsAndInsets(); parent_->UpdateColorsAndInsets();
} }
BEGIN_METADATA(ToolbarButton, views::LabelButton)
ADD_PROPERTY_METADATA(gfx::Insets, LayoutInsets)
END_METADATA
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <memory> #include <memory>
#include "base/optional.h" #include "base/optional.h"
#include "chrome/browser/ui/views/chrome_views_export.h"
#include "ui/base/pointer/touch_ui_controller.h" #include "ui/base/pointer/touch_ui_controller.h"
#include "ui/base/theme_provider.h" #include "ui/base/theme_provider.h"
#include "ui/gfx/animation/animation_delegate.h" #include "ui/gfx/animation/animation_delegate.h"
...@@ -15,6 +16,8 @@ ...@@ -15,6 +16,8 @@
#include "ui/gfx/geometry/point.h" #include "ui/gfx/geometry/point.h"
#include "ui/views/context_menu_controller.h" #include "ui/views/context_menu_controller.h"
#include "ui/views/controls/button/label_button.h" #include "ui/views/controls/button/label_button.h"
#include "ui/views/metadata/metadata_header_macros.h"
#include "ui/views/metadata/view_factory.h"
class TabStripModel; class TabStripModel;
...@@ -37,6 +40,8 @@ class MenuRunner; ...@@ -37,6 +40,8 @@ class MenuRunner;
class ToolbarButton : public views::LabelButton, class ToolbarButton : public views::LabelButton,
public views::ContextMenuController { public views::ContextMenuController {
public: public:
METADATA_HEADER(ToolbarButton);
// More convenient form of the ctor below, when |model| and |tab_strip_model| // More convenient form of the ctor below, when |model| and |tab_strip_model|
// are both nullptr. // are both nullptr.
explicit ToolbarButton(PressedCallback callback); explicit ToolbarButton(PressedCallback callback);
...@@ -82,7 +87,8 @@ class ToolbarButton : public views::LabelButton, ...@@ -82,7 +87,8 @@ class ToolbarButton : public views::LabelButton,
// icon state changes, e.g. in response to theme or touch mode changes. // icon state changes, e.g. in response to theme or touch mode changes.
virtual void UpdateIcon() {} virtual void UpdateIcon() {}
// Sets |layout_insets_|, see comment there. // Gets/Sets |layout_insets_|, see comment there.
gfx::Insets GetLayoutInsets() const;
void SetLayoutInsets(const gfx::Insets& insets); void SetLayoutInsets(const gfx::Insets& insets);
// views::LabelButton: // views::LabelButton:
...@@ -222,9 +228,6 @@ class ToolbarButton : public views::LabelButton, ...@@ -222,9 +228,6 @@ class ToolbarButton : public views::LabelButton,
// Callback for MenuModelAdapter. // Callback for MenuModelAdapter.
void OnMenuClosed(); void OnMenuClosed();
// views::ImageButton:
const char* GetClassName() const override;
// views::LabelButton: // views::LabelButton:
// This is private to avoid a foot-shooter. Callers should use SetHighlight() // This is private to avoid a foot-shooter. Callers should use SetHighlight()
// instead which sets an optional color as well. // instead which sets an optional color as well.
...@@ -251,11 +254,11 @@ class ToolbarButton : public views::LabelButton, ...@@ -251,11 +254,11 @@ class ToolbarButton : public views::LabelButton,
// Menu runner to display drop down menu. // Menu runner to display drop down menu.
std::unique_ptr<views::MenuRunner> menu_runner_; std::unique_ptr<views::MenuRunner> menu_runner_;
// Layout insets to use. This is used when the ToolbarButton is not actually // Layout insets to use.
// hosted inside the toolbar. If not supplied, // The default value is GetLayoutInsets(TOOLBAR_BUTTON) which is only
// |GetLayoutInsets(TOOLBAR_BUTTON)| is used instead which is not appropriate // appropriate inside the toolbar. When it is hosted outside the toolbar, use
// outside the toolbar. // SetLayoutInsets() to supply the proper value.
base::Optional<gfx::Insets> layout_insets_; gfx::Insets layout_insets_;
// Delta from regular toolbar-button insets. This is necessary for buttons // Delta from regular toolbar-button insets. This is necessary for buttons
// that use smaller or larger icons than regular ToolbarButton instances. // that use smaller or larger icons than regular ToolbarButton instances.
...@@ -286,4 +289,8 @@ class ToolbarButton : public views::LabelButton, ...@@ -286,4 +289,8 @@ class ToolbarButton : public views::LabelButton,
base::WeakPtrFactory<ToolbarButton> show_menu_factory_{this}; base::WeakPtrFactory<ToolbarButton> show_menu_factory_{this};
}; };
BEGIN_VIEW_BUILDER(CHROME_VIEWS_EXPORT, ToolbarButton, views::LabelButton)
VIEW_BUILDER_PROPERTY(gfx::Insets, LayoutInsets)
END_VIEW_BUILDER(CHROME_VIEWS_EXPORT, ToolbarButton)
#endif // CHROME_BROWSER_UI_VIEWS_TOOLBAR_TOOLBAR_BUTTON_H_ #endif // CHROME_BROWSER_UI_VIEWS_TOOLBAR_TOOLBAR_BUTTON_H_
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "content/public/test/browser_task_environment.h" #include "content/public/test/browser_task_environment.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/models/simple_menu_model.h" #include "ui/base/models/simple_menu_model.h"
#include "ui/views/controls/button/button.h"
#include "ui/views/controls/menu/menu_runner.h" #include "ui/views/controls/menu/menu_runner.h"
namespace test { namespace test {
...@@ -28,6 +29,7 @@ class ToolbarButtonTestApi { ...@@ -28,6 +29,7 @@ class ToolbarButtonTestApi {
views::MenuRunner* menu_runner() { return button_->menu_runner_.get(); } views::MenuRunner* menu_runner() { return button_->menu_runner_.get(); }
bool menu_showing() const { return button_->menu_showing_; } bool menu_showing() const { return button_->menu_showing_; }
const gfx::Insets last_paint_insets() const { const gfx::Insets last_paint_insets() const {
return button_->last_paint_insets_; return button_->last_paint_insets_;
} }
...@@ -93,6 +95,21 @@ class TestToolbarButton : public ToolbarButton { ...@@ -93,6 +95,21 @@ class TestToolbarButton : public ToolbarButton {
using ToolbarButtonViewsTest = ChromeViewsTestBase; using ToolbarButtonViewsTest = ChromeViewsTestBase;
TEST_F(ToolbarButtonViewsTest, DefaultLayoutInsets) {
ToolbarButton button{views::Button::PressedCallback()};
gfx::Insets default_insets = ::GetLayoutInsets(TOOLBAR_BUTTON);
EXPECT_EQ(default_insets, button.GetLayoutInsets());
EXPECT_EQ(default_insets, button.GetInsets());
}
TEST_F(ToolbarButtonViewsTest, SetLayoutInsets) {
ToolbarButton button{views::Button::PressedCallback()};
gfx::Insets new_insets(2, 3, 4, 5);
button.SetLayoutInsets(new_insets);
EXPECT_EQ(new_insets, button.GetLayoutInsets());
EXPECT_EQ(new_insets, button.GetInsets());
}
TEST_F(ToolbarButtonViewsTest, MenuDoesNotShowWhenTabStripIsEmpty) { TEST_F(ToolbarButtonViewsTest, MenuDoesNotShowWhenTabStripIsEmpty) {
TestTabStripModelDelegate delegate; TestTabStripModelDelegate delegate;
TestingProfile profile; TestingProfile profile;
......
...@@ -85,6 +85,13 @@ base::string16 TypeConverter<gfx::Range>::ToString( ...@@ -85,6 +85,13 @@ base::string16 TypeConverter<gfx::Range>::ToString(
"{%i, %i}", source_value.GetMin(), source_value.GetMax())); "{%i, %i}", source_value.GetMin(), source_value.GetMax()));
} }
base::string16 TypeConverter<gfx::Insets>::ToString(
const gfx::Insets& source_value) {
return base::ASCIIToUTF16(base::StringPrintf(
"{%d, %d, %d, %d}", source_value.top(), source_value.left(),
source_value.bottom(), source_value.right()));
}
base::Optional<int8_t> TypeConverter<int8_t>::FromString( base::Optional<int8_t> TypeConverter<int8_t>::FromString(
const base::string16& source_value) { const base::string16& source_value) {
int32_t ret = 0; int32_t ret = 0;
...@@ -247,6 +254,21 @@ base::Optional<gfx::Range> TypeConverter<gfx::Range>::FromString( ...@@ -247,6 +254,21 @@ base::Optional<gfx::Range> TypeConverter<gfx::Range>::FromString(
return base::nullopt; return base::nullopt;
} }
base::Optional<gfx::Insets> TypeConverter<gfx::Insets>::FromString(
const base::string16& source_value) {
const auto values =
base::SplitStringPiece(source_value, base::ASCIIToUTF16("{,,,}"),
base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
int top, left, bottom, right;
if ((values.size() == 4) && base::StringToInt(values[0], &top) &&
base::StringToInt(values[1], &left) &&
base::StringToInt(values[2], &bottom) &&
base::StringToInt(values[3], &right)) {
return gfx::Insets(top, left, bottom, right);
}
return base::nullopt;
}
} // namespace metadata } // namespace metadata
} // namespace views } // namespace views
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include "base/strings/sys_string_conversions.h" #include "base/strings/sys_string_conversions.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "base/time/time.h" #include "base/time/time.h"
#include "ui/gfx/geometry/insets.h"
#include "ui/gfx/geometry/size.h" #include "ui/gfx/geometry/size.h"
#include "ui/gfx/range/range.h" #include "ui/gfx/range/range.h"
#include "ui/gfx/shadow_value.h" #include "ui/gfx/shadow_value.h"
...@@ -127,6 +128,7 @@ DECLARE_CONVERSIONS(base::TimeDelta) ...@@ -127,6 +128,7 @@ DECLARE_CONVERSIONS(base::TimeDelta)
DECLARE_CONVERSIONS(gfx::ShadowValues) DECLARE_CONVERSIONS(gfx::ShadowValues)
DECLARE_CONVERSIONS(gfx::Size) DECLARE_CONVERSIONS(gfx::Size)
DECLARE_CONVERSIONS(gfx::Range) DECLARE_CONVERSIONS(gfx::Range)
DECLARE_CONVERSIONS(gfx::Insets)
#undef DECLARE_CONVERSIONS #undef DECLARE_CONVERSIONS
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
#include "testing/platform_test.h" #include "testing/platform_test.h"
#include "ui/gfx/geometry/insets.h"
#include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/rect.h"
namespace MD = views::metadata; namespace MD = views::metadata;
...@@ -101,3 +102,16 @@ TEST_F(TypeConversionTest, TestConversion_StringToShadowValues) { ...@@ -101,3 +102,16 @@ TEST_F(TypeConversionTest, TestConversion_StringToShadowValues) {
EXPECT_EQ(result[0].blur(), 0.53); EXPECT_EQ(result[0].blur(), 0.53);
EXPECT_EQ(result[1].blur(), 4.33); EXPECT_EQ(result[1].blur(), 4.33);
} }
TEST_F(TypeConversionTest, TestConversion_InsetsToString) {
base::string16 to_string =
MD::TypeConverter<gfx::Insets>::ToString(gfx::Insets(3, 5, 7, 9));
EXPECT_EQ(to_string, base::ASCIIToUTF16("{3, 5, 7, 9}"));
}
TEST_F(TypeConversionTest, TestConversion_StringToInsets) {
base::string16 from_string = base::ASCIIToUTF16("{2, 3, 4, 5}");
EXPECT_EQ(MD::TypeConverter<gfx::Insets>::FromString(from_string),
gfx::Insets(2, 3, 4, 5));
}
...@@ -188,7 +188,7 @@ class BaseViewBuilderT : public internal::ViewBuilderCore { ...@@ -188,7 +188,7 @@ class BaseViewBuilderT : public internal::ViewBuilderCore {
}; \ }; \
\ \
template <> \ template <> \
class export Builder<view_class> \ class export views::Builder<view_class> \
: public view_class##BuilderT<views::Builder<view_class>>{}; : public view_class##BuilderT<views::Builder<view_class>>{};
// clang-format on // clang-format on
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment