Skip to content

Commit 2e526b2

Browse files
author
wonder
committed
symbology-ng: Improved loading speed of the symbol properties dialog.
git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@14362 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 94264a9 commit 2e526b2

File tree

2 files changed

+62
-50
lines changed

2 files changed

+62
-50
lines changed

src/gui/symbology-ng/qgssymbollayerv2widget.cpp

+61-49
Original file line numberDiff line numberDiff line change
@@ -436,31 +436,58 @@ QgsSvgMarkerSymbolLayerV2Widget::QgsSvgMarkerSymbolLayerV2Widget( QWidget* paren
436436
connect( spinOffsetY, SIGNAL( valueChanged( double ) ), this, SLOT( setOffset() ) );
437437
}
438438

439-
void QgsSvgMarkerSymbolLayerV2Widget::populateList()
439+
#include <QTime>
440+
#include <QAbstractListModel>
441+
442+
class QgsSvgListModel : public QAbstractListModel
440443
{
441-
QStandardItemModel* m = new QStandardItemModel( viewImages );
442-
viewImages->setModel( m );
444+
public:
445+
QgsSvgListModel( QObject* parent ) : QAbstractListModel( parent )
446+
{
447+
mSvgFiles = QgsSvgMarkerSymbolLayerV2::listSvgFiles();
448+
}
443449

444-
QSvgRenderer renderer;
445-
QPainter painter;
450+
int rowCount( const QModelIndex & parent = QModelIndex() ) const
451+
{
452+
return mSvgFiles.count();
453+
}
446454

447-
foreach( QString entry, QgsSvgMarkerSymbolLayerV2::listSvgFiles() )
448-
{
449-
// render SVG file
450-
renderer.load( entry );
451-
QPixmap pixmap( renderer.defaultSize() );
452-
pixmap.fill();
453-
painter.begin( &pixmap );
454-
renderer.render( &painter );
455-
painter.end();
456-
457-
// add item
458-
QStandardItem* item = new QStandardItem( QIcon( pixmap ), QString() );
459-
item->setData( entry, Qt::UserRole );
460-
item->setToolTip( entry );
461-
m->appendRow( item );
462-
}
455+
QVariant data( const QModelIndex & index, int role = Qt::DisplayRole ) const
456+
{
457+
QString entry = mSvgFiles.at( index.row() );
458+
459+
if ( role == Qt::DecorationRole ) // icon
460+
{
461+
QSvgRenderer renderer;
462+
QPainter painter;
463+
464+
// render SVG file
465+
renderer.load( entry );
466+
QPixmap pixmap( QSize( 24, 24 ) );
467+
pixmap.fill();
468+
painter.begin( &pixmap );
469+
renderer.render( &painter );
470+
painter.end();
471+
472+
return pixmap;
473+
}
474+
else if ( role == Qt::UserRole || role == Qt::ToolTipRole )
475+
{
476+
return entry;
477+
}
478+
479+
return QVariant();
480+
}
463481

482+
protected:
483+
QStringList mSvgFiles;
484+
};
485+
486+
void QgsSvgMarkerSymbolLayerV2Widget::populateList()
487+
{
488+
QgsSvgListModel* m = new QgsSvgListModel( viewImages );
489+
490+
viewImages->setModel( m );
464491
}
465492

466493

@@ -474,19 +501,21 @@ void QgsSvgMarkerSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer )
474501

475502
// set values
476503

477-
QStandardItemModel* m = static_cast<QStandardItemModel*>( viewImages->model() );
504+
QAbstractItemModel* m = viewImages->model();
505+
QItemSelectionModel* selModel = viewImages->selectionModel();
478506
for ( int i = 0; i < m->rowCount(); i++ )
479507
{
480-
QStandardItem* item = m->item( i, 0 );
481-
if ( item->data( Qt::UserRole ).toString() == mLayer->path() )
508+
QModelIndex idx( m->index( i, 0 ) );
509+
if ( m->data( idx ).toString() == mLayer->path() )
482510
{
483-
viewImages->selectionModel()->select( item->index(), QItemSelectionModel::SelectCurrent );
484-
viewImages->selectionModel()->setCurrentIndex( item->index(), QItemSelectionModel::SelectCurrent );
511+
selModel->select( idx, QItemSelectionModel::SelectCurrent );
512+
selModel->setCurrentIndex( idx, QItemSelectionModel::SelectCurrent );
485513
break;
486514
}
487515
}
488516

489517

518+
490519
spinSize->setValue( mLayer->size() );
491520
spinAngle->setValue( mLayer->angle() );
492521

@@ -578,6 +607,8 @@ QgsSVGFillSymbolLayerWidget::QgsSVGFillSymbolLayerWidget( QWidget* parent ): Qgs
578607
setupUi( this );
579608
insertIcons();
580609
updateOutlineIcon();
610+
611+
connect( mSvgListView->selectionModel(), SIGNAL( currentChanged( const QModelIndex&, const QModelIndex& ) ), this, SLOT( setFile( const QModelIndex& ) ) );
581612
}
582613

583614
void QgsSVGFillSymbolLayerWidget::setSymbolLayer( QgsSymbolLayerV2* layer )
@@ -642,34 +673,15 @@ void QgsSVGFillSymbolLayerWidget::on_mSVGLineEdit_textChanged( const QString & t
642673
emit changed();
643674
}
644675

645-
void QgsSVGFillSymbolLayerWidget::on_mSvgListWidget_currentItemChanged( QListWidgetItem* item, QListWidgetItem* previous )
676+
void QgsSVGFillSymbolLayerWidget::setFile( const QModelIndex& item )
646677
{
647-
mSVGLineEdit->setText( item->data( Qt::UserRole ).toString() );
678+
mSVGLineEdit->setText( item.data( Qt::UserRole ).toString() );
648679
}
649680

650681
void QgsSVGFillSymbolLayerWidget::insertIcons()
651682
{
652-
mSvgListWidget->clear();
653-
654-
QStringList svgFiles = QgsSvgMarkerSymbolLayerV2::listSvgFiles();
655-
QSvgRenderer renderer;
656-
QPainter painter;
657-
658-
QStringList::const_iterator it = svgFiles.constBegin();
659-
for ( ; it != svgFiles.constEnd(); ++it )
660-
{
661-
renderer.load( *it );
662-
QPixmap pixmap( renderer.defaultSize() );
663-
pixmap.fill();
664-
painter.begin( &pixmap );
665-
renderer.render( &painter );
666-
painter.end();
667-
668-
QListWidgetItem* item = new QListWidgetItem( mSvgListWidget );
669-
item->setData( Qt::UserRole, *it );
670-
item->setIcon( QIcon( pixmap ) );
671-
item->setToolTip( *it );
672-
}
683+
QgsSvgListModel* m = new QgsSvgListModel( mSvgListView );
684+
mSvgListView->setModel( m );
673685
}
674686

675687
void QgsSVGFillSymbolLayerWidget::on_mChangeOutlinePushButton_clicked()

src/gui/symbology-ng/qgssymbollayerv2widget.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ class GUI_EXPORT QgsSVGFillSymbolLayerWidget : public QgsSymbolLayerV2Widget, pr
243243
void on_mBrowseToolButton_clicked();
244244
void on_mTextureWidthSpinBox_valueChanged( double d );
245245
void on_mSVGLineEdit_textChanged( const QString & text );
246-
void on_mSvgListWidget_currentItemChanged( QListWidgetItem* item, QListWidgetItem* previous );
246+
void setFile( const QModelIndex& item );
247247
void on_mChangeOutlinePushButton_clicked();
248248
};
249249

0 commit comments

Comments
 (0)