Skip to content

Commit db59e1b

Browse files
committed
automatically scroll parent QScrollArea when QgsCollapsibleGroupBox is expanded
1 parent f53aa30 commit db59e1b

4 files changed

Lines changed: 29 additions & 13 deletions

File tree

‎src/gui/qgscollapsiblegroupbox.cpp‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include <QMouseEvent>
2525
#include <QStyleOptionGroupBox>
2626
#include <QSettings>
27+
#include <QScrollArea>
2728

2829
QIcon QgsCollapsibleGroupBox::mCollapseIcon;
2930
QIcon QgsCollapsibleGroupBox::mExpandIcon;
@@ -52,7 +53,9 @@ void QgsCollapsibleGroupBox::init()
5253
mCollapsed = false;
5354
mSaveState = true;
5455
mInitFlat = false;
56+
mScrollOnExpand = true;
5557
mShown = false;
58+
mParentScrollArea = 0;
5659

5760
// init icons
5861
if ( mCollapseIcon.isNull() )
@@ -87,6 +90,16 @@ void QgsCollapsibleGroupBox::showEvent( QShowEvent * event )
8790
// check if groupbox was set to flat in Designer or in code
8891
mInitFlat = isFlat();
8992

93+
// find parent QScrollArea - this might not work in complex layouts - should we look deeper?
94+
if ( parent() && parent()->parent() )
95+
mParentScrollArea = dynamic_cast<QScrollArea*>( parent()->parent()->parent() );
96+
else
97+
mParentScrollArea = 0;
98+
if ( mParentScrollArea )
99+
QgsDebugMsg( "found a QScrollArea parent: " + mParentScrollArea->objectName() );
100+
else
101+
QgsDebugMsg( "did not find a QScrollArea parent" );
102+
90103
loadState();
91104

92105
updateStyle();
@@ -278,6 +291,13 @@ void QgsCollapsibleGroupBox::setCollapsed( bool collapse )
278291
setMaximumHeight( collapse ? titleRect().bottom() + 6 : 16777215 );
279292
mCollapseButton->setIcon( collapse ? mExpandIcon : mCollapseIcon );
280293

294+
// if expanding and is in a QScrollArea, scroll down to make entire widget visible
295+
if ( mScrollOnExpand && !collapse && mParentScrollArea )
296+
{
297+
// process events so entire widget is shown
298+
QApplication::processEvents();
299+
mParentScrollArea->ensureWidgetVisible( this );
300+
}
281301
emit collapsedStateChanged( this );
282302
}
283303

‎src/gui/qgscollapsiblegroupbox.h‎

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include <QGroupBox>
2929

3030
class QToolButton;
31+
class QScrollArea;
3132

3233
class GUI_EXPORT QgsCollapsibleGroupBox : public QGroupBox
3334
{
@@ -37,17 +38,21 @@ class GUI_EXPORT QgsCollapsibleGroupBox : public QGroupBox
3738
QgsCollapsibleGroupBox( QWidget *parent = 0 );
3839
QgsCollapsibleGroupBox( const QString &title, QWidget *parent = 0 );
3940
~QgsCollapsibleGroupBox();
41+
4042
bool isCollapsed() const { return mCollapsed; }
4143
void setCollapsed( bool collapse );
44+
45+
//! set this to false to not save/restore check and collapse state
4246
void setSaveState( bool save ) { mSaveState = save; }
47+
//! set this to false to not automatically scroll parent QScrollArea to this widget's contents when expanded
48+
void setScrollOnExpand( bool scroll ) { mScrollOnExpand = scroll; }
4349

4450
signals:
4551
void collapsedStateChanged( QWidget* );
4652

4753
public slots:
4854
void checkToggled( bool ckd );
4955
void toggleCollapsed();
50-
void updateStyle();
5156

5257
protected slots:
5358
void loadState();
@@ -57,13 +62,16 @@ class GUI_EXPORT QgsCollapsibleGroupBox : public QGroupBox
5762
void init();
5863
void showEvent( QShowEvent *event );
5964
void mouseReleaseEvent( QMouseEvent *event );
65+
void updateStyle();
6066
QRect titleRect() const;
6167
QString saveKey() const;
6268

6369
bool mCollapsed;
6470
bool mSaveState;
6571
bool mInitFlat;
72+
bool mScrollOnExpand;
6673
bool mShown;
74+
QScrollArea* mParentScrollArea;
6775
QToolButton* mCollapseButton;
6876

6977
static QIcon mCollapseIcon;

‎src/gui/qgsrasterlayersaveasdialog.cpp‎

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -106,11 +106,6 @@ QgsRasterLayerSaveAsDialog::QgsRasterLayerSaveAsDialog( QgsRasterLayer* rasterLa
106106
{
107107
okButton->setEnabled( false );
108108
}
109-
110-
// this should scroll down to make widget visible, but it's not happening
111-
// (at least part of it is visible)...
112-
connect( mCreateOptionsGroupBox, SIGNAL( collapsedStateChanged( QWidget* ) ),
113-
this, SLOT( groupBoxExpanded( QWidget* ) ) );
114109
}
115110

116111
void QgsRasterLayerSaveAsDialog::setValidators()
@@ -529,12 +524,6 @@ void QgsRasterLayerSaveAsDialog::on_mRawModeRadioButton_toggled( bool checked )
529524
mNoDataGroupBox->setEnabled( checked && mDataProvider->bandCount() == 1 );
530525
}
531526

532-
void QgsRasterLayerSaveAsDialog::groupBoxExpanded( QWidget * widget )
533-
{
534-
if ( !mCreateOptionsGroupBox->isCollapsed() )
535-
mScrollArea->ensureWidgetVisible( widget );
536-
}
537-
538527
void QgsRasterLayerSaveAsDialog::on_mAddNoDataManuallyToolButton_clicked()
539528
{
540529
addNoDataRow( std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN() );

‎src/gui/qgsrasterlayersaveasdialog.h‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,6 @@ class GUI_EXPORT QgsRasterLayerSaveAsDialog: public QDialog, private Ui::QgsRast
9292

9393
void on_mCrsComboBox_currentIndexChanged( int ) { crsChanged(); }
9494

95-
void groupBoxExpanded( QWidget * widget );
9695
void on_mAddNoDataManuallyToolButton_clicked();
9796
void on_mLoadTransparentNoDataToolButton_clicked();
9897
void on_mRemoveSelectedNoDataToolButton_clicked();

0 commit comments

Comments
 (0)