285 changes: 172 additions & 113 deletions src/gui/qgscollapsiblegroupbox.cpp

Large diffs are not rendered by default.

104 changes: 69 additions & 35 deletions src/gui/qgscollapsiblegroupbox.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,22 +20,84 @@

#include "qgisgui.h"

/** \ingroup gui
* A groupbox that collapses/expands when toggled.
* @note Collapsible function not shown in promoted QtDesigner widgets.
*/

#include <QGroupBox>
#include <QSettings>
#include <QPointer>

class QToolButton;
class QScrollArea;

class GUI_EXPORT QgsCollapsibleGroupBox : public QGroupBox
/** \ingroup gui
* \class QgsCollapsibleGroupBoxBasic
* A groupbox that collapses/expands when toggled.
* Basic class QgsCollapsibleGroupBoxBasic does not auto-save collapsed or checked state
* @note To add Collapsible properties in promoted QtDesigner widgets, you can add the following "Dynamic properties" by clicking on the green + in the propreties palette:
* bool collapsed
*/

class GUI_EXPORT QgsCollapsibleGroupBoxBasic : public QGroupBox
{
Q_OBJECT

Q_PROPERTY( bool collapsed READ isCollapsed WRITE setCollapsed USER true )

public:
QgsCollapsibleGroupBoxBasic( QWidget *parent = 0 );
QgsCollapsibleGroupBoxBasic( const QString &title, QWidget *parent = 0 );
~QgsCollapsibleGroupBoxBasic();

bool isCollapsed() const { return mCollapsed; }
void setCollapsed( bool collapse );

//! set this to false to not automatically scroll parent QScrollArea to this widget's contents when expanded
void setScrollOnExpand( bool scroll ) { mScrollOnExpand = scroll; }

signals:
/** Signal emitted when groupbox collapsed/expanded state is changed, and when first shown */
void collapsedStateChanged( bool collapsed );

public slots:
void checkToggled( bool ckd );
void toggleCollapsed();

protected:
void init();
void showEvent( QShowEvent *event );
void mouseReleaseEvent( QMouseEvent *event );
void changeEvent( QEvent *event );

void updateStyle();
QRect titleRect() const;

bool mCollapsed;
bool mInitFlat;
bool mInitFlatChecked;
bool mScrollOnExpand;
bool mShown;
QScrollArea* mParentScrollArea;
QToolButton* mCollapseButton;

static QIcon mCollapseIcon;
static QIcon mExpandIcon;
};

/** \ingroup gui
* \class QgsCollapsibleGroupBox
* A groupbox that collapses/expands when toggled and can save its collapsed and checked states.
* By default, it auto-saves only its collapsed state to the global settings based on the widget and it's parent names.
* @see basic class QgsCollapsibleGroupBoxBasic which does not auto-save states
* @note To add Collapsible properties in promoted QtDesigner widgets, you can add the following "Dynamic properties" by clicking on the green + in the propreties palette:
* bool collapsed, bool saveCollapsedState, bool saveCheckedState
*/

class GUI_EXPORT QgsCollapsibleGroupBox : public QgsCollapsibleGroupBoxBasic
{
Q_OBJECT

Q_PROPERTY( bool collapsed READ isCollapsed WRITE setCollapsed USER true )
Q_PROPERTY( bool saveCollapsedState READ saveCollapsedState WRITE setSaveCollapsedState USER true )
Q_PROPERTY( bool saveCheckedState READ saveCheckedState WRITE setSaveCheckedState USER true )

public:
QgsCollapsibleGroupBox( QWidget *parent = 0, QSettings* settings = 0 );
QgsCollapsibleGroupBox( const QString &title, QWidget *parent = 0, QSettings* settings = 0 );
Expand All @@ -44,9 +106,6 @@ class GUI_EXPORT QgsCollapsibleGroupBox : public QGroupBox
// set custom QSettings pointer if group box was already created from QtDesigner promotion
void setSettings( QSettings* settings );

bool isCollapsed() const { return mCollapsed; }
void setCollapsed( bool collapse );

//! set this to false to not save/restore collapsed state
void setSaveCollapsedState( bool save ) { mSaveCollapsedState = save; }
/** set this to true to save/restore checked state
Expand All @@ -56,52 +115,27 @@ class GUI_EXPORT QgsCollapsibleGroupBox : public QGroupBox
bool saveCollapsedState() { return mSaveCollapsedState; }
bool saveCheckedState() { return mSaveCheckedState; }

//! set this to a defined string to share save/restore collapsed state across dialogs
//! set this to a defined string to share save/restore states across different parent dialogs
void setSettingGroup( const QString &group ) { mSettingGroup = group; }
QString settingGroup() const { return mSettingGroup; }

//! set this to false to not automatically scroll parent QScrollArea to this widget's contents when expanded
void setScrollOnExpand( bool scroll ) { mScrollOnExpand = scroll; }

signals:
/** Signal emitted when groupbox collapsed/expanded state is changed, and when first shown */
void collapsedStateChanged( QgsCollapsibleGroupBox* );

public slots:
void checkToggled( bool ckd );
void toggleCollapsed();

protected slots:
void loadState();
void saveState();

protected:
void init();
void showEvent( QShowEvent *event );
void mouseReleaseEvent( QMouseEvent *event );
void changeEvent( QEvent *event );

void updateStyle();
QRect titleRect() const;
QString saveKey() const;

// pointer to app or custom, external QSettings
// QPointer in case custom settings obj gets deleted while groupbox's dialog is open
QPointer<QSettings> mSettings;
bool mDelSettings;

bool mCollapsed;
bool mSaveCollapsedState;
bool mSaveCheckedState;
QString mSettingGroup;
bool mInitFlat;
bool mScrollOnExpand;
bool mShown;
QScrollArea* mParentScrollArea;
QToolButton* mCollapseButton;

static QIcon mCollapseIcon;
static QIcon mExpandIcon;
};

#endif
4 changes: 2 additions & 2 deletions src/ui/qgscomposeritemwidgetbase.ui
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QgsCollapsibleGroupBox" name="mFrameGroupBox">
<widget class="QgsCollapsibleGroupBox" name="mFrameGroupBox"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<property name="title">
<string>Show frame</string>
</property>
Expand Down Expand Up @@ -60,7 +60,7 @@
</widget>
</item>
<item row="2" column="0" colspan="2">
<widget class="QgsCollapsibleGroupBox" name="mBackgroundGroupBox">
<widget class="QgsCollapsibleGroupBox" name="mBackgroundGroupBox"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<property name="title">
<string>Show background</string>
</property>
Expand Down
30 changes: 15 additions & 15 deletions src/ui/qgslabelingguibase.ui
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@
<property name="childrenCollapsible">
<bool>false</bool>
</property>
<widget class="QgsCollapsibleGroupBox" name="groupBox_mPreview">
<widget class="QgsCollapsibleGroupBox" name="groupBox_mPreview"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
Expand Down Expand Up @@ -462,7 +462,7 @@
<number>20</number>
</property>
<item row="9" column="0">
<widget class="QgsCollapsibleGroupBox" name="chkFormattedNumbers">
<widget class="QgsCollapsibleGroupBox" name="chkFormattedNumbers"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
Expand Down Expand Up @@ -529,7 +529,7 @@
</widget>
</item>
<item row="7" column="0">
<widget class="QgsCollapsibleGroupBox" name="mFontMultiLineGroupBox">
<widget class="QgsCollapsibleGroupBox" name="mFontMultiLineGroupBox"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<property name="minimumSize">
<size>
<width>0</width>
Expand Down Expand Up @@ -677,7 +677,7 @@
</widget>
</item>
<item row="2" column="0">
<widget class="QgsCollapsibleGroupBox" name="mFontStyleGroupBox">
<widget class="QgsCollapsibleGroupBox" name="mFontStyleGroupBox"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
Expand Down Expand Up @@ -1161,7 +1161,7 @@
</widget>
</item>
<item row="4" column="0">
<widget class="QgsCollapsibleGroupBox" name="chkBuffer">
<widget class="QgsCollapsibleGroupBox" name="chkBuffer"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
Expand Down Expand Up @@ -1412,7 +1412,7 @@
</spacer>
</item>
<item row="6" column="0">
<widget class="QgsCollapsibleGroupBox" name="mFontLimitPixelGroupBox">
<widget class="QgsCollapsibleGroupBox" name="mFontLimitPixelGroupBox"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<property name="title">
<string>Pixel size-based visibility</string>
</property>
Expand Down Expand Up @@ -1550,7 +1550,7 @@
</widget>
</item>
<item row="5" column="0">
<widget class="QgsCollapsibleGroupBox" name="chkScaleBasedVisibility">
<widget class="QgsCollapsibleGroupBox" name="chkScaleBasedVisibility"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
Expand Down Expand Up @@ -1691,7 +1691,7 @@
</widget>
</item>
<item row="8" column="0">
<widget class="QgsCollapsibleGroupBox" name="mDirectSymbGroupBox">
<widget class="QgsCollapsibleGroupBox" name="mDirectSymbGroupBox"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<property name="title">
<string>Line direction symbols</string>
</property>
Expand Down Expand Up @@ -1929,7 +1929,7 @@
<number>6</number>
</property>
<item row="1" column="0">
<widget class="QgsCollapsibleGroupBox" name="mPriorityGroupBox">
<widget class="QgsCollapsibleGroupBox" name="mPriorityGroupBox"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<property name="maximumSize">
<size>
<width>16777215</width>
Expand Down Expand Up @@ -1977,7 +1977,7 @@
</widget>
</item>
<item row="0" column="0">
<widget class="QgsCollapsibleGroupBox" name="mPlacementGroupBox">
<widget class="QgsCollapsibleGroupBox" name="mPlacementGroupBox"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
Expand Down Expand Up @@ -2731,7 +2731,7 @@
</spacer>
</item>
<item row="2" column="0">
<widget class="QgsCollapsibleGroupBox" name="mOptionsGroupBox">
<widget class="QgsCollapsibleGroupBox" name="mOptionsGroupBox"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<property name="maximumSize">
<size>
<width>16777215</width>
Expand Down Expand Up @@ -3003,7 +3003,7 @@
<number>6</number>
</property>
<item row="3" column="0">
<widget class="QgsCollapsibleGroupBox" name="mBufferAttributesPropertiesGroupBox">
<widget class="QgsCollapsibleGroupBox" name="mBufferAttributesPropertiesGroupBox"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<property name="title">
<string>Buffer properties</string>
</property>
Expand Down Expand Up @@ -3049,7 +3049,7 @@
</widget>
</item>
<item row="4" column="0">
<widget class="QgsCollapsibleGroupBox" name="mPositionAttributeGroupBox">
<widget class="QgsCollapsibleGroupBox" name="mPositionAttributeGroupBox"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<property name="title">
<string>Position</string>
</property>
Expand Down Expand Up @@ -3147,7 +3147,7 @@
</spacer>
</item>
<item row="1" column="0">
<widget class="QgsCollapsibleGroupBox" name="mDisplayAttributesPropertiesGroupBox">
<widget class="QgsCollapsibleGroupBox" name="mDisplayAttributesPropertiesGroupBox"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<property name="title">
<string>Display properties</string>
</property>
Expand Down Expand Up @@ -3211,7 +3211,7 @@
</widget>
</item>
<item row="2" column="0">
<widget class="QgsCollapsibleGroupBox" name="mFontAttributePropertiesGroupBox">
<widget class="QgsCollapsibleGroupBox" name="mFontAttributePropertiesGroupBox"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
Expand Down
4 changes: 2 additions & 2 deletions src/ui/qgsoptionsbase.ui
Original file line number Diff line number Diff line change
Expand Up @@ -997,7 +997,7 @@
</widget>
</item>
<item row="2" column="0" colspan="4">
<widget class="QgsCollapsibleGroupBox" name="mCurrentVariablesGrpBx">
<widget class="QgsCollapsibleGroupBox" name="mCurrentVariablesGrpBx"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<property name="minimumSize">
<size>
<width>0</width>
Expand Down Expand Up @@ -3790,7 +3790,7 @@
</widget>
</item>
<item>
<widget class="QgsCollapsibleGroupBox" name="grpProxy">
<widget class="QgsCollapsibleGroupBox" name="grpProxy"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<property name="title">
<string>Use proxy for web access</string>
</property>
Expand Down
10 changes: 5 additions & 5 deletions src/ui/qgsprojectpropertiesbase.ui
Original file line number Diff line number Diff line change
Expand Up @@ -843,7 +843,7 @@
</property>
<layout class="QGridLayout" name="gridLayout_15">
<item row="0" column="0">
<widget class="QgsCollapsibleGroupBox" name="grpOWSServiceCapabilities">
<widget class="QgsCollapsibleGroupBox" name="grpOWSServiceCapabilities"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<property name="title">
<string>Service Capabilitities</string>
</property>
Expand Down Expand Up @@ -979,7 +979,7 @@
</property>
<layout class="QGridLayout" name="gridLayout_14">
<item row="0" column="0">
<widget class="QgsCollapsibleGroupBox" name="grpWMSExt">
<widget class="QgsCollapsibleGroupBox" name="grpWMSExt"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<property name="title">
<string>Advertised Extent</string>
</property>
Expand Down Expand Up @@ -1082,7 +1082,7 @@
</widget>
</item>
<item row="0" column="1" colspan="2">
<widget class="QgsCollapsibleGroupBox" name="grpWMSList">
<widget class="QgsCollapsibleGroupBox" name="grpWMSList"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<property name="title">
<string>Coordinate Systems Restrictions</string>
</property>
Expand Down Expand Up @@ -1121,7 +1121,7 @@
</widget>
</item>
<item row="1" column="0">
<widget class="QgsCollapsibleGroupBox" name="mWMSComposerGroupBox">
<widget class="QgsCollapsibleGroupBox" name="mWMSComposerGroupBox"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<property name="title">
<string>Exclude composers</string>
</property>
Expand Down Expand Up @@ -1174,7 +1174,7 @@
</widget>
</item>
<item row="1" column="2">
<widget class="QgsCollapsibleGroupBox" name="mLayerRestrictionsGroupBox">
<widget class="QgsCollapsibleGroupBox" name="mLayerRestrictionsGroupBox"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<property name="title">
<string>Exclude layers</string>
</property>
Expand Down
2 changes: 1 addition & 1 deletion src/ui/qgsrasterlayerpropertiesbase.ui
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@
</widget>
</item>
<item>
<widget class="QgsCollapsibleGroupBox" name="mResamplingGroupBox">
<widget class="QgsCollapsibleGroupBox" name="mResamplingGroupBox"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<property name="title">
<string>Resampling</string>
</property>
Expand Down
12 changes: 6 additions & 6 deletions src/ui/qgsrasterlayersaveasdialogbase.ui
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ datasets with maximum width and height specified below.</string>
<number>0</number>
</property>
<item>
<widget class="QgsCollapsibleGroupBox" name="mExtentGroupBox">
<widget class="QgsCollapsibleGroupBox" name="mExtentGroupBox"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
Expand Down Expand Up @@ -380,7 +380,7 @@ datasets with maximum width and height specified below.</string>
</widget>
</item>
<item>
<widget class="QgsCollapsibleGroupBox" name="mResolutionGroupBox">
<widget class="QgsCollapsibleGroupBox" name="mResolutionGroupBox"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
Expand Down Expand Up @@ -465,7 +465,7 @@ datasets with maximum width and height specified below.</string>
</widget>
</item>
<item>
<widget class="QgsCollapsibleGroupBox" name="mTilesGroupBox">
<widget class="QgsCollapsibleGroupBox" name="mTilesGroupBox"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
Expand Down Expand Up @@ -520,7 +520,7 @@ datasets with maximum width and height specified below.</string>
</widget>
</item>
<item>
<widget class="QgsCollapsibleGroupBox" name="mCreateOptionsGroupBox">
<widget class="QgsCollapsibleGroupBox" name="mCreateOptionsGroupBox"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
Expand All @@ -544,7 +544,7 @@ datasets with maximum width and height specified below.</string>
</widget>
</item>
<item>
<widget class="QgsCollapsibleGroupBox" name="mPyramidsGroupBox">
<widget class="QgsCollapsibleGroupBox" name="mPyramidsGroupBox"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
Expand Down Expand Up @@ -628,7 +628,7 @@ datasets with maximum width and height specified below.</string>
</widget>
</item>
<item>
<widget class="QgsCollapsibleGroupBox" name="mNoDataGroupBox">
<widget class="QgsCollapsibleGroupBox" name="mNoDataGroupBox"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
Expand Down