#include #include #include "breadcrumb.h" using namespace craftlab::ui; Breadcrumb::Breadcrumb(QWidget* parent): QWidget(parent), inner(std::make_unique(this)) { new QVBoxLayout(this); layout()->setContentsMargins(0, 0, 0, 0); layout()->addWidget(inner.get()); inner->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); inner->setEditTriggers(QAbstractItemView::NoEditTriggers); inner->setSelectionMode(QAbstractItemView::SingleSelection); inner->setFlow(QListView::Flow::LeftToRight); inner->setSizePolicy(QSizePolicy(QSizePolicy::Policy::Expanding, QSizePolicy::Policy::Fixed)); inner->setSizeAdjustPolicy(QAbstractScrollArea::SizeAdjustPolicy::AdjustToContentsOnFirstShow); inner->setUniformItemSizes(false); connect(inner.get(), &QListWidget::itemSelectionChanged, this, [this]() { QList selection = inner->selectedItems(); if (!selection.isEmpty()) { QModelIndex index = inner->indexFromItem(selection.first()); if (index.isValid()) emit SelectionChanged(index.row()); } }); } void Breadcrumb::addItem(const QString& label) { addItem(new QListWidgetItem(label, inner.get())); } void Breadcrumb::addItem(const QIcon& icon, const QString& label) { addItem(new QListWidgetItem(icon, label, inner.get())); } QWidget* Breadcrumb::BuildItemWidget(const QListWidgetItem& item) { QSizePolicy sizePolicy(QSizePolicy::Policy::Ignored, QSizePolicy::Policy::Minimum); QWidget* result = new QWidget(this); result->setSizePolicy(QSizePolicy(QSizePolicy::Policy::Ignored, QSizePolicy::Policy::Minimum)); new QHBoxLayout(result); QLabel* label = new QLabel(this); label->setText(item.text()); label->setSizePolicy(QSizePolicy(QSizePolicy::Policy::MinimumExpanding, QSizePolicy::Policy::Minimum)); result->layout()->addWidget(label); label = new QLabel(this); label->setText("\uE017"); label->setSizePolicy(QSizePolicy(QSizePolicy::Policy::Minimum, QSizePolicy::Policy::Minimum)); result->layout()->addWidget(label); return result; } void Breadcrumb::addItem(QListWidgetItem* item) { QWidget* child = BuildItemWidget(*item); QSize childSize = child->layout()->totalMinimumSize(); if (!item->data(Qt::DecorationRole).isNull()) { QStyleOption opt; opt.initFrom(this); childSize.setWidth(childSize.width() + style()->pixelMetric(QStyle::PM_LineEditIconSize, &opt) + 2*(style()->pixelMetric(QStyle::PM_LineEditIconMargin))); } item->setSizeHint(childSize); inner->addItem(item); inner->setItemWidget(item, child); } void Breadcrumb::clear() { inner->clear(); }