rkflx added a comment.
Sorry for the back and forth, it seems this is all a bit tricky to get right… Now I get a horizontal scrollbar for small window sizes and big icons (independent from the widget style in use) :( The `5 * devicePixelRatioF` sounds odd, and adding an additional `scrollBarWidth` to `width` looks a bit fishy, too, because this is not only an issue for 1 column of items, but happens with every width upon resize. No hacks, please (at least no ugly ones ;) Let's go with the version we had before. IMO it's better to be a bit off-center for Oxygen after resizing, than to get a scrollbar everywhere and have this ugly code. I guess this has to be fixed in Oxygen eventually, and not worked around in `KDirOperator`. For the `+ 1` in `const in scrollBarWidth`, please move it to `const int viewPortWidth` (i.e. it becomes `-1` there), and as a comment add `Subtract 1 px to prevent flickering when resizing the window`. This way future readers of the code will know what this is about. (The scrollbar width is reported correctly, so it should be left alone.) --- There is one more issue: For Oxygen, re-showing the dialog results in one column missing from displaying, it only shows up after the window has been resized. We are in a dilemma here: - We cannot ship the file dialog without it working on Oxygen. This is no cosmetic issue, but a serious bug. - We should not add a hack (i.e. `5 * itemView->devicePixelRatioF()`) for every style, to work around a bug which only happens with Oxygen. For now we have no choice but to add this hack (for me, 4 instead of 5 was enough). Nevertheless, please document it properly (see my suggestion below). Also, please open a bug (and add a link here) or get otherwise in contact with Hugo (maintainer of Oxygen), so he can share his wisdom and give some tips. --- Patch: diff --git a/src/filewidgets/kdiroperator.cpp b/src/filewidgets/kdiroperator.cpp index db07a311..ea6373dc 100644 --- a/src/filewidgets/kdiroperator.cpp +++ b/src/filewidgets/kdiroperator.cpp @@ -2589,13 +2589,16 @@ void KDirOperator::Private::updateListViewGrid() const int height = itemView->iconSize().height() + metrics.height() * 2.5; const int minWidth = qMax(height, metrics.height() * 5); - // this is needed for a workaround to an issue where the scrollbar area seems to be reserved at all times - const int scrollBarWidth = itemView->verticalScrollBar()->sizeHint().width() + (5 * itemView->devicePixelRatioF()); + const int scrollBarWidth = itemView->verticalScrollBar()->sizeHint().width(); - const int viewPortWidth = itemView->contentsRect().width() - scrollBarWidth; + // Subtract 1 px to prevent flickering when resizing the window + // For Oxygen a column is missing after showing the dialog without resizing it, + // therefore subtract 3 more (scaled) pixels + const int viewPortWidth = itemView->contentsRect().width() - scrollBarWidth + - 1 - 3 * itemView->devicePixelRatioF() ; const int itemsInRow = qMax(1, viewPortWidth / minWidth); const int remainingWidth = viewPortWidth - (minWidth * itemsInRow); - const int width = minWidth + (remainingWidth / itemsInRow) + ( itemsInRow == 1 ? scrollBarWidth : 0); + const int width = minWidth + (remainingWidth / itemsInRow); const QSize itemSize(width, height); REPOSITORY R241 KIO BRANCH master REVISION DETAIL https://phabricator.kde.org/D12306 To: anemeth, #frameworks, #vdg, ngraham Cc: abetts, rkflx, ngraham, #frameworks, michaelh, bruns