Stretch every tab instead of individual ones.

This commit is contained in:
Skyth 2025-02-12 15:10:14 +03:00
parent 8ec408db9c
commit a65abdae45

View file

@ -477,43 +477,43 @@ static bool DrawCategories()
auto clipRectMin = drawList->GetClipRectMin(); auto clipRectMin = drawList->GetClipRectMin();
auto clipRectMax = drawList->GetClipRectMax(); auto clipRectMax = drawList->GetClipRectMax();
constexpr float NARROW_PADDING_GRID_COUNT = 1.5f;
constexpr float WIDE_PADDING_GRID_COUNT = 3.0f;
float gridSize = Scale(GRID_SIZE); float gridSize = Scale(GRID_SIZE);
float textPadding = gridSize * Lerp(NARROW_PADDING_GRID_COUNT, WIDE_PADDING_GRID_COUNT, g_aspectRatioNarrowScale);
float tabPadding = gridSize;
float size = Scale(32.0f); float size = Scale(32.0f);
ImVec2 textSizes[g_categoryCount]; ImVec2 textSizes[g_categoryCount];
float textSquashRatio[g_categoryCount];
float clipRectWidth = clipRectMax.x - clipRectMin.x; float clipRectWidth = clipRectMax.x - clipRectMin.x;
float categoryTextPadding = textPadding * 2.0f * g_categoryCount;
float categoryTabPadding = tabPadding * (g_categoryCount - 1);
float maxTabWidth = (clipRectWidth - categoryTabPadding) / float(g_categoryCount);
float maxTextWidth = maxTabWidth - (NARROW_PADDING_GRID_COUNT * gridSize * 2.0f);
float tabWidthSum = categoryTabPadding; float textWidthSum = 0.0f;
for (size_t i = 0; i < g_categoryCount; i++) for (size_t i = 0; i < g_categoryCount; i++)
{ {
textSizes[i] = g_dfsogeistdFont->CalcTextSizeA(size, FLT_MAX, 0.0f, GetCategory(i).c_str()); textSizes[i] = g_dfsogeistdFont->CalcTextSizeA(size, FLT_MAX, 0.0f, GetCategory(i).c_str());
textSquashRatio[i] = std::min(maxTextWidth / textSizes[i].x, 1.0f); textWidthSum += textSizes[i].x;
tabWidthSum += std::min(textSizes[i].x + textPadding * 2.0f, maxTabWidth); }
float textSquashRatio = 1.0f;
float maxTextWidthSum = clipRectWidth - (gridSize * 4.0f * (g_categoryCount - 1));
if (textWidthSum > maxTextWidthSum)
{
textSquashRatio = maxTextWidthSum / textWidthSum;
for (auto& textSize : textSizes)
textSize.x *= textSquashRatio;
textWidthSum = maxTextWidthSum;
} }
float tabHeight = gridSize * 4.0f; float tabHeight = gridSize * 4.0f;
float xOffset = (clipRectWidth - tabWidthSum) / 2.0f; float textPadding = (clipRectWidth - textWidthSum) / (g_categoryCount + 1.0f);
float xOffset = textPadding;
xOffset -= (1.0 - motion) * gridSize * 4.0; xOffset -= (1.0 - motion) * gridSize * 4.0;
ImVec2 minVec[g_categoryCount]; ImVec2 textPositions[g_categoryCount];
for (size_t i = 0; i < g_categoryCount; i++) for (size_t i = 0; i < g_categoryCount; i++)
{ {
ImVec2 min = { clipRectMin.x + xOffset, clipRectMin.y }; float tabPadding = std::min(textPadding / 2.0f, gridSize * 3.0f);
xOffset += std::min(textSizes[i].x + textPadding * 2.0f, maxTabWidth); ImVec2 min = { clipRectMin.x + xOffset - tabPadding, clipRectMin.y };
ImVec2 max = { clipRectMin.x + xOffset, clipRectMin.y + tabHeight }; ImVec2 max = { min.x + textSizes[i].x + tabPadding * 2.0f, min.y + tabHeight};
xOffset += tabPadding;
if (g_categoryIndex == i) if (g_categoryIndex == i)
{ {
@ -577,23 +577,23 @@ static bool DrawCategories()
SetShaderModifier(IMGUI_SHADER_MODIFIER_NONE); SetShaderModifier(IMGUI_SHADER_MODIFIER_NONE);
} }
min.x += ((max.x - min.x) - (textSizes[i].x * textSquashRatio[i])) / 2.0f;
// Store to draw again later, otherwise the tab background gets drawn on top of text during the animation. // Store to draw again later, otherwise the tab background gets drawn on top of text during the animation.
minVec[i] = min; textPositions[i] = { clipRectMin.x + xOffset, clipRectMin.y };
xOffset += textSizes[i].x + textPadding;
} }
SetScale({ textSquashRatio, 1.0f });
for (size_t i = 0; i < g_categoryCount; i++) for (size_t i = 0; i < g_categoryCount; i++)
{ {
auto& min = minVec[i]; auto& pos = textPositions[i];
uint8_t alpha = (i == g_categoryIndex ? 235 : 128) * motion; uint8_t alpha = (i == g_categoryIndex ? 235 : 128) * motion;
SetOrigin({ min.x, min.y }); SetOrigin({ pos.x, pos.y });
SetScale({ textSquashRatio[i], 1.0f });
SetGradient SetGradient
( (
min, pos,
{ min.x + textSizes[i].x, min.y + textSizes[i].y }, { pos.x + textSizes[i].x, pos.y + textSizes[i].y },
IM_COL32(128, 255, 0, alpha), IM_COL32(128, 255, 0, alpha),
IM_COL32(255, 192, 0, alpha) IM_COL32(255, 192, 0, alpha)
); );
@ -602,7 +602,7 @@ static bool DrawCategories()
( (
g_dfsogeistdFont, g_dfsogeistdFont,
size, size,
min, pos,
IM_COL32_WHITE, IM_COL32_WHITE,
GetCategory(i).c_str(), GetCategory(i).c_str(),
4, 4,