Index: src/filewidgets/kdiroperatordetailview.cpp =================================================================== --- src/filewidgets/kdiroperatordetailview.cpp +++ src/filewidgets/kdiroperatordetailview.cpp @@ -19,7 +19,6 @@ #include "kdiroperatordetailview_p.h" #include -#include #include #include @@ -85,25 +84,68 @@ bool KDirOperatorDetailView::event(QEvent *event) { - if (event->type() == QEvent::Polish) { - QHeaderView *headerView = header(); - headerView->setSectionResizeMode(0, QHeaderView::Stretch); - headerView->setSectionResizeMode(1, QHeaderView::ResizeToContents); - headerView->setSectionResizeMode(2, QHeaderView::ResizeToContents); - headerView->setStretchLastSection(false); - headerView->setSectionsMovable(false); - - setColumnHidden(KDirModel::Size, m_hideDetailColumns); - setColumnHidden(KDirModel::ModifiedTime, m_hideDetailColumns); - hideColumn(KDirModel::Type); - hideColumn(KDirModel::Permissions); - hideColumn(KDirModel::Owner); - hideColumn(KDirModel::Group); - } else if (event->type() == QEvent::UpdateRequest) { - // A wheel movement will scroll 4 items - if (model()->rowCount()) { - verticalScrollBar()->setSingleStep((sizeHintForRow(0) / 3) * 4); + switch (event->type()) { + case QEvent::Polish: { + QHeaderView *headerView = header(); + headerView->setSectionResizeMode(0, QHeaderView::Stretch); + headerView->setSectionResizeMode(1, QHeaderView::ResizeToContents); + headerView->setSectionResizeMode(2, QHeaderView::ResizeToContents); + headerView->setStretchLastSection(false); + headerView->setSectionsMovable(false); + + setColumnHidden(KDirModel::Size, m_hideDetailColumns); + setColumnHidden(KDirModel::ModifiedTime, m_hideDetailColumns); + hideColumn(KDirModel::Type); + hideColumn(KDirModel::Permissions); + hideColumn(KDirModel::Owner); + hideColumn(KDirModel::Group); + m_setInteractiveResizeMode = false; + for (int i = 0 ; i < KDirModel::ColumnCount ; ++i) { + m_currentColumnWidth[i] = -1; + } + connect(header(), &QHeaderView::sectionResized, + [=](int column, int, int newSize) { + if (newSize > 0 && model()->rowCount() > 0) { + // store the new width; note that we may be called multiple times + // for columns in Stretch mode, with increasingly accurate sizes. + m_currentColumnWidth[column] = newSize; + // for some reason making a selective ResizeMode setting here + // has no effect; we need to set interactive mode on all sections + // at a later stage. Queue that now, and don't touch any + // section settings directly. + m_setInteractiveResizeMode = true; + } + }); + break; } + case QEvent::UpdateRequest: + // A wheel movement will scroll 4 items + if (model()->rowCount()) { + verticalScrollBar()->setSingleStep((sizeHintForRow(0) / 3) * 4); + } + break; + case QEvent::Paint: + // event analysis confirms that the 1st paint event arrives after all headers have + // had a size set, so we can now set the definitive section size explicitly and + // activate interactive mode. The results is that section size is set once according + // to the principles defined above (Polish case) but can then be adapted by the user, + // for instance when navigating to a different directory. + if (m_setInteractiveResizeMode) { + for (int i = 0 ; i < KDirModel::ColumnCount ; ++i) { + if (m_currentColumnWidth[i] > 0) { + // set the obtained width explicitly + header()->resizeSection(i, m_currentColumnWidth[i]); + } + } + header()->setSectionResizeMode(QHeaderView::Interactive); + // we only do this once after each Polish event which reset the column size mode. + // (In practice this events seems to arrive only once.) + m_setInteractiveResizeMode = false; + } + break; + default: + // noop + break; } return QTreeView::event(event); Index: src/filewidgets/kdiroperatordetailview_p.h =================================================================== --- src/filewidgets/kdiroperatordetailview_p.h +++ src/filewidgets/kdiroperatordetailview_p.h @@ -22,6 +22,7 @@ #include #include +#include class QAbstractItemModel; @@ -50,6 +51,8 @@ private: bool m_hideDetailColumns; + bool m_setInteractiveResizeMode; + int m_currentColumnWidth[KDirModel::ColumnCount]; }; #endif