1
0
mirror of https://github.com/esphome/esphome.git synced 2025-11-16 06:45:48 +00:00
Files
esphome/esphome/components/display_menu_base/menu_item.cpp
Michael Davidson b30430b0bd Add graphical display menu (#4105)
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
Co-authored-by: Alex Hermann <gaaf@gmx.net>
2023-12-12 12:15:59 +09:00

203 lines
4.7 KiB
C++

#include "menu_item.h"
#include <cstdio>
namespace esphome {
namespace display_menu_base {
const LogString *menu_item_type_to_string(MenuItemType type) {
switch (type) {
case MenuItemType::MENU_ITEM_LABEL:
return LOG_STR("MENU_ITEM_LABEL");
case MenuItemType::MENU_ITEM_MENU:
return LOG_STR("MENU_ITEM_MENU");
case MenuItemType::MENU_ITEM_BACK:
return LOG_STR("MENU_ITEM_BACK");
case MenuItemType::MENU_ITEM_SELECT:
return LOG_STR("MENU_ITEM_SELECT");
case MenuItemType::MENU_ITEM_NUMBER:
return LOG_STR("MENU_ITEM_NUMBER");
case MenuItemType::MENU_ITEM_SWITCH:
return LOG_STR("MENU_ITEM_SWITCH");
case MenuItemType::MENU_ITEM_COMMAND:
return LOG_STR("MENU_ITEM_COMMAND");
case MenuItemType::MENU_ITEM_CUSTOM:
return LOG_STR("MENU_ITEM_CUSTOM");
default:
return LOG_STR("UNKNOWN");
}
}
void MenuItem::on_enter() { this->on_enter_callbacks_.call(); }
void MenuItem::on_leave() { this->on_leave_callbacks_.call(); }
void MenuItem::on_value_() { this->on_value_callbacks_.call(); }
#ifdef USE_SELECT
std::string MenuItemSelect::get_value_text() const {
std::string result;
if (this->value_getter_.has_value()) {
result = this->value_getter_.value()(this);
} else {
if (this->select_var_ != nullptr) {
result = this->select_var_->state;
}
}
return result;
}
bool MenuItemSelect::select_next() {
bool changed = false;
if (this->select_var_ != nullptr) {
this->select_var_->make_call().select_next(true).perform();
changed = true;
}
return changed;
}
bool MenuItemSelect::select_prev() {
bool changed = false;
if (this->select_var_ != nullptr) {
this->select_var_->make_call().select_previous(true).perform();
changed = true;
}
return changed;
}
#endif // USE_SELECT
#ifdef USE_NUMBER
std::string MenuItemNumber::get_value_text() const {
std::string result;
if (this->value_getter_.has_value()) {
result = this->value_getter_.value()(this);
} else {
char data[32];
snprintf(data, sizeof(data), this->format_.c_str(), get_number_value_());
result = data;
}
return result;
}
bool MenuItemNumber::select_next() {
bool changed = false;
if (this->number_var_ != nullptr) {
float last = this->number_var_->state;
this->number_var_->make_call().number_increment(false).perform();
if (this->number_var_->state != last) {
this->on_value_();
changed = true;
}
}
return changed;
}
bool MenuItemNumber::select_prev() {
bool changed = false;
if (this->number_var_ != nullptr) {
float last = this->number_var_->state;
this->number_var_->make_call().number_decrement(false).perform();
if (this->number_var_->state != last) {
this->on_value_();
changed = true;
}
}
return changed;
}
float MenuItemNumber::get_number_value_() const {
float result = 0.0;
if (this->number_var_ != nullptr) {
if (!this->number_var_->has_state() || this->number_var_->state < this->number_var_->traits.get_min_value()) {
result = this->number_var_->traits.get_min_value();
} else if (this->number_var_->state > this->number_var_->traits.get_max_value()) {
result = this->number_var_->traits.get_max_value();
} else {
result = this->number_var_->state;
}
}
return result;
}
#endif // USE_NUMBER
#ifdef USE_SWITCH
std::string MenuItemSwitch::get_value_text() const {
std::string result;
if (this->value_getter_.has_value()) {
result = this->value_getter_.value()(this);
} else {
result = this->get_switch_state_() ? this->switch_on_text_ : this->switch_off_text_;
}
return result;
}
bool MenuItemSwitch::select_next() { return this->toggle_switch_(); }
bool MenuItemSwitch::select_prev() { return this->toggle_switch_(); }
bool MenuItemSwitch::get_switch_state_() const { return (this->switch_var_ != nullptr && this->switch_var_->state); }
bool MenuItemSwitch::toggle_switch_() {
bool changed = false;
if (this->switch_var_ != nullptr) {
this->switch_var_->toggle();
this->on_value_();
changed = true;
}
return changed;
}
#endif // USE_SWITCH
std::string MenuItemCustom::get_value_text() const {
return (this->value_getter_.has_value()) ? this->value_getter_.value()(this) : "";
}
bool MenuItemCommand::select_next() {
this->on_value_();
return true;
}
bool MenuItemCommand::select_prev() {
this->on_value_();
return true;
}
bool MenuItemCustom::select_next() {
this->on_next_();
this->on_value_();
return true;
}
bool MenuItemCustom::select_prev() {
this->on_prev_();
this->on_value_();
return true;
}
void MenuItemCustom::on_next_() { this->on_next_callbacks_.call(); }
void MenuItemCustom::on_prev_() { this->on_prev_callbacks_.call(); }
} // namespace display_menu_base
} // namespace esphome