25
25
#include " qgsmessagelog.h"
26
26
#include " qgsvectordataprovider.h"
27
27
#include " qgsvectorlayercache.h"
28
+ #include " qgsorganizetablecolumnsdialog.h"
28
29
29
30
#include < QClipboard>
30
31
#include < QDialog>
31
32
#include < QMenu>
32
33
#include < QMessageBox>
33
34
#include < QProgressDialog>
34
35
#include < QSettings>
36
+ #include < QGroupBox>
35
37
36
38
QgsDualView::QgsDualView ( QWidget* parent )
37
39
: QStackedWidget( parent )
@@ -40,6 +42,7 @@ QgsDualView::QgsDualView( QWidget* parent )
40
42
, mFilterModel( nullptr )
41
43
, mFeatureListModel( nullptr )
42
44
, mAttributeForm( nullptr )
45
+ , mHorizontalHeaderMenu( nullptr )
43
46
, mLayerCache( nullptr )
44
47
, mProgressDlg( nullptr )
45
48
, mFeatureSelectionManager( nullptr )
@@ -67,6 +70,8 @@ void QgsDualView::init( QgsVectorLayer* layer, QgsMapCanvas* mapCanvas, const Qg
67
70
mEditorContext = context;
68
71
69
72
connect ( mTableView , SIGNAL ( willShowContextMenu ( QMenu*, QModelIndex ) ), this , SLOT ( viewWillShowContextMenu ( QMenu*, QModelIndex ) ) );
73
+ mTableView ->horizontalHeader ()->setContextMenuPolicy ( Qt::CustomContextMenu );
74
+ connect ( mTableView ->horizontalHeader (), SIGNAL ( customContextMenuRequested ( QPoint ) ), this , SLOT ( showViewHeaderMenu ( QPoint ) ) );
70
75
71
76
initLayerCache ( layer, !request.filterRect ().isNull () );
72
77
initModels ( mapCanvas, request );
@@ -453,6 +458,89 @@ void QgsDualView::viewWillShowContextMenu( QMenu* menu, const QModelIndex& atInd
453
458
menu->addAction ( tr ( " Open form" ), a, SLOT ( featureForm () ) );
454
459
}
455
460
461
+ void QgsDualView::showViewHeaderMenu ( QPoint point )
462
+ {
463
+ delete mHorizontalHeaderMenu ;
464
+ mHorizontalHeaderMenu = new QMenu ( this );
465
+ QAction* organize = new QAction ( tr ( " &Organize columns..." ), mHorizontalHeaderMenu );
466
+ connect ( organize, SIGNAL ( triggered ( bool ) ), this , SLOT ( organizeColumns () ) );
467
+ mHorizontalHeaderMenu ->addAction ( organize );
468
+ QAction* sort = new QAction ( tr ( " &Sort..." ), mHorizontalHeaderMenu );
469
+ connect ( sort, SIGNAL ( triggered ( bool ) ), this , SLOT ( modifySort () ) );
470
+ mHorizontalHeaderMenu ->addAction ( sort );
471
+ mHorizontalHeaderMenu ->popup ( mTableView ->horizontalHeader ()->mapToGlobal ( point ) );
472
+ }
473
+
474
+ void QgsDualView::organizeColumns ()
475
+ {
476
+ if ( !mLayerCache ->layer () )
477
+ {
478
+ return ;
479
+ }
480
+
481
+ QgsOrganizeTableColumnsDialog dialog ( mLayerCache ->layer (), this );
482
+ if ( dialog.exec () == QDialog::Accepted )
483
+ {
484
+ QgsAttributeTableConfig config = dialog.config ();
485
+ mLayerCache ->layer ()->setAttributeTableConfig ( config );
486
+ setAttributeTableConfig ( config );
487
+ }
488
+ }
489
+
490
+ void QgsDualView::modifySort ()
491
+ {
492
+ QgsVectorLayer* layer = mLayerCache ->layer ();
493
+ if ( !layer )
494
+ return ;
495
+
496
+ QgsAttributeTableConfig config = layer->attributeTableConfig ();
497
+
498
+ QDialog orderByDlg;
499
+ orderByDlg.setWindowTitle ( tr ( " Configure attribute table sort order" ) );
500
+ QDialogButtonBox* dialogButtonBox = new QDialogButtonBox ( QDialogButtonBox::Ok | QDialogButtonBox::Cancel );
501
+ QGridLayout* layout = new QGridLayout ();
502
+ connect ( dialogButtonBox, SIGNAL ( accepted () ), &orderByDlg, SLOT ( accept () ) );
503
+ connect ( dialogButtonBox, SIGNAL ( rejected () ), &orderByDlg, SLOT ( reject () ) );
504
+ orderByDlg.setLayout ( layout );
505
+
506
+ QGroupBox* sortingGroupBox = new QGroupBox ();
507
+ sortingGroupBox->setTitle ( tr ( " Enable sorting order in attribute table" ) );
508
+ sortingGroupBox->setCheckable ( true );
509
+ sortingGroupBox->setChecked ( !sortExpression ().isEmpty () );
510
+ layout->addWidget ( sortingGroupBox );
511
+ sortingGroupBox->setLayout ( new QGridLayout () );
512
+
513
+ QgsExpressionBuilderWidget* expressionBuilder = new QgsExpressionBuilderWidget ();
514
+ QgsExpressionContext context;
515
+ context << QgsExpressionContextUtils::globalScope ()
516
+ << QgsExpressionContextUtils::projectScope ()
517
+ << QgsExpressionContextUtils::layerScope ( layer );
518
+ expressionBuilder->setExpressionContext ( context );
519
+ expressionBuilder->setLayer ( layer );
520
+ expressionBuilder->loadFieldNames ();
521
+ expressionBuilder->loadRecent ( " generic" );
522
+ expressionBuilder->setExpressionText ( sortExpression ().isEmpty () ? layer->displayExpression () : sortExpression () );
523
+
524
+ sortingGroupBox->layout ()->addWidget ( expressionBuilder );
525
+
526
+ layout->addWidget ( dialogButtonBox );
527
+ if ( orderByDlg.exec () )
528
+ {
529
+ if ( sortingGroupBox->isChecked () )
530
+ {
531
+ setSortExpression ( expressionBuilder->expressionText () );
532
+ config.setSortExpression ( expressionBuilder->expressionText () );
533
+ }
534
+ else
535
+ {
536
+ setSortExpression ( QString () );
537
+ config.setSortExpression ( QString () );
538
+ }
539
+
540
+ layer->setAttributeTableConfig ( config );
541
+ }
542
+ }
543
+
456
544
void QgsDualView::zoomToCurrentFeature ()
457
545
{
458
546
QModelIndex currentIndex = mTableView ->currentIndex ();
0 commit comments