fix(ui): ellipsize blame attribution text

This commit is contained in:
2026-06-19 00:27:45 -05:00
parent b6fdec12f5
commit aebfe65352

View File

@@ -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), "...");