breadcrumb.cpp 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #include <QLayout>
  2. #include <QLabel>
  3. #include "breadcrumb.h"
  4. using namespace craftlab::ui;
  5. Breadcrumb::Breadcrumb(QWidget* parent): QWidget(parent), inner(std::make_unique<QListWidget>(this))
  6. {
  7. new QVBoxLayout(this);
  8. layout()->setContentsMargins(0, 0, 0, 0);
  9. layout()->addWidget(inner.get());
  10. inner->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
  11. inner->setEditTriggers(QAbstractItemView::NoEditTriggers);
  12. inner->setSelectionMode(QAbstractItemView::SingleSelection);
  13. inner->setFlow(QListView::Flow::LeftToRight);
  14. inner->setSizePolicy(QSizePolicy(QSizePolicy::Policy::Expanding, QSizePolicy::Policy::Fixed));
  15. inner->setSizeAdjustPolicy(QAbstractScrollArea::SizeAdjustPolicy::AdjustToContentsOnFirstShow);
  16. inner->setUniformItemSizes(false);
  17. connect(inner.get(), &QListWidget::itemSelectionChanged, this, [this]()
  18. {
  19. QList<QListWidgetItem*> selection = inner->selectedItems();
  20. if (!selection.isEmpty())
  21. {
  22. QModelIndex index = inner->indexFromItem(selection.first());
  23. if (index.isValid())
  24. emit SelectionChanged(index.row());
  25. }
  26. });
  27. }
  28. void Breadcrumb::addItem(const QString& label)
  29. {
  30. addItem(new QListWidgetItem(label, inner.get()));
  31. }
  32. void Breadcrumb::addItem(const QIcon& icon, const QString& label)
  33. {
  34. addItem(new QListWidgetItem(icon, label, inner.get()));
  35. }
  36. QWidget* Breadcrumb::BuildItemWidget(const QListWidgetItem& item)
  37. {
  38. QSizePolicy sizePolicy(QSizePolicy::Policy::Ignored, QSizePolicy::Policy::Minimum);
  39. QWidget* result = new QWidget(this);
  40. result->setSizePolicy(QSizePolicy(QSizePolicy::Policy::Ignored, QSizePolicy::Policy::Minimum));
  41. new QHBoxLayout(result);
  42. QLabel* label = new QLabel(this);
  43. label->setText(item.text());
  44. label->setSizePolicy(QSizePolicy(QSizePolicy::Policy::MinimumExpanding, QSizePolicy::Policy::Minimum));
  45. result->layout()->addWidget(label);
  46. label = new QLabel(this);
  47. label->setText("\uE017");
  48. label->setSizePolicy(QSizePolicy(QSizePolicy::Policy::Minimum, QSizePolicy::Policy::Minimum));
  49. result->layout()->addWidget(label);
  50. return result;
  51. }
  52. void Breadcrumb::addItem(QListWidgetItem* item)
  53. {
  54. QWidget* child = BuildItemWidget(*item);
  55. QSize childSize = child->layout()->totalMinimumSize();
  56. if (!item->data(Qt::DecorationRole).isNull())
  57. {
  58. QStyleOption opt;
  59. opt.initFrom(this);
  60. childSize.setWidth(childSize.width() + style()->pixelMetric(QStyle::PM_LineEditIconSize, &opt) + 2*(style()->pixelMetric(QStyle::PM_LineEditIconMargin)));
  61. }
  62. item->setSizeHint(childSize);
  63. inner->addItem(item);
  64. inner->setItemWidget(item, child);
  65. }
  66. void Breadcrumb::clear()
  67. {
  68. inner->clear();
  69. }