knxdisplay/main/widgets/Widget.hpp
2026-02-01 20:49:09 +01:00

87 lines
3.0 KiB
C++

#pragma once
#include "../WidgetConfig.hpp"
#include "lvgl.h"
#include <ctime>
class Widget {
public:
explicit Widget(const WidgetConfig& config);
virtual ~Widget();
// Delete copy/move
Widget(const Widget&) = delete;
Widget& operator=(const Widget&) = delete;
// Destroy LVGL object
void destroy();
// Access to LVGL object
lv_obj_t* getLvglObject() const { return obj_; }
lv_obj_t* getObj() const { return obj_; } // Alias
void clearLvglObject() { obj_ = nullptr; }
// Widget ID
uint8_t getId() const { return config_.id; }
// KNX group address for read binding
uint16_t getKnxAddress() const { return config_.knxAddress; }
uint16_t getKnxAddress2() const { return config_.knxAddress2; }
uint16_t getKnxAddress3() const { return config_.knxAddress3; }
// TextSource for KNX callback filtering
TextSource getTextSource() const { return config_.textSource; }
TextSource getTextSource2() const { return config_.textSource2; }
TextSource getTextSource3() const { return config_.textSource3; }
// Widget type
WidgetType getType() const { return config_.type; }
// Config access (for button action handling)
const WidgetConfig& getConfig() const { return config_; }
// Create LVGL widget on parent - must be implemented by subclasses
virtual lv_obj_t* create(lv_obj_t* parent) = 0;
// Apply styling after create() - can be overridden
virtual void applyStyle();
// KNX callbacks - default implementations do nothing
virtual void onKnxValue(float value);
virtual void onKnxValue2(float value); // For secondary address (left)
virtual void onKnxValue3(float value); // For tertiary address (right)
virtual void onKnxSwitch(bool value);
virtual void onKnxText(const char* text);
virtual void onKnxTime(const struct tm& value, TextSource source);
virtual void onHistoryUpdate();
// Condition evaluation - returns true if style was changed
virtual bool evaluateConditions(float primaryValue, float secondaryValue, float tertiaryValue);
// Get cached values for condition evaluation
float getCachedPrimaryValue() const { return cachedPrimaryValue_; }
float getCachedSecondaryValue() const { return cachedSecondaryValue_; }
float getCachedTertiaryValue() const { return cachedTertiaryValue_; }
protected:
// Common style helper functions
void applyCommonStyle();
void applyShadowStyle();
void applyConditionStyle(const ConditionStyle& style);
static const lv_font_t* getFontBySize(uint8_t sizeIndex);
const WidgetConfig& config_;
lv_obj_t* obj_ = nullptr;
// Cached values for condition evaluation
float cachedPrimaryValue_ = 0.0f;
float cachedSecondaryValue_ = 0.0f;
float cachedTertiaryValue_ = 0.0f;
bool hasCachedPrimary_ = false;
bool hasCachedSecondary_ = false;
bool hasCachedTertiary_ = false;
// Current applied condition (for detecting changes)
uint32_t currentConditionIcon_ = 0;
};