feat: Full UI internationalization, pool hashrate stats, and layout caching

- Replace all hardcoded English strings with TR() translation keys across
  every tab, dialog, and component (~20 UI files)
- Expand all 8 language files (de, es, fr, ja, ko, pt, ru, zh) with
  complete translations (~37k lines added)
- Improve i18n loader with exe-relative path fallback and English base
  fallback for missing keys
- Add pool-side hashrate polling via pool stats API in xmrig_manager
- Introduce Layout::beginFrame() per-frame caching and refresh balance
  layout config only on schema generation change
- Offload daemon output parsing to worker thread
- Add CJK subset fallback font for Chinese/Japanese/Korean glyphs
This commit is contained in:
2026-03-11 00:40:50 -05:00
parent f416ff3d09
commit 2c5a658ea5
71 changed files with 43567 additions and 5267 deletions

View File

@@ -572,12 +572,12 @@ void AcrylicMaterial::drawRect(ImDrawList* drawList, const ImVec2& pMin, const I
float u1 = localX1 / viewportWidth_;
float v1 = 1.0f - localY1 / viewportHeight_; // V at bottom-right (low)
// Draw the blurred background. The glass opacity comes from
// fallbackColor.w — blur always renders at full strength.
// UI opacity is handled separately by card surface alpha.
// Draw the blurred background. Scale by both the glass preset
// opacity (fallbackColor.w) AND the user's UI opacity slider so
// that lowering card opacity lets the sharp background through.
ImTextureID blurTex = getBlurredTexture();
uint8_t glassAlpha = static_cast<uint8_t>(
std::min(255.0f, std::max(0.0f, params.fallbackColor.w * 255.0f)));
std::min(255.0f, std::max(0.0f, params.fallbackColor.w * settings_.uiOpacity * 255.0f)));
if (blurTex) {
drawList->AddImageRounded(
@@ -774,11 +774,11 @@ AcrylicFallback AcrylicMaterial::detectFallback() const
void AcrylicMaterial::drawTintedRect(ImDrawList* drawList, const ImVec2& pMin, const ImVec2& pMax,
const AcrylicParams& params, float rounding)
{
// Draw semi-transparent tint without blur
// This is the "Tinted Only" fallback mode (not affected by UI opacity)
// Draw semi-transparent tint without blur — scale by UI opacity
// so the tinted fallback also respects the card transparency slider.
ImU32 tintCol = ImGui::ColorConvertFloat4ToU32(
ImVec4(params.tintColor.x, params.tintColor.y, params.tintColor.z,
params.tintColor.w * params.tintOpacity * 0.9f)
params.tintColor.w * params.tintOpacity * 0.9f * settings_.uiOpacity)
);
drawList->AddRectFilled(pMin, pMax, tintCol, rounding);
@@ -1528,11 +1528,11 @@ void AcrylicMaterial::drawRect(ImDrawList* drawList, const ImVec2& pMin, const I
(void*)blurTex, u0, v0, u1, v1);
}
// Draw the blurred background. Glass opacity from fallbackColor
// alpha. Blur always renders at full strength; UI opacity is
// handled separately by card surface alpha.
// Draw the blurred background. Scale by both the glass preset
// opacity (fallbackColor.w) AND the user's UI opacity slider so
// that lowering card opacity lets the sharp background through.
uint8_t glassAlpha = (uint8_t)std::min(255.f,
std::max(0.f, params.fallbackColor.w * 255.f));
std::max(0.f, params.fallbackColor.w * settings_.uiOpacity * 255.f));
if (blurTex) {
drawList->AddImageRounded(
@@ -1559,7 +1559,7 @@ void AcrylicMaterial::drawTintedRect(ImDrawList* drawList, const ImVec2& pMin, c
{
ImU32 tintCol = ImGui::ColorConvertFloat4ToU32(
ImVec4(params.tintColor.x, params.tintColor.y, params.tintColor.z,
params.tintColor.w * params.tintOpacity * 0.9f));
params.tintColor.w * params.tintOpacity * 0.9f * settings_.uiOpacity));
drawList->AddRectFilled(pMin, pMax, tintCol, rounding);
// Noise grain overlay — single draw call via pre-tiled texture

View File

@@ -105,6 +105,12 @@ public:
bool hasSandstorm() const { return enabled_ && sandstorm_.enabled; }
bool hasViewportOverlay() const { return enabled_ && (viewport_overlay_.colorWashEnabled || viewport_overlay_.vignetteEnabled); }
/// True when any per-panel visual effect is active (rainbow, shimmer, specular, edge, ember, gradient)
bool hasAnyPanelEffect() const {
return hasRainbowBorder() || hasShimmer() || hasSpecularGlare()
|| hasEdgeTrace() || hasEmberRise() || hasGradientBorder();
}
/// True when any time-dependent effect is active and needs continuous redraws
bool hasActiveAnimation() const {
if (!enabled_) return false;