Settings be smart about scrollbars

Task-number: QTCREATORBUG-12745
Change-Id: I88a586143fc7c982df00db4aabf43e50487c2671
Reviewed-by: Eike Ziller <eike.ziller@theqtcompany.com>
Reviewed-by: Tim Jenssen <tim.jenssen@theqtcompany.com>
This commit is contained in:
Daniel Teske
2014-07-29 18:31:09 +02:00
committed by Daniel Teske
parent a577600d12
commit 63be3a4024

View File

@@ -46,6 +46,8 @@
#include <QListView> #include <QListView>
#include <QPointer> #include <QPointer>
#include <QPushButton> #include <QPushButton>
#include <QResizeEvent>
#include <QScrollArea>
#include <QScrollBar> #include <QScrollBar>
#include <QSettings> #include <QSettings>
#include <QSortFilterProxyModel> #include <QSortFilterProxyModel>
@@ -278,8 +280,7 @@ public:
virtual QSize sizeHint() const virtual QSize sizeHint() const
{ {
int width = sizeHintForColumn(0) + frameWidth() * 2 + 5; int width = sizeHintForColumn(0) + frameWidth() * 2 + 5;
if (verticalScrollBar()->isVisible()) width += verticalScrollBar()->width();
width += verticalScrollBar()->width();
return QSize(width, 100); return QSize(width, 100);
} }
@@ -294,6 +295,68 @@ public:
} }
}; };
// ----------- SmartScrollArea
class SmartScrollArea : public QScrollArea
{
public:
SmartScrollArea(QWidget *parent = 0)
: QScrollArea(parent)
{
setFrameStyle(QFrame::NoFrame | QFrame::Plain);
viewport()->setAutoFillBackground(false);
}
private:
void resizeEvent(QResizeEvent *event) override
{
QWidget *inner = widget();
if (inner) {
int fw = frameWidth() * 2;
QSize innerSize = event->size() - QSize(fw, fw);
QSize innerSizeHint = inner->minimumSizeHint();
if (innerSizeHint.height() > innerSize.height()) { // Widget wants to be bigger than available space
innerSize.setWidth(innerSize.width() - scrollBarWidth());
innerSize.setHeight(innerSizeHint.height());
}
inner->resize(innerSize);
}
QScrollArea::resizeEvent(event);
}
QSize minimumSizeHint() const override {
QWidget *inner = widget();
if (inner) {
int fw = frameWidth() * 2;
QSize minSize = inner->minimumSizeHint();
minSize += QSize(fw, fw);
minSize += QSize(scrollBarWidth(), 0);
minSize.setHeight(qMin(minSize.height(), 450));
minSize.setWidth(qMin(minSize.width(), 810));
return minSize;
}
return QSize(0, 0);
}
bool event(QEvent *event) override {
if (event->type() == QEvent::LayoutRequest)
updateGeometry();
return QScrollArea::event(event);
}
int scrollBarWidth() const
{
auto that = const_cast<SmartScrollArea *>(this);
QWidgetList list = that->scrollBarWidgets(Qt::AlignRight);
if (list.isEmpty())
return 0;
return list.first()->sizeHint().width();
}
};
// ----------- SettingsDialog // ----------- SettingsDialog
// Helpers to sort by category. id // Helpers to sort by category. id
@@ -447,9 +510,7 @@ void SettingsDialog::createGui()
buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true);
setMinimumSize(1000, 550); mainGridLayout->setSizeConstraint(QLayout::SetMinimumSize);
if (Utils::HostOsInfo::isMacHost())
setMinimumHeight(minimumHeight() * 1.1);
} }
SettingsDialog::~SettingsDialog() SettingsDialog::~SettingsDialog()
@@ -491,7 +552,10 @@ void SettingsDialog::ensureCategoryWidget(Category *category)
for (int j = 0; j < category->pages.size(); ++j) { for (int j = 0; j < category->pages.size(); ++j) {
IOptionsPage *page = category->pages.at(j); IOptionsPage *page = category->pages.at(j);
QWidget *widget = page->widget(); QWidget *widget = page->widget();
tabWidget->addTab(widget, page->displayName()); SmartScrollArea *ssa = new SmartScrollArea(this);
ssa->setWidget(widget);
widget->setAutoFillBackground(false);
tabWidget->addTab(ssa, page->displayName());
} }
connect(tabWidget, &QTabWidget::currentChanged, connect(tabWidget, &QTabWidget::currentChanged,