diff --git a/src/plugins/filemanager/core/dfmplugin-workspace/utils/fileviewhelper.cpp b/src/plugins/filemanager/core/dfmplugin-workspace/utils/fileviewhelper.cpp index dd9e9e3acb..48831b99eb 100644 --- a/src/plugins/filemanager/core/dfmplugin-workspace/utils/fileviewhelper.cpp +++ b/src/plugins/filemanager/core/dfmplugin-workspace/utils/fileviewhelper.cpp @@ -260,6 +260,12 @@ int FileViewHelper::verticalOffset() const return parent()->verticalOffset(); } +bool FileViewHelper::isLastIndex(const QModelIndex &index) +{ + int rowCount = parent()->model()->rowCount(parent()->rootIndex()); + return index.row() + 1 == rowCount; +} + int FileViewHelper::caculateListItemIndex(const QSize &itemSize, const QPoint &pos) { if (pos.y() % (itemSize.height() + kListViewSpacing * 2) < kListViewSpacing) diff --git a/src/plugins/filemanager/core/dfmplugin-workspace/utils/fileviewhelper.h b/src/plugins/filemanager/core/dfmplugin-workspace/utils/fileviewhelper.h index 889381cb75..3ba19ca87d 100644 --- a/src/plugins/filemanager/core/dfmplugin-workspace/utils/fileviewhelper.h +++ b/src/plugins/filemanager/core/dfmplugin-workspace/utils/fileviewhelper.h @@ -41,6 +41,7 @@ class FileViewHelper : public QObject bool isEmptyArea(const QPoint &pos); QSize viewContentSize() const; int verticalOffset() const; + bool isLastIndex(const QModelIndex &index); static int caculateListItemIndex(const QSize &itemSize, const QPoint &pos); static int caculateIconItemIndex(const FileView *view, const QSize &itemSize, const QPoint &pos); diff --git a/src/plugins/filemanager/core/dfmplugin-workspace/views/expandedItem.cpp b/src/plugins/filemanager/core/dfmplugin-workspace/views/expandedItem.cpp index e163b22806..1ac7eb8e22 100644 --- a/src/plugins/filemanager/core/dfmplugin-workspace/views/expandedItem.cpp +++ b/src/plugins/filemanager/core/dfmplugin-workspace/views/expandedItem.cpp @@ -204,3 +204,13 @@ QRectF ExpandedItem::iconGeometry() const return iconRect; } + +void ExpandedItem::setDifferenceOfLastRow(const int diff) +{ + this->diff = diff < 0 ? 0 : diff; +} + +int ExpandedItem::getDifferenceOfLastRow() const +{ + return diff; +} diff --git a/src/plugins/filemanager/core/dfmplugin-workspace/views/expandedItem.h b/src/plugins/filemanager/core/dfmplugin-workspace/views/expandedItem.h index 23c72431c8..e44d565cdd 100644 --- a/src/plugins/filemanager/core/dfmplugin-workspace/views/expandedItem.h +++ b/src/plugins/filemanager/core/dfmplugin-workspace/views/expandedItem.h @@ -42,6 +42,8 @@ class ExpandedItem : public QWidget void setOption(QStyleOptionViewItem opt); QRectF textGeometry(int width = -1) const; QRectF iconGeometry() const; + void setDifferenceOfLastRow(const int diff); + int getDifferenceOfLastRow() const; private: QPixmap iconPixmap; @@ -52,6 +54,7 @@ class ExpandedItem : public QWidget qreal opacity { 1 }; bool canDeferredDelete { true }; IconItemDelegate *delegate { nullptr }; + int diff { 0 }; }; } diff --git a/src/plugins/filemanager/core/dfmplugin-workspace/views/iconitemdelegate.cpp b/src/plugins/filemanager/core/dfmplugin-workspace/views/iconitemdelegate.cpp index 971eefb22c..751b12a1d2 100644 --- a/src/plugins/filemanager/core/dfmplugin-workspace/views/iconitemdelegate.cpp +++ b/src/plugins/filemanager/core/dfmplugin-workspace/views/iconitemdelegate.cpp @@ -568,6 +568,8 @@ void IconItemDelegate::paintItemFileName(QPainter *painter, QRectF iconRect, QPa // if has selected show all file name else show elide file name. bool isSelected = !isDragMode && isSelectedOpt && opt.showDecorationSelected; + if (!singleSelected) + d->expandedItem->setDifferenceOfLastRow(0); if (isSelected && singleSelected) { const_cast(this)->hideNotEditingIndexWidget(); @@ -582,10 +584,7 @@ void IconItemDelegate::paintItemFileName(QPainter *painter, QRectF iconRect, QPa d->expandedItem->setOption(opt); d->expandedItem->setTextBounding(QRectF()); d->expandedItem->setFixedWidth(0); - - if (parent()->parent()->indexOfRow(index) == parent()->parent()->rowCount() - 1) { - d->lastAndExpandedIndex = index; - } + d->expandedItem->setDifferenceOfLastRow(parent()->parent()->rowCount() - parent()->parent()->indexOfRow(index) - 1); updateEditorGeometry(d->expandedItem, opt, index); @@ -593,6 +592,7 @@ void IconItemDelegate::paintItemFileName(QPainter *painter, QRectF iconRect, QPa } else { if (!singleSelected) { const_cast(this)->hideNotEditingIndexWidget(); + d->lastAndExpandedIndex = QModelIndex(); } } @@ -630,9 +630,13 @@ QSize IconItemDelegate::sizeHint(const QStyleOptionViewItem &, const QModelIndex const QSize &size = d->itemSizeHint; - if (index.isValid() && index == d->lastAndExpandedIndex) { + // 如果有一个选中,名称显示很长时,最后一个index时设置item的高度为最多,右边才会出现滑动块 + if(index.isValid() && parent()->isLastIndex(index) && d->expandedItem + && d->expandedIndex.isValid() && d->expandedItem->isVisible()) { d->expandedItem->setIconHeight(parent()->parent()->iconSize().height()); - return QSize(size.width(), d->expandedItem->heightForWidth(size.width())); + auto hight = qMax(size.height(), d->expandedItem->heightForWidth(size.width()) - + d->expandedItem->getDifferenceOfLastRow() * size.height()); + return QSize(size.width(), hight); } return size; @@ -700,7 +704,6 @@ void IconItemDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionV editor->setFixedWidth(option.rect.width()); d->expandedItem->setIconHeight(iconSize.height()); editor->adjustSize(); - return; }