mirror of
				https://github.com/esphome/esphome.git
				synced 2025-11-04 09:01:49 +00:00 
			
		
		
		
	compat
This commit is contained in:
		@@ -1143,7 +1143,7 @@ message ListEntitiesSelectResponse {
 | 
				
			|||||||
  reserved 4; // Deprecated: was string unique_id
 | 
					  reserved 4; // Deprecated: was string unique_id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  string icon = 5 [(field_ifdef) = "USE_ENTITY_ICON"];
 | 
					  string icon = 5 [(field_ifdef) = "USE_ENTITY_ICON"];
 | 
				
			||||||
  repeated string options = 6 [(container_pointer) = "std::vector"];
 | 
					  repeated string options = 6 [(container_pointer) = "FixedVector"];
 | 
				
			||||||
  bool disabled_by_default = 7;
 | 
					  bool disabled_by_default = 7;
 | 
				
			||||||
  EntityCategory entity_category = 8;
 | 
					  EntityCategory entity_category = 8;
 | 
				
			||||||
  uint32 device_id = 9 [(field_ifdef) = "USE_DEVICES"];
 | 
					  uint32 device_id = 9 [(field_ifdef) = "USE_DEVICES"];
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1534,7 +1534,7 @@ class ListEntitiesSelectResponse final : public InfoResponseProtoMessage {
 | 
				
			|||||||
#ifdef HAS_PROTO_MESSAGE_DUMP
 | 
					#ifdef HAS_PROTO_MESSAGE_DUMP
 | 
				
			||||||
  const char *message_name() const override { return "list_entities_select_response"; }
 | 
					  const char *message_name() const override { return "list_entities_select_response"; }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
  const std::vector<std::string> *options{};
 | 
					  const FixedVector<std::string> *options{};
 | 
				
			||||||
  void encode(ProtoWriteBuffer buffer) const override;
 | 
					  void encode(ProtoWriteBuffer buffer) const override;
 | 
				
			||||||
  void calculate_size(ProtoSize &size) const override;
 | 
					  void calculate_size(ProtoSize &size) const override;
 | 
				
			||||||
#ifdef HAS_PROTO_MESSAGE_DUMP
 | 
					#ifdef HAS_PROTO_MESSAGE_DUMP
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,8 @@ static const char *const TAG = "copy.select";
 | 
				
			|||||||
void CopySelect::setup() {
 | 
					void CopySelect::setup() {
 | 
				
			||||||
  source_->add_on_state_callback([this](const std::string &value, size_t index) { this->publish_state(value); });
 | 
					  source_->add_on_state_callback([this](const std::string &value, size_t index) { this->publish_state(value); });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  traits.set_options(source_->traits.get_options());
 | 
					  // Copy options from source select
 | 
				
			||||||
 | 
					  this->traits.copy_options(source_->traits.get_options());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (source_->has_state())
 | 
					  if (source_->has_state())
 | 
				
			||||||
    this->publish_state(source_->state);
 | 
					    this->publish_state(source_->state);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -300,11 +300,11 @@ void LvSelectable::set_selected_text(const std::string &text, lv_anim_enable_t a
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void LvSelectable::set_options(std::vector<std::string> options) {
 | 
					void LvSelectable::set_options(std::initializer_list<std::string> options) {
 | 
				
			||||||
  auto index = this->get_selected_index();
 | 
					  auto index = this->get_selected_index();
 | 
				
			||||||
  if (index >= options.size())
 | 
					  if (index >= options.size())
 | 
				
			||||||
    index = options.size() - 1;
 | 
					    index = options.size() - 1;
 | 
				
			||||||
  this->options_ = std::move(options);
 | 
					  this->options_ = options;
 | 
				
			||||||
  this->set_option_string(join_string(this->options_).c_str());
 | 
					  this->set_option_string(join_string(this->options_).c_str());
 | 
				
			||||||
  lv_event_send(this->obj, LV_EVENT_REFRESH, nullptr);
 | 
					  lv_event_send(this->obj, LV_EVENT_REFRESH, nullptr);
 | 
				
			||||||
  this->set_selected_index(index, LV_ANIM_OFF);
 | 
					  this->set_selected_index(index, LV_ANIM_OFF);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -358,12 +358,12 @@ class LvSelectable : public LvCompound {
 | 
				
			|||||||
  virtual void set_selected_index(size_t index, lv_anim_enable_t anim) = 0;
 | 
					  virtual void set_selected_index(size_t index, lv_anim_enable_t anim) = 0;
 | 
				
			||||||
  void set_selected_text(const std::string &text, lv_anim_enable_t anim);
 | 
					  void set_selected_text(const std::string &text, lv_anim_enable_t anim);
 | 
				
			||||||
  std::string get_selected_text();
 | 
					  std::string get_selected_text();
 | 
				
			||||||
  std::vector<std::string> get_options() { return this->options_; }
 | 
					  const FixedVector<std::string> &get_options() { return this->options_; }
 | 
				
			||||||
  void set_options(std::vector<std::string> options);
 | 
					  void set_options(std::initializer_list<std::string> options);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 protected:
 | 
					 protected:
 | 
				
			||||||
  virtual void set_option_string(const char *options) = 0;
 | 
					  virtual void set_option_string(const char *options) = 0;
 | 
				
			||||||
  std::vector<std::string> options_{};
 | 
					  FixedVector<std::string> options_{};
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef USE_LVGL_DROPDOWN
 | 
					#ifdef USE_LVGL_DROPDOWN
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -53,7 +53,10 @@ class LVGLSelect : public select::Select, public Component {
 | 
				
			|||||||
    this->widget_->set_selected_text(value, this->anim_);
 | 
					    this->widget_->set_selected_text(value, this->anim_);
 | 
				
			||||||
    this->publish();
 | 
					    this->publish();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  void set_options_() { this->traits.set_options(this->widget_->get_options()); }
 | 
					  void set_options_() {
 | 
				
			||||||
 | 
					    // Copy options from lvgl widget to select traits
 | 
				
			||||||
 | 
					    this->traits.copy_options(this->widget_->get_options());
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  LvSelectable *widget_;
 | 
					  LvSelectable *widget_;
 | 
				
			||||||
  lv_anim_enable_t anim_;
 | 
					  lv_anim_enable_t anim_;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,9 +3,9 @@
 | 
				
			|||||||
namespace esphome {
 | 
					namespace esphome {
 | 
				
			||||||
namespace select {
 | 
					namespace select {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SelectTraits::set_options(std::vector<std::string> options) { this->options_ = std::move(options); }
 | 
					void SelectTraits::set_options(std::initializer_list<std::string> options) { this->options_ = options; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const std::vector<std::string> &SelectTraits::get_options() const { return this->options_; }
 | 
					const FixedVector<std::string> &SelectTraits::get_options() const { return this->options_; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}  // namespace select
 | 
					}  // namespace select
 | 
				
			||||||
}  // namespace esphome
 | 
					}  // namespace esphome
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,18 +1,21 @@
 | 
				
			|||||||
#pragma once
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <vector>
 | 
					 | 
				
			||||||
#include <string>
 | 
					#include <string>
 | 
				
			||||||
 | 
					#include <initializer_list>
 | 
				
			||||||
 | 
					#include "esphome/core/helpers.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace esphome {
 | 
					namespace esphome {
 | 
				
			||||||
namespace select {
 | 
					namespace select {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class SelectTraits {
 | 
					class SelectTraits {
 | 
				
			||||||
 public:
 | 
					 public:
 | 
				
			||||||
  void set_options(std::vector<std::string> options);
 | 
					  void set_options(std::initializer_list<std::string> options);
 | 
				
			||||||
  const std::vector<std::string> &get_options() const;
 | 
					  const FixedVector<std::string> &get_options() const;
 | 
				
			||||||
 | 
					  /// Copy options from another SelectTraits (for copy_select, lvgl)
 | 
				
			||||||
 | 
					  void copy_options(const FixedVector<std::string> &other) { this->options_.copy_from(other); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 protected:
 | 
					 protected:
 | 
				
			||||||
  std::vector<std::string> options_;
 | 
					  FixedVector<std::string> options_;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}  // namespace select
 | 
					}  // namespace select
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -246,6 +246,17 @@ template<typename T> class FixedVector {
 | 
				
			|||||||
    return *this;
 | 
					    return *this;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /// Copy another FixedVector (explicit copy for special cases like copy_select)
 | 
				
			||||||
 | 
					  /// Creates exact duplicate of source vector
 | 
				
			||||||
 | 
					  void copy_from(const FixedVector &other) {
 | 
				
			||||||
 | 
					    cleanup_();
 | 
				
			||||||
 | 
					    reset_();
 | 
				
			||||||
 | 
					    init(other.size());
 | 
				
			||||||
 | 
					    for (const auto &item : other) {
 | 
				
			||||||
 | 
					      push_back(item);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Allocate capacity - can be called multiple times to reinit
 | 
					  // Allocate capacity - can be called multiple times to reinit
 | 
				
			||||||
  void init(size_t n) {
 | 
					  void init(size_t n) {
 | 
				
			||||||
    cleanup_();
 | 
					    cleanup_();
 | 
				
			||||||
@@ -304,6 +315,11 @@ template<typename T> class FixedVector {
 | 
				
			|||||||
    return data_[size_ - 1];
 | 
					    return data_[size_ - 1];
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /// Access first element (no bounds checking - matches std::vector behavior)
 | 
				
			||||||
 | 
					  /// Caller must ensure vector is not empty (size() > 0)
 | 
				
			||||||
 | 
					  T &front() { return data_[0]; }
 | 
				
			||||||
 | 
					  const T &front() const { return data_[0]; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /// Access last element (no bounds checking - matches std::vector behavior)
 | 
					  /// Access last element (no bounds checking - matches std::vector behavior)
 | 
				
			||||||
  /// Caller must ensure vector is not empty (size() > 0)
 | 
					  /// Caller must ensure vector is not empty (size() > 0)
 | 
				
			||||||
  T &back() { return data_[size_ - 1]; }
 | 
					  T &back() { return data_[size_ - 1]; }
 | 
				
			||||||
@@ -317,6 +333,12 @@ template<typename T> class FixedVector {
 | 
				
			|||||||
  T &operator[](size_t i) { return data_[i]; }
 | 
					  T &operator[](size_t i) { return data_[i]; }
 | 
				
			||||||
  const T &operator[](size_t i) const { return data_[i]; }
 | 
					  const T &operator[](size_t i) const { return data_[i]; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /// Access element with bounds checking (matches std::vector behavior)
 | 
				
			||||||
 | 
					  /// Returns reference to element at index i
 | 
				
			||||||
 | 
					  /// Behavior for out of bounds access matches std::vector::at() (undefined on embedded)
 | 
				
			||||||
 | 
					  T &at(size_t i) { return data_[i]; }
 | 
				
			||||||
 | 
					  const T &at(size_t i) const { return data_[i]; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Iterator support for range-based for loops
 | 
					  // Iterator support for range-based for loops
 | 
				
			||||||
  T *begin() { return data_; }
 | 
					  T *begin() { return data_; }
 | 
				
			||||||
  T *end() { return data_ + size_; }
 | 
					  T *end() { return data_ + size_; }
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user