Merge branch 'feat-weather' of https://github.com/jpirnay/crosspoint-reader into mybuild

This commit is contained in:
jpirnay
2026-04-03 11:06:17 +02:00
15 changed files with 467 additions and 491 deletions
+1 -1
View File
@@ -230,7 +230,7 @@ void HomeActivity::render(RenderLock&&) {
// Build menu items dynamically
std::vector<const char*> menuItems = {tr(STR_BROWSE_FILES), tr(STR_MENU_RECENT_BOOKS), tr(STR_FILE_TRANSFER),
tr(STR_WEATHER), tr(STR_SETTINGS_TITLE)};
std::vector<UIIcon> menuIcons = {Folder, Recent, Transfer, Library, Settings};
std::vector<UIIcon> menuIcons = {Folder, Recent, Transfer, Weather, Settings};
if (hasOpdsUrl) {
// Insert OPDS Browser after Recents (before File Transfer)
+10 -10
View File
@@ -124,8 +124,8 @@ void WeatherActivity::onEnter() {
void WeatherActivity::onExit() {
Activity::onExit();
// Restore orientation from settings
renderer.setOrientation(static_cast<GfxRenderer::Orientation>(SETTINGS.orientation));
// Weather screen is always landscape; restore app UI to portrait on exit.
renderer.setOrientation(GfxRenderer::Orientation::Portrait);
WiFi.mode(WIFI_OFF);
}
@@ -405,12 +405,12 @@ void WeatherActivity::renderCurrentConditions(int x, int y, int w, int h) {
textY += 15;
}
// Weather icon (WEATHER_ICON_LARGE x WEATHER_ICON_LARGE)
// Weather icon (WEATHER_ICON_SIZE x WEATHER_ICON_SIZE)
auto iconType = getWeatherIconType(cur.weatherCode, cur.isDay);
const uint8_t* icon = getWeatherIconLarge(iconType);
int iconX = x + (w - WEATHER_ICON_LARGE) / 2;
drawWeatherIconWithOrientation(renderer, icon, iconX, textY + 2, WEATHER_ICON_LARGE);
textY += WEATHER_ICON_LARGE + 5;
int iconX = x + (w - WEATHER_ICON_SIZE) / 2;
drawWeatherIconWithOrientation(renderer, icon, iconX, textY + 2, WEATHER_ICON_SIZE);
textY += WEATHER_ICON_SIZE + 5;
// Temperature (large)
char tempBuf[16];
@@ -528,12 +528,12 @@ void WeatherActivity::renderDailyForecast(int x, int y, int w, int h) {
renderer.drawText(SMALL_FONT_ID, cardX + (cardWidth - dateWidth) / 2, textY, dateBuf);
textY += 18;
// Weather icon (WEATHER_ICON_LARGE for all days)
// Weather icon (WEATHER_ICON_SIZE for all days)
auto iconType = getWeatherIconType(day.weatherCode, true);
const uint8_t* icon = getWeatherIconLarge(iconType);
int iconX = cardX + (cardWidth - WEATHER_ICON_LARGE) / 2;
drawWeatherIconWithOrientation(renderer, icon, iconX, textY, WEATHER_ICON_LARGE);
textY += WEATHER_ICON_LARGE + 8;
int iconX = cardX + (cardWidth - WEATHER_ICON_SIZE) / 2;
drawWeatherIconWithOrientation(renderer, icon, iconX, textY, WEATHER_ICON_SIZE);
textY += WEATHER_ICON_SIZE + 8;
// Weather description (short)
const char* desc = I18N.get(getWeatherDescriptionStrId(day.weatherCode));
@@ -55,12 +55,15 @@ void WeatherSettingsActivity::loop() {
}
buttonNavigator.onNext([this] {
selectedIndex = (selectedIndex + 1) % searchResults.size();
if (searchResults.empty()) return;
selectedIndex = (selectedIndex + 1) % static_cast<int>(searchResults.size());
requestUpdate();
});
buttonNavigator.onPrevious([this] {
selectedIndex = (selectedIndex + searchResults.size() - 1) % searchResults.size();
if (searchResults.empty()) return;
const int size = static_cast<int>(searchResults.size());
selectedIndex = (selectedIndex + size - 1) % size;
requestUpdate();
});
return;
@@ -24,13 +24,15 @@ class WeatherSettingsActivity final : public Activity {
private:
ButtonNavigator buttonNavigator;
size_t selectedIndex = 0;
int selectedIndex = 0;
// City search results (populated when user searches)
std::vector<GeocodingResult> searchResults;
bool showingSearchResults = false;
bool searchInProgress = false;
std::string searchQuery;
static constexpr size_t MENU_ITEMS = 6; // Location, Lat, Lon, TempUnit, WindUnit, PrecipUnit
static constexpr int MENU_ITEMS = 6; // Location, Lat, Lon, TempUnit, WindUnit, PrecipUnit
void handleSelection();
void launchCitySearch();