From aebfe653525e5449cfd50f4f50dd92e2a72fe430 Mon Sep 17 00:00:00 2001 From: GigabiteStudios Date: Fri, 19 Jun 2026 00:27:45 -0500 Subject: [PATCH] fix(ui): ellipsize blame attribution text --- src/ui/diff_viewer.cpp | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/src/ui/diff_viewer.cpp b/src/ui/diff_viewer.cpp index 397a264..bb6236a 100644 --- a/src/ui/diff_viewer.cpp +++ b/src/ui/diff_viewer.cpp @@ -623,6 +623,32 @@ void drawCodeLineNumber(int value, float x, float y, ImU32 color) { const std::string text = std::to_string(value); ImGui::GetWindowDrawList()->AddText({x, y}, color, text.c_str()); } + +std::string ellipsizeText(std::string_view text, float max_width) { + if (text.empty() || max_width <= 0.0f) return {}; + + std::string display{text}; + if (ImGui::CalcTextSize(display.c_str()).x <= max_width) return display; + + constexpr const char* overflow = "..."; + const float overflow_width = ImGui::CalcTextSize(overflow).x; + if (overflow_width >= max_width) return overflow; + + while (!display.empty() && ImGui::CalcTextSize(display.c_str()).x + overflow_width > max_width) { + display.pop_back(); + } + display += overflow; + return display; +} + +void drawEllipsizedText(ImDrawList* draw, ImVec2 position, ImU32 color, std::string_view text, + float max_width, const ImVec2& clip_min, const ImVec2& clip_max) { + const std::string display = ellipsizeText(text, max_width); + if (display.empty()) return; + draw->PushClipRect(clip_min, clip_max, true); + draw->AddText(position, color, display.c_str()); + draw->PopClipRect(); +} } void DiffViewer::open(RepositoryView& repository, GitManager& manager, const std::string& path, @@ -1049,13 +1075,17 @@ void DiffViewer::draw(RepositoryView& repository, GitManager& manager, AvatarCac accent, scaled(3.0f, scale)); } const float info_x = avatar_min.x + avatar_size + scaled(8.0f, scale); + const float info_right = line_minimum.x + info_width - scaled(10.0f, scale); + const float info_text_width = std::max(0.0f, info_right - info_x); + const ImVec2 info_clip_min{info_x, line_minimum.y}; + const ImVec2 info_clip_max{info_right, line_maximum.y}; const std::string author = line.author.empty() ? "Unknown author" : line.author; std::string summary = line.summary.empty() ? "(no summary)" : line.summary; if (!line.date.empty()) summary += " " + line.date; - draw->AddText({info_x, line_minimum.y + scaled(1.0f, scale)}, - IM_COL32(216, 220, 226, 255), author.c_str()); - draw->AddText({info_x, line_minimum.y + scaled(10.0f, scale)}, - IM_COL32(134, 140, 151, 255), summary.c_str()); + drawEllipsizedText(draw, {info_x, line_minimum.y + scaled(1.0f, scale)}, + IM_COL32(216, 220, 226, 255), author, info_text_width, info_clip_min, info_clip_max); + drawEllipsizedText(draw, {info_x, line_minimum.y + scaled(10.0f, scale)}, + IM_COL32(134, 140, 151, 255), summary, info_text_width, info_clip_min, info_clip_max); } else { draw->AddText({line_minimum.x + scaled(16.0f, scale), line_minimum.y + scaled(2.0f, scale)}, IM_COL32(92, 99, 110, 255), "...");