|
|
@@ -1,6 +1,70 @@
|
|
|
+#include <QLayout>
|
|
|
+#include <QLabel>
|
|
|
#include "breadcrumb.h"
|
|
|
|
|
|
using namespace craftlab::ui;
|
|
|
|
|
|
-Breadcrumb::Breadcrumb(QWidget* parent): QListWidget(parent)
|
|
|
-{}
|
|
|
+Breadcrumb::Breadcrumb(QWidget* parent): QWidget(parent), inner(std::make_unique<QListWidget>(this))
|
|
|
+{
|
|
|
+ new QVBoxLayout(this);
|
|
|
+ const auto _layout = layout();
|
|
|
+ inner->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
|
|
+ layout()->setContentsMargins(0, 0, 0, 0);
|
|
|
+ layout()->addWidget(inner.get());
|
|
|
+ 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);
|
|
|
+}
|
|
|
+
|
|
|
+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();
|
|
|
+}
|