Show building_block icon in header stock, expand button and build costs
This commit is contained in:
@@ -3,34 +3,51 @@
|
||||
#include <cmath>
|
||||
#include <string>
|
||||
|
||||
#include <QFontMetrics>
|
||||
#include <QHBoxLayout>
|
||||
#include <QIcon>
|
||||
#include <QLabel>
|
||||
#include <QPalette>
|
||||
#include <QPushButton>
|
||||
#include <QSignalMapper>
|
||||
#include <QSize>
|
||||
|
||||
#include "Command.h"
|
||||
#include "CommandRequestedEvent.h"
|
||||
#include "EventManager.h"
|
||||
#include "IconCaption.h"
|
||||
#include "ItemIconCache.h"
|
||||
#include "SpeedChangeRequestedEvent.h"
|
||||
#include "Tick.h"
|
||||
|
||||
namespace
|
||||
{
|
||||
// Item id of the building blocks resource, whose icon stands in for the "Blocks"
|
||||
// word in the header stock and expand button (REQ-UI-BLOCKS-ICON).
|
||||
const char* const kBlockItemId = "building_block";
|
||||
}
|
||||
|
||||
const double HeaderBar::kSpeeds[] = { 0.0, 0.5, 1.0, 2.0, 10.0 };
|
||||
const int HeaderBar::kSpeedCount = 5;
|
||||
|
||||
HeaderBar::HeaderBar(const GameConfig* config, QWidget* parent)
|
||||
HeaderBar::HeaderBar(const GameConfig* config, const std::string& itemsIconDir,
|
||||
QWidget* parent)
|
||||
: QWidget(parent)
|
||||
, m_itemIcons(std::make_unique<ItemIconCache>(
|
||||
QString::fromStdString(itemsIconDir)))
|
||||
{
|
||||
QHBoxLayout* layout = new QHBoxLayout(this);
|
||||
layout->setContentsMargins(8, 4, 8, 4);
|
||||
layout->setSpacing(8);
|
||||
|
||||
m_timeLabel = new QLabel("00:00", this);
|
||||
m_blocksLabel = new QLabel(tr("Building Blocks: 0"), this);
|
||||
m_blocksLabel = new QLabel(this);
|
||||
if (config->world.buildingBlocksTooltip)
|
||||
{
|
||||
m_blocksLabel->setToolTip(
|
||||
QString::fromStdString(*config->world.buildingBlocksTooltip));
|
||||
}
|
||||
updateBlocksLabel();
|
||||
m_artifactsLabel = new QLabel(tr("Artifacts: 0/?"), this);
|
||||
if (config->world.artifactTooltip)
|
||||
{
|
||||
@@ -91,7 +108,7 @@ void HeaderBar::handleEvent(std::shared_ptr<const TickAdvancedEvent> event)
|
||||
void HeaderBar::handleEvent(std::shared_ptr<const BuildingBlocksChangedEvent> event)
|
||||
{
|
||||
m_blocks = event->blocks;
|
||||
m_blocksLabel->setText(tr("Building Blocks: %1").arg(event->blocks));
|
||||
updateBlocksLabel();
|
||||
updateExpandButton();
|
||||
}
|
||||
|
||||
@@ -101,10 +118,58 @@ void HeaderBar::handleEvent(std::shared_ptr<const ExpansionCostChangedEvent> eve
|
||||
updateExpandButton();
|
||||
}
|
||||
|
||||
QPixmap HeaderBar::blockIcon() const
|
||||
{
|
||||
if (!m_itemIcons->hasIcon(kBlockItemId)) { return QPixmap(); }
|
||||
// Sized to the header text height so it sits inline with the caption.
|
||||
const int sizePx = QFontMetrics(font()).height();
|
||||
return m_itemIcons->getPixmap(kBlockItemId, sizePx);
|
||||
}
|
||||
|
||||
void HeaderBar::updateBlocksLabel()
|
||||
{
|
||||
const QPixmap icon = blockIcon();
|
||||
if (icon.isNull())
|
||||
{
|
||||
// Fallback text form when no building_block icon exists (REQ-UI-BLOCKS-ICON).
|
||||
m_blocksLabel->setText(tr("Stock: %1 Blocks").arg(m_blocks));
|
||||
return;
|
||||
}
|
||||
m_blocksLabel->setPixmap(renderCaptionWithIcon(
|
||||
tr("Stock: %1").arg(m_blocks), icon, font(),
|
||||
m_blocksLabel->palette().color(QPalette::WindowText)));
|
||||
}
|
||||
|
||||
void HeaderBar::updateExpandButton()
|
||||
{
|
||||
m_expandButton->setText(tr("Expand: %1 Building Blocks").arg(m_expansionCost));
|
||||
m_expandButton->setEnabled(m_blocks >= m_expansionCost);
|
||||
|
||||
const QPixmap icon = blockIcon();
|
||||
if (icon.isNull())
|
||||
{
|
||||
// Fallback text form when no building_block icon exists (REQ-UI-EXPAND-BUTTON).
|
||||
m_expandButton->setIcon(QIcon());
|
||||
m_expandButton->setText(tr("Expand: %1 Blocks").arg(m_expansionCost));
|
||||
return;
|
||||
}
|
||||
|
||||
const QString text = tr("Expand: %1").arg(m_expansionCost);
|
||||
const QPalette& pal = m_expandButton->palette();
|
||||
const QPixmap normal = renderCaptionWithIcon(
|
||||
text, icon, m_expandButton->font(), pal.color(QPalette::ButtonText));
|
||||
const QPixmap greyed = renderCaptionWithIcon(
|
||||
text, icon, m_expandButton->font(),
|
||||
pal.color(QPalette::Disabled, QPalette::ButtonText));
|
||||
|
||||
QIcon buttonIcon;
|
||||
buttonIcon.addPixmap(normal, QIcon::Normal);
|
||||
buttonIcon.addPixmap(greyed, QIcon::Disabled);
|
||||
m_expandButton->setText(QString());
|
||||
m_expandButton->setIcon(buttonIcon);
|
||||
const qreal dpr = normal.devicePixelRatio();
|
||||
m_expandButton->setIconSize(QSize(
|
||||
static_cast<int>(normal.width() / dpr),
|
||||
static_cast<int>(normal.height() / dpr)));
|
||||
}
|
||||
|
||||
void HeaderBar::handleEvent(std::shared_ptr<const GameSpeedChangedEvent> event)
|
||||
|
||||
Reference in New Issue
Block a user