import QtQuick import Weave.Templates as T import Weave.Controls T.BreadcrumbBar { id: root implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset, implicitContentWidth + leftPadding + rightPadding) implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset, implicitContentHeight + topPadding + bottomPadding) hoverEnabled: root.enabled model: T.BreadcrumbModel {} contentItem: Item { id: content implicitWidth: row.implicitWidth implicitHeight: row.implicitHeight property var overflowItem: Breadcrumb { visible: parent != content onBreadcrumbSelected: { // reparent to avoid destruction if the current parent is destroyed. content.overflowItem.parent = content content.overflowItem.multilevelEntities = [] root.breadcrumbSelected((root.overflowLocation === T.BreadcrumbBar.Start ? 0 : 1) + selectedMultilevelEntity, -1) Qt.callLater(content.recalculateOverflow) // regenerate the overflow item if the client does not prune entries. } } Row { id: row Repeater { id: repeater model: root.model delegate: Breadcrumb { anchors.verticalCenter: parent.verticalCenter _repeaterIndex: index _repeaterCount: repeater.count icon.name: model.iconName != null ? model.iconName : "" icon.source: ((model.iconName != null && model.iconName.length) || !model.iconSource) ? "" : model.iconSource text: model.text != null ? model.text : "" multilevelEntities: model.multilevelEntities != null ? model.multilevelEntities : [] onBreadcrumbSelected: root.breadcrumbSelected(model.index, selectedMultilevelEntity) } onCountChanged: Qt.callLater(content.recalculateOverflow) Component.onCompleted: Qt.callLater(content.recalculateOverflow) } } function recalculateOverflow() { var repeaterCount = repeater.count var totalImplicitWidth = 0 var currBreadcrumb = null var i = 0 // decompress everything. content.overflowItem.parent = content content.overflowItem.multilevelEntities = [] for (i = 0; i < repeaterCount; ++i) { currBreadcrumb = repeater.itemAt(i) currBreadcrumb.compressed = false currBreadcrumb.overflowItem = null totalImplicitWidth += currBreadcrumb.implicitWidth } // if they all fit (or if there aren't enough breadcrumbs to compress), we're done. if (totalImplicitWidth <= content.width || repeaterCount <= (root.overflowLocation === T.BreadcrumbBar.Start ? 2 : 3)) { return } // if they don't all fit, attempt to compress breadcrumbs at the overflow location. // first, reparent the overflowItem to the appropriate breadcrumb. var compressed = [] totalImplicitWidth += content.overflowItem.implicitWidth i = root.overflowLocation === T.BreadcrumbBar.Start ? 0 : 1 currBreadcrumb = repeater.itemAt(i) currBreadcrumb.overflowItem = content.overflowItem content.overflowItem.parent = currBreadcrumb // then, compress breadcrumbs until they fit. for ( ; i < (repeaterCount-1) && totalImplicitWidth > content.width; ++i) { currBreadcrumb = repeater.itemAt(i) currBreadcrumb.compressed = true compressed.push(currBreadcrumb.text) totalImplicitWidth -= currBreadcrumb.implicitWidth } content.overflowItem.multilevelEntities = compressed } } background: Item {} }