diff --git a/src/core/settings/qgssettingstree.h b/src/core/settings/qgssettingstree.h index fdfcdd690522..b7b52788c4cd 100644 --- a/src/core/settings/qgssettingstree.h +++ b/src/core/settings/qgssettingstree.h @@ -65,6 +65,7 @@ class CORE_EXPORT QgsSettingsTree static inline QgsSettingsTreeNode *sTreeAnnotations = treeRoot()->createChildNode( QStringLiteral( "annotations" ) ); static inline QgsSettingsTreeNode *sTreeNetworkCache = treeRoot()->createChildNode( QStringLiteral( "cache" ) ); static inline QgsSettingsTreeNode *sTreeAttributeTable = treeRoot()->createChildNode( QStringLiteral( "attribute-table" ) ); + static inline QgsSettingsTreeNode *sTreeWindowState = sTreeGui->createChildNode( QStringLiteral( "window-state" ) ); #endif diff --git a/src/gui/attributetable/qgsdualview.cpp b/src/gui/attributetable/qgsdualview.cpp index efc31af319e5..fddfdd80caad 100644 --- a/src/gui/attributetable/qgsdualview.cpp +++ b/src/gui/attributetable/qgsdualview.cpp @@ -48,6 +48,8 @@ #include "qgsvectorlayereditbuffer.h" #include "qgsactionmenu.h" +const std::unique_ptr QgsDualView::conditionalFormattingSplitterState = std::make_unique( QStringLiteral( "attribute-table-splitter-state" ), QgsSettingsTree::sTreeWindowState, QgsVariantUtils::createNullVariant( QMetaType::Type::QByteArray ), QStringLiteral( "State of conditionnal formatting splitter's layout so it could be restored when opening attribute table view." ) ); +const std::unique_ptr QgsDualView::attributeEditorSplitterState = std::make_unique( QStringLiteral( "attribute-editor-splitter-state" ), QgsSettingsTree::sTreeWindowState, QgsVariantUtils::createNullVariant( QMetaType::Type::QByteArray ), QStringLiteral( "State of attribute editor splitter's layout so it could be restored when opening attribute editor view." ) ); QgsDualView::QgsDualView( QWidget *parent ) : QStackedWidget( parent ) @@ -69,7 +71,10 @@ QgsDualView::QgsDualView( QWidget *parent ) mConditionalFormatWidget->setDockMode( true ); const QgsSettings settings; - mConditionalSplitter->restoreState( settings.value( QStringLiteral( "/qgis/attributeTable/splitterState" ), QByteArray() ).toByteArray() ); + // copy old setting + conditionalFormattingSplitterState->copyValueFromKey( QStringLiteral( "/qgis/attributeTable/splitterState" ), true ); + mConditionalSplitter->restoreState( conditionalFormattingSplitterState->value().toByteArray() ); + mAttributeEditorViewSplitter->restoreState( attributeEditorSplitterState->value().toByteArray() ); mPreviewColumnsMenu = new QMenu( this ); mActionPreviewColumnsMenu->setMenu( mPreviewColumnsMenu ); @@ -114,8 +119,6 @@ QgsDualView::QgsDualView( QWidget *parent ) QgsDualView::~QgsDualView() { - QgsSettings settings; - settings.setValue( QStringLiteral( "/qgis/attributeTable/splitterState" ), mConditionalSplitter->saveState() ); } void QgsDualView::init( QgsVectorLayer *layer, QgsMapCanvas *mapCanvas, const QgsFeatureRequest &request, const QgsAttributeEditorContext &context, bool loadFeatures, bool showFirstFeature ) @@ -815,6 +818,14 @@ void QgsDualView::hideEvent( QHideEvent *event ) { Q_UNUSED( event ) saveRecentDisplayExpressions(); + + // Better to save settings here than in destructor. This last can be called after a new + // project is loaded. So, when Qgis::ProjectFlag::RememberAttributeTableWindowsBetweenSessions is set, + // a new QgsDualView is created at project loading and we restore the old settings before saving the + // new one. + // And also, we override close event to just hide in QgsDockableWidgetHelper::eventFilter, that's why hideEvent + conditionalFormattingSplitterState->setValue( mConditionalSplitter->saveState() ); + attributeEditorSplitterState->setValue( mAttributeEditorViewSplitter->saveState() ); } void QgsDualView::viewWillShowContextMenu( QMenu *menu, const QModelIndex &masterIndex ) diff --git a/src/gui/attributetable/qgsdualview.h b/src/gui/attributetable/qgsdualview.h index 002d85f7b096..49a3b92f7838 100644 --- a/src/gui/attributetable/qgsdualview.h +++ b/src/gui/attributetable/qgsdualview.h @@ -32,6 +32,7 @@ class QgsFeatureRequest; class QgsMapLayerAction; class QgsScrollArea; class QgsFieldConditionalFormatWidget; +class QgsSettingsEntryVariant; /** * \ingroup gui @@ -421,6 +422,9 @@ class GUI_EXPORT QgsDualView : public QStackedWidget, private Ui::QgsDualViewBas //! Returns TRUE if the expression dialog has been accepted bool modifySort(); + static const std::unique_ptr conditionalFormattingSplitterState; + static const std::unique_ptr attributeEditorSplitterState; + QgsFieldConditionalFormatWidget *mConditionalFormatWidget = nullptr; QgsAttributeEditorContext mEditorContext; QgsAttributeTableModel *mMasterModel = nullptr;