mirror of
https://github.com/esphome/esphome.git
synced 2024-11-22 23:18:10 +01:00
Code cleanup fixes for the select component (#3457)
Co-authored-by: Maurice Makaay <mmakaay1@xs4all.net>
This commit is contained in:
parent
235a97ea10
commit
62f9e181e0
5 changed files with 33 additions and 18 deletions
|
@ -23,6 +23,10 @@ void Select::add_on_state_callback(std::function<void(std::string, size_t)> &&ca
|
|||
this->state_callback_.add(std::move(callback));
|
||||
}
|
||||
|
||||
bool Select::has_option(const std::string &option) const { return this->index_of(option).has_value(); }
|
||||
|
||||
bool Select::has_index(size_t index) const { return index < this->size(); }
|
||||
|
||||
size_t Select::size() const {
|
||||
auto options = traits.get_options();
|
||||
return options.size();
|
||||
|
@ -46,11 +50,12 @@ optional<size_t> Select::active_index() const {
|
|||
}
|
||||
|
||||
optional<std::string> Select::at(size_t index) const {
|
||||
auto options = traits.get_options();
|
||||
if (index >= options.size()) {
|
||||
if (this->has_index(index)) {
|
||||
auto options = traits.get_options();
|
||||
return options.at(index);
|
||||
} else {
|
||||
return {};
|
||||
}
|
||||
return options.at(index);
|
||||
}
|
||||
|
||||
uint32_t Select::hash_base() { return 2812997003UL; }
|
||||
|
|
|
@ -28,16 +28,28 @@ class Select : public EntityBase {
|
|||
|
||||
void publish_state(const std::string &state);
|
||||
|
||||
/// Return whether this select has gotten a full state yet.
|
||||
/// Return whether this select component has gotten a full state yet.
|
||||
bool has_state() const { return has_state_; }
|
||||
|
||||
/// Instantiate a SelectCall object to modify this select component's state.
|
||||
SelectCall make_call() { return SelectCall(this); }
|
||||
void set(const std::string &value) { make_call().set_option(value).perform(); }
|
||||
|
||||
// Methods that provide an API to index-based access.
|
||||
/// Return whether this select component contains the provided option.
|
||||
bool has_option(const std::string &option) const;
|
||||
|
||||
/// Return whether this select component contains the provided index offset.
|
||||
bool has_index(size_t index) const;
|
||||
|
||||
/// Return the number of options in this select component.
|
||||
size_t size() const;
|
||||
|
||||
/// Find the (optional) index offset of the provided option value.
|
||||
optional<size_t> index_of(const std::string &option) const;
|
||||
|
||||
/// Return the (optional) index offset of the currently active option.
|
||||
optional<size_t> active_index() const;
|
||||
|
||||
/// Return the (optional) option value at the provided index offset.
|
||||
optional<std::string> at(size_t index) const;
|
||||
|
||||
void add_on_state_callback(std::function<void(std::string, size_t)> &&callback);
|
||||
|
|
|
@ -13,8 +13,6 @@ SelectCall &SelectCall::set_option(const std::string &option) {
|
|||
|
||||
SelectCall &SelectCall::set_index(size_t index) { return with_operation(SELECT_OP_SET_INDEX).with_index(index); }
|
||||
|
||||
const optional<std::string> &SelectCall::get_option() const { return option_; }
|
||||
|
||||
SelectCall &SelectCall::select_next(bool cycle) { return with_operation(SELECT_OP_NEXT).with_cycle(cycle); }
|
||||
|
||||
SelectCall &SelectCall::select_previous(bool cycle) { return with_operation(SELECT_OP_PREVIOUS).with_cycle(cycle); }
|
||||
|
|
|
@ -24,7 +24,6 @@ class SelectCall {
|
|||
|
||||
SelectCall &set_option(const std::string &option);
|
||||
SelectCall &set_index(size_t index);
|
||||
const optional<std::string> &get_option() const;
|
||||
|
||||
SelectCall &select_next(bool cycle);
|
||||
SelectCall &select_previous(bool cycle);
|
||||
|
|
|
@ -20,9 +20,12 @@ void TemplateSelect::setup() {
|
|||
this->pref_ = global_preferences->make_preference<size_t>(this->get_object_id_hash());
|
||||
if (!this->pref_.load(&index)) {
|
||||
value = this->initial_option_;
|
||||
ESP_LOGD(TAG, "State from initial (could not load): %s", value.c_str());
|
||||
ESP_LOGD(TAG, "State from initial (could not load stored index): %s", value.c_str());
|
||||
} else if (!this->has_index(index)) {
|
||||
value = this->initial_option_;
|
||||
ESP_LOGD(TAG, "State from initial (restored index %d out of bounds): %s", index, value.c_str());
|
||||
} else {
|
||||
value = this->traits.get_options().at(index);
|
||||
value = this->at(index).value();
|
||||
ESP_LOGD(TAG, "State from restore: %s", value.c_str());
|
||||
}
|
||||
}
|
||||
|
@ -38,9 +41,8 @@ void TemplateSelect::update() {
|
|||
if (!val.has_value())
|
||||
return;
|
||||
|
||||
auto options = this->traits.get_options();
|
||||
if (std::find(options.begin(), options.end(), *val) == options.end()) {
|
||||
ESP_LOGE(TAG, "lambda returned an invalid option %s", (*val).c_str());
|
||||
if (!this->has_option(*val)) {
|
||||
ESP_LOGE(TAG, "Lambda returned an invalid option: %s", (*val).c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -54,12 +56,11 @@ void TemplateSelect::control(const std::string &value) {
|
|||
this->publish_state(value);
|
||||
|
||||
if (this->restore_value_) {
|
||||
auto options = this->traits.get_options();
|
||||
size_t index = std::find(options.begin(), options.end(), value) - options.begin();
|
||||
|
||||
this->pref_.save(&index);
|
||||
auto index = this->index_of(value);
|
||||
this->pref_.save(&index.value());
|
||||
}
|
||||
}
|
||||
|
||||
void TemplateSelect::dump_config() {
|
||||
LOG_SELECT("", "Template Select", this);
|
||||
LOG_UPDATE_INTERVAL(this);
|
||||
|
|
Loading…
Reference in a new issue