1515
1616#include " qgsdatadefinedsizelegenddialog.h"
1717
18+ #include < QInputDialog>
19+
1820#include " qgsdatadefinedsizelegend.h"
1921#include " qgslayertree.h"
2022#include " qgslayertreemodel.h"
@@ -51,7 +53,7 @@ QgsDataDefinedSizeLegendDialog::QgsDataDefinedSizeLegendDialog( const QgsDataDef
5153 else
5254 cboAlignSymbols->setCurrentIndex ( 1 );
5355
54- symbol = ddsLegend->symbol (); // may be null (undefined)
56+ symbol = ddsLegend->symbol () ? ddsLegend-> symbol ()-> clone () : nullptr ; // may be null (undefined)
5557 }
5658
5759 if ( overrideSymbol )
@@ -71,6 +73,28 @@ QgsDataDefinedSizeLegendDialog::QgsDataDefinedSizeLegendDialog( const QgsDataDef
7173 QIcon icon = QgsSymbolLayerUtils::symbolPreviewIcon ( mSourceSymbol .get (), btnChangeSymbol->iconSize () );
7274 btnChangeSymbol->setIcon ( icon );
7375
76+ mSizeClassesModel = new QStandardItemModel ( viewSizeClasses );
77+ mSizeClassesModel ->setHorizontalHeaderLabels ( QStringList () << tr ( " Value" ) );
78+ mSizeClassesModel ->setSortRole ( Qt::UserRole + 1 );
79+ if ( ddsLegend )
80+ {
81+ groupManualSizeClasses->setChecked ( !ddsLegend->classes ().isEmpty () );
82+ Q_FOREACH ( const QgsDataDefinedSizeLegend::SizeClass &sc, ddsLegend->classes () )
83+ {
84+ QStandardItem *item = new QStandardItem ( sc.label );
85+ item->setEditable ( false );
86+ item->setData ( sc.label .toInt () );
87+ mSizeClassesModel ->appendRow ( item );
88+ }
89+ mSizeClassesModel ->sort ( 0 );
90+ }
91+
92+ connect ( groupManualSizeClasses, &QGroupBox::clicked, this , &QgsDataDefinedSizeLegendDialog::updatePreview );
93+ connect ( btnAddClass, &QToolButton::clicked, this , &QgsDataDefinedSizeLegendDialog::addSizeClass );
94+ connect ( btnRemoveClass, &QToolButton::clicked, this , &QgsDataDefinedSizeLegendDialog::removeSizeClass );
95+
96+ viewSizeClasses->setModel ( mSizeClassesModel );
97+
7498 // prepare layer and model to preview legend
7599 mPreviewLayer = new QgsVectorLayer ( " Point?crs=EPSG:4326" , " Preview" , " memory" );
76100 mPreviewTree = new QgsLayerTree;
@@ -107,6 +131,18 @@ QgsDataDefinedSizeLegend *QgsDataDefinedSizeLegendDialog::dataDefinedSizeLegend(
107131 {
108132 ddsLegend->setSymbol ( mSourceSymbol ->clone () );
109133 }
134+ if ( groupManualSizeClasses->isChecked () )
135+ {
136+ const QgsSizeScaleTransformer *transformer = dynamic_cast <const QgsSizeScaleTransformer *>( mSizeProperty .transformer () );
137+ QList<QgsDataDefinedSizeLegend::SizeClass> classes;
138+ for ( int i = 0 ; i < mSizeClassesModel ->rowCount (); ++i )
139+ {
140+ double value = mSizeClassesModel ->data ( mSizeClassesModel ->index ( i, 0 ), Qt::UserRole + 1 ).toDouble ();
141+ double size = transformer ? transformer->size ( value ) : value;
142+ classes << QgsDataDefinedSizeLegend::SizeClass ( size, QString::number ( value ) );
143+ }
144+ ddsLegend->setClasses ( classes );
145+ }
110146 return ddsLegend;
111147}
112148
@@ -150,3 +186,29 @@ void QgsDataDefinedSizeLegendDialog::changeSymbol()
150186
151187 updatePreview ();
152188}
189+
190+ void QgsDataDefinedSizeLegendDialog::addSizeClass ()
191+ {
192+ bool ok;
193+ double v = QInputDialog::getDouble ( this , tr ( " Add Size Class" ), tr ( " Enter value for a new class" ),
194+ 0 , -2147483647 , 2147483647 , 6 , &ok );
195+ if ( !ok )
196+ return ;
197+
198+ QStandardItem *item = new QStandardItem ( QString::number ( v ) );
199+ item->setEditable ( false );
200+ item->setData ( v );
201+ mSizeClassesModel ->appendRow ( item );
202+ mSizeClassesModel ->sort ( 0 );
203+ updatePreview ();
204+ }
205+
206+ void QgsDataDefinedSizeLegendDialog::removeSizeClass ()
207+ {
208+ QModelIndex idx = viewSizeClasses->currentIndex ();
209+ if ( !idx.isValid () )
210+ return ;
211+
212+ mSizeClassesModel ->removeRow ( idx.row () );
213+ updatePreview ();
214+ }
0 commit comments