Hi,
>Assistance would be appreciated. :-)
I've whipped up something, a bit sneaky but it does more or less what I had in
mind.
- the QEvent::Polish handler connects to the sectionResized signal
- this sectionResized slot will check if the QTreeView contains a positive
number of elements, if the new size is positive and if the current resize mode
is not already "Interactive". If so, it sets the current section to interactive
resize and sets the new size explictly.
- somehow this per-column change does not have the intended effect (when done
here, with Qt 5.9 and FW 5.52.0), so a class state variable is toggled too
- at an appropriate moment the entire QHeaderView is set to interactive mode if
that state variable is true. The first QPaintEvent should come after the
section widths have been determined and turns out to be just in time to get
actually resizable sections.
I haven't checked in depth if there are side-effects but this works good enough
for me (as a first draft). The only thing I'd like to see added is the
persistence of the column widths I mentioned earlier: save the widths of any
columns the user resized manually, and use those values when the dialog is
reopened.
Let me know what you think; should I put this on phab?
R.
diff --git src/filewidgets/kdiroperatordetailview.cpp src/filewidgets/kdiroperatordetailview.cpp
index fa8094f8..f3116e21 100644
--- src/filewidgets/kdiroperatordetailview.cpp
+++ src/filewidgets/kdiroperatordetailview.cpp
@@ -85,25 +85,55 @@ bool KDirOperatorDetailView::setViewMode(KFile::FileView viewMode)
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;
+ connect(header(), &QHeaderView::sectionResized,
+ [=](int column, int, int newSize) {
+ if (newSize > 0 && model()->rowCount() > 0
+ && header()->sectionResizeMode(column) != QHeaderView::Interactive) {
+ qWarning() << "Section" << column << "resized to" << newSize
+ << "count=" << model()->rowCount()
+ << "changing resizeMode to interactive from" << header()->sectionResizeMode(column);
+ header()->setSectionResizeMode(column, QHeaderView::Interactive);
+ header()->resizeSection(column, newSize);
+ // for some reason the selective ResizeMode setting has no effect,
+ // we need to set interactive mode on all sections, queue that now.
+ 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 activate interactive mode.
+ if (m_setInteractiveResizeMode) {
+ header()->setSectionResizeMode(QHeaderView::Interactive);
+ m_setInteractiveResizeMode = false;
+ }
+ break;
+ default:
+ // noop
+ break;
}
return QTreeView::event(event);
diff --git src/filewidgets/kdiroperatordetailview_p.h src/filewidgets/kdiroperatordetailview_p.h
index 2f177cd5..b27d75b2 100644
--- src/filewidgets/kdiroperatordetailview_p.h
+++ src/filewidgets/kdiroperatordetailview_p.h
@@ -50,6 +50,7 @@ protected:
private:
bool m_hideDetailColumns;
+ bool m_setInteractiveResizeMode;
};
#endif