18 #include <QHeaderView> 34 : QTableView( parent )
35 , mMasterModel( NULL )
36 , mFilterModel( NULL )
37 , mFeatureSelectionModel( NULL )
38 , mFeatureSelectionManager( NULL )
40 , mActionPopup( NULL )
42 , mRowSectionAnchor( 0 )
43 , mCtrlDragSelectionFlag( QItemSelectionModel::Select )
46 restoreGeometry( settings.value(
"/BetterAttributeTable/geometry" ).toByteArray() );
48 verticalHeader()->setDefaultSectionSize( 20 );
49 horizontalHeader()->setHighlightSections(
false );
52 setItemDelegate( mTableDelegate );
54 setSelectionBehavior( QAbstractItemView::SelectRows );
55 setSelectionMode( QAbstractItemView::ExtendedSelection );
56 setSortingEnabled(
true );
58 verticalHeader()->viewport()->installEventFilter(
this );
60 connect( verticalHeader(), SIGNAL( sectionPressed(
int ) ),
this, SLOT(
selectRow(
int ) ) );
61 connect( verticalHeader(), SIGNAL( sectionEntered(
int ) ),
this, SLOT(
_q_selectRow(
int ) ) );
71 if (
object == verticalHeader()->viewport() )
73 switch ( event->type() )
75 case QEvent::MouseButtonPress:
79 case QEvent::MouseButtonRelease:
95 disconnect( mFilterModel, SIGNAL( filterAboutToBeInvalidated() ),
this, SLOT( onFilterAboutToBeInvalidated() ) );
96 disconnect( mFilterModel, SIGNAL( filterInvalidated() ),
this, SLOT( onFilterInvalidated() ) );
99 mFilterModel = filterModel;
100 QTableView::setModel( filterModel );
102 connect( mFilterModel, SIGNAL( destroyed() ),
this, SLOT( modelDeleted() ) );
104 delete mFeatureSelectionModel;
105 mFeatureSelectionModel = 0;
109 if ( !mFeatureSelectionManager )
114 mFeatureSelectionModel =
new QgsFeatureSelectionModel( mFilterModel, mFilterModel, mFeatureSelectionManager, mFilterModel );
115 setSelectionModel( mFeatureSelectionModel );
117 connect( mFeatureSelectionModel, SIGNAL( requestRepaint( QModelIndexList ) ),
this, SLOT(
repaintRequested( QModelIndexList ) ) );
118 connect( mFeatureSelectionModel, SIGNAL( requestRepaint() ),
this, SLOT(
repaintRequested() ) );
124 if ( mFeatureSelectionManager )
125 delete mFeatureSelectionManager;
127 mFeatureSelectionManager = featureSelectionManager;
129 if ( mFeatureSelectionModel )
137 settings.setValue(
"/BetterAttributeTable/geometry", QVariant( saveGeometry() ) );
142 setSelectionMode( QAbstractItemView::NoSelection );
143 QTableView::mousePressEvent( event );
144 setSelectionMode( QAbstractItemView::ExtendedSelection );
149 setSelectionMode( QAbstractItemView::NoSelection );
150 QTableView::mouseReleaseEvent( event );
151 setSelectionMode( QAbstractItemView::ExtendedSelection );
156 setSelectionMode( QAbstractItemView::NoSelection );
157 QTableView::mouseMoveEvent( event );
158 setSelectionMode( QAbstractItemView::ExtendedSelection );
163 switch ( event->key() )
172 setSelectionMode( QAbstractItemView::NoSelection );
173 QTableView::keyPressEvent( event );
174 setSelectionMode( QAbstractItemView::ExtendedSelection );
178 QTableView::keyPressEvent( event );
185 foreach (
const QModelIndex
index, indexes )
193 setDirtyRegion( viewport()->rect() );
198 QItemSelection selection;
199 selection.append( QItemSelectionRange( mFilterModel->index( 0, 0 ), mFilterModel->index( mFilterModel->rowCount() - 1, 0 ) ) );
200 mFeatureSelectionModel->
selectFeatures( selection, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows );
208 QModelIndex idx = indexAt( event->pos() );
209 if ( !idx.isValid() )
218 mActionPopup =
new QMenu();
220 mActionPopup->addAction(
tr(
"Select All" ),
this, SLOT(
selectAll() ), QKeySequence::SelectAll );
225 if ( mActionPopup->actions().count() > 0 )
227 mActionPopup->popup( event->globalPos() );
241 void QgsAttributeTableView::modelDeleted()
244 mFeatureSelectionManager = 0;
245 mFeatureSelectionModel = 0;
250 if ( selectionBehavior() == QTableView::SelectColumns
251 || ( selectionMode() == QTableView::SingleSelection
252 && selectionBehavior() == QTableView::SelectItems ) )
255 if ( row >= 0 && row < model()->rowCount() )
257 int column = horizontalHeader()->logicalIndexAt( isRightToLeft() ? viewport()->width() : 0 );
258 QModelIndex
index = model()->index( row, column );
259 QItemSelectionModel::SelectionFlags command = selectionCommand( index );
260 selectionModel()->setCurrentIndex( index, QItemSelectionModel::NoUpdate );
261 if (( anchor && !( command & QItemSelectionModel::Current ) )
262 || ( selectionMode() == QTableView::SingleSelection ) )
263 mRowSectionAnchor = row;
265 if ( selectionMode() != QTableView::SingleSelection
266 && command.testFlag( QItemSelectionModel::Toggle ) )
269 mCtrlDragSelectionFlag = mFeatureSelectionModel->
isSelected( index )
270 ? QItemSelectionModel::Deselect : QItemSelectionModel::Select;
271 command &= ~QItemSelectionModel::Toggle;
272 command |= mCtrlDragSelectionFlag;
274 command |= QItemSelectionModel::Current;
277 QModelIndex tl = model()->index( qMin( mRowSectionAnchor, row ), 0 );
278 QModelIndex br = model()->index( qMax( mRowSectionAnchor, row ), model()->columnCount() - 1 );
279 if ( verticalHeader()->sectionsMoved() && tl.row() != br.row() )
280 setSelection( visualRect( tl ) | visualRect( br ), command );
282 mFeatureSelectionModel->
selectFeatures( QItemSelection( tl, br ), command );
virtual bool isSelected(QgsFeatureId fid)
Returns the selection status of a given feature id.
virtual bool eventFilter(QObject *object, QEvent *event) override
This event filter is installed on the verticalHeader to intercept mouse press and release events...
virtual void selectAll() override
void enableSync(bool enable)
Enables or disables synchronisation to the QgsVectorLayer When synchronisation is disabled...
void setFeatureSelectionModel(QgsFeatureSelectionModel *featureSelectionModel)
void mouseReleaseEvent(QMouseEvent *event) override
Called for mouse release events on a table cell.
QgsVectorLayer * layer() const
Returns the layer this filter acts on.
QgsAttributeTableView(QWidget *parent=0)
virtual void selectFeatures(const QItemSelection &selection, SelectionFlags command)
Select features on this table.
void mousePressEvent(QMouseEvent *event) override
Called for mouse press events on a table cell.
virtual void setFeatureSelectionManager(QgsIFeatureSelectionManager *featureSelectionManager)
virtual void setModel(QgsAttributeTableFilterModel *filterModel)
void willShowContextMenu(QMenu *menu, QModelIndex atIndex)
Is emitted, in order to provide a hook to add aditional menu entries to the context menu...
void mouseMoveEvent(QMouseEvent *event) override
Called for mouse move events on a table cell.
void setFeatureSelectionManager(QgsIFeatureSelectionManager *featureSelectionManager)
setFeatureSelectionManager
A delegate item class for QgsAttributeTable (see Qt documentation for QItemDelegate).
virtual void selectRow(int row)
virtual void _q_selectRow(int row)
virtual ~QgsAttributeTableView()
Is an interface class to abstract feature selection handling.
void closeEvent(QCloseEvent *event) override
Saves geometry to the settings on close.
Represents a vector layer which manages a vector based data sets.
void keyPressEvent(QKeyEvent *event) override
Called for key press events Disables selection change by only pressing an arrow key.
void contextMenuEvent(QContextMenuEvent *event) override
Is called when the context menu will be shown.