#include "RecipeSummaryRow.h" #include #include #include #include #include "ItemIconCache.h" namespace { // Size the item icons are drawn at on the summary line, in device-independent pixels. const int kSummaryIconSizePx = 14; } // namespace RecipeSummaryRow::RecipeSummaryRow(ItemIconCache* itemIcons, QWidget* parent) : QWidget(parent) , m_itemIcons(itemIcons) { m_layout = new QHBoxLayout(this); m_layout->setContentsMargins(0, 0, 0, 0); m_layout->setSpacing(4); hide(); } void RecipeSummaryRow::setSummary(const std::vector& inputs, const std::vector& outputs, double durationSeconds) { if (outputs.empty() && inputs.empty()) { // Forgotten as well as hidden, so re-selecting the same recipe later is seen as // a change and shows the row again. m_inputs.clear(); m_outputs.clear(); m_durationSeconds = -1.0; hide(); return; } if (inputs == m_inputs && outputs == m_outputs && durationSeconds == m_durationSeconds) { return; } m_inputs = inputs; m_outputs = outputs; m_durationSeconds = durationSeconds; rebuild(inputs, outputs, durationSeconds); show(); } void RecipeSummaryRow::rebuild(const std::vector& inputs, const std::vector& outputs, double durationSeconds) { while (QLayoutItem* item = m_layout->takeAt(0)) { if (item->widget()) { item->widget()->deleteLater(); } delete item; } addAmounts(inputs); if (!inputs.empty()) { const QChar rightArrow(0x2192); // U+2192 RIGHTWARDS ARROW m_layout->addWidget(new QLabel(QString(rightArrow), this)); } addAmounts(outputs); if (durationSeconds > 0.0) { const QChar middleDot(0x00B7); // U+00B7 MIDDLE DOT m_layout->addWidget(new QLabel( QStringLiteral("%1 %2").arg(middleDot).arg( tr("%1 s").arg(durationSeconds, 0, 'f', 1)), this)); } m_layout->addStretch(1); } void RecipeSummaryRow::addAmounts(const std::vector& amounts) { for (const Amount& entry : amounts) { // A missing icon file is not an error (REQ-UI-ITEM-ICON): the item's id then // stands in for its icon. if (m_itemIcons->hasIcon(entry.itemId)) { QLabel* iconLabel = new QLabel(this); iconLabel->setPixmap( m_itemIcons->getPixmap(entry.itemId, kSummaryIconSizePx)); m_layout->addWidget(iconLabel); } else { m_layout->addWidget( new QLabel(QString::fromStdString(entry.itemId), this)); } m_layout->addWidget(new QLabel(QString::number(entry.amount), this)); } }