Files
whetstone_DSL/editor/src/CodeAnnotationBadges.h

89 lines
2.9 KiB
C++

#pragma once
#include <algorithm>
#include <map>
#include <string>
#include <vector>
struct AnnotationBadgeInput {
int line = 0;
std::string type;
std::string detail;
std::string nodeId;
};
struct InlineBadge {
int line = 0;
std::string type;
std::string icon;
std::string colorHex;
std::string detail;
std::string nodeId;
};
struct LineBadgeStack {
int line = 0;
std::vector<InlineBadge> badges;
};
class CodeAnnotationBadges {
public:
static std::vector<InlineBadge> buildBadges(const std::vector<AnnotationBadgeInput>& in) {
std::vector<InlineBadge> out;
for (const auto& a : in) {
InlineBadge b;
b.line = a.line;
b.type = a.type;
b.icon = iconForType(a.type);
b.colorHex = colorForType(a.type);
b.detail = a.detail;
b.nodeId = a.nodeId;
out.push_back(b);
}
std::sort(out.begin(), out.end(),
[](const InlineBadge& a, const InlineBadge& b) {
if (a.line != b.line) return a.line < b.line;
return a.type < b.type;
});
return out;
}
static std::vector<LineBadgeStack> stackByLine(const std::vector<InlineBadge>& badges) {
std::map<int, std::vector<InlineBadge>> grouped;
for (const auto& b : badges) grouped[b.line].push_back(b);
std::vector<LineBadgeStack> out;
for (auto& [line, lineBadges] : grouped) {
out.push_back({line, lineBadges});
}
std::sort(out.begin(), out.end(),
[](const LineBadgeStack& a, const LineBadgeStack& b) {
return a.line < b.line;
});
return out;
}
static std::string expandDetail(const InlineBadge& badge) {
return badge.type + " [" + badge.nodeId + "]: " + badge.detail;
}
static std::string iconForType(const std::string& type) {
if (type.find("Intent") != std::string::npos) return "I";
if (type.find("Complexity") != std::string::npos) return "C";
if (type.find("Risk") != std::string::npos) return "R";
if (type.find("Contract") != std::string::npos) return "K";
if (type.find("Review") != std::string::npos) return "V";
if (type.find("Priority") != std::string::npos) return "P";
return "A";
}
static std::string colorForType(const std::string& type) {
if (type.find("Intent") != std::string::npos) return "#1ABC9C";
if (type.find("Complexity") != std::string::npos) return "#F39C12";
if (type.find("Risk") != std::string::npos) return "#E74C3C";
if (type.find("Contract") != std::string::npos) return "#3498DB";
if (type.find("Review") != std::string::npos) return "#9B59B6";
if (type.find("Priority") != std::string::npos) return "#2ECC71";
return "#95A5A6";
}
};