ESPHome 2026.5.0
Loading...
Searching...
No Matches
menu_item.h
Go to the documentation of this file.
1#pragma once
2
5
6#ifdef USE_NUMBER
8#endif
9#ifdef USE_SELECT
11#endif
12#ifdef USE_SWITCH
14#endif
15
16#include <vector>
17#include "esphome/core/log.h"
18
20
31
34
35class MenuItem;
36class MenuItemMenu;
37using value_getter_t = std::function<std::string(const MenuItem *)>;
38
39class MenuItem {
40 public:
41 explicit MenuItem(MenuItemType t) : item_type_(t) {}
42 void set_parent(MenuItemMenu *parent) { this->parent_ = parent; }
43 MenuItemMenu *get_parent() { return this->parent_; }
44 MenuItemType get_type() const { return this->item_type_; }
45 template<typename V> void set_text(V val) { this->text_ = val; }
46 template<typename F> void add_on_enter_callback(F &&cb) { this->on_enter_callbacks_.add(std::forward<F>(cb)); }
47 template<typename F> void add_on_leave_callback(F &&cb) { this->on_leave_callbacks_.add(std::forward<F>(cb)); }
48 template<typename F> void add_on_value_callback(F &&cb) { this->on_value_callbacks_.add(std::forward<F>(cb)); }
49
50 std::string get_text() const { return const_cast<MenuItem *>(this)->text_.value(this); }
51 virtual bool get_immediate_edit() const { return false; }
52 virtual bool has_value() const { return false; }
53 virtual std::string get_value_text() const { return ""; }
54
55 virtual bool select_next() { return false; }
56 virtual bool select_prev() { return false; }
57
58 void on_enter();
59 void on_leave();
60
61 protected:
62 void on_value_();
63
67
71};
72
73class MenuItemMenu : public MenuItem {
74 public:
76 void add_item(MenuItem *item) {
77 item->set_parent(this);
78 this->items_.push_back(item);
79 }
80 size_t items_size() const { return this->items_.size(); }
81 MenuItem *get_item(size_t i) { return this->items_[i]; }
82
83 protected:
84 std::vector<MenuItem *> items_;
85};
86
87class MenuItemEditable : public MenuItem {
88 public:
90 void set_immediate_edit(bool val) { this->immediate_edit_ = val; }
91 bool get_immediate_edit() const override { return this->immediate_edit_; }
92 void set_value_lambda(value_getter_t &&getter) { this->value_getter_ = getter; }
93
94 protected:
95 bool immediate_edit_{false};
96 optional<value_getter_t> value_getter_{};
97};
98
99#ifdef USE_SELECT
101 public:
104
105 bool has_value() const override { return true; }
106 std::string get_value_text() const override;
107
108 bool select_next() override;
109 bool select_prev() override;
110
111 protected:
113};
114#endif
115
116#ifdef USE_NUMBER
118 public:
121 void set_format(const std::string &fmt) { this->format_ = fmt; }
122
123 bool has_value() const override { return true; }
124 std::string get_value_text() const override;
125
126 bool select_next() override;
127 bool select_prev() override;
128
129 protected:
130 float get_number_value_() const;
131
133 std::string format_;
134};
135#endif
136
137#ifdef USE_SWITCH
139 public:
142 void set_on_text(const std::string &t) { this->switch_on_text_ = t; }
143 void set_off_text(const std::string &t) { this->switch_off_text_ = t; }
144
145 bool has_value() const override { return true; }
146 std::string get_value_text() const override;
147
148 bool select_next() override;
149 bool select_prev() override;
150
151 protected:
152 bool get_switch_state_() const;
153 bool toggle_switch_();
154
156 std::string switch_on_text_;
157 std::string switch_off_text_;
158};
159#endif
160
161class MenuItemCommand : public MenuItem {
162 public:
164
165 bool select_next() override;
166 bool select_prev() override;
167};
168
170 public:
172 template<typename F> void add_on_next_callback(F &&cb) { this->on_next_callbacks_.add(std::forward<F>(cb)); }
173 template<typename F> void add_on_prev_callback(F &&cb) { this->on_prev_callbacks_.add(std::forward<F>(cb)); }
174
175 bool has_value() const override { return this->value_getter_.has_value(); }
176 std::string get_value_text() const override;
177
178 bool select_next() override;
179 bool select_prev() override;
180
181 protected:
182 void on_next_();
183 void on_prev_();
184
187};
188
189} // namespace esphome::display_menu_base
Primary TemplatableValue: stores either a constant value or a function pointer.
Definition automation.h:115
CallbackManager< void()> on_next_callbacks_
Definition menu_item.h:185
std::string get_value_text() const override
CallbackManager< void()> on_prev_callbacks_
Definition menu_item.h:186
void set_value_lambda(value_getter_t &&getter)
Definition menu_item.h:92
optional< value_getter_t > value_getter_
Definition menu_item.h:96
virtual std::string get_value_text() const
Definition menu_item.h:53
void set_parent(MenuItemMenu *parent)
Definition menu_item.h:42
CallbackManager< void()> on_leave_callbacks_
Definition menu_item.h:69
CallbackManager< void()> on_value_callbacks_
Definition menu_item.h:70
CallbackManager< void()> on_enter_callbacks_
Definition menu_item.h:68
virtual bool has_value() const
Definition menu_item.h:52
MenuItemType get_type() const
Definition menu_item.h:44
TemplatableValue< std::string, const MenuItem * > text_
Definition menu_item.h:66
virtual bool get_immediate_edit() const
Definition menu_item.h:51
std::vector< MenuItem * > items_
Definition menu_item.h:84
std::string get_value_text() const override
Definition menu_item.cpp:78
void set_number_variable(number::Number *var)
Definition menu_item.h:120
void set_format(const std::string &fmt)
Definition menu_item.h:121
void set_select_variable(select::Select *var)
Definition menu_item.h:103
std::string get_value_text() const override
Definition menu_item.cpp:37
void set_off_text(const std::string &t)
Definition menu_item.h:143
std::string get_value_text() const override
void set_on_text(const std::string &t)
Definition menu_item.h:142
void set_switch_variable(switch_::Switch *var)
Definition menu_item.h:141
Base-class for all numbers.
Definition number.h:29
Base-class for all selects.
Definition select.h:29
Base class for all switches.
Definition switch.h:38
uint16_t type
mopeka_std_values val[3]
std::function< std::string(const MenuItem *)> value_getter_t
Definition menu_item.h:37
const LogString * menu_item_type_to_string(MenuItemType type)
Returns a string representation of a menu item type suitable for logging.
Definition menu_item.cpp:7
size_t size_t const char * fmt
Definition helpers.h:1039