Show building_block icon in header stock, expand button and build costs

This commit is contained in:
2026-07-23 21:13:37 +02:00
parent 0bba7686e6
commit 79b79ab7c3
9 changed files with 313 additions and 18 deletions

48
src/ui/IconCaption.cpp Normal file
View File

@@ -0,0 +1,48 @@
#include "IconCaption.h"
#include <QFontMetrics>
#include <QGuiApplication>
#include <QPainter>
#include <QRect>
QPixmap renderCaptionWithIcon(const QString& text, const QPixmap& icon,
const QFont& font, const QColor& textColor)
{
const QFontMetrics metrics(font);
const int textWidth = metrics.horizontalAdvance(text);
const int gap = icon.isNull() ? 0 : 6;
// The icon is drawn at the caption's device-independent pixel size; the source
// pixmap may be larger (rasterized at a target size / device pixel ratio), so
// divide by its own dpr to get its logical size.
const qreal iconDpr = icon.isNull() ? 1.0 : icon.devicePixelRatio();
const int iconW = icon.isNull() ? 0
: static_cast<int>(icon.width() / iconDpr);
const int iconH = icon.isNull() ? 0
: static_cast<int>(icon.height() / iconDpr);
const int width = textWidth + gap + iconW;
const int height = qMax(metrics.height(), iconH);
const qreal dpr = qApp ? qApp->devicePixelRatio() : 1.0;
QPixmap pixmap(static_cast<int>(width * dpr), static_cast<int>(height * dpr));
pixmap.setDevicePixelRatio(dpr);
pixmap.fill(Qt::transparent);
QPainter painter(&pixmap);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.setRenderHint(QPainter::SmoothPixmapTransform, true);
painter.setFont(font);
painter.setPen(textColor);
painter.drawText(QRect(0, 0, textWidth, height),
Qt::AlignLeft | Qt::AlignVCenter, text);
if (!icon.isNull())
{
const int iconX = textWidth + gap;
const int iconY = (height - iconH) / 2;
painter.drawPixmap(QRect(iconX, iconY, iconW, iconH), icon);
}
return pixmap;
}