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

Convert callback and model in Combobox to properties

Add support for unique_ptr type of properties. Set their type converter
to be non-serializable.

Convert Combobox's 'model', 'owned_model', and 'callback' into
properties. And apply them into the example builder to show the usages.

Bug: 938501
Change-Id: I065f35420e266a0641754edf8edfebd8188f4144
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2477484
Commit-Queue: Wei Li <weili@chromium.org>
Reviewed-by: default avatarPeter Boström <pbos@chromium.org>
Cr-Commit-Position: refs/heads/master@{#819383}
parent 5d942d36
...@@ -577,6 +577,14 @@ void Combobox::OnComboboxModelChanged(ui::ComboboxModel* model) { ...@@ -577,6 +577,14 @@ void Combobox::OnComboboxModelChanged(ui::ComboboxModel* model) {
SchedulePaint(); SchedulePaint();
} }
const base::RepeatingClosure& Combobox::GetCallback() const {
return callback_;
}
const std::unique_ptr<ui::ComboboxModel>& Combobox::GetOwnedModel() const {
return owned_model_;
}
void Combobox::UpdateBorder() { void Combobox::UpdateBorder() {
std::unique_ptr<FocusableBorder> border(new FocusableBorder()); std::unique_ptr<FocusableBorder> border(new FocusableBorder());
if (invalid_) if (invalid_)
...@@ -717,6 +725,9 @@ PrefixSelector* Combobox::GetPrefixSelector() { ...@@ -717,6 +725,9 @@ PrefixSelector* Combobox::GetPrefixSelector() {
} }
BEGIN_METADATA(Combobox, View) BEGIN_METADATA(Combobox, View)
ADD_PROPERTY_METADATA(base::RepeatingClosure, Callback)
ADD_PROPERTY_METADATA(std::unique_ptr<ui::ComboboxModel>, OwnedModel)
ADD_PROPERTY_METADATA(ui::ComboboxModel*, Model)
ADD_PROPERTY_METADATA(int, SelectedIndex) ADD_PROPERTY_METADATA(int, SelectedIndex)
ADD_PROPERTY_METADATA(bool, Invalid) ADD_PROPERTY_METADATA(bool, Invalid)
ADD_PROPERTY_METADATA(bool, SizeToLargestLabel) ADD_PROPERTY_METADATA(bool, SizeToLargestLabel)
......
...@@ -78,6 +78,7 @@ class VIEWS_EXPORT Combobox : public View, ...@@ -78,6 +78,7 @@ class VIEWS_EXPORT Combobox : public View,
bool SelectValue(const base::string16& value); bool SelectValue(const base::string16& value);
void SetOwnedModel(std::unique_ptr<ui::ComboboxModel> model); void SetOwnedModel(std::unique_ptr<ui::ComboboxModel> model);
void SetModel(ui::ComboboxModel* model); void SetModel(ui::ComboboxModel* model);
ui::ComboboxModel* GetModel() const { return model_; } ui::ComboboxModel* GetModel() const { return model_; }
...@@ -125,6 +126,10 @@ class VIEWS_EXPORT Combobox : public View, ...@@ -125,6 +126,10 @@ class VIEWS_EXPORT Combobox : public View,
// Overridden from ComboboxModelObserver: // Overridden from ComboboxModelObserver:
void OnComboboxModelChanged(ui::ComboboxModel* model) override; void OnComboboxModelChanged(ui::ComboboxModel* model) override;
// Getters to be used by metadata.
const base::RepeatingClosure& GetCallback() const;
const std::unique_ptr<ui::ComboboxModel>& GetOwnedModel() const;
private: private:
friend class test::ComboboxTestApi; friend class test::ComboboxTestApi;
...@@ -226,6 +231,9 @@ class VIEWS_EXPORT Combobox : public View, ...@@ -226,6 +231,9 @@ class VIEWS_EXPORT Combobox : public View,
}; };
BEGIN_VIEW_BUILDER(VIEWS_EXPORT, Combobox, View) BEGIN_VIEW_BUILDER(VIEWS_EXPORT, Combobox, View)
VIEW_BUILDER_PROPERTY(base::RepeatingClosure, Callback)
VIEW_BUILDER_PROPERTY(std::unique_ptr<ui::ComboboxModel>, OwnedModel)
VIEW_BUILDER_PROPERTY(ui::ComboboxModel*, Model)
VIEW_BUILDER_PROPERTY(int, SelectedIndex) VIEW_BUILDER_PROPERTY(int, SelectedIndex)
VIEW_BUILDER_PROPERTY(bool, Invalid) VIEW_BUILDER_PROPERTY(bool, Invalid)
VIEW_BUILDER_PROPERTY(bool, SizeToLargestLabel) VIEW_BUILDER_PROPERTY(bool, SizeToLargestLabel)
......
...@@ -45,30 +45,27 @@ ComboboxExample::~ComboboxExample() = default; ...@@ -45,30 +45,27 @@ ComboboxExample::~ComboboxExample() = default;
void ComboboxExample::CreateExampleView(View* container) { void ComboboxExample::CreateExampleView(View* container) {
container->SetLayoutManager(std::make_unique<FillLayout>()); container->SetLayoutManager(std::make_unique<FillLayout>());
Combobox* disabled_combobox; auto view =
Builder<BoxLayoutView>()
.SetOrientation(BoxLayout::Orientation::kVertical)
.SetInsideBorderInsets(gfx::Insets(10, 0))
.SetBetweenChildSpacing(5)
.AddChildren(
{Builder<Combobox>()
.CopyAddressTo(&combobox_)
.SetOwnedModel(std::make_unique<ComboboxModelExample>())
.SetSelectedIndex(3)
.SetCallback(base::BindRepeating(
&ComboboxExample::ValueChanged, base::Unretained(this))),
Builder<Combobox>()
.SetOwnedModel(std::make_unique<ComboboxModelExample>())
.SetEnabled(false)
.SetSelectedIndex(4)
.SetCallback(
base::BindRepeating(&ComboboxExample::ValueChanged,
base::Unretained(this)))})
.Build();
auto view = Builder<BoxLayoutView>()
.SetOrientation(BoxLayout::Orientation::kVertical)
.SetInsideBorderInsets(gfx::Insets(10, 0))
.SetBetweenChildSpacing(5)
.AddChildren({Builder<Combobox>().CopyAddressTo(&combobox_),
Builder<Combobox>()
.CopyAddressTo(&disabled_combobox)
.SetEnabled(false)})
.Build();
combobox_->SetOwnedModel(std::make_unique<ComboboxModelExample>());
combobox_->SetCallback(base::BindRepeating(&ComboboxExample::ValueChanged,
base::Unretained(this)));
// The index is set outside of the builder because SetOwnedModel will override
// set indices.
combobox_->SetSelectedIndex(3);
disabled_combobox->SetOwnedModel(std::make_unique<ComboboxModelExample>());
disabled_combobox->SetCallback(base::BindRepeating(
&ComboboxExample::ValueChanged, base::Unretained(this)));
// The index is set outside of the builder because SetOwnedModel will override
// set indices.
disabled_combobox->SetSelectedIndex(4);
container->AddChildView(std::move(view)); container->AddChildView(std::move(view));
} }
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <string> #include <string>
#include <type_traits> #include <type_traits>
#include <utility>
#include "base/macros.h" #include "base/macros.h"
#include "base/strings/string16.h" #include "base/strings/string16.h"
...@@ -73,7 +74,7 @@ class ClassPropertyMetaData ...@@ -73,7 +74,7 @@ class ClassPropertyMetaData
return; return;
if (base::Optional<TValue> result = if (base::Optional<TValue> result =
TypeConverter<TValue>::FromString(new_value)) { TypeConverter<TValue>::FromString(new_value)) {
(static_cast<TClass*>(obj)->*Set)(result.value()); (static_cast<TClass*>(obj)->*Set)(std::move(result.value()));
} }
} }
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <stdint.h> #include <stdint.h>
#include <memory>
#include <utility> #include <utility>
#include <vector> #include <vector>
...@@ -159,6 +160,15 @@ struct TypeConverter<base::Optional<T>> { ...@@ -159,6 +160,15 @@ struct TypeConverter<base::Optional<T>> {
} }
}; };
template <typename T>
struct TypeConverter<std::unique_ptr<T>> {
static constexpr bool is_serializable = false;
static bool IsSerializable() { return is_serializable; }
static base::string16 ToString(const std::unique_ptr<T>& source_value);
static base::Optional<std::unique_ptr<T>> FromString(
const base::string16& source_value);
};
} // namespace metadata } // namespace metadata
} // namespace views } // namespace views
......
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