@@ -226,14 +226,17 @@ QgsAttributeTableDialog::QgsAttributeTableDialog( QgsVectorLayer *layer, QgsAttr
226
226
// info from table to application
227
227
connect ( this , &QgsAttributeTableDialog::saveEdits, this , [ = ] { QgisApp::instance ()->saveEdits (); } );
228
228
229
- bool myDockFlag = settings.value ( QStringLiteral ( " qgis/dockAttributeTable" ), false ).toBool ();
230
- if ( myDockFlag )
229
+ const bool dockTable = settings.value ( QStringLiteral ( " qgis/dockAttributeTable" ), false ).toBool ();
230
+ if ( dockTable )
231
231
{
232
- mDock = new QgsAttributeTableDock ( tr ( " %1 (%n Feature(s)) " , " feature count " , mMainView -> featureCount () ). arg ( mLayer -> name () ), QgisApp::instance () );
232
+ mDock = new QgsAttributeTableDock ( QString ( ), QgisApp::instance () );
233
233
mDock ->setWidget ( this );
234
234
connect ( this , &QObject::destroyed, mDock , &QWidget::close );
235
235
QgisApp::instance ()->addDockWidget ( Qt::BottomDockWidgetArea, mDock );
236
236
}
237
+ mActionDockUndock ->setChecked ( dockTable );
238
+ connect ( mActionDockUndock , &QAction::toggled, this , &QgsAttributeTableDialog::toggleDockMode );
239
+ installEventFilter ( this );
237
240
238
241
columnBoxInit ();
239
242
updateTitle ();
@@ -363,7 +366,9 @@ void QgsAttributeTableDialog::updateTitle()
363
366
{
364
367
return ;
365
368
}
366
- QWidget *w = mDock ? qobject_cast<QWidget *>( mDock ) : qobject_cast<QWidget *>( this );
369
+ QWidget *w = mDock ? qobject_cast<QWidget *>( mDock )
370
+ : mDialog ? qobject_cast<QWidget *>( mDialog )
371
+ : qobject_cast<QWidget *>( this );
367
372
w->setWindowTitle ( tr ( " %1 :: Features Total: %2, Filtered: %3, Selected: %4" )
368
373
.arg ( mLayer ->name () )
369
374
.arg ( std::max ( static_cast < long >( mMainView ->featureCount () ), mLayer ->featureCount () ) ) // layer count may be estimated, so use larger of the two
@@ -390,25 +395,28 @@ void QgsAttributeTableDialog::updateButtonStatus( const QString &fieldName, bool
390
395
mRunFieldCalc ->setEnabled ( isValid );
391
396
}
392
397
393
- void QgsAttributeTableDialog::closeEvent ( QCloseEvent *event )
398
+ void QgsAttributeTableDialog::keyPressEvent ( QKeyEvent *event )
394
399
{
395
- QDialog::closeEvent ( event );
400
+ QDialog::keyPressEvent ( event );
396
401
397
- if ( ! mDock )
402
+ if ( ( event-> key () == Qt::Key_Backspace || event-> key () == Qt::Key_Delete ) && mActionDeleteSelected -> isEnabled () )
398
403
{
399
- QgsSettings settings;
400
- settings.setValue ( QStringLiteral ( " Windows/BetterAttributeTable/geometry" ), saveGeometry () );
404
+ QgisApp::instance ()->deleteSelected ( mLayer , this );
401
405
}
402
406
}
403
407
404
- void QgsAttributeTableDialog::keyPressEvent ( QKeyEvent *event )
408
+ bool QgsAttributeTableDialog::eventFilter ( QObject *object, QEvent *ev )
405
409
{
406
- QDialog::keyPressEvent ( event );
407
-
408
- if ( ( event->key () == Qt::Key_Backspace || event->key () == Qt::Key_Delete ) && mActionDeleteSelected ->isEnabled () )
410
+ if ( ev->type () == QEvent::Close && !mDock && ( !mDialog || mDialog == object ) )
409
411
{
410
- QgisApp::instance ()->deleteSelected ( mLayer , this );
412
+ if ( QWidget *w = qobject_cast< QWidget * >( object ) )
413
+ {
414
+ QgsSettings settings;
415
+ settings.setValue ( QStringLiteral ( " Windows/BetterAttributeTable/geometry" ), w->saveGeometry () );
416
+ }
411
417
}
418
+
419
+ return QDialog::eventFilter ( object, ev );
412
420
}
413
421
414
422
void QgsAttributeTableDialog::columnBoxInit ()
@@ -1094,6 +1102,56 @@ void QgsAttributeTableDialog::showContextMenu( QgsActionMenu *menu, const QgsFea
1094
1102
}
1095
1103
}
1096
1104
1105
+ void QgsAttributeTableDialog::toggleDockMode ( bool docked )
1106
+ {
1107
+ if ( docked )
1108
+ {
1109
+ // going from window -> dock, so save current window geometry
1110
+ QgsSettings ().setValue ( QStringLiteral ( " Windows/BetterAttributeTable/geometry" ), mDialog ? mDialog ->saveGeometry () : saveGeometry () );
1111
+ if ( mDialog )
1112
+ {
1113
+ mDialog ->removeEventFilter ( this );
1114
+ mDialog ->setLayout ( nullptr );
1115
+ mDialog ->deleteLater ();
1116
+ mDialog = nullptr ;
1117
+ }
1118
+
1119
+ mDock = new QgsAttributeTableDock ( QString (), QgisApp::instance () );
1120
+ mDock ->setWidget ( this );
1121
+ connect ( this , &QObject::destroyed, mDock , &QWidget::close );
1122
+ QgisApp::instance ()->addDockWidget ( Qt::BottomDockWidgetArea, mDock );
1123
+ updateTitle ();
1124
+ }
1125
+ else
1126
+ {
1127
+ // going from dock -> window
1128
+
1129
+ mDialog = new QDialog ( QgisApp::instance (), Qt::Window );
1130
+ mDialog ->setAttribute ( Qt::WA_DeleteOnClose );
1131
+
1132
+ QVBoxLayout *vl = new QVBoxLayout ();
1133
+ vl->setContentsMargins ( 0 , 0 , 0 , 0 );
1134
+ vl->setMargin ( 0 );
1135
+ vl->addWidget ( this );
1136
+ mDialog ->setLayout ( vl );
1137
+
1138
+ if ( mDock )
1139
+ {
1140
+ mDock ->setWidget ( nullptr );
1141
+ disconnect ( this , &QObject::destroyed, mDock , &QWidget::close );
1142
+ mDock ->deleteLater ();
1143
+ mDock = nullptr ;
1144
+ }
1145
+
1146
+ // subscribe to close events, so that we can save window geometry
1147
+ mDialog ->installEventFilter ( this );
1148
+
1149
+ updateTitle ();
1150
+ mDialog ->restoreGeometry ( QgsSettings ().value ( QStringLiteral ( " Windows/BetterAttributeTable/geometry" ) ).toByteArray () );
1151
+ mDialog ->show ();
1152
+ }
1153
+ }
1154
+
1097
1155
//
1098
1156
// QgsAttributeTableDock
1099
1157
//
0 commit comments