Merge pull request #59762 from troopa81/restore_attributeeditor_spliiter

fix(AttributeEditor): Restore splitter position
This commit is contained in:
Julien Cabieces 2024-12-19 11:11:54 +01:00 committed by GitHub
commit 99c3852375
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 19 additions and 3 deletions

View File

@ -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

View File

@ -48,6 +48,8 @@
#include "qgsvectorlayereditbuffer.h"
#include "qgsactionmenu.h"
const std::unique_ptr<QgsSettingsEntryVariant> QgsDualView::conditionalFormattingSplitterState = std::make_unique<QgsSettingsEntryVariant>( 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<QgsSettingsEntryVariant> QgsDualView::attributeEditorSplitterState = std::make_unique<QgsSettingsEntryVariant>( 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 )

View File

@ -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<QgsSettingsEntryVariant> conditionalFormattingSplitterState;
static const std::unique_ptr<QgsSettingsEntryVariant> attributeEditorSplitterState;
QgsFieldConditionalFormatWidget *mConditionalFormatWidget = nullptr;
QgsAttributeEditorContext mEditorContext;
QgsAttributeTableModel *mMasterModel = nullptr;