diff --git a/src/utils/scrollarea.cpp b/src/utils/scrollarea.cpp index cf672d823..83ae05426 100644 --- a/src/utils/scrollarea.cpp +++ b/src/utils/scrollarea.cpp @@ -1,56 +1,59 @@ /* -*- mode: c++; c-basic-offset:4 -*- utils/scrollarea.cpp This file is part of Kleopatra, the KDE keymanager SPDX-FileCopyrightText: 2007 Klarälvdalens Datakonsult AB SPDX-License-Identifier: GPL-2.0-or-later */ #include #include "scrollarea.h" #include #include using namespace Kleo; -namespace +ScrollArea::ScrollArea(QWidget *parent) + : QScrollArea{parent} { - -static QSize getMinimumSizeHint(const QWidget *w) -{ - return w ? w->minimumSizeHint() : QSize(0, 0); -} - -static QSize getSizeHint(const QWidget *w) -{ - return w ? w->sizeHint() : QSize(0, 0); -} -} - -ScrollArea::ScrollArea(QWidget *parent) : QScrollArea(parent) -{ - setWidget(new QWidget); - new QVBoxLayout(widget()); + auto w = new QWidget; + w->setObjectName(QLatin1String("scrollarea_widget")); + new QVBoxLayout{w}; + setWidget(w); setWidgetResizable(true); } -ScrollArea::~ScrollArea() -{ -} +ScrollArea::~ScrollArea() = default; QSize ScrollArea::minimumSizeHint() const { - return QSize(getMinimumSizeHint(widget()).width() + getSizeHint(verticalScrollBar()).width() + 2 * frameWidth(), 0) - .expandedTo(QScrollArea::minimumSizeHint()); + const int fw = frameWidth(); + QSize sz{2 * fw, 2 * fw}; + sz += widget()->minimumSizeHint(); + if (verticalScrollBarPolicy() != Qt::ScrollBarAlwaysOff) { + sz.setWidth(sz.width() + verticalScrollBar()->sizeHint().width()); + } + if (horizontalScrollBarPolicy() != Qt::ScrollBarAlwaysOff) { + sz.setHeight(sz.height() + horizontalScrollBar()->sizeHint().height()); + } + return QScrollArea::minimumSizeHint().expandedTo(sz); } QSize ScrollArea::sizeHint() const { - const QSize widgetSizeHint = getSizeHint(widget()); const int fw = frameWidth(); - return QScrollArea::sizeHint().expandedTo(widgetSizeHint + QSize(2 * fw, 2 * fw) + QSize(getSizeHint(verticalScrollBar()).width(), 0)); + QSize sz{2 * fw, 2 * fw}; + sz += viewportSizeHint(); + if (verticalScrollBarPolicy() != Qt::ScrollBarAlwaysOff) { + sz.setWidth(sz.width() + verticalScrollBar()->sizeHint().width()); + } + if (horizontalScrollBarPolicy() != Qt::ScrollBarAlwaysOff) { + sz.setHeight(sz.height() + horizontalScrollBar()->sizeHint().height()); + } + sz = QScrollArea::sizeHint().expandedTo(sz); + return sz; } diff --git a/src/utils/scrollarea.h b/src/utils/scrollarea.h index 032cb4609..f4ef29fe2 100644 --- a/src/utils/scrollarea.h +++ b/src/utils/scrollarea.h @@ -1,31 +1,48 @@ /* -*- mode: c++; c-basic-offset:4 -*- utils/scrollarea.h This file is part of Kleopatra, the KDE keymanager SPDX-FileCopyrightText: 2007 Klarälvdalens Datakonsult AB SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include namespace Kleo { +/** + * This class improves a few aspects of QScrollArea for usage by us, in + * particular, for vertically scrollable widgets. + */ class ScrollArea : public QScrollArea { Q_OBJECT public: - explicit ScrollArea(QWidget *widget = nullptr); + /** + * Creates a scroll area with a QWidget with QVBoxLayout that is flagged + * as resizable. + */ + explicit ScrollArea(QWidget *parent = nullptr); ~ScrollArea() override; + /** + * Reimplemented to add the minimum size hint of the widget. + */ QSize minimumSizeHint() const override; + + /** + * Reimplemented to remove the caching of the size/size hint of the + * widget and to add the horizontal size hint of the vertical scroll bar + * unless it is explicitly turned off. + */ QSize sizeHint() const override; }; }