feat(settings): adjustable opacity for the favorite gold outline + star
Adds a "Favorite Highlight Opacity" slider (15-100%, default 100%) to Settings > Appearance > Scale & Effects. It scales the alpha of the four favorite gold tokens (fill/border/icon/outline) at their resolve site in the Balance address list via material::ScaleAlpha, so the gold row outline and the star button fade together. The multiplier is skin-agnostic (it scales whatever alpha the theme resolved) and touches only favorited rows; non-favorite rows and the white selection highlight are unchanged, and the 100% default is byte-identical to the previous look. The preference lives in Settings (favorite_opacity, clamped 0.15-1.0 in both the setter and on load), persists across restarts, updates live, and is not low-spec gated (it's a pure color-alpha preference, independent of the transparency sliders). New i18n keys favorite_opacity / tt_favorite_opacity are translated into all eight locales; the CJK subset font is rebuilt to add the two new glyphs the zh string needs. Verified: full + lite builds clean, full + lite test suites pass, hygiene OK. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -106,6 +106,7 @@ struct SettingsPageState {
|
||||
float noise_opacity = 0.5f;
|
||||
float ui_opacity = 1.0f;
|
||||
float window_opacity = 1.0f;
|
||||
float favorite_opacity = 1.0f;
|
||||
std::string balance_layout = "classic";
|
||||
bool scanline_enabled = true;
|
||||
bool theme_effects_enabled = true;
|
||||
@@ -448,6 +449,7 @@ static void loadSettingsPageState(App* app) {
|
||||
s_settingsState.acrylic_enabled = (s_settingsState.blur_amount > 0.001f);
|
||||
s_settingsState.ui_opacity = settings->getUIOpacity();
|
||||
s_settingsState.window_opacity = settings->getWindowOpacity();
|
||||
s_settingsState.favorite_opacity = settings->getFavoriteOpacity();
|
||||
s_settingsState.noise_opacity = settings->getNoiseOpacity();
|
||||
|
||||
s_settingsState.gradient_background = settings->getGradientBackground();
|
||||
@@ -532,6 +534,7 @@ static void saveSettingsPageState(config::Settings* settings) {
|
||||
settings->setBlurMultiplier(blur);
|
||||
settings->setUIOpacity(lowSpecOverrides ? realPrefs.ui_opacity : s_settingsState.ui_opacity);
|
||||
settings->setWindowOpacity(s_settingsState.window_opacity); // 1.0 under low-spec, as the hotkey saves it
|
||||
settings->setFavoriteOpacity(s_settingsState.favorite_opacity); // not low-spec gated — cosmetic
|
||||
settings->setNoiseOpacity(s_settingsState.noise_opacity);
|
||||
settings->setGradientBackground(s_settingsState.gradient_background);
|
||||
settings->setScanlineEnabled(lowSpecOverrides ? realPrefs.scanline_enabled : s_settingsState.scanline_enabled);
|
||||
@@ -1025,6 +1028,30 @@ void RenderSettingsPage(App* app) {
|
||||
|
||||
ImGui::Dummy(ImVec2(0, Layout::spacingMd()));
|
||||
|
||||
// --- Favorite highlight opacity (gold outline + star button in the Balance address list) ---
|
||||
// Pure color-alpha preference; not low-spec gated (unlike the transparency sliders below).
|
||||
{
|
||||
ImGui::PushFont(body2);
|
||||
ImGui::PushStyleColor(ImGuiCol_Text, ImGui::GetColorU32(OnSurfaceMedium()));
|
||||
ImGui::TextUnformatted(TR("favorite_opacity"));
|
||||
ImGui::PopStyleColor();
|
||||
float favSliderW = std::min(std::max(S.drawElement("components.settings-page", "effects-input-min-width").size, contentW), 360.0f * dp);
|
||||
ImGui::SetNextItemWidth(favSliderW);
|
||||
{
|
||||
char favop_fmt[16];
|
||||
snprintf(favop_fmt, sizeof(favop_fmt), "%.0f%%%%", s_settingsState.favorite_opacity * 100.0f);
|
||||
if (ImGui::SliderFloat("##FavoriteOpacity", &s_settingsState.favorite_opacity, 0.15f, 1.0f, favop_fmt,
|
||||
ImGuiSliderFlags_AlwaysClamp)) {
|
||||
if (app->settings()) app->settings()->setFavoriteOpacity(s_settingsState.favorite_opacity); // live; persisted on release
|
||||
}
|
||||
}
|
||||
if (ImGui::IsItemDeactivatedAfterEdit()) saveSettingsPageState(app->settings());
|
||||
if (ImGui::IsItemHovered()) material::Tooltip("%s", TR("tt_favorite_opacity"));
|
||||
ImGui::PopFont();
|
||||
}
|
||||
|
||||
ImGui::Dummy(ImVec2(0, Layout::spacingMd()));
|
||||
|
||||
// --- Effect toggles (always visible, horizontal wrapping flow) ---
|
||||
{
|
||||
ImGui::PushFont(body2);
|
||||
|
||||
@@ -285,10 +285,13 @@ void RenderSharedAddressList(App* app, float listH, float availW,
|
||||
float innerW = ImGui::GetContentRegionAvail().x;
|
||||
|
||||
// Theme colors for buttons (resolved once)
|
||||
ImU32 favGoldFill = S.resolveColor("var(--favorite-fill)", IM_COL32(255, 200, 50, 40));
|
||||
ImU32 favGoldBorder = S.resolveColor("var(--favorite-border)", IM_COL32(255, 200, 50, 100));
|
||||
ImU32 favGoldIcon = S.resolveColor("var(--favorite-icon)", IM_COL32(255, 200, 50, 255));
|
||||
ImU32 favGoldOutline= S.resolveColor("var(--favorite-outline)", IM_COL32(255, 200, 50, 120));
|
||||
// User-adjustable opacity for the favorite gold visuals (Settings > Appearance). 1.0 =
|
||||
// theme default (unchanged); scales whatever alpha the skin resolved, so it is skin-agnostic.
|
||||
const float favOp = app->settings() ? app->settings()->getFavoriteOpacity() : 1.0f;
|
||||
ImU32 favGoldFill = ScaleAlpha(S.resolveColor("var(--favorite-fill)", IM_COL32(255, 200, 50, 40)), favOp);
|
||||
ImU32 favGoldBorder = ScaleAlpha(S.resolveColor("var(--favorite-border)", IM_COL32(255, 200, 50, 100)), favOp);
|
||||
ImU32 favGoldIcon = ScaleAlpha(S.resolveColor("var(--favorite-icon)", IM_COL32(255, 200, 50, 255)), favOp);
|
||||
ImU32 favGoldOutline= ScaleAlpha(S.resolveColor("var(--favorite-outline)", IM_COL32(255, 200, 50, 120)), favOp);
|
||||
ImU32 btnFill = S.resolveColor("var(--row-button-fill)", IM_COL32(255, 255, 255, 12));
|
||||
ImU32 btnFillHov = S.resolveColor("var(--row-button-fill-hover)", IM_COL32(255, 255, 255, 25));
|
||||
ImU32 btnBorder = S.resolveColor("var(--row-button-border)", IM_COL32(255, 255, 255, 25));
|
||||
|
||||
Reference in New Issue
Block a user