//TabManager.cpp - Gestion des onglets de l'interface
#include "TabManager.h"
#include "Tabs.h"
#include "WeatherData.h"
// Définition des onglets avec leurs fonctions
Tab TabManager::tabs[TAB_COUNT] = {
{TAB_WEATHER, "Meteo", drawWeatherTab, updateWeatherTab},
{TAB_DEBUG, "Debug", drawDebugTab, updateDebugTab},
{TAB_INDOOR_TEMP, "Interieur", drawIndoorTab, updateIndoorTab},
{TAB_STATS, "Statistiques",drawStatsTab, updateStatsTab}
};
int TabManager::currentTab = TAB_WEATHER;
int TabManager::lastTab = -1;
bool TabManager::needsRedraw = true;
unsigned long TabManager::lastButtonTime = 0;
void TabManager::init() {
currentTab = TAB_WEATHER;
lastTab = -1;
needsRedraw = true;
lastButtonTime = 0;
// Initialiser les widgets météo
initWeatherTab();
}
void TabManager::nextTab() {
currentTab = (currentTab + 1) % TAB_COUNT;
needsRedraw = true;
// Ajouter un message de debug
addDebugMessage("Changement onglet -> %s", tabs[currentTab].name);
}
void TabManager::previousTab() {
currentTab = (currentTab - 1 + TAB_COUNT) % TAB_COUNT;
needsRedraw = true;
// Ajouter un message de debug
addDebugMessage("Changement onglet <- %s", tabs[currentTab].name);
}
void TabManager::handleButton(int buttonId, bool longPress) {
unsigned long now = millis();
if (now - lastButtonTime < BUTTON_DEBOUNCE) return;
lastButtonTime = now;
switch(buttonId) {
case 0: // LEFT
previousTab();
break;
case 1: // RIGHT
nextTab();
break;
case 2: // UP
// Action spécifique pour l'onglet courant
switch(currentTab) {
case TAB_WEATHER:
// Forcer la mise à jour des widgets météo
if (mainTempWidget) mainTempWidget->markDirty();
if (forecastWidget) forecastWidget->markDirty();
if (chartWidget) chartWidget->markDirty();
if (sunWidget) sunWidget->markDirty();
if (aqiWidget) aqiWidget->markDirty();
break;
case TAB_INDOOR_TEMP:
// Force une lecture immédiate des capteurs
break;
default:
break;
}
needsRedraw = true;
break;
case 3: // DOWN
// Action spécifique pour l'onglet courant
switch(currentTab) {
case TAB_INDOOR_TEMP:
// Force une lecture immédiate des capteurs
break;
default:
break;
}
needsRedraw = true;
break;
case 4: // CENTER
// Action centrale : rafraîchit immédiatement l'onglet courant
addDebugMessage("Rafraichissement manuel -> %s", tabs[currentTab].name);
needsRedraw = true;
break;
}
}
void TabManager::draw(TFT_eSPI& tft) {
if (!needsRedraw && currentTab == lastTab) return;
// Effacer l'écran seulement au changement d'onglet : chaque onglet efface
// désormais lui-même toute sa zone de contenu (fillRect en tête de
// drawDebugTab/drawIndoorTab/drawStatsTab), donc ce fillScreen répété à
// chaque rafraîchissement de données n'est plus nécessaire.
if (currentTab != lastTab) {
tft.fillScreen(C_BG);
}
// Dessiner la barre d'onglets
drawTabBar(tft, currentTab);
// Dessiner le contenu de l'onglet courant
if (tabs[currentTab].drawFunction) {
tabs[currentTab].drawFunction(tft);
}
lastTab = currentTab;
needsRedraw = false;
}
void TabManager::update() {
// Mettre à jour l'onglet courant
if (tabs[currentTab].updateFunction) {
tabs[currentTab].updateFunction();
}
}