[QGIS Commit] r14362 - trunk/qgis/src/gui/symbology-ng

svn_qgis at osgeo.org svn_qgis at osgeo.org
Sun Oct 10 13:38:57 EDT 2010


Author: wonder
Date: 2010-10-10 10:38:57 -0700 (Sun, 10 Oct 2010)
New Revision: 14362

Modified:
   trunk/qgis/src/gui/symbology-ng/qgssymbollayerv2widget.cpp
   trunk/qgis/src/gui/symbology-ng/qgssymbollayerv2widget.h
Log:
symbology-ng: Improved loading speed of the symbol properties dialog.


Modified: trunk/qgis/src/gui/symbology-ng/qgssymbollayerv2widget.cpp
===================================================================
--- trunk/qgis/src/gui/symbology-ng/qgssymbollayerv2widget.cpp	2010-10-10 16:29:14 UTC (rev 14361)
+++ trunk/qgis/src/gui/symbology-ng/qgssymbollayerv2widget.cpp	2010-10-10 17:38:57 UTC (rev 14362)
@@ -436,31 +436,58 @@
   connect( spinOffsetY, SIGNAL( valueChanged( double ) ), this, SLOT( setOffset() ) );
 }
 
-void QgsSvgMarkerSymbolLayerV2Widget::populateList()
+#include <QTime>
+#include <QAbstractListModel>
+
+class QgsSvgListModel : public QAbstractListModel
 {
-  QStandardItemModel* m = new QStandardItemModel( viewImages );
-  viewImages->setModel( m );
+  public:
+    QgsSvgListModel( QObject* parent ) : QAbstractListModel( parent )
+    {
+      mSvgFiles = QgsSvgMarkerSymbolLayerV2::listSvgFiles();
+    }
 
-  QSvgRenderer renderer;
-  QPainter painter;
+    int rowCount( const QModelIndex & parent = QModelIndex() ) const
+    {
+      return mSvgFiles.count();
+    }
 
-  foreach( QString entry, QgsSvgMarkerSymbolLayerV2::listSvgFiles() )
-  {
-    // render SVG file
-    renderer.load( entry );
-    QPixmap pixmap( renderer.defaultSize() );
-    pixmap.fill();
-    painter.begin( &pixmap );
-    renderer.render( &painter );
-    painter.end();
+    QVariant data( const QModelIndex & index, int role = Qt::DisplayRole ) const
+    {
+      QString entry = mSvgFiles.at( index.row() );
 
-    // add item
-    QStandardItem* item = new QStandardItem( QIcon( pixmap ), QString() );
-    item->setData( entry, Qt::UserRole );
-    item->setToolTip( entry );
-    m->appendRow( item );
-  }
+      if ( role == Qt::DecorationRole ) // icon
+      {
+        QSvgRenderer renderer;
+        QPainter painter;
 
+        // render SVG file
+        renderer.load( entry );
+        QPixmap pixmap( QSize( 24, 24 ) );
+        pixmap.fill();
+        painter.begin( &pixmap );
+        renderer.render( &painter );
+        painter.end();
+
+        return pixmap;
+      }
+      else if ( role == Qt::UserRole || role == Qt::ToolTipRole )
+      {
+        return entry;
+      }
+
+      return QVariant();
+    }
+
+  protected:
+    QStringList mSvgFiles;
+};
+
+void QgsSvgMarkerSymbolLayerV2Widget::populateList()
+{
+  QgsSvgListModel* m = new QgsSvgListModel( viewImages );
+
+  viewImages->setModel( m );
 }
 
 
@@ -474,19 +501,21 @@
 
   // set values
 
-  QStandardItemModel* m = static_cast<QStandardItemModel*>( viewImages->model() );
+  QAbstractItemModel* m = viewImages->model();
+  QItemSelectionModel* selModel = viewImages->selectionModel();
   for ( int i = 0; i < m->rowCount(); i++ )
   {
-    QStandardItem* item = m->item( i, 0 );
-    if ( item->data( Qt::UserRole ).toString() == mLayer->path() )
+    QModelIndex idx( m->index( i, 0 ) );
+    if ( m->data( idx ).toString() == mLayer->path() )
     {
-      viewImages->selectionModel()->select( item->index(), QItemSelectionModel::SelectCurrent );
-      viewImages->selectionModel()->setCurrentIndex( item->index(), QItemSelectionModel::SelectCurrent );
+      selModel->select( idx, QItemSelectionModel::SelectCurrent );
+      selModel->setCurrentIndex( idx, QItemSelectionModel::SelectCurrent );
       break;
     }
   }
 
 
+
   spinSize->setValue( mLayer->size() );
   spinAngle->setValue( mLayer->angle() );
 
@@ -578,6 +607,8 @@
   setupUi( this );
   insertIcons();
   updateOutlineIcon();
+
+  connect( mSvgListView->selectionModel(), SIGNAL( currentChanged( const QModelIndex&, const QModelIndex& ) ), this, SLOT( setFile( const QModelIndex& ) ) );
 }
 
 void QgsSVGFillSymbolLayerWidget::setSymbolLayer( QgsSymbolLayerV2* layer )
@@ -642,34 +673,15 @@
   emit changed();
 }
 
-void QgsSVGFillSymbolLayerWidget::on_mSvgListWidget_currentItemChanged( QListWidgetItem* item, QListWidgetItem* previous )
+void QgsSVGFillSymbolLayerWidget::setFile( const QModelIndex& item )
 {
-  mSVGLineEdit->setText( item->data( Qt::UserRole ).toString() );
+  mSVGLineEdit->setText( item.data( Qt::UserRole ).toString() );
 }
 
 void QgsSVGFillSymbolLayerWidget::insertIcons()
 {
-  mSvgListWidget->clear();
-
-  QStringList svgFiles = QgsSvgMarkerSymbolLayerV2::listSvgFiles();
-  QSvgRenderer renderer;
-  QPainter painter;
-
-  QStringList::const_iterator it = svgFiles.constBegin();
-  for ( ; it != svgFiles.constEnd(); ++it )
-  {
-    renderer.load( *it );
-    QPixmap pixmap( renderer.defaultSize() );
-    pixmap.fill();
-    painter.begin( &pixmap );
-    renderer.render( &painter );
-    painter.end();
-
-    QListWidgetItem* item = new QListWidgetItem( mSvgListWidget );
-    item->setData( Qt::UserRole, *it );
-    item->setIcon( QIcon( pixmap ) );
-    item->setToolTip( *it );
-  }
+  QgsSvgListModel* m = new QgsSvgListModel( mSvgListView );
+  mSvgListView->setModel( m );
 }
 
 void QgsSVGFillSymbolLayerWidget::on_mChangeOutlinePushButton_clicked()

Modified: trunk/qgis/src/gui/symbology-ng/qgssymbollayerv2widget.h
===================================================================
--- trunk/qgis/src/gui/symbology-ng/qgssymbollayerv2widget.h	2010-10-10 16:29:14 UTC (rev 14361)
+++ trunk/qgis/src/gui/symbology-ng/qgssymbollayerv2widget.h	2010-10-10 17:38:57 UTC (rev 14362)
@@ -243,7 +243,7 @@
     void on_mBrowseToolButton_clicked();
     void on_mTextureWidthSpinBox_valueChanged( double d );
     void on_mSVGLineEdit_textChanged( const QString & text );
-    void on_mSvgListWidget_currentItemChanged( QListWidgetItem* item, QListWidgetItem* previous );
+    void setFile( const QModelIndex& item );
     void on_mChangeOutlinePushButton_clicked();
 };
 



More information about the QGIS-commit mailing list