Add collapse toggling synchronization to QgsCollapsibleGroupBoxBasic

- Holding Alt modifier key when toggling collapsed state will synchronize the toggling across other boxes with the same syncGroup QString value
- Synchronizes boxes of same syncGroup via recursive search in parent or grandparent widget (if grandparent is not QgisApp)
This commit is contained in:
Larry Shaffer 2013-02-12 14:43:05 -07:00
parent df412ece90
commit c8ca3761ff
4 changed files with 248 additions and 23 deletions

View File

@ -3,8 +3,9 @@
* \class QgsCollapsibleGroupBoxBasic
* A groupbox that collapses/expands when toggled.
* Basic class QgsCollapsibleGroupBoxBasic does not auto-save collapsed or checked state
* Holding Alt modifier key when toggling collapsed state will synchronize the toggling across other collapsible group boxes with the same syncGroup QString value
* @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 collapsed, QString syncGroup
*/
class QgsCollapsibleGroupBoxBasic : QGroupBox
@ -20,6 +21,10 @@ class QgsCollapsibleGroupBoxBasic : QGroupBox
bool isCollapsed() const;
void setCollapsed( bool collapse );
/** Named group which synchronizes collapsing action when triangle is clicked while holding alt modifier key */
QString syncGroup() const;
void setSyncGroup( QString grp );
//! set this to false to not automatically scroll parent QScrollArea to this widget's contents when expanded
void setScrollOnExpand( bool scroll );
@ -45,9 +50,10 @@ class QgsCollapsibleGroupBoxBasic : QGroupBox
* \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.
* Holding Alt modifier key when toggling collapsed state will synchronize the toggling across other collapsible group boxes with the same syncGroup QString value
* @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
* bool collapsed, bool saveCollapsedState, bool saveCheckedState, QString syncGroup
*/
class QgsCollapsibleGroupBox : QgsCollapsibleGroupBoxBasic

View File

@ -58,6 +58,8 @@ void QgsCollapsibleGroupBoxBasic::init()
mScrollOnExpand = true;
mShown = false;
mParentScrollArea = 0;
mSyncParent = 0;
mSyncGroup = "";
// init icons
if ( mCollapseIcon.isNull() )
@ -67,7 +69,7 @@ void QgsCollapsibleGroupBoxBasic::init()
}
// collapse button
mCollapseButton = new QToolButton( this );
mCollapseButton = new QgsGroupBoxCollapseButton( this );
mCollapseButton->setObjectName( "collapseButton" );
mCollapseButton->setAutoRaise( true );
mCollapseButton->setFixedSize( 16, 16 );
@ -175,6 +177,55 @@ void QgsCollapsibleGroupBoxBasic::checkToggled( bool chkd )
void QgsCollapsibleGroupBoxBasic::toggleCollapsed()
{
// verify if sender is this group box's collapse button
bool senderCollBtn = false;
QgsGroupBoxCollapseButton* collBtn = qobject_cast<QgsGroupBoxCollapseButton*>( QObject::sender() );
senderCollBtn = ( collBtn && collBtn == mCollapseButton );
// find any sync group siblings and toggle them
if ( senderCollBtn && mCollapseButton->altDown() && !mSyncGroup.isEmpty() )
{
mCollapseButton->setAltDown( false );
QgsDebugMsg( "Alt key down, syncing group" );
// get pointer to parent or grandparent widget
if ( parentWidget() )
{
mSyncParent = parentWidget();
if ( mSyncParent->parentWidget() )
{
// don't use whole app for grandparent (common for dialogs that use main window for parent)
if ( mSyncParent->parentWidget()->objectName() != QString( "QgisApp" ) )
{
mSyncParent = mSyncParent->parentWidget();
}
}
}
else
{
mSyncParent = 0;
}
if ( mSyncParent )
{
QgsDebugMsg( "found sync parent: " + mSyncParent->objectName() );
bool thisCollapsed = mCollapsed; // get state of current box before its changed
foreach ( QgsCollapsibleGroupBoxBasic *grpbox, mSyncParent->findChildren<QgsCollapsibleGroupBoxBasic*>() )
{
if ( grpbox->syncGroup() == syncGroup() && grpbox->isEnabled() )
{
grpbox->setCollapsed( !thisCollapsed );
}
}
return;
}
else
{
QgsDebugMsg( "did not find a sync parent" );
}
}
setCollapsed( !mCollapsed );
}

View File

@ -23,16 +23,43 @@
#include <QGroupBox>
#include <QSettings>
#include <QPointer>
#include <QToolButton>
#include <QMouseEvent>
class QToolButton;
class QScrollArea;
class QgsGroupBoxCollapseButton: public QToolButton
{
Q_OBJECT
public:
QgsGroupBoxCollapseButton( QWidget *parent = 0 )
: QToolButton( parent ), mAltDown( false ) {}
~QgsGroupBoxCollapseButton() {}
bool altDown() const { return mAltDown; }
void setAltDown( bool updown ) { mAltDown = updown; }
protected:
void mouseReleaseEvent( QMouseEvent *event )
{
mAltDown = ( event->modifiers() & Qt::AltModifier );
QToolButton::mouseReleaseEvent( event );
}
private:
bool mAltDown;
};
/** \ingroup gui
* \class QgsCollapsibleGroupBoxBasic
* A groupbox that collapses/expands when toggled.
* Basic class QgsCollapsibleGroupBoxBasic does not auto-save collapsed or checked state
* Holding Alt modifier key when toggling collapsed state will synchronize the toggling across other collapsible group boxes with the same syncGroup QString value
* @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 collapsed, QString syncGroup
*/
class GUI_EXPORT QgsCollapsibleGroupBoxBasic : public QGroupBox
@ -40,6 +67,7 @@ class GUI_EXPORT QgsCollapsibleGroupBoxBasic : public QGroupBox
Q_OBJECT
Q_PROPERTY( bool collapsed READ isCollapsed WRITE setCollapsed USER true )
Q_PROPERTY( QString syncGroup READ syncGroup WRITE setSyncGroup )
public:
QgsCollapsibleGroupBoxBasic( QWidget *parent = 0 );
@ -49,6 +77,10 @@ class GUI_EXPORT QgsCollapsibleGroupBoxBasic : public QGroupBox
bool isCollapsed() const { return mCollapsed; }
void setCollapsed( bool collapse );
/** Named group which synchronizes collapsing action when triangle is clicked while holding alt modifier key */
QString syncGroup() const { return mSyncGroup; }
void setSyncGroup( QString grp ) { mSyncGroup = grp; }
//! set this to false to not automatically scroll parent QScrollArea to this widget's contents when expanded
void setScrollOnExpand( bool scroll ) { mScrollOnExpand = scroll; }
@ -75,7 +107,9 @@ class GUI_EXPORT QgsCollapsibleGroupBoxBasic : public QGroupBox
bool mScrollOnExpand;
bool mShown;
QScrollArea* mParentScrollArea;
QToolButton* mCollapseButton;
QgsGroupBoxCollapseButton* mCollapseButton;
QWidget* mSyncParent;
QString mSyncGroup;
static QIcon mCollapseIcon;
static QIcon mExpandIcon;
@ -85,9 +119,10 @@ class GUI_EXPORT QgsCollapsibleGroupBoxBasic : public QGroupBox
* \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.
* Holding Alt modifier key when toggling collapsed state will synchronize the toggling across other collapsible group boxes with the same syncGroup QString value
* @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
* bool collapsed, bool saveCollapsedState, bool saveCheckedState, QString syncGroup
*/
class GUI_EXPORT QgsCollapsibleGroupBox : public QgsCollapsibleGroupBoxBasic
@ -95,8 +130,9 @@ 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 )
Q_PROPERTY( bool saveCollapsedState READ saveCollapsedState WRITE setSaveCollapsedState )
Q_PROPERTY( bool saveCheckedState READ saveCheckedState WRITE setSaveCheckedState )
Q_PROPERTY( QString syncGroup READ syncGroup WRITE setSyncGroup )
public:
QgsCollapsibleGroupBox( QWidget *parent = 0, QSettings* settings = 0 );

View File

@ -169,7 +169,7 @@
<property name="childrenCollapsible">
<bool>false</bool>
</property>
<widget class="QgsCollapsibleGroupBox" name="groupBox_mPreview"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<widget class="QgsCollapsibleGroupBox" name="groupBox_mPreview">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
@ -188,6 +188,12 @@
<property name="flat">
<bool>true</bool>
</property>
<property name="collapsed" stdset="0">
<bool>false</bool>
</property>
<property name="saveCollapsedState" stdset="0">
<bool>true</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<property name="spacing">
<number>0</number>
@ -462,7 +468,7 @@
<number>20</number>
</property>
<item row="9" column="0">
<widget class="QgsCollapsibleGroupBox" name="chkFormattedNumbers"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<widget class="QgsCollapsibleGroupBox" name="chkFormattedNumbers">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
@ -481,6 +487,15 @@
<property name="checkable">
<bool>true</bool>
</property>
<property name="collapsed" stdset="0">
<bool>false</bool>
</property>
<property name="saveCollapsedState" stdset="0">
<bool>true</bool>
</property>
<property name="syncGroup" stdset="0">
<string>labelsettings</string>
</property>
<layout class="QGridLayout" name="gridLayout_15">
<item row="0" column="1">
<widget class="QSpinBox" name="spinDecimals">
@ -529,7 +544,7 @@
</widget>
</item>
<item row="7" column="0">
<widget class="QgsCollapsibleGroupBox" name="mFontMultiLineGroupBox"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<widget class="QgsCollapsibleGroupBox" name="mFontMultiLineGroupBox">
<property name="minimumSize">
<size>
<width>0</width>
@ -542,6 +557,15 @@
<property name="checkable">
<bool>false</bool>
</property>
<property name="collapsed" stdset="0">
<bool>false</bool>
</property>
<property name="saveCollapsedState" stdset="0">
<bool>true</bool>
</property>
<property name="syncGroup" stdset="0">
<string>labelsettings</string>
</property>
<layout class="QGridLayout" name="gridLayout_14">
<item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_9">
@ -677,7 +701,7 @@
</widget>
</item>
<item row="2" column="0">
<widget class="QgsCollapsibleGroupBox" name="mFontStyleGroupBox"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<widget class="QgsCollapsibleGroupBox" name="mFontStyleGroupBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
@ -693,6 +717,15 @@
<property name="title">
<string>Text style</string>
</property>
<property name="collapsed" stdset="0">
<bool>false</bool>
</property>
<property name="saveCollapsedState" stdset="0">
<bool>true</bool>
</property>
<property name="syncGroup" stdset="0">
<string>labelsettings</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QFrame" name="verticalFrame">
@ -1161,7 +1194,7 @@
</widget>
</item>
<item row="4" column="0">
<widget class="QgsCollapsibleGroupBox" name="chkBuffer"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<widget class="QgsCollapsibleGroupBox" name="chkBuffer">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
@ -1180,6 +1213,15 @@
<property name="checkable">
<bool>true</bool>
</property>
<property name="collapsed" stdset="0">
<bool>false</bool>
</property>
<property name="saveCollapsedState" stdset="0">
<bool>true</bool>
</property>
<property name="syncGroup" stdset="0">
<string>labelsettings</string>
</property>
<layout class="QGridLayout" name="gridLayout_9">
<item row="0" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_7">
@ -1412,13 +1454,22 @@
</spacer>
</item>
<item row="6" column="0">
<widget class="QgsCollapsibleGroupBox" name="mFontLimitPixelGroupBox"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<widget class="QgsCollapsibleGroupBox" name="mFontLimitPixelGroupBox">
<property name="title">
<string>Pixel size-based visibility</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="collapsed" stdset="0">
<bool>false</bool>
</property>
<property name="saveCollapsedState" stdset="0">
<bool>true</bool>
</property>
<property name="syncGroup" stdset="0">
<string>labelsettings</string>
</property>
<layout class="QGridLayout" name="gridLayout_10">
<item row="0" column="5">
<widget class="QSpinBox" name="mFontMaxPixelSpinBox">
@ -1550,7 +1601,7 @@
</widget>
</item>
<item row="5" column="0">
<widget class="QgsCollapsibleGroupBox" name="chkScaleBasedVisibility"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<widget class="QgsCollapsibleGroupBox" name="chkScaleBasedVisibility">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
@ -1575,6 +1626,15 @@
<property name="checkable">
<bool>true</bool>
</property>
<property name="collapsed" stdset="0">
<bool>false</bool>
</property>
<property name="saveCollapsedState" stdset="0">
<bool>true</bool>
</property>
<property name="syncGroup" stdset="0">
<string>labelsettings</string>
</property>
<layout class="QGridLayout" name="gridLayout_21">
<item row="0" column="0">
<widget class="QSpinBox" name="spinScaleMin">
@ -1691,7 +1751,7 @@
</widget>
</item>
<item row="8" column="0">
<widget class="QgsCollapsibleGroupBox" name="mDirectSymbGroupBox"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<widget class="QgsCollapsibleGroupBox" name="mDirectSymbGroupBox">
<property name="title">
<string>Line direction symbols</string>
</property>
@ -1701,6 +1761,15 @@
<property name="checked">
<bool>true</bool>
</property>
<property name="collapsed" stdset="0">
<bool>false</bool>
</property>
<property name="saveCollapsedState" stdset="0">
<bool>true</bool>
</property>
<property name="syncGroup" stdset="0">
<string>labelsettings</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_10">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_19">
@ -1929,7 +1998,7 @@
<number>6</number>
</property>
<item row="1" column="0">
<widget class="QgsCollapsibleGroupBox" name="mPriorityGroupBox"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<widget class="QgsCollapsibleGroupBox" name="mPriorityGroupBox">
<property name="maximumSize">
<size>
<width>16777215</width>
@ -1939,6 +2008,15 @@
<property name="title">
<string>Priority</string>
</property>
<property name="collapsed" stdset="0">
<bool>false</bool>
</property>
<property name="saveCollapsedState" stdset="0">
<bool>true</bool>
</property>
<property name="syncGroup" stdset="0">
<string>advanced</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_18">
<item>
<widget class="QLabel" name="label_34">
@ -1977,7 +2055,7 @@
</widget>
</item>
<item row="0" column="0">
<widget class="QgsCollapsibleGroupBox" name="mPlacementGroupBox"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<widget class="QgsCollapsibleGroupBox" name="mPlacementGroupBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
@ -1993,6 +2071,15 @@
<property name="title">
<string>Placement</string>
</property>
<property name="collapsed" stdset="0">
<bool>false</bool>
</property>
<property name="saveCollapsedState" stdset="0">
<bool>true</bool>
</property>
<property name="syncGroup" stdset="0">
<string>advanced</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_12">
<property name="leftMargin">
<number>0</number>
@ -2731,7 +2818,7 @@
</spacer>
</item>
<item row="2" column="0">
<widget class="QgsCollapsibleGroupBox" name="mOptionsGroupBox"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<widget class="QgsCollapsibleGroupBox" name="mOptionsGroupBox">
<property name="maximumSize">
<size>
<width>16777215</width>
@ -2741,6 +2828,15 @@
<property name="title">
<string>Options</string>
</property>
<property name="collapsed" stdset="0">
<bool>false</bool>
</property>
<property name="saveCollapsedState" stdset="0">
<bool>true</bool>
</property>
<property name="syncGroup" stdset="0">
<string>advanced</string>
</property>
<layout class="QGridLayout" name="gridLayout_12">
<item row="2" column="0">
<widget class="QCheckBox" name="chkMergeLines">
@ -3003,10 +3099,19 @@
<number>6</number>
</property>
<item row="3" column="0">
<widget class="QgsCollapsibleGroupBox" name="mBufferAttributesPropertiesGroupBox"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<widget class="QgsCollapsibleGroupBox" name="mBufferAttributesPropertiesGroupBox">
<property name="title">
<string>Buffer properties</string>
</property>
<property name="collapsed" stdset="0">
<bool>false</bool>
</property>
<property name="saveCollapsedState" stdset="0">
<bool>true</bool>
</property>
<property name="syncGroup" stdset="0">
<string>datadefined</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="mBufferSizeLabel">
@ -3049,10 +3154,19 @@
</widget>
</item>
<item row="4" column="0">
<widget class="QgsCollapsibleGroupBox" name="mPositionAttributeGroupBox"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<widget class="QgsCollapsibleGroupBox" name="mPositionAttributeGroupBox">
<property name="title">
<string>Position</string>
</property>
<property name="collapsed" stdset="0">
<bool>false</bool>
</property>
<property name="saveCollapsedState" stdset="0">
<bool>true</bool>
</property>
<property name="syncGroup" stdset="0">
<string>datadefined</string>
</property>
<layout class="QGridLayout" name="gridLayout_4">
<item row="5" column="1">
<widget class="QComboBox" name="mRotationComboBox"/>
@ -3147,10 +3261,19 @@
</spacer>
</item>
<item row="1" column="0">
<widget class="QgsCollapsibleGroupBox" name="mDisplayAttributesPropertiesGroupBox"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<widget class="QgsCollapsibleGroupBox" name="mDisplayAttributesPropertiesGroupBox">
<property name="title">
<string>Display properties</string>
</property>
<property name="collapsed" stdset="0">
<bool>false</bool>
</property>
<property name="saveCollapsedState" stdset="0">
<bool>true</bool>
</property>
<property name="syncGroup" stdset="0">
<string>datadefined</string>
</property>
<layout class="QGridLayout" name="gridLayout_16">
<item row="1" column="1">
<widget class="QComboBox" name="mAlwaysShowAttributeComboBox"/>
@ -3211,7 +3334,7 @@
</widget>
</item>
<item row="2" column="0">
<widget class="QgsCollapsibleGroupBox" name="mFontAttributePropertiesGroupBox"><property name="collapsed" stdset="0"><bool>false</bool></property><property name="saveCollapsedState" stdset="0"><bool>true</bool></property>
<widget class="QgsCollapsibleGroupBox" name="mFontAttributePropertiesGroupBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
@ -3221,6 +3344,15 @@
<property name="title">
<string>Font properties</string>
</property>
<property name="collapsed" stdset="0">
<bool>false</bool>
</property>
<property name="saveCollapsedState" stdset="0">
<bool>true</bool>
</property>
<property name="syncGroup" stdset="0">
<string>datadefined</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="11" column="0">
<widget class="QLabel" name="mLineHeightLabel">