41
41
#include " qgsgui.h"
42
42
#include " qgsnative.h"
43
43
#include " qgsmaptoolpan.h"
44
+ #include " qgsvectorlayercache.h"
45
+ #include " qgsattributetablemodel.h"
46
+ #include " qgsattributetablefiltermodel.h"
44
47
#include < QDesktopServices>
45
48
46
49
#include < QDragEnterEvent>
@@ -133,6 +136,11 @@ QgsBrowserLayerProperties::QgsBrowserLayerProperties( QWidget *parent )
133
136
mMapCanvas ->freeze ( false );
134
137
mMapCanvas ->refresh ();
135
138
}
139
+ else if ( mTabWidget ->currentWidget () == mAttributesTab )
140
+ {
141
+ if ( ! mAttributeTableFilterModel )
142
+ loadAttributeTable ();
143
+ }
136
144
} );
137
145
}
138
146
@@ -202,6 +210,13 @@ void QgsBrowserLayerProperties::setItem( QgsDataItem *item )
202
210
return ;
203
211
}
204
212
213
+ mAttributeTable ->setModel ( nullptr );
214
+ if ( mAttributeTableFilterModel )
215
+ {
216
+ // Cleanup
217
+ mAttributeTableFilterModel ->deleteLater ();
218
+ mAttributeTableFilterModel = nullptr ;
219
+ }
205
220
if ( mLayer && mLayer ->isValid () )
206
221
{
207
222
bool ok = false ;
@@ -212,6 +227,12 @@ void QgsBrowserLayerProperties::setItem( QgsDataItem *item )
212
227
mMapCanvas ->setDestinationCrs ( mLayer ->crs () );
213
228
mMapCanvas ->setLayers ( QList< QgsMapLayer * >() << mLayer .get () );
214
229
mMapCanvas ->zoomToFullExtent ();
230
+
231
+ if ( mAttributesTab && mLayer ->type () != QgsMapLayer::VectorLayer )
232
+ {
233
+ mTabWidget ->removeTab ( mTabWidget ->indexOf ( mAttributesTab ) );
234
+ mAttributesTab = nullptr ;
235
+ }
215
236
}
216
237
217
238
QString myStyle = QgsApplication::reportStyleSheet ();
@@ -247,6 +268,39 @@ void QgsBrowserLayerProperties::urlClicked( const QUrl &url )
247
268
QDesktopServices::openUrl ( url );
248
269
}
249
270
271
+ void QgsBrowserLayerProperties::loadAttributeTable ()
272
+ {
273
+ if ( !mLayer || !mLayer ->isValid () || mLayer ->type () != QgsMapLayer::VectorLayer )
274
+ return ;
275
+
276
+ // Initialize the cache
277
+ QgsVectorLayerCache *layerCache = new QgsVectorLayerCache ( qobject_cast< QgsVectorLayer * >( mLayer .get () ), 1000 , this );
278
+ layerCache->setCacheGeometry ( false );
279
+ QgsAttributeTableModel *tableModel = new QgsAttributeTableModel ( layerCache, this );
280
+ mAttributeTableFilterModel = new QgsAttributeTableFilterModel ( nullptr , tableModel, this );
281
+ tableModel->setRequest ( QgsFeatureRequest ().setFlags ( QgsFeatureRequest::NoGeometry ).setLimit ( 100 ) );
282
+ layerCache->setParent ( tableModel );
283
+ tableModel->setParent ( mAttributeTableFilterModel );
284
+
285
+ mAttributeTable ->setModel ( mAttributeTableFilterModel );
286
+ tableModel->loadLayer ();
287
+ QFont font = mAttributeTable ->font ();
288
+ int fontSize = font.pointSize ();
289
+ #ifdef Q_OS_WIN
290
+ fontSize = std::max ( fontSize - 1 , 8 ); // bit less on windows, due to poor rendering of small point sizes
291
+ #else
292
+ fontSize = std::max ( fontSize - 2 , 6 );
293
+ #endif
294
+ font.setPointSize ( fontSize );
295
+ mAttributeTable ->setFont ( font );
296
+
297
+ // we can safely do this expensive operation here (unlike in the main attribute table), because at most we have only 100 rows...
298
+ mAttributeTable ->resizeColumnsToContents ();
299
+ mAttributeTable ->resizeRowsToContents ();
300
+ mAttributeTable ->verticalHeader ()->setVisible ( false ); // maximize valuable table space
301
+ mAttributeTable ->setAlternatingRowColors ( true );
302
+ }
303
+
250
304
QgsBrowserDirectoryProperties::QgsBrowserDirectoryProperties ( QWidget *parent )
251
305
: QgsBrowserPropertiesWidget( parent )
252
306
0 commit comments