#include "ui/StatusStrip.h"
#include "ui/Palette.h"
#include <QFontMetrics>
#include <QHBoxLayout>
#include <QLabel>
#include <QLocale>
#include <QPalette>
#include <QProgressBar>
#include <QResizeEvent>
#include <QStyle>
#include <QVBoxLayout>
namespace whittle {
namespace {
// progress bar width
constexpr int kBarWidth = 600;
constexpr int kMinBarWidth = 400;
constexpr int kSpacing = 8;
// status padding
constexpr int kPadAbove = 0;
constexpr int kPadBelow = 9;
QString human(qint64 b) {
return QLocale().formattedDataSize(b, 1, QLocale::DataSizeTraditionalFormat);
}
}
StatusStrip::StatusStrip(QWidget* parent) : QWidget(parent) {
m_status = new QLabel;
m_detail = new QLabel;
m_size = new QLabel;
m_errors = new QLabel;
m_detail->setTextFormat(Qt::PlainText);
m_detail->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Preferred);
QPalette pal = m_errors->palette();
pal.setColor(QPalette::WindowText, Palette::Skipped);
m_errors->setPalette(pal);
m_bar = new QProgressBar;
m_bar->setTextVisible(false);
m_bar->setMinimumWidth(kMinBarWidth);
m_bar->setMaximumWidth(kBarWidth);
const int side = style()->pixelMetric(QStyle::PM_LayoutLeftMargin);
auto* h = new QHBoxLayout(this);
h->setContentsMargins(side, kPadAbove, side, kPadBelow);
h->setSpacing(kSpacing);
h->addWidget(m_bar);
h->addWidget(m_status);
h->addWidget(m_detail, 1);
h->addWidget(m_size);
h->addWidget(m_errors);
setDormant();
}
void StatusStrip::setStatus(const QString& text) {
m_status->setText(text);
m_status->setVisible(!text.isEmpty());
}
void StatusStrip::setDormant() {
m_detailText.clear();
m_detail->clear();
m_size->clear();
m_errors->clear();
setStatus(tr("Whittle Me This"));
m_bar->setRange(0, 1000);
m_bar->setValue(0);
}
void StatusStrip::setScanning() {
m_size->clear();
m_errors->clear();
setStatus(tr("Scanning..."));
m_bar->setRange(0, 0);
}
void StatusStrip::setScanned() {
m_size->clear();
m_errors->clear();
setStatus(QString());
m_bar->setRange(0, 1000);
m_bar->setValue(0);
}
void StatusStrip::setCounts(int folders, int files, qint64 bytes,
int newFiles, qint64 newBytes,
int diffFiles, qint64 diffBytes) {
m_elide = Qt::ElideRight;
m_detailText =
tr("Folders: %1 Files: %2 (%3) New: %4 (%5) Different: %6 (%7)")
.arg(folders)
.arg(files).arg(human(bytes))
.arg(newFiles).arg(human(newBytes))
.arg(diffFiles).arg(human(diffBytes));
updateDetail();
}
void StatusStrip::setMerging(const QString& relPath, qint64 fileBytes,
qint64 bytesDone, qint64 bytesTotal) {
setStatus(tr("Merging:"));
m_errors->clear();
m_size->setText(relPath.isEmpty() ? QString() : human(fileBytes));
m_elide = Qt::ElideMiddle;
m_detailText = relPath;
updateDetail();
m_bar->setRange(0, 1000);
m_bar->setValue(bytesTotal > 0 ? int((bytesDone * 1000) / bytesTotal) : 1000);
}
void StatusStrip::setWhittled(int files, qint64 bytes, int errors) {
m_detailText.clear();
m_detail->clear();
m_size->clear();
setStatus(tr("Whittled: %1 (%2)").arg(files).arg(human(bytes)));
m_errors->setText(errors > 0 ? tr("Errors: %1").arg(errors) : QString());
m_bar->setRange(0, 1000);
m_bar->setValue(1000);
}
void StatusStrip::updateDetail() {
if (m_detailText.isEmpty()) { m_detail->clear(); return; }
m_detail->setText(m_detail->fontMetrics().elidedText(
m_detailText, m_elide, m_detail->width()));
}
void StatusStrip::resizeEvent(QResizeEvent* e) {
QWidget::resizeEvent(e);
updateDetail();
}
}