| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- #include <QLayout>
- #include <QLabel>
- #include "breadcrumb.h"
- using namespace craftlab::ui;
- Breadcrumb::Breadcrumb(QWidget* parent): QWidget(parent), inner(std::make_unique<QListWidget>(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<QListWidgetItem*> 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();
- }
|