// UpdatableWidgets.h - Versions updatables des widgets principaux
#pragma once
#include "WidgetUpdater.h"
#include "Widget.h"
#include "Widgets.h"
#include "WeatherData.h"
#include "Theme.h"
#include "Tabs.h" // Pour avoir la définition de IndoorSensor
// Pas besoin de redeclarer gSensors ici car il est dans Tabs.h
// Les déclarations externes sont déjà dans Tabs.h
// ════════════════════════════════════════════════════════════════════════════
// UpdatableMainTempWidget — version updatable du widget température principale
// ════════════════════════════════════════════════════════════════════════════
class UpdatableMainTempWidget : public WidgetMainTemp, public UpdatableWidget {
private:
bool dirty;
int lastTemp;
int lastHumidity;
unsigned long lastDataUpdate;
public:
UpdatableMainTempWidget(int x, int y, int w, int h)
: WidgetMainTemp(x, y, w, h), dirty(true), lastTemp(-999), lastHumidity(-999), lastDataUpdate(0) {
widgetX = x; widgetY = y; widgetW = w; widgetH = h;
}
void setDirty(bool d) override { dirty = d; }
bool isDirty() override { return dirty; }
bool needsUpdate() override {
if (gWeather.temp != lastTemp || gWeather.humidity != lastHumidity) {
lastTemp = gWeather.temp;
lastHumidity = gWeather.humidity;
lastDataUpdate = millis();
return true;
}
if (millis() - lastDataUpdate > 10000) {
lastDataUpdate = millis();
return true;
}
return false;
}
void update(TFT_eSPI& tft, bool forceRedraw = false) override {
if (forceRedraw || needsUpdate() || dirty) {
tft.fillRect(widgetX, widgetY, widgetW, widgetH, C_BG);
draw(tft);
dirty = false;
}
}
void draw(TFT_eSPI& tft) override {
WidgetMainTemp::draw(tft);
}
};
// ════════════════════════════════════════════════════════════════════════════
// UpdatableForecastWidget — version updatable des prévisions
// ════════════════════════════════════════════════════════════════════════════
class UpdatableForecastWidget : public WidgetForecast, public UpdatableWidget {
private:
bool dirty;
unsigned long lastUpdate;
public:
UpdatableForecastWidget(int x, int y, int w, int h)
: WidgetForecast(x, y, w, h), dirty(true), lastUpdate(0) {
widgetX = x; widgetY = y; widgetW = w; widgetH = h;
}
void setDirty(bool d) override { dirty = d; }
bool isDirty() override { return dirty; }
bool needsUpdate() override {
if (millis() - lastUpdate > 30000) {
lastUpdate = millis();
return true;
}
return false;
}
void update(TFT_eSPI& tft, bool forceRedraw = false) override {
if (forceRedraw || needsUpdate() || dirty) {
tft.fillRect(widgetX, widgetY, widgetW, widgetH, C_BG);
draw(tft);
dirty = false;
}
}
void draw(TFT_eSPI& tft) override {
WidgetForecast::draw(tft);
}
};
// ════════════════════════════════════════════════════════════════════════════
// UpdatableChartWidget — version updatable du graphique
// ════════════════════════════════════════════════════════════════════════════
class UpdatableChartWidget : public WidgetChart, public UpdatableWidget {
private:
bool dirty;
unsigned long lastUpdate;
public:
UpdatableChartWidget(int x, int y, int w, int h)
: WidgetChart(x, y, w, h), dirty(true), lastUpdate(0) {
widgetX = x; widgetY = y; widgetW = w; widgetH = h;
}
void setDirty(bool d) override { dirty = d; }
bool isDirty() override { return dirty; }
bool needsUpdate() override {
if (millis() - lastUpdate > 60000) {
lastUpdate = millis();
return true;
}
return false;
}
void update(TFT_eSPI& tft, bool forceRedraw = false) override {
if (forceRedraw || needsUpdate() || dirty) {
tft.fillRect(widgetX, widgetY, widgetW, widgetH, C_BG);
draw(tft);
dirty = false;
}
}
void draw(TFT_eSPI& tft) override {
WidgetChart::draw(tft);
}
};
// ════════════════════════════════════════════════════════════════════════════
// UpdatableSunWidget — version updatable du widget soleil
// ════════════════════════════════════════════════════════════════════════════
class UpdatableSunWidget : public WidgetSun, public UpdatableWidget {
private:
bool dirty;
unsigned long lastUpdate;
public:
UpdatableSunWidget(int x, int y, int w, int h)
: WidgetSun(x, y, w, h), dirty(true), lastUpdate(0) {
widgetX = x; widgetY = y; widgetW = w; widgetH = h;
}
void setDirty(bool d) override { dirty = d; }
bool isDirty() override { return dirty; }
bool needsUpdate() override {
if (millis() - lastUpdate > 60000) {
lastUpdate = millis();
return true;
}
return false;
}
void update(TFT_eSPI& tft, bool forceRedraw = false) override {
if (forceRedraw || needsUpdate() || dirty) {
tft.fillRect(widgetX, widgetY, widgetW, widgetH, C_BG);
draw(tft);
dirty = false;
}
}
void draw(TFT_eSPI& tft) override {
WidgetSun::draw(tft);
}
};
// ════════════════════════════════════════════════════════════════════════════
// UpdatableAQIWidget — version updatable du widget qualité d'air
// ════════════════════════════════════════════════════════════════════════════
class UpdatableAQIWidget : public WidgetAQI, public UpdatableWidget {
private:
bool dirty;
unsigned long lastUpdate;
public:
UpdatableAQIWidget(int x, int y, int w, int h)
: WidgetAQI(x, y, w, h), dirty(true), lastUpdate(0) {
widgetX = x; widgetY = y; widgetW = w; widgetH = h;
}
void setDirty(bool d) override { dirty = d; }
bool isDirty() override { return dirty; }
bool needsUpdate() override {
if (millis() - lastUpdate > 60000) {
lastUpdate = millis();
return true;
}
return false;
}
void update(TFT_eSPI& tft, bool forceRedraw = false) override {
if (forceRedraw || needsUpdate() || dirty) {
tft.fillRect(widgetX, widgetY, widgetW, widgetH, C_BG);
draw(tft);
dirty = false;
}
}
void draw(TFT_eSPI& tft) override {
WidgetAQI::draw(tft);
}
};