refactor(audit): batch 9 — de-duplicate balance/peers/transactions UI cards
Three UI de-duplications (rendering changes; the test suite skips the GUI, so these need a manual screenshot check of the Balance/Peers/Transactions tabs). 1. Classic balance layout — the DEFAULT layout — hand-rolled its own ~550-line address-list + recent-tx renderers that had DIVERGED from the shared RenderSharedAddressList/RenderSharedRecentTx used by the other 9 layouts. Deleted the inline copies and called the shared renderers (as the minimal layout already does), so the default layout now gains set-label + add-to-portfolio context items, custom address icons, drag-to-reorder, keyboard nav, copy-flash, and fully TR()'d strings. Hero row and Classic sizing (tabs.balance.classic address-table-height=340) preserved; addrH is computed before the call exactly as before. This is a deliberate feature-parity behavior change for the default layout. 2. peers_tab info cards — extracted drawStatCell() (label + value/em-dash with the shared offset math) and one drawCardDivider() replacing two duplicate divider lambdas; plain cells drive off a per-card loop. Bespoke cells (Blocks "(X left)", copy-on-click Best Block, TLS check-icon) kept inline. 3. transactions_tab — one drawSummaryCard() replaces the three near-identical Received/Sent/Mined blocks (same glass panel, icon, hover outline, click-to-filter). Byte-equivalent. Full-node + Lite build clean (net -651 lines, no new warnings); ctest 1/1; hygiene clean. NEEDS SCREENSHOT VERIFICATION. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -64,6 +64,30 @@ static bool IsSeedNode(const std::string& addr) {
|
||||
return seeds.count(ExtractIP(addr)) > 0;
|
||||
}
|
||||
|
||||
// Draw one label/value stat cell in an info card. The caption label sits on the first line
|
||||
// (OnSurfaceMedium); the value sits below it (valueFont) — or an em-dash "—" in the disabled
|
||||
// color when the value is null/empty. Matches the hand-positioned blocks it replaces exactly:
|
||||
// value baseline is ry + capFont->LegacySize + spacingXs().
|
||||
static void drawStatCell(ImDrawList* dl, float cx, float ry, ImFont* capFont, ImFont* valueFont,
|
||||
const char* label, const char* valueText, ImU32 valueCol)
|
||||
{
|
||||
dl->AddText(capFont, capFont->LegacySize, ImVec2(cx, ry), OnSurfaceMedium(), label);
|
||||
float valY = ry + capFont->LegacySize + Layout::spacingXs();
|
||||
if (valueText && valueText[0]) {
|
||||
dl->AddText(valueFont, valueFont->LegacySize, ImVec2(cx, valY), valueCol, valueText);
|
||||
} else {
|
||||
dl->AddText(valueFont, valueFont->LegacySize, ImVec2(cx, valY), OnSurfaceDisabled(), "\xE2\x80\x94");
|
||||
}
|
||||
}
|
||||
|
||||
// Draw a subtle horizontal divider between info-card rows, inset to the card's rounded corners.
|
||||
static void drawCardDivider(ImDrawList* dl, float leftX, float rightX, float y, float rounding, float dp)
|
||||
{
|
||||
dl->AddLine(ImVec2(leftX + rounding * 0.5f, y),
|
||||
ImVec2(rightX - rounding * 0.5f, y),
|
||||
WithAlpha(OnSurface(), 15), 1.0f * dp);
|
||||
}
|
||||
|
||||
void RenderPeersTab(App* app)
|
||||
{
|
||||
auto& S = schema::UI();
|
||||
@@ -153,20 +177,22 @@ void RenderPeersTab(App* app)
|
||||
dl->AddText(ovFont, ovFont->LegacySize, ImVec2(cardMin.x + pad, cardMin.y + pad * 0.5f), Primary(), TR("peers_blockchain"));
|
||||
|
||||
float colW = (cardW - pad * 2) / 2.0f;
|
||||
float leftX = cardMin.x + pad;
|
||||
float rightX = cardMin.x + pad + colW;
|
||||
float ry = cardMin.y + pad * 0.5f + headerH;
|
||||
|
||||
// Helper to draw a subtle horizontal divider
|
||||
auto drawDivider = [&](float y) {
|
||||
float rnd = glassSpec.rounding;
|
||||
dl->AddLine(ImVec2(cardMin.x + rnd * 0.5f, y),
|
||||
ImVec2(cardMax.x - rnd * 0.5f, y),
|
||||
WithAlpha(OnSurface(), 15), 1.0f * dp);
|
||||
// Advance ry past a row and draw a divider before the next one. Keeps the row
|
||||
// stepping + divider in one place (was a per-row copy + a duplicate divider lambda).
|
||||
auto stepRow = [&]() {
|
||||
ry += rowH + Layout::spacingSm() * 0.5f;
|
||||
drawCardDivider(dl, cardMin.x, cardMax.x, ry, glassSpec.rounding, dp);
|
||||
ry += Layout::spacingSm() * 0.5f + dividerH;
|
||||
};
|
||||
|
||||
// Row 1: Blocks | Longest Chain
|
||||
{
|
||||
// Blocks
|
||||
float cx = cardMin.x + pad;
|
||||
// Blocks — bespoke: block number + "(X left)" in a second color
|
||||
float cx = leftX;
|
||||
dl->AddText(capFont, capFont->LegacySize, ImVec2(cx, ry), OnSurfaceMedium(), TR("peers_blocks"));
|
||||
int blocks = state.sync.blocks;
|
||||
if (blocks > 0) {
|
||||
@@ -174,7 +200,6 @@ void RenderPeersTab(App* app)
|
||||
int blocksLeft = chainTip - blocks;
|
||||
if (blocksLeft < 0) blocksLeft = 0;
|
||||
if (blocksLeft > 0) {
|
||||
snprintf(buf, sizeof(buf), "%d (%d left)", blocks, blocksLeft);
|
||||
float valY = ry + capFont->LegacySize + Layout::spacingXs();
|
||||
// Draw block number in normal color
|
||||
char blockStr[32];
|
||||
@@ -196,136 +221,85 @@ void RenderPeersTab(App* app)
|
||||
}
|
||||
|
||||
// Longest Chain
|
||||
cx = cardMin.x + pad + colW;
|
||||
dl->AddText(capFont, capFont->LegacySize, ImVec2(cx, ry), OnSurfaceMedium(), TR("peers_longest_chain"));
|
||||
if (state.longestchain > 0) {
|
||||
snprintf(buf, sizeof(buf), "%d", state.longestchain);
|
||||
int localHeight = mining.blocks > 0 ? mining.blocks : state.sync.blocks;
|
||||
ImU32 chainCol = (localHeight >= state.longestchain) ? Success() : Warning();
|
||||
dl->AddText(sub1, sub1->LegacySize, ImVec2(cx, ry + capFont->LegacySize + Layout::spacingXs()), chainCol, buf);
|
||||
drawStatCell(dl, rightX, ry, capFont, sub1, TR("peers_longest_chain"), buf, chainCol);
|
||||
} else {
|
||||
dl->AddText(sub1, sub1->LegacySize, ImVec2(cx, ry + capFont->LegacySize + Layout::spacingXs()), OnSurfaceDisabled(), "\xE2\x80\x94");
|
||||
drawStatCell(dl, rightX, ry, capFont, sub1, TR("peers_longest_chain"), nullptr, OnSurface());
|
||||
}
|
||||
}
|
||||
|
||||
ry += rowH + Layout::spacingSm() * 0.5f;
|
||||
drawDivider(ry);
|
||||
ry += Layout::spacingSm() * 0.5f + dividerH;
|
||||
stepRow();
|
||||
|
||||
// Row 2: Hashrate | Difficulty
|
||||
{
|
||||
// Hashrate
|
||||
float cx = cardMin.x + pad;
|
||||
dl->AddText(capFont, capFont->LegacySize, ImVec2(cx, ry), OnSurfaceMedium(), TR("peers_hashrate"));
|
||||
float valY = ry + capFont->LegacySize + Layout::spacingXs();
|
||||
if (mining.networkHashrate > 0) {
|
||||
std::string hr = FormatHashrate(mining.networkHashrate);
|
||||
dl->AddText(sub1, sub1->LegacySize, ImVec2(cx, valY), Success(), hr.c_str());
|
||||
} else {
|
||||
dl->AddText(sub1, sub1->LegacySize, ImVec2(cx, valY), OnSurfaceDisabled(), "\xE2\x80\x94");
|
||||
}
|
||||
std::string hr = mining.networkHashrate > 0 ? FormatHashrate(mining.networkHashrate) : std::string();
|
||||
drawStatCell(dl, leftX, ry, capFont, sub1, TR("peers_hashrate"),
|
||||
hr.empty() ? nullptr : hr.c_str(), Success());
|
||||
|
||||
// Difficulty
|
||||
cx = cardMin.x + pad + colW;
|
||||
dl->AddText(capFont, capFont->LegacySize, ImVec2(cx, ry), OnSurfaceMedium(), TR("difficulty"));
|
||||
valY = ry + capFont->LegacySize + Layout::spacingXs();
|
||||
if (mining.difficulty > 0) {
|
||||
snprintf(buf, sizeof(buf), "%.4f", mining.difficulty);
|
||||
dl->AddText(sub1, sub1->LegacySize, ImVec2(cx, valY), OnSurface(), buf);
|
||||
} else {
|
||||
dl->AddText(sub1, sub1->LegacySize, ImVec2(cx, valY), OnSurfaceDisabled(), "\xE2\x80\x94");
|
||||
}
|
||||
if (mining.difficulty > 0) snprintf(buf, sizeof(buf), "%.4f", mining.difficulty);
|
||||
drawStatCell(dl, rightX, ry, capFont, sub1, TR("difficulty"),
|
||||
mining.difficulty > 0 ? buf : nullptr, OnSurface());
|
||||
}
|
||||
|
||||
ry += rowH + Layout::spacingSm() * 0.5f;
|
||||
drawDivider(ry);
|
||||
ry += Layout::spacingSm() * 0.5f + dividerH;
|
||||
stepRow();
|
||||
|
||||
// Row 3: Notarized | Protocol
|
||||
{
|
||||
// Notarized
|
||||
float cx = cardMin.x + pad;
|
||||
dl->AddText(capFont, capFont->LegacySize, ImVec2(cx, ry), OnSurfaceMedium(), TR("peers_notarized"));
|
||||
float valY = ry + capFont->LegacySize + Layout::spacingXs();
|
||||
if (state.notarized > 0) {
|
||||
snprintf(buf, sizeof(buf), "%d", state.notarized);
|
||||
dl->AddText(sub1, sub1->LegacySize, ImVec2(cx, valY), OnSurface(), buf);
|
||||
} else {
|
||||
dl->AddText(sub1, sub1->LegacySize, ImVec2(cx, valY), OnSurfaceDisabled(), "\xE2\x80\x94");
|
||||
}
|
||||
if (state.notarized > 0) snprintf(buf, sizeof(buf), "%d", state.notarized);
|
||||
drawStatCell(dl, leftX, ry, capFont, sub1, TR("peers_notarized"),
|
||||
state.notarized > 0 ? buf : nullptr, OnSurface());
|
||||
|
||||
// Protocol
|
||||
cx = cardMin.x + pad + colW;
|
||||
dl->AddText(capFont, capFont->LegacySize, ImVec2(cx, ry), OnSurfaceMedium(), TR("peers_protocol"));
|
||||
valY = ry + capFont->LegacySize + Layout::spacingXs();
|
||||
if (state.protocol_version > 0) {
|
||||
snprintf(buf, sizeof(buf), "%d", state.protocol_version);
|
||||
dl->AddText(sub1, sub1->LegacySize, ImVec2(cx, valY), OnSurface(), buf);
|
||||
} else {
|
||||
dl->AddText(sub1, sub1->LegacySize, ImVec2(cx, valY), OnSurfaceDisabled(), "\xE2\x80\x94");
|
||||
}
|
||||
if (state.protocol_version > 0) snprintf(buf, sizeof(buf), "%d", state.protocol_version);
|
||||
drawStatCell(dl, rightX, ry, capFont, sub1, TR("peers_protocol"),
|
||||
state.protocol_version > 0 ? buf : nullptr, OnSurface());
|
||||
}
|
||||
|
||||
ry += rowH + Layout::spacingSm() * 0.5f;
|
||||
drawDivider(ry);
|
||||
ry += Layout::spacingSm() * 0.5f + dividerH;
|
||||
stepRow();
|
||||
|
||||
// Row 4: Version | Memory
|
||||
{
|
||||
// Version
|
||||
float cx = cardMin.x + pad;
|
||||
dl->AddText(capFont, capFont->LegacySize, ImVec2(cx, ry), OnSurfaceMedium(), TR("peers_version"));
|
||||
float valY = ry + capFont->LegacySize + Layout::spacingXs();
|
||||
if (state.daemon_version > 0) {
|
||||
int major = state.daemon_version / 1000000;
|
||||
int minor = (state.daemon_version / 10000) % 100;
|
||||
int patch = (state.daemon_version / 100) % 100;
|
||||
snprintf(buf, sizeof(buf), "%d.%d.%d", major, minor, patch);
|
||||
dl->AddText(sub1, sub1->LegacySize, ImVec2(cx, valY), OnSurface(), buf);
|
||||
} else {
|
||||
dl->AddText(sub1, sub1->LegacySize, ImVec2(cx, valY), OnSurfaceDisabled(), "\xE2\x80\x94");
|
||||
}
|
||||
drawStatCell(dl, leftX, ry, capFont, sub1, TR("peers_version"),
|
||||
state.daemon_version > 0 ? buf : nullptr, OnSurface());
|
||||
|
||||
// Memory
|
||||
cx = cardMin.x + pad + colW;
|
||||
dl->AddText(capFont, capFont->LegacySize, ImVec2(cx, ry), OnSurfaceMedium(), TR("peers_memory"));
|
||||
valY = ry + capFont->LegacySize + Layout::spacingXs();
|
||||
double memMb = state.mining.daemon_memory_mb;
|
||||
if (memMb > 0) {
|
||||
if (memMb >= 1024.0)
|
||||
snprintf(buf, sizeof(buf), "%.1f GB", memMb / 1024.0);
|
||||
else
|
||||
snprintf(buf, sizeof(buf), "%.0f MB", memMb);
|
||||
dl->AddText(sub1, sub1->LegacySize, ImVec2(cx, valY), OnSurface(), buf);
|
||||
} else {
|
||||
dl->AddText(sub1, sub1->LegacySize, ImVec2(cx, valY), OnSurfaceDisabled(), "\xE2\x80\x94");
|
||||
}
|
||||
drawStatCell(dl, rightX, ry, capFont, sub1, TR("peers_memory"),
|
||||
memMb > 0 ? buf : nullptr, OnSurface());
|
||||
}
|
||||
|
||||
ry += rowH + Layout::spacingSm() * 0.5f;
|
||||
drawDivider(ry);
|
||||
ry += Layout::spacingSm() * 0.5f + dividerH;
|
||||
stepRow();
|
||||
|
||||
// Row 5: Longest Chain | Best Block
|
||||
{
|
||||
// Longest Chain
|
||||
float cx = cardMin.x + pad;
|
||||
dl->AddText(capFont, capFont->LegacySize, ImVec2(cx, ry), OnSurfaceMedium(), TR("peers_longest"));
|
||||
float valY = ry + capFont->LegacySize + Layout::spacingXs();
|
||||
if (state.longestchain > 0) {
|
||||
snprintf(buf, sizeof(buf), "%d", state.longestchain);
|
||||
// Color green if local matches longest, warning if behind
|
||||
int localHeight = mining.blocks > 0 ? mining.blocks : state.sync.blocks;
|
||||
ImU32 chainCol = (localHeight >= state.longestchain) ? Success() : Warning();
|
||||
dl->AddText(sub1, sub1->LegacySize, ImVec2(cx, valY), chainCol, buf);
|
||||
drawStatCell(dl, leftX, ry, capFont, sub1, TR("peers_longest"), buf, chainCol);
|
||||
} else {
|
||||
dl->AddText(sub1, sub1->LegacySize, ImVec2(cx, valY), OnSurfaceDisabled(), "\xE2\x80\x94");
|
||||
drawStatCell(dl, leftX, ry, capFont, sub1, TR("peers_longest"), nullptr, OnSurface());
|
||||
}
|
||||
|
||||
// Best Block (truncated hash)
|
||||
cx = cardMin.x + pad + colW;
|
||||
// Best Block — bespoke: truncated hash with click-to-copy + hover underline
|
||||
float cx = rightX;
|
||||
float valY = ry + capFont->LegacySize + Layout::spacingXs();
|
||||
dl->AddText(capFont, capFont->LegacySize, ImVec2(cx, ry), OnSurfaceMedium(), TR("peers_best_block"));
|
||||
valY = ry + capFont->LegacySize + Layout::spacingXs();
|
||||
if (!state.sync.best_blockhash.empty()) {
|
||||
// Truncate hash to fit: first 6 + "..." + last 6
|
||||
std::string hash = state.sync.best_blockhash;
|
||||
@@ -372,39 +346,32 @@ void RenderPeersTab(App* app)
|
||||
dl->AddText(ovFont, ovFont->LegacySize, ImVec2(cardMin.x + pad, cardMin.y + pad * 0.5f), Primary(), TR("peers_upper"));
|
||||
|
||||
float colW = (cardW - pad * 2) / 2.0f;
|
||||
float leftX = cardMin.x + pad;
|
||||
float rightX = cardMin.x + pad + colW;
|
||||
float ry = cardMin.y + pad * 0.5f + headerH;
|
||||
|
||||
// Helper to draw a subtle horizontal divider
|
||||
auto drawPeerDivider = [&](float y) {
|
||||
float rnd = glassSpec.rounding;
|
||||
dl->AddLine(ImVec2(cardMin.x + rnd * 0.5f, y),
|
||||
ImVec2(cardMax.x - rnd * 0.5f, y),
|
||||
WithAlpha(OnSurface(), 15), 1.0f * dp);
|
||||
// Advance ry past a row and draw a divider before the next one (see blockchain card).
|
||||
auto stepRow = [&]() {
|
||||
ry += rowH + Layout::spacingSm() * 0.5f;
|
||||
drawCardDivider(dl, cardMin.x, cardMax.x, ry, glassSpec.rounding, dp);
|
||||
ry += Layout::spacingSm() * 0.5f + dividerH;
|
||||
};
|
||||
|
||||
// Row 1: Connected | In/Out
|
||||
{
|
||||
// Connected
|
||||
float cx = cardMin.x + pad;
|
||||
dl->AddText(capFont, capFont->LegacySize, ImVec2(cx, ry), OnSurfaceMedium(), TR("peers_connected"));
|
||||
snprintf(buf, sizeof(buf), "%d", totalPeers);
|
||||
dl->AddText(sub1, sub1->LegacySize, ImVec2(cx, ry + capFont->LegacySize + Layout::spacingXs()), OnSurface(), buf);
|
||||
drawStatCell(dl, leftX, ry, capFont, sub1, TR("peers_connected"), buf, OnSurface());
|
||||
|
||||
// In / Out
|
||||
cx = cardMin.x + pad + colW;
|
||||
dl->AddText(capFont, capFont->LegacySize, ImVec2(cx, ry), OnSurfaceMedium(), TR("peers_in_out"));
|
||||
snprintf(buf, sizeof(buf), "%d / %d", inboundCount, outboundCount);
|
||||
dl->AddText(sub1, sub1->LegacySize, ImVec2(cx, ry + capFont->LegacySize + Layout::spacingXs()), OnSurface(), buf);
|
||||
drawStatCell(dl, rightX, ry, capFont, sub1, TR("peers_in_out"), buf, OnSurface());
|
||||
}
|
||||
|
||||
ry += rowH + Layout::spacingSm() * 0.5f;
|
||||
drawPeerDivider(ry);
|
||||
ry += Layout::spacingSm() * 0.5f + dividerH;
|
||||
stepRow();
|
||||
|
||||
// Row 2: TLS | Avg Ping
|
||||
{
|
||||
// TLS
|
||||
float cx = cardMin.x + pad;
|
||||
// TLS — bespoke: appends a check icon when every peer is TLS
|
||||
float cx = leftX;
|
||||
dl->AddText(capFont, capFont->LegacySize, ImVec2(cx, ry), OnSurfaceMedium(), "TLS");
|
||||
float valY = ry + capFont->LegacySize + Layout::spacingXs();
|
||||
if (totalPeers > 0) {
|
||||
@@ -420,60 +387,39 @@ void RenderPeersTab(App* app)
|
||||
dl->AddText(sub1, sub1->LegacySize, ImVec2(cx, valY), OnSurfaceDisabled(), "\xE2\x80\x94");
|
||||
}
|
||||
|
||||
// Avg Ping
|
||||
cx = cardMin.x + pad + colW;
|
||||
dl->AddText(capFont, capFont->LegacySize, ImVec2(cx, ry), OnSurfaceMedium(), TR("peers_avg_ping"));
|
||||
// Avg Ping — color by latency
|
||||
ImU32 pingCol;
|
||||
if (avgPing < 100) pingCol = Success();
|
||||
else if (avgPing < 500) pingCol = Warning();
|
||||
else pingCol = Error();
|
||||
snprintf(buf, sizeof(buf), "%.0f ms", avgPing);
|
||||
dl->AddText(sub1, sub1->LegacySize, ImVec2(cx, ry + capFont->LegacySize + Layout::spacingXs()), pingCol, buf);
|
||||
drawStatCell(dl, rightX, ry, capFont, sub1, TR("peers_avg_ping"), buf, pingCol);
|
||||
}
|
||||
|
||||
ry += rowH + Layout::spacingSm() * 0.5f;
|
||||
drawPeerDivider(ry);
|
||||
ry += Layout::spacingSm() * 0.5f + dividerH;
|
||||
stepRow();
|
||||
|
||||
// Row 3: Received | Sent
|
||||
{
|
||||
// Received
|
||||
float cx = cardMin.x + pad;
|
||||
dl->AddText(capFont, capFont->LegacySize, ImVec2(cx, ry), OnSurfaceMedium(), TR("peers_received"));
|
||||
std::string recvStr = fmtBytes(totalBytesRecv);
|
||||
dl->AddText(sub1, sub1->LegacySize, ImVec2(cx, ry + capFont->LegacySize + Layout::spacingXs()), OnSurface(), recvStr.c_str());
|
||||
drawStatCell(dl, leftX, ry, capFont, sub1, TR("peers_received"), recvStr.c_str(), OnSurface());
|
||||
|
||||
// Sent
|
||||
cx = cardMin.x + pad + colW;
|
||||
dl->AddText(capFont, capFont->LegacySize, ImVec2(cx, ry), OnSurfaceMedium(), TR("peers_sent"));
|
||||
std::string sentStr = fmtBytes(totalBytesSent);
|
||||
dl->AddText(sub1, sub1->LegacySize, ImVec2(cx, ry + capFont->LegacySize + Layout::spacingXs()), OnSurface(), sentStr.c_str());
|
||||
drawStatCell(dl, rightX, ry, capFont, sub1, TR("peers_sent"), sentStr.c_str(), OnSurface());
|
||||
}
|
||||
|
||||
ry += rowH + Layout::spacingSm() * 0.5f;
|
||||
drawPeerDivider(ry);
|
||||
ry += Layout::spacingSm() * 0.5f + dividerH;
|
||||
stepRow();
|
||||
|
||||
// Row 4: P2P Port | Banned
|
||||
{
|
||||
// P2P Port
|
||||
float cx = cardMin.x + pad;
|
||||
dl->AddText(capFont, capFont->LegacySize, ImVec2(cx, ry), OnSurfaceMedium(), TR("peers_p2p_port"));
|
||||
float valY = ry + capFont->LegacySize + Layout::spacingXs();
|
||||
if (state.p2p_port > 0) {
|
||||
snprintf(buf, sizeof(buf), "%d", state.p2p_port);
|
||||
dl->AddText(sub1, sub1->LegacySize, ImVec2(cx, valY), OnSurface(), buf);
|
||||
} else {
|
||||
dl->AddText(sub1, sub1->LegacySize, ImVec2(cx, valY), OnSurfaceDisabled(), "\xE2\x80\x94");
|
||||
}
|
||||
// Banned count
|
||||
cx = cardMin.x + pad + colW;
|
||||
dl->AddText(capFont, capFont->LegacySize, ImVec2(cx, ry), OnSurfaceMedium(), TR("peers_banned"));
|
||||
valY = ry + capFont->LegacySize + Layout::spacingXs();
|
||||
if (state.p2p_port > 0) snprintf(buf, sizeof(buf), "%d", state.p2p_port);
|
||||
drawStatCell(dl, leftX, ry, capFont, sub1, TR("peers_p2p_port"),
|
||||
state.p2p_port > 0 ? buf : nullptr, OnSurface());
|
||||
|
||||
size_t bannedCount = state.bannedPeers.size();
|
||||
snprintf(buf, sizeof(buf), "%zu", bannedCount);
|
||||
ImU32 bannedCol = (bannedCount > 0) ? Warning() : OnSurface();
|
||||
dl->AddText(sub1, sub1->LegacySize, ImVec2(cx, valY), bannedCol, buf); }
|
||||
drawStatCell(dl, rightX, ry, capFont, sub1, TR("peers_banned"), buf, bannedCol);
|
||||
}
|
||||
}
|
||||
|
||||
ImGui::SetCursorScreenPos(basePos);
|
||||
|
||||
Reference in New Issue
Block a user