mirror of
https://github.com/hedge-dev/UnleashedRecomp.git
synced 2026-04-28 05:11:37 +00:00
allow preliminary annotation on DrawCenteredParagraph
This commit is contained in:
parent
692542fb85
commit
967996acf1
2 changed files with 96 additions and 8 deletions
|
|
@ -361,12 +361,49 @@ std::vector<std::string> Split(const char* strStart, const ImFont *font, float f
|
||||||
|
|
||||||
ImVec2 MeasureCentredParagraph(const ImFont* font, float fontSize, float lineMargin, std::vector<std::string> lines)
|
ImVec2 MeasureCentredParagraph(const ImFont* font, float fontSize, float lineMargin, std::vector<std::string> lines)
|
||||||
{
|
{
|
||||||
|
struct TextSegment {
|
||||||
|
bool annotated;
|
||||||
|
std::string text;
|
||||||
|
std::string annotation;
|
||||||
|
};
|
||||||
|
|
||||||
auto x = 0.0f;
|
auto x = 0.0f;
|
||||||
auto y = 0.0f;
|
auto y = 0.0f;
|
||||||
|
|
||||||
for (auto& str : lines)
|
for (auto& str : lines)
|
||||||
{
|
{
|
||||||
auto textSize = font->CalcTextSizeA(fontSize, FLT_MAX, 0, str.c_str());
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
// TODO: Don't duplicate this code segment
|
||||||
|
std::vector<TextSegment> segments;
|
||||||
|
std::regex regex(R"(\[([^\:]+):([^\]]+)\])"); // Matches "[text:annotation]"
|
||||||
|
std::smatch match;
|
||||||
|
|
||||||
|
auto searchStart = str.cbegin();
|
||||||
|
while (std::regex_search(searchStart, str.cend(), match, regex))
|
||||||
|
{
|
||||||
|
if (searchStart != match[0].first)
|
||||||
|
{
|
||||||
|
segments.push_back({ false, std::string(searchStart, match[0].first), "" });
|
||||||
|
}
|
||||||
|
|
||||||
|
segments.push_back({ true, match[1].str(), match[2].str() });
|
||||||
|
|
||||||
|
searchStart = match[0].second;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (searchStart != str.cend())
|
||||||
|
{
|
||||||
|
segments.push_back({ false, std::string(searchStart, str.cend()), "" });
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string annotationRemovedLine = "";
|
||||||
|
for (const auto& segment : segments)
|
||||||
|
{
|
||||||
|
annotationRemovedLine += segment.text;
|
||||||
|
}
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
auto textSize = font->CalcTextSizeA(fontSize, FLT_MAX, 0, annotationRemovedLine.c_str());
|
||||||
|
|
||||||
x = std::max(x, textSize.x);
|
x = std::max(x, textSize.x);
|
||||||
y += textSize.y + Scale(lineMargin);
|
y += textSize.y + Scale(lineMargin);
|
||||||
|
|
@ -386,18 +423,65 @@ void DrawCentredParagraph(const ImFont* font, float fontSize, float maxWidth, co
|
||||||
auto paragraphSize = MeasureCentredParagraph(font, fontSize, lineMargin, lines);
|
auto paragraphSize = MeasureCentredParagraph(font, fontSize, lineMargin, lines);
|
||||||
auto offsetY = 0.0f;
|
auto offsetY = 0.0f;
|
||||||
|
|
||||||
for (int i = 0; i < lines.size(); i++)
|
struct TextSegment {
|
||||||
{
|
bool annotated;
|
||||||
auto& str = lines[i];
|
std::string text;
|
||||||
auto textSize = font->CalcTextSizeA(fontSize, FLT_MAX, 0, str.c_str());
|
std::string annotation;
|
||||||
|
};
|
||||||
|
|
||||||
auto textX = str.starts_with("- ")
|
for (const auto& line : lines)
|
||||||
|
{
|
||||||
|
std::vector<TextSegment> segments;
|
||||||
|
std::regex regex(R"(\[([^\:]+):([^\]]+)\])"); // Matches "[text:annotation]"
|
||||||
|
std::smatch match;
|
||||||
|
|
||||||
|
auto searchStart = line.cbegin();
|
||||||
|
while (std::regex_search(searchStart, line.cend(), match, regex))
|
||||||
|
{
|
||||||
|
if (searchStart != match[0].first)
|
||||||
|
{
|
||||||
|
segments.push_back({ false, std::string(searchStart, match[0].first), ""});
|
||||||
|
}
|
||||||
|
|
||||||
|
segments.push_back({ true, match[1].str(), match[2].str() });
|
||||||
|
|
||||||
|
searchStart = match[0].second;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (searchStart != line.cend())
|
||||||
|
{
|
||||||
|
segments.push_back({ false, std::string(searchStart, line.cend()), "" });
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string annotationRemovedLine = "";
|
||||||
|
for (const auto& segment : segments)
|
||||||
|
{
|
||||||
|
annotationRemovedLine += segment.text;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto textSize = font->CalcTextSizeA(fontSize, FLT_MAX, 0, annotationRemovedLine.c_str());
|
||||||
|
|
||||||
|
auto textX = annotationRemovedLine.starts_with("- ")
|
||||||
? centre.x - paragraphSize.x / 2
|
? centre.x - paragraphSize.x / 2
|
||||||
: centre.x - textSize.x / 2;
|
: centre.x - textSize.x / 2;
|
||||||
|
|
||||||
auto textY = centre.y - paragraphSize.y / 2 + offsetY;
|
for (const auto& segment : segments)
|
||||||
|
{
|
||||||
|
textSize = font->CalcTextSizeA(fontSize, FLT_MAX, 0, segment.text.c_str());
|
||||||
|
auto textY = centre.y - paragraphSize.y / 2 + offsetY;
|
||||||
|
|
||||||
drawMethod(str.c_str(), { textX, textY });
|
if (segment.annotated)
|
||||||
|
{
|
||||||
|
auto annotationSize = font->CalcTextSizeA(fontSize * 0.6f, FLT_MAX, 0, segment.annotation.c_str());
|
||||||
|
|
||||||
|
float annotationX = textX + (textSize.x - annotationSize.x) / 2.0f;
|
||||||
|
|
||||||
|
annotationDrawMethod(segment.annotation.c_str(), fontSize * 0.6f, { annotationX, textY - (fontSize * 0.6f) });
|
||||||
|
}
|
||||||
|
|
||||||
|
drawMethod(segment.text.c_str(), { textX, textY });
|
||||||
|
textX += textSize.x;
|
||||||
|
}
|
||||||
|
|
||||||
offsetY += textSize.y + Scale(lineMargin);
|
offsetY += textSize.y + Scale(lineMargin);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -319,6 +319,10 @@ void MessageWindow::Draw()
|
||||||
[=](const char* str, ImVec2 pos)
|
[=](const char* str, ImVec2 pos)
|
||||||
{
|
{
|
||||||
DrawTextWithShadow(g_fntSeurat, fontSize, pos, IM_COL32(255, 255, 255, 255), str);
|
DrawTextWithShadow(g_fntSeurat, fontSize, pos, IM_COL32(255, 255, 255, 255), str);
|
||||||
|
},
|
||||||
|
[=](const char* str, float size, ImVec2 pos)
|
||||||
|
{
|
||||||
|
DrawTextWithShadow(g_fntSeurat, size, pos, IM_COL32(255, 255, 255, 255), str);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue