From 01ec830555ee56c8a5004145c94ef8f1b8269e68 Mon Sep 17 00:00:00 2001 From: Kelsi Date: Fri, 13 Mar 2026 09:25:23 -0700 Subject: [PATCH] feat: show calendar pending invites indicator below minimap (WotLK) Add a pulsing purple "Calendar: N Invite(s)" notification below the minimap indicator stack when the server reports unacknowledged calendar invites (SMSG_CALENDAR_SEND_NUM_PENDING / EVENT_INVITE_ALERT). Only rendered when the WotLK expansion is active since the calendar system is WotLK-exclusive. Consistent with the existing New Mail, talent point, BG queue, and LFG queue indicator stack. --- src/ui/game_screen.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/ui/game_screen.cpp b/src/ui/game_screen.cpp index bbd90a8d..857f903d 100644 --- a/src/ui/game_screen.cpp +++ b/src/ui/game_screen.cpp @@ -16653,6 +16653,28 @@ void GameScreen::renderMinimapMarkers(game::GameHandler& gameHandler) { } } + // Calendar pending invites indicator (WotLK only) + { + auto* expReg = core::Application::getInstance().getExpansionRegistry(); + bool isWotLK = expReg && expReg->getActive() && expReg->getActive()->id == "wotlk"; + if (isWotLK) { + uint32_t calPending = gameHandler.getCalendarPendingInvites(); + if (calPending > 0) { + ImGui::SetNextWindowPos(ImVec2(indicatorX, nextIndicatorY), ImGuiCond_Always); + ImGui::SetNextWindowSize(ImVec2(indicatorW, kIndicatorH), ImGuiCond_Always); + if (ImGui::Begin("##CalendarIndicator", nullptr, indicatorFlags)) { + float pulse = 0.7f + 0.3f * std::sin(static_cast(ImGui::GetTime()) * 2.0f); + char calBuf[48]; + snprintf(calBuf, sizeof(calBuf), "Calendar: %u Invite%s", + calPending, calPending == 1 ? "" : "s"); + ImGui::TextColored(ImVec4(0.6f, 0.5f, 1.0f, pulse), "%s", calBuf); + } + ImGui::End(); + nextIndicatorY += kIndicatorH; + } + } + } + // Latency indicator — centered at top of screen uint32_t latMs = gameHandler.getLatencyMs(); if (showLatencyMeter_ && latMs > 0 && gameHandler.getState() == game::WorldState::IN_WORLD) {