| 319 | } |
| 320 | |
| 321 | void SettingsActivity::render(RenderLock&&) { |
| 322 | renderer.clearScreen(); |
| 323 | |
| 324 | const auto pageWidth = renderer.getScreenWidth(); |
| 325 | const auto pageHeight = renderer.getScreenHeight(); |
| 326 | |
| 327 | const auto& metrics = UITheme::getInstance().getMetrics(); |
| 328 | |
| 329 | GUI.drawHeader(renderer, Rect{0, metrics.topPadding, pageWidth, metrics.headerHeight}, tr(STR_SETTINGS_TITLE), |
| 330 | CROSSPOINT_VERSION); |
| 331 | |
| 332 | std::vector<TabInfo> tabs; |
| 333 | tabs.reserve(categoryCount); |
| 334 | for (int i = 0; i < categoryCount; i++) { |
| 335 | tabs.push_back({I18N.get(categoryNames[i]), selectedCategoryIndex == i}); |
| 336 | } |
| 337 | GUI.drawTabBar(renderer, Rect{0, metrics.topPadding + metrics.headerHeight, pageWidth, metrics.tabBarHeight}, tabs, |
| 338 | selectedSettingIndex == 0); |
| 339 | |
| 340 | const auto& settings = *currentSettings; |
| 341 | GUI.drawList( |
| 342 | renderer, |
| 343 | Rect{0, metrics.topPadding + metrics.headerHeight + metrics.tabBarHeight + metrics.verticalSpacing, pageWidth, |
| 344 | pageHeight - (metrics.topPadding + metrics.headerHeight + metrics.tabBarHeight + metrics.buttonHintsHeight + |
| 345 | metrics.verticalSpacing * 2)}, |
| 346 | settingsCount, selectedSettingIndex - 1, |
| 347 | [&settings](int index) { return std::string(I18N.get(settings[index].nameId)); }, nullptr, nullptr, |
| 348 | [&settings](int i) { |
| 349 | const auto& setting = settings[i]; |
| 350 | std::string valueText = ""; |
| 351 | if (setting.type == SettingType::TOGGLE && setting.valuePtr != nullptr) { |
| 352 | const bool value = SETTINGS.*(setting.valuePtr); |
| 353 | valueText = value ? tr(STR_STATE_ON) : tr(STR_STATE_OFF); |
| 354 | } else if (setting.type == SettingType::ENUM && setting.valuePtr != nullptr) { |
| 355 | const uint8_t value = SETTINGS.*(setting.valuePtr); |
| 356 | valueText = I18N.get(setting.enumValues[value]); |
| 357 | } else if (setting.type == SettingType::ENUM && setting.valueGetter) { |
| 358 | const uint8_t value = setting.valueGetter(); |
| 359 | if (!setting.enumStringValues.empty() && value < setting.enumStringValues.size()) { |
| 360 | valueText = setting.enumStringValues[value]; |
| 361 | } else if (value < setting.enumValues.size()) { |
| 362 | valueText = I18N.get(setting.enumValues[value]); |
| 363 | } |
| 364 | } else if (setting.type == SettingType::VALUE && setting.valuePtr != nullptr) { |
| 365 | if (setting.nameId == StrId::STR_TIME_TO_SLEEP) { |
| 366 | char valueBuffer[32]; |
| 367 | if (SETTINGS.sleepTimeoutMinutes >= CrossPointSettings::SLEEP_TIMEOUT_NEVER_MINUTES) { |
| 368 | valueText = tr(STR_SLEEP_NEVER); |
| 369 | } else { |
| 370 | snprintf(valueBuffer, sizeof(valueBuffer), tr(STR_SLEEP_TIMER_VALUE_FORMAT), |
| 371 | static_cast<unsigned int>(SETTINGS.*(setting.valuePtr))); |
| 372 | valueText = valueBuffer; |
| 373 | } |
| 374 | } else { |
| 375 | valueText = std::to_string(SETTINGS.*(setting.valuePtr)); |
| 376 | } |
| 377 | } |
| 378 | return valueText; |
nothing calls this directly
no test coverage detected