Skip to content

Commit 1095f98

Browse files
committed
Add option to use custom QSettings for QgsCollapsibleGroupBox
- Useful for plugins that may want to store collapsed state in their own QSettings file
1 parent 8e7db45 commit 1095f98

File tree

3 files changed

+51
-15
lines changed

3 files changed

+51
-15
lines changed

python/gui/qgscollapsiblegroupbox.sip

+5-2
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@ class QgsCollapsibleGroupBox : QGroupBox
44
#include <qgscollapsiblegroupbox.h>
55
%End
66
public:
7-
QgsCollapsibleGroupBox( QWidget *parent = 0 );
8-
QgsCollapsibleGroupBox( const QString &title, QWidget *parent = 0 );
7+
QgsCollapsibleGroupBox( QWidget *parent = 0, QSettings* settings = 0 );
8+
QgsCollapsibleGroupBox( const QString &title, QWidget *parent = 0, QSettings* settings = 0 );
99
~QgsCollapsibleGroupBox();
1010

11+
// set custom QSettings pointer if group box was already created from QtDesigner promotion
12+
void setSettings( QSettings* settings );
13+
1114
bool isCollapsed() const;
1215
void setCollapsed( bool collapse );
1316

src/gui/qgscollapsiblegroupbox.cpp

+34-11
Original file line numberDiff line numberDiff line change
@@ -29,26 +29,46 @@
2929
QIcon QgsCollapsibleGroupBox::mCollapseIcon;
3030
QIcon QgsCollapsibleGroupBox::mExpandIcon;
3131

32-
QgsCollapsibleGroupBox::QgsCollapsibleGroupBox( QWidget *parent )
33-
: QGroupBox( parent )
32+
QgsCollapsibleGroupBox::QgsCollapsibleGroupBox( QWidget *parent, QSettings* settings )
33+
: QGroupBox( parent ), mSettings( settings )
3434
{
3535
init();
3636
}
3737

3838
QgsCollapsibleGroupBox::QgsCollapsibleGroupBox( const QString &title,
39-
QWidget *parent )
40-
: QGroupBox( title, parent )
39+
QWidget *parent, QSettings* settings )
40+
: QGroupBox( title, parent ), mSettings( settings )
4141
{
4242
init();
4343
}
4444

4545
QgsCollapsibleGroupBox::~QgsCollapsibleGroupBox()
4646
{
4747
saveState();
48+
if ( mDelSettings ) // local settings obj to delete
49+
delete mSettings;
50+
mSettings = 0; // null the pointer (in case of outside settings obj)
51+
}
52+
53+
54+
void QgsCollapsibleGroupBox::setSettings( QSettings* settings )
55+
{
56+
if ( mDelSettings ) // local settings obj to delete
57+
delete mSettings;
58+
mSettings = settings;
59+
mDelSettings = false; // don't delete outside obj
4860
}
4961

5062
void QgsCollapsibleGroupBox::init()
5163
{
64+
// use pointer to app qsettings if no custom qsettings specified
65+
// custom qsettings object may be from Python plugin
66+
mDelSettings = false;
67+
if ( !mSettings )
68+
{
69+
mSettings = new QSettings();
70+
mDelSettings = true; // only delete obj created by class
71+
}
5272
// variables
5373
mCollapsed = false;
5474
mSaveCollapsedState = true;
@@ -183,23 +203,25 @@ QString QgsCollapsibleGroupBox::saveKey() const
183203

184204
void QgsCollapsibleGroupBox::loadState()
185205
{
206+
if ( !mSettings )
207+
return;
208+
186209
if ( !isEnabled() || ( !mSaveCollapsedState && !mSaveCheckedState ) )
187210
return;
188211

189212
setUpdatesEnabled( false );
190213

191-
QSettings settings;
192214
QString key = saveKey();
193215
QVariant val;
194216
if ( mSaveCheckedState )
195217
{
196-
val = settings.value( key + "/checked" );
218+
val = mSettings->value( key + "/checked" );
197219
if ( ! val.isNull() )
198220
setChecked( val.toBool() );
199221
}
200222
if ( mSaveCollapsedState )
201223
{
202-
val = settings.value( key + "/collapsed" );
224+
val = mSettings->value( key + "/collapsed" );
203225
if ( ! val.isNull() )
204226
setCollapsed( val.toBool() );
205227
}
@@ -209,16 +231,18 @@ void QgsCollapsibleGroupBox::loadState()
209231

210232
void QgsCollapsibleGroupBox::saveState()
211233
{
234+
if ( !mSettings )
235+
return;
236+
212237
if ( !isEnabled() || ( !mSaveCollapsedState && !mSaveCheckedState ) )
213238
return;
214239

215-
QSettings settings;
216240
QString key = saveKey();
217241

218242
if ( mSaveCheckedState )
219-
settings.setValue( key + "/checked", isChecked() );
243+
mSettings->setValue( key + "/checked", isChecked() );
220244
if ( mSaveCollapsedState )
221-
settings.setValue( key + "/collapsed", isCollapsed() );
245+
mSettings->setValue( key + "/collapsed", isCollapsed() );
222246
}
223247

224248
void QgsCollapsibleGroupBox::checkToggled( bool chkd )
@@ -340,4 +364,3 @@ void QgsCollapsibleGroupBox::setCollapsed( bool collapse )
340364
}
341365
emit collapsedStateChanged( this );
342366
}
343-

src/gui/qgscollapsiblegroupbox.h

+12-2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
*/
2727

2828
#include <QGroupBox>
29+
#include <QSettings>
30+
#include <QPointer>
2931

3032
class QToolButton;
3133
class QScrollArea;
@@ -35,10 +37,13 @@ class GUI_EXPORT QgsCollapsibleGroupBox : public QGroupBox
3537
Q_OBJECT
3638

3739
public:
38-
QgsCollapsibleGroupBox( QWidget *parent = 0 );
39-
QgsCollapsibleGroupBox( const QString &title, QWidget *parent = 0 );
40+
QgsCollapsibleGroupBox( QWidget *parent = 0, QSettings* settings = 0 );
41+
QgsCollapsibleGroupBox( const QString &title, QWidget *parent = 0, QSettings* settings = 0 );
4042
~QgsCollapsibleGroupBox();
4143

44+
// set custom QSettings pointer if group box was already created from QtDesigner promotion
45+
void setSettings( QSettings* settings );
46+
4247
bool isCollapsed() const { return mCollapsed; }
4348
void setCollapsed( bool collapse );
4449

@@ -80,6 +85,11 @@ class GUI_EXPORT QgsCollapsibleGroupBox : public QGroupBox
8085
QRect titleRect() const;
8186
QString saveKey() const;
8287

88+
// pointer to app or custom, external QSettings
89+
// QPointer in case custom settings obj gets deleted while groupbox's dialog is open
90+
QPointer<QSettings> mSettings;
91+
bool mDelSettings;
92+
8393
bool mCollapsed;
8494
bool mSaveCollapsedState;
8595
bool mSaveCheckedState;

0 commit comments

Comments
 (0)