From e3c999d8449ea5069987c2e7b92910fc53b9d8d1 Mon Sep 17 00:00:00 2001 From: Kelsi Date: Fri, 27 Mar 2026 10:20:45 -0700 Subject: [PATCH] refactor: add 4 color constants, replace 31 more inline literals Add kDarkRed, kSoftRed, kHostileRed, kMediumGray to ui_colors.hpp and replace 31 inline ImVec4 literals across game_screen, character_screen, inventory_screen, and performance_hud. Also replace local color aliases in performance_hud with shared constants. --- include/ui/ui_colors.hpp | 4 +++ src/rendering/performance_hud.cpp | 8 +++-- src/ui/character_screen.cpp | 2 +- src/ui/game_screen.cpp | 58 +++++++++++++++---------------- src/ui/inventory_screen.cpp | 2 +- 5 files changed, 40 insertions(+), 34 deletions(-) diff --git a/include/ui/ui_colors.hpp b/include/ui/ui_colors.hpp index f31daa04..a9c17e99 100644 --- a/include/ui/ui_colors.hpp +++ b/include/ui/ui_colors.hpp @@ -22,6 +22,10 @@ namespace colors { constexpr ImVec4 kLightBlue = {0.4f, 0.6f, 1.0f, 1.0f}; constexpr ImVec4 kManaBlue = {0.2f, 0.2f, 0.9f, 1.0f}; constexpr ImVec4 kCyan = {0.0f, 0.8f, 1.0f, 1.0f}; + constexpr ImVec4 kDarkRed = {0.9f, 0.2f, 0.2f, 1.0f}; + constexpr ImVec4 kSoftRed = {1.0f, 0.4f, 0.4f, 1.0f}; + constexpr ImVec4 kHostileRed = {1.0f, 0.35f, 0.35f, 1.0f}; + constexpr ImVec4 kMediumGray = {0.65f, 0.65f, 0.65f, 1.0f}; // Coin colors constexpr ImVec4 kGold = {1.00f, 0.82f, 0.00f, 1.0f}; diff --git a/src/rendering/performance_hud.cpp b/src/rendering/performance_hud.cpp index 67f9f7fa..7fd5ff4b 100644 --- a/src/rendering/performance_hud.cpp +++ b/src/rendering/performance_hud.cpp @@ -15,6 +15,7 @@ #include "rendering/wmo_renderer.hpp" #include "rendering/m2_renderer.hpp" #include "rendering/camera.hpp" +#include "ui/ui_colors.hpp" #include #include #include @@ -24,9 +25,10 @@ namespace wowee { namespace rendering { namespace { - constexpr ImVec4 kHelpText = {0.6f, 0.6f, 0.6f, 1.0f}; + using namespace wowee::ui; constexpr ImVec4 kSectionHeader = {0.8f, 0.8f, 0.5f, 1.0f}; - constexpr ImVec4 kTitle = {0.7f, 0.7f, 0.7f, 1.0f}; + const auto& kHelpText = colors::kGray; + const auto& kTitle = colors::kLightGray; } // namespace PerformanceHUD::PerformanceHUD() { @@ -197,7 +199,7 @@ void PerformanceHUD::render(const Renderer* renderer, const Camera* camera) { // FSR info if (renderer->isFSREnabled()) { - ImGui::TextColored(ImVec4(0.4f, 1.0f, 0.4f, 1.0f), "FSR 1.0: ON"); + ImGui::TextColored(colors::kGreen, "FSR 1.0: ON"); auto* ctx = renderer->getVkContext(); if (ctx) { auto ext = ctx->getSwapchainExtent(); diff --git a/src/ui/character_screen.cpp b/src/ui/character_screen.cpp index 6c22ee0e..95fccf0e 100644 --- a/src/ui/character_screen.cpp +++ b/src/ui/character_screen.cpp @@ -94,7 +94,7 @@ void CharacterScreen::render(game::GameHandler& gameHandler) { if (characters.empty() && (gameHandler.getState() == game::WorldState::DISCONNECTED || gameHandler.getState() == game::WorldState::FAILED)) { - ImGui::TextColored(ImVec4(1.0f, 0.4f, 0.4f, 1.0f), "Disconnected from server."); + ImGui::TextColored(ui::colors::kSoftRed, "Disconnected from server."); ImGui::TextWrapped("The server closed the connection before sending the character list."); ImGui::Spacing(); if (ImGui::Button("Back", ImVec2(120, 36))) { if (onBack) onBack(); } diff --git a/src/ui/game_screen.cpp b/src/ui/game_screen.cpp index a9fdc8a9..b8d668a7 100644 --- a/src/ui/game_screen.cpp +++ b/src/ui/game_screen.cpp @@ -3372,7 +3372,7 @@ void GameScreen::renderPlayerFrame(game::GameHandler& gameHandler) { ImGui::TextDisabled("Lv %u", playerLevel); if (isDead) { ImGui::SameLine(); - ImGui::TextColored(ImVec4(0.9f, 0.2f, 0.2f, 1.0f), "DEAD"); + ImGui::TextColored(colors::kDarkRed, "DEAD"); } // Group leader crown on self frame when you lead the party/raid if (gameHandler.isInGroup() && @@ -3472,7 +3472,7 @@ void GameScreen::renderPlayerFrame(game::GameHandler& gameHandler) { } break; } - case 1: powerColor = ImVec4(0.9f, 0.2f, 0.2f, 1.0f); break; // Rage (red) + case 1: powerColor = colors::kDarkRed; break; // Rage (red) case 2: powerColor = ImVec4(0.9f, 0.6f, 0.1f, 1.0f); break; // Focus (orange) case 3: powerColor = ImVec4(0.9f, 0.9f, 0.2f, 1.0f); break; // Energy (yellow) case 4: powerColor = ImVec4(0.5f, 0.9f, 0.3f, 1.0f); break; // Happiness (green) @@ -3808,7 +3808,7 @@ void GameScreen::renderPetFrame(game::GameHandler& gameHandler) { ImVec4 powerColor; switch (powerType) { case 0: powerColor = colors::kManaBlue; break; // Mana - case 1: powerColor = ImVec4(0.9f, 0.2f, 0.2f, 1.0f); break; // Rage + case 1: powerColor = colors::kDarkRed; break; // Rage case 2: powerColor = ImVec4(0.9f, 0.6f, 0.1f, 1.0f); break; // Focus (hunter pets) case 3: powerColor = ImVec4(0.9f, 0.9f, 0.2f, 1.0f); break; // Energy default: powerColor = colors::kManaBlue; break; @@ -3860,7 +3860,7 @@ void GameScreen::renderPetFrame(game::GameHandler& gameHandler) { static const ImVec4 kReactColors[] = { colors::kLightBlue, // passive — blue ImVec4(0.3f, 0.85f, 0.3f, 1.0f), // defensive — green - ImVec4(1.0f, 0.35f, 0.35f, 1.0f),// aggressive — red + colors::kHostileRed,// aggressive — red }; static const ImVec4 kReactDimColors[] = { ImVec4(0.15f, 0.2f, 0.4f, 0.8f), @@ -4490,7 +4490,7 @@ void GameScreen::renderTargetFrame(game::GameHandler& gameHandler) { ImVec4 targetPowerColor; switch (targetPowerType) { case 0: targetPowerColor = colors::kManaBlue; break; // Mana (blue) - case 1: targetPowerColor = ImVec4(0.9f, 0.2f, 0.2f, 1.0f); break; // Rage (red) + case 1: targetPowerColor = colors::kDarkRed; break; // Rage (red) case 2: targetPowerColor = ImVec4(0.9f, 0.6f, 0.1f, 1.0f); break; // Focus (orange) case 3: targetPowerColor = ImVec4(0.9f, 0.9f, 0.2f, 1.0f); break; // Energy (yellow) case 4: targetPowerColor = ImVec4(0.5f, 0.9f, 0.3f, 1.0f); break; // Happiness (green) @@ -5364,7 +5364,7 @@ void GameScreen::renderFocusFrame(game::GameHandler& gameHandler) { ImVec4 pwrColor; switch (pType) { case 0: pwrColor = colors::kManaBlue; break; - case 1: pwrColor = ImVec4(0.9f, 0.2f, 0.2f, 1.0f); break; + case 1: pwrColor = colors::kDarkRed; break; case 3: pwrColor = ImVec4(0.9f, 0.9f, 0.2f, 1.0f); break; case 6: pwrColor = ImVec4(0.8f, 0.1f, 0.2f, 1.0f); break; default: pwrColor = colors::kManaBlue; break; @@ -9332,7 +9332,7 @@ void GameScreen::renderActionBar(game::GameHandler& gameHandler) { } } if (outOfRange) { - ImGui::TextColored(ImVec4(1.0f, 0.35f, 0.35f, 1.0f), "Out of range"); + ImGui::TextColored(colors::kHostileRed, "Out of range"); } if (insufficientPower) { ImGui::TextColored(ImVec4(0.75f, 0.55f, 1.0f, 1.0f), "Not enough power"); @@ -12632,7 +12632,7 @@ void GameScreen::renderPartyFrames(game::GameHandler& gameHandler) { ImVec4 powerColor; switch (member.powerType) { case 0: powerColor = colors::kManaBlue; break; // Mana (blue) - case 1: powerColor = ImVec4(0.9f, 0.2f, 0.2f, 1.0f); break; // Rage (red) + case 1: powerColor = colors::kDarkRed; break; // Rage (red) case 2: powerColor = ImVec4(0.9f, 0.6f, 0.1f, 1.0f); break; // Focus (orange) case 3: powerColor = ImVec4(0.9f, 0.9f, 0.2f, 1.0f); break; // Energy (yellow) case 4: powerColor = ImVec4(0.5f, 0.9f, 0.3f, 1.0f); break; // Happiness (green) @@ -13319,7 +13319,7 @@ void GameScreen::renderBossFrames(game::GameHandler& gameHandler) { ImVec4 bpColor; switch (bossPowerType) { case 0: bpColor = ImVec4(0.2f, 0.3f, 0.9f, 1.0f); break; // Mana: blue - case 1: bpColor = ImVec4(0.9f, 0.2f, 0.2f, 1.0f); break; // Rage: red + case 1: bpColor = colors::kDarkRed; break; // Rage: red case 2: bpColor = ImVec4(0.9f, 0.6f, 0.1f, 1.0f); break; // Focus: orange case 3: bpColor = ImVec4(0.9f, 0.9f, 0.1f, 1.0f); break; // Energy: yellow default: bpColor = ImVec4(0.4f, 0.8f, 0.4f, 1.0f); break; @@ -14180,7 +14180,7 @@ void GameScreen::renderBgInvitePopup(game::GameHandler& gameHandler) { frac = std::clamp(frac, 0.0f, 1.0f); ImVec4 barColor = frac > 0.5f ? ImVec4(0.2f, 0.8f, 0.2f, 1.0f) : frac > 0.25f ? ImVec4(0.9f, 0.7f, 0.1f, 1.0f) - : ImVec4(0.9f, 0.2f, 0.2f, 1.0f); + : colors::kDarkRed; ImGui::PushStyleColor(ImGuiCol_PlotHistogram, barColor); char countdownLabel[32]; snprintf(countdownLabel, sizeof(countdownLabel), "%ds", static_cast(remaining)); @@ -16033,7 +16033,7 @@ void GameScreen::renderGossipWindow(game::GameHandler& gameHandler) { switch (quest.questIcon) { case 5: // INCOMPLETE — in progress but not done statusIcon = "?"; - statusColor = ImVec4(0.65f, 0.65f, 0.65f, 1.0f); // gray + statusColor = colors::kMediumGray; // gray break; case 6: // REWARD_REP — repeatable, ready to turn in case 10: // REWARD — ready to turn in @@ -16042,7 +16042,7 @@ void GameScreen::renderGossipWindow(game::GameHandler& gameHandler) { break; case 7: // AVAILABLE_LOW — available but gray (low-level) statusIcon = "!"; - statusColor = ImVec4(0.65f, 0.65f, 0.65f, 1.0f); // gray + statusColor = colors::kMediumGray; // gray break; default: // AVAILABLE (8) and any others statusIcon = "!"; @@ -17877,7 +17877,7 @@ void GameScreen::renderDeathScreen(game::GameHandler& gameHandler) { snprintf(timerBuf, sizeof(timerBuf), "Auto-release in %d:%02d", mins, secs); float tw = ImGui::CalcTextSize(timerBuf).x; ImGui::SetCursorPosX((dlgW - tw) / 2); - ImGui::TextColored(ImVec4(0.65f, 0.65f, 0.65f, 1.0f), "%s", timerBuf); + ImGui::TextColored(colors::kMediumGray, "%s", timerBuf); } ImGui::Spacing(); @@ -20302,7 +20302,7 @@ void GameScreen::renderMinimapMarkers(game::GameHandler& gameHandler) { glm::vec3 hoverRender(playerRender.x + hoverDx, playerRender.y + hoverDy, playerRender.z); glm::vec3 hoverCanon = core::coords::renderToCanonical(hoverRender); ImGui::TextColored(ImVec4(0.9f, 0.85f, 0.5f, 1.0f), "%.1f, %.1f", hoverCanon.x, hoverCanon.y); - ImGui::TextColored(ImVec4(0.65f, 0.65f, 0.65f, 1.0f), "Ctrl+click to ping"); + ImGui::TextColored(colors::kMediumGray, "Ctrl+click to ping"); ImGui::EndTooltip(); if (ImGui::IsMouseClicked(ImGuiMouseButton_Right)) { @@ -23879,7 +23879,7 @@ void GameScreen::renderDungeonFinderWindow(game::GameHandler& gameHandler) { } if (!rolesOk) { ImGui::EndDisabled(); - ImGui::TextColored(ImVec4(1.0f, 0.4f, 0.4f, 1.0f), "Select at least one role."); + ImGui::TextColored(colors::kSoftRed, "Select at least one role."); } } @@ -23978,7 +23978,7 @@ void GameScreen::renderInstanceLockouts(game::GameHandler& gameHandler) { if (lo.extended) { ImGui::TextColored(ImVec4(0.3f, 0.7f, 1.0f, 1.0f), "Ext"); } else if (lo.locked) { - ImGui::TextColored(ImVec4(1.0f, 0.4f, 0.4f, 1.0f), "Locked"); + ImGui::TextColored(colors::kSoftRed, "Locked"); } else { ImGui::TextColored(ImVec4(0.5f, 0.9f, 0.5f, 1.0f), "Open"); } @@ -24103,7 +24103,7 @@ void GameScreen::renderBattlegroundScore(game::GameHandler& gameHandler) { snprintf(hBuf, sizeof(hBuf), "\xF0\x9F\x94\xB4 %u / %u", hordeScore, maxScore); else snprintf(hBuf, sizeof(hBuf), "\xF0\x9F\x94\xB4 %u", hordeScore); - ImGui::TextColored(ImVec4(1.0f, 0.35f, 0.35f, 1.0f), "%s", hBuf); + ImGui::TextColored(colors::kHostileRed, "%s", hBuf); } ImGui::EndGroup(); } @@ -24312,7 +24312,7 @@ void GameScreen::renderCombatLog(game::GameHandler& gameHandler) { switch (e.type) { case T::MELEE_DAMAGE: snprintf(desc, sizeof(desc), "%s hits %s for %d", src, tgt, e.amount); - color = e.isPlayerSource ? ImVec4(1.0f, 0.9f, 0.3f, 1.0f) : ImVec4(1.0f, 0.4f, 0.4f, 1.0f); + color = e.isPlayerSource ? ImVec4(1.0f, 0.9f, 0.3f, 1.0f) : colors::kSoftRed; break; case T::CRIT_DAMAGE: snprintf(desc, sizeof(desc), "%s crits %s for %d!", src, tgt, e.amount); @@ -24323,7 +24323,7 @@ void GameScreen::renderCombatLog(game::GameHandler& gameHandler) { snprintf(desc, sizeof(desc), "%s's %s hits %s for %d", src, spell, tgt, e.amount); else snprintf(desc, sizeof(desc), "%s's spell hits %s for %d", src, tgt, e.amount); - color = e.isPlayerSource ? ImVec4(1.0f, 0.9f, 0.3f, 1.0f) : ImVec4(1.0f, 0.4f, 0.4f, 1.0f); + color = e.isPlayerSource ? ImVec4(1.0f, 0.9f, 0.3f, 1.0f) : colors::kSoftRed; break; case T::PERIODIC_DAMAGE: if (spell) @@ -24358,21 +24358,21 @@ void GameScreen::renderCombatLog(game::GameHandler& gameHandler) { snprintf(desc, sizeof(desc), "%s's %s misses %s", src, spell, tgt); else snprintf(desc, sizeof(desc), "%s misses %s", src, tgt); - color = ImVec4(0.65f, 0.65f, 0.65f, 1.0f); + color = colors::kMediumGray; break; case T::DODGE: if (spell) snprintf(desc, sizeof(desc), "%s dodges %s's %s", tgt, src, spell); else snprintf(desc, sizeof(desc), "%s dodges %s's attack", tgt, src); - color = ImVec4(0.65f, 0.65f, 0.65f, 1.0f); + color = colors::kMediumGray; break; case T::PARRY: if (spell) snprintf(desc, sizeof(desc), "%s parries %s's %s", tgt, src, spell); else snprintf(desc, sizeof(desc), "%s parries %s's attack", tgt, src); - color = ImVec4(0.65f, 0.65f, 0.65f, 1.0f); + color = colors::kMediumGray; break; case T::BLOCK: if (spell) @@ -24386,7 +24386,7 @@ void GameScreen::renderCombatLog(game::GameHandler& gameHandler) { snprintf(desc, sizeof(desc), "%s evades %s's %s", tgt, src, spell); else snprintf(desc, sizeof(desc), "%s evades %s's attack", tgt, src); - color = ImVec4(0.65f, 0.65f, 0.65f, 1.0f); + color = colors::kMediumGray; break; case T::IMMUNE: if (spell) @@ -24799,7 +24799,7 @@ void GameScreen::renderGmTicketWindow(game::GameHandler& gameHandler) { // Show GM support availability if (!gameHandler.isGmSupportAvailable()) { - ImGui::TextColored(ImVec4(1.0f, 0.4f, 0.4f, 1.0f), "GM support is currently unavailable."); + ImGui::TextColored(colors::kSoftRed, "GM support is currently unavailable."); ImGui::Spacing(); } @@ -24980,7 +24980,7 @@ void GameScreen::renderBgScoreboard(game::GameHandler& gameHandler) { const auto& at = data->arenaTeams[t]; if (at.teamName.empty()) continue; int32_t ratingDelta = static_cast(at.ratingChange); - ImVec4 teamCol = (t == 0) ? ImVec4(1.0f, 0.35f, 0.35f, 1.0f) // team 0: red + ImVec4 teamCol = (t == 0) ? colors::kHostileRed // team 0: red : colors::kLightBlue; // team 1: blue ImGui::TextColored(teamCol, "%s", at.teamName.c_str()); ImGui::SameLine(); @@ -25002,12 +25002,12 @@ void GameScreen::renderBgScoreboard(game::GameHandler& gameHandler) { // For arenas, winner byte 0/1 refers to team index in arenaTeams[] const auto& winTeam = data->arenaTeams[data->winner & 1]; winnerStr = winTeam.teamName.empty() ? "Team 1" : winTeam.teamName.c_str(); - winnerColor = (data->winner == 0) ? ImVec4(1.0f, 0.35f, 0.35f, 1.0f) + winnerColor = (data->winner == 0) ? colors::kHostileRed : colors::kLightBlue; } else { winnerStr = (data->winner == 1) ? "Alliance" : "Horde"; winnerColor = (data->winner == 1) ? colors::kLightBlue - : ImVec4(1.0f, 0.35f, 0.35f, 1.0f); + : colors::kHostileRed; } float textW = ImGui::CalcTextSize(winnerStr).x + ImGui::CalcTextSize(" Victory!").x; ImGui::SetCursorPosX((ImGui::GetContentRegionAvail().x - textW) * 0.5f); @@ -25081,7 +25081,7 @@ void GameScreen::renderBgScoreboard(game::GameHandler& gameHandler) { if (ps->team == 1) ImGui::TextColored(colors::kLightBlue, "Alliance"); else - ImGui::TextColored(ImVec4(1.0f, 0.35f, 0.35f, 1.0f), "Horde"); + ImGui::TextColored(colors::kHostileRed, "Horde"); // Name (highlight player's own row) ImGui::TableNextColumn(); @@ -25262,7 +25262,7 @@ void GameScreen::renderInspectWindow(game::GameHandler& gameHandler) { ImGui::TextDisabled(" %u talent pts", result->totalTalents); if (result->unspentTalents > 0) { ImGui::SameLine(); - ImGui::TextColored(ImVec4(1.0f, 0.4f, 0.4f, 1.0f), "(%u unspent)", result->unspentTalents); + ImGui::TextColored(colors::kSoftRed, "(%u unspent)", result->unspentTalents); } if (result->talentGroups > 1) { ImGui::SameLine(); diff --git a/src/ui/inventory_screen.cpp b/src/ui/inventory_screen.cpp index e0253641..1b1d009b 100644 --- a/src/ui/inventory_screen.cpp +++ b/src/ui/inventory_screen.cpp @@ -825,7 +825,7 @@ void InventoryScreen::render(game::Inventory& inventory, uint64_t moneyCopper) { destroyConfirmOpen_ = false; } if (ImGui::BeginPopup("##DestroyItem", ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar)) { - ImGui::TextColored(ImVec4(1.0f, 0.4f, 0.4f, 1.0f), "Destroy"); + ImGui::TextColored(ui::colors::kSoftRed, "Destroy"); ImGui::TextUnformatted(destroyItemName_.c_str()); ImGui::Spacing(); if (ImGui::Button("Yes, Destroy", ImVec2(110, 0))) {