30
30
#include < QPainter>
31
31
#include < QImage>
32
32
#include < QFileDialog>
33
- #include < QListWidgetItem>
34
33
#include < QKeyEvent>
34
+ #include < QAbstractListModel>
35
35
36
36
#define DO_NOT_USE_STR " <off>"
37
37
38
+
39
+ class QgsMarkerListModel : public QAbstractListModel
40
+ {
41
+ public:
42
+ QgsMarkerListModel ( QObject* parent ) : QAbstractListModel( parent )
43
+ {
44
+ mMarkers = QgsMarkerCatalogue::instance ()->list ();
45
+ }
46
+
47
+ int rowCount ( const QModelIndex & parent = QModelIndex() ) const
48
+ {
49
+ return mMarkers .size ();
50
+ }
51
+
52
+ QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const
53
+ {
54
+ QString marker = mMarkers .at ( index .row () );
55
+
56
+ if ( role == Qt::DecorationRole ) // icon
57
+ {
58
+ QPen pen ( QColor ( 0 , 0 , 255 ) );
59
+ QBrush brush ( QColor ( 220 , 220 , 220 ), Qt::SolidPattern );
60
+ return QPixmap::fromImage ( QgsMarkerCatalogue::instance ()->imageMarker ( marker, 18 , pen, brush ) );
61
+ }
62
+ else if ( role == Qt::UserRole || role == Qt::ToolTipRole )
63
+ {
64
+ return marker;
65
+ }
66
+
67
+ return QVariant ();
68
+ }
69
+
70
+ protected:
71
+ QStringList mMarkers ;
72
+ };
73
+
74
+
38
75
QgsSingleSymbolDialog::QgsSingleSymbolDialog (): QDialog(), mVectorLayer( 0 )
39
76
{
40
77
setupUi ( this );
@@ -71,8 +108,8 @@ QgsSingleSymbolDialog::QgsSingleSymbolDialog( QgsVectorLayer * layer, bool disab
71
108
connect ( btnFillColor, SIGNAL ( clicked () ), this , SLOT ( selectFillColor () ) );
72
109
connect ( outlinewidthspinbox, SIGNAL ( valueChanged ( double ) ), this , SLOT ( resendSettingsChanged () ) );
73
110
connect ( mLabelEdit , SIGNAL ( textChanged ( const QString& ) ), this , SLOT ( resendSettingsChanged () ) );
74
- connect ( lstSymbols, SIGNAL ( currentItemChanged ( QListWidgetItem *, QListWidgetItem * ) ),
75
- this , SLOT ( symbolChanged ( QListWidgetItem *, QListWidgetItem * ) ) );
111
+ connect ( lstSymbols, SIGNAL ( currentChanged ( const QModelIndex & , const QModelIndex & ) ),
112
+ this , SLOT ( symbolChanged ( const QModelIndex & , const QModelIndex & ) ) );
76
113
connect ( mPointSizeSpinBox , SIGNAL ( valueChanged ( double ) ), this , SLOT ( resendSettingsChanged () ) );
77
114
connect ( mPointSizeUnitsCheckBox , SIGNAL ( toggled ( bool ) ), this , SLOT ( resendSettingsChanged () ) );
78
115
connect ( mRotationClassificationComboBox , SIGNAL ( currentIndexChanged ( const QString & ) ),
@@ -95,32 +132,8 @@ QgsSingleSymbolDialog::QgsSingleSymbolDialog( QgsVectorLayer * layer, bool disab
95
132
96
133
void QgsSingleSymbolDialog::refreshMarkers ()
97
134
{
98
- lstSymbols->blockSignals ( true );
99
- lstSymbols->clear ();
100
-
101
- QPen pen ( QColor ( 0 , 0 , 255 ) );
102
- QBrush brush ( QColor ( 220 , 220 , 220 ), Qt::SolidPattern );
103
- int size = 18 ;
104
- int myCounter = 0 ;
105
- QStringList ml = QgsMarkerCatalogue::instance ()->list ();
106
- for ( QStringList::iterator it = ml.begin (); it != ml.end (); ++it )
107
- {
108
- QPixmap myPixmap = QPixmap::fromImage ( QgsMarkerCatalogue::instance ()->imageMarker ( *it, size, pen, brush ) );
109
- QListWidgetItem * mypItem = new QListWidgetItem ( lstSymbols );
110
- QIcon myIcon;
111
- myIcon.addPixmap ( myPixmap );
112
- mypItem->setIcon ( myIcon );
113
- mypItem->setText ( " " );
114
- mypItem->setToolTip ( *it );
115
- // store the symbol offset in the UserData role for later retrieval
116
- mypItem->setData ( Qt::UserRole, *it );
117
- mypItem->setFlags ( Qt::ItemIsSelectable | Qt::ItemIsEnabled );
118
- if ( mVectorLayer && mVectorLayer ->geometryType () != QGis::Point )
119
- {
120
- break ;
121
- }
122
- ++myCounter;
123
- }
135
+ QgsMarkerListModel *m = new QgsMarkerListModel ( lstSymbols );
136
+ lstSymbols->setModel ( m );
124
137
125
138
// Find out the numerical fields of mVectorLayer, and populate the ComboBoxes
126
139
QgsVectorDataProvider *provider = mVectorLayer ->dataProvider ();
@@ -283,9 +296,10 @@ void QgsSingleSymbolDialog::apply( QgsSymbol *sy )
283
296
//
284
297
// Apply point symbol
285
298
//
286
- if ( lstSymbols->isEnabled () && lstSymbols->currentItem () )
299
+ if ( lstSymbols->isEnabled () && lstSymbols->currentIndex (). isValid () )
287
300
{
288
- sy->setNamedPointSymbol ( lstSymbols->currentItem ()->data ( Qt::UserRole ).toString () ) ;
301
+ QAbstractItemModel *m = lstSymbols->model ();
302
+ sy->setNamedPointSymbol ( m->data ( lstSymbols->currentIndex (), Qt::UserRole ).toString () );
289
303
}
290
304
291
305
if ( mPointSizeSpinBox ->isEnabled () )
@@ -376,12 +390,15 @@ void QgsSingleSymbolDialog::set( const QgsSymbol *sy )
376
390
377
391
// Set point symbol
378
392
QString mySymbolName = sy->pointSymbolName ();
379
- for ( int i = 0 ; i < lstSymbols->count (); ++i )
393
+
394
+ QAbstractItemModel *m = lstSymbols->model ();
395
+ for ( int i = 0 ; i < m->rowCount (); i++ )
380
396
{
381
- if ( lstSymbols->item ( i )->data ( Qt::UserRole ).toString () == ( mySymbolName ) )
397
+ QModelIndex idx ( m->index ( i, 0 ) );
398
+ if ( m->data ( idx, Qt::UserRole ).toString () == mySymbolName )
382
399
{
383
- lstSymbols->setCurrentItem ( lstSymbols-> item ( i ) );
384
- lstSymbols-> item ( i )-> setBackground ( QBrush ( Qt::cyan ) );
400
+ lstSymbols->setCurrentIndex ( idx );
401
+ // m->setData( idx, Qt::UserRole+1, Qt::cyan );
385
402
break ;
386
403
}
387
404
}
@@ -478,8 +495,13 @@ void QgsSingleSymbolDialog::updateSet( const QgsSymbol *sy )
478
495
if ( mLabelEdit ->isEnabled () && mLabelEdit ->text () != sy->label () )
479
496
mLabelEdit ->setEnabled ( false );
480
497
481
- if ( lstSymbols->isEnabled () && lstSymbols->currentItem ()->data ( Qt::UserRole ).toString () != sy->pointSymbolName () )
482
- lstSymbols->setEnabled ( false );
498
+ if ( lstSymbols->isEnabled () && lstSymbols->currentIndex ().isValid () )
499
+ {
500
+ QAbstractItemModel *m = lstSymbols->model ();
501
+
502
+ if ( m->data ( lstSymbols->currentIndex (), Qt::UserRole ).toString () != sy->pointSymbolName () )
503
+ lstSymbols->setEnabled ( false );
504
+ }
483
505
484
506
if ( mPointSizeSpinBox ->isEnabled () && !doubleNear ( mPointSizeSpinBox ->value (), sy->pointSize () ) )
485
507
mPointSizeSpinBox ->setEnabled ( false );
@@ -612,14 +634,12 @@ void QgsSingleSymbolDialog::setLabel( QString label )
612
634
mLabelEdit ->setText ( label );
613
635
}
614
636
615
- void QgsSingleSymbolDialog::symbolChanged
616
- ( QListWidgetItem * current, QListWidgetItem * previous )
637
+ void QgsSingleSymbolDialog::symbolChanged ( const QModelIndex ¤t, const QModelIndex &previous )
617
638
{
618
- current->setBackground ( QBrush ( Qt::cyan ) );
619
- if ( previous )
620
- {
621
- previous->setBackground ( QBrush ( Qt::white ) );
622
- }
639
+ QAbstractItemModel *m = lstSymbols->model ();
640
+ QgsDebugMsg ( QString ( " symbol changed to %1:%2" ).arg ( current.row () ).arg ( m->data ( current, Qt::UserRole ).toString () ) );
641
+ // m->setData( current, Qt::UserRole+1, Qt::cyan );
642
+ // m->setData( prev, Qt::UserRole+1, Qt::white );
623
643
emit settingsChanged ();
624
644
}
625
645
0 commit comments