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) {
SchedulePaint();
}
const base::RepeatingClosure& Combobox::GetCallback() const {
return callback_;
}
const std::unique_ptr<ui::ComboboxModel>& Combobox::GetOwnedModel() const {
return owned_model_;
}
void Combobox::UpdateBorder() {
std::unique_ptr<FocusableBorder> border(new FocusableBorder());
if (invalid_)
......@@ -717,6 +725,9 @@ PrefixSelector* Combobox::GetPrefixSelector() {
}
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(bool, Invalid)
ADD_PROPERTY_METADATA(bool, SizeToLargestLabel)
......
......@@ -78,6 +78,7 @@ class VIEWS_EXPORT Combobox : public View,
bool SelectValue(const base::string16& value);
void SetOwnedModel(std::unique_ptr<ui::ComboboxModel> model);
void SetModel(ui::ComboboxModel* model);
ui::ComboboxModel* GetModel() const { return model_; }
......@@ -125,6 +126,10 @@ class VIEWS_EXPORT Combobox : public View,
// Overridden from ComboboxModelObserver:
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:
friend class test::ComboboxTestApi;
......@@ -226,6 +231,9 @@ class VIEWS_EXPORT Combobox : public 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(bool, Invalid)
VIEW_BUILDER_PROPERTY(bool, SizeToLargestLabel)
......
......@@ -45,30 +45,27 @@ ComboboxExample::~ComboboxExample() = default;
void ComboboxExample::CreateExampleView(View* container) {
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));
}
......
......@@ -7,6 +7,7 @@
#include <string>
#include <type_traits>
#include <utility>
#include "base/macros.h"
#include "base/strings/string16.h"
......@@ -73,7 +74,7 @@ class ClassPropertyMetaData
return;
if (base::Optional<TValue> result =
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 @@
#include <stdint.h>
#include <memory>
#include <utility>
#include <vector>
......@@ -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 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