소스 검색

Breadcrumb

isundil 9 달 전
부모
커밋
9200d932e7
3개의 변경된 파일76개의 추가작업 그리고 4개의 파일을 삭제
  1. 9 1
      includes/breadcrumb.h
  2. 66 2
      src/breadcrumb.cpp
  3. 1 1
      src/checkableComboBox.cpp

+ 9 - 1
includes/breadcrumb.h

@@ -5,12 +5,20 @@
 
 namespace craftlab::ui
 {
-	class QTWIDGETS_EXPORT Breadcrumb : public QListWidget
+	class QTWIDGETS_EXPORT Breadcrumb : virtual public QWidget
 	{
 	Q_OBJECT
 	public:
 		Breadcrumb(QWidget* parent = nullptr);
 
+		void clear();
+		void addItem(const QString& label);
+		void addItem(const QIcon& icon, const QString& label);
+
 	private:
+		void addItem(QListWidgetItem*);
+		QWidget* BuildItemWidget(const QListWidgetItem& item);
+
+		std::unique_ptr<QListWidget> inner;
 	};
 }

+ 66 - 2
src/breadcrumb.cpp

@@ -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();
+}

+ 1 - 1
src/checkableComboBox.cpp

@@ -31,8 +31,8 @@ void CheckableComboBox::paintEvent(QPaintEvent* e)
     if (checked)
     {
         QStyleOptionButton option;
-        QRectF downButtonRect = style()->proxy()->subControlRect(QStyle::CC_ComboBox, &opt, QStyle::SC_ComboBoxArrow, this);
         option.initFrom(this);
+        QRectF downButtonRect = style()->proxy()->subControlRect(QStyle::CC_ComboBox, &opt, QStyle::SC_ComboBoxArrow, this);
         option.features = QStyleOptionButton::HasMenu;
         option.state |= QStyle::State_On;
         option.text = currentText();