28#include "moc_qgslayoutchartwidget.cpp"
32 , mChartItem( chartItem )
38 mainLayout->addWidget( mItemPropertiesWidget );
41 for (
auto plotTypesIterator = plotTypes.keyValueBegin(); plotTypesIterator != plotTypes.keyValueEnd(); ++plotTypesIterator )
43 mChartTypeComboBox->addItem( plotTypesIterator->second, plotTypesIterator->first );
48 connect( mChartTypeComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsLayoutChartWidget::mChartTypeComboBox_currentIndexChanged );
49 connect( mChartPropertiesButton, &QPushButton::clicked,
this, &QgsLayoutChartWidget::mChartPropertiesButton_clicked );
50 connect( mFlipAxesCheckBox, &QCheckBox::stateChanged,
this, &QgsLayoutChartWidget::mFlipAxesCheckBox_stateChanged );
54 connect( mSortCheckBox, &QCheckBox::stateChanged,
this, &QgsLayoutChartWidget::mSortCheckBox_stateChanged );
56 connect( mSortDirectionButton, &QToolButton::clicked,
this, &QgsLayoutChartWidget::mSortDirectionButton_clicked );
58 connect( mSeriesListWidget, &QListWidget::currentItemChanged,
this, &QgsLayoutChartWidget::mSeriesListWidget_currentItemChanged );
59 connect( mSeriesListWidget, &QListWidget::itemChanged,
this, &QgsLayoutChartWidget::mSeriesListWidget_itemChanged );
60 connect( mAddSeriesPushButton, &QPushButton::clicked,
this, &QgsLayoutChartWidget::mAddSeriesPushButton_clicked );
61 connect( mRemoveSeriesPushButton, &QPushButton::clicked,
this, &QgsLayoutChartWidget::mRemoveSeriesPushButton_clicked );
62 connect( mSeriesPropertiesButton, &QPushButton::clicked,
this, &QgsLayoutChartWidget::mSeriesPropertiesButton_clicked );
64 mLinkedMapComboBox->setCurrentLayout( mChartItem->layout() );
68 connect( mFilterOnlyVisibleFeaturesCheckBox, &QCheckBox::stateChanged,
this, &QgsLayoutChartWidget::mFilterOnlyVisibleFeaturesCheckBox_stateChanged );
69 connect( mIntersectAtlasCheckBox, &QCheckBox::stateChanged,
this, &QgsLayoutChartWidget::mIntersectAtlasCheckBox_stateChanged );
71 setGuiElementValues();
79 if ( mItemPropertiesWidget )
80 mItemPropertiesWidget->setMasterLayout( masterLayout );
93 mChartItem = qobject_cast<QgsLayoutItemChart *>( item );
94 mItemPropertiesWidget->setItem( mChartItem );
101 setGuiElementValues();
106void QgsLayoutChartWidget::setGuiElementValues()
110 whileBlocking( mChartTypeComboBox )->setCurrentIndex( mChartTypeComboBox->findData( mChartItem->plot()->type() ) );
111 whileBlocking( mLayerComboBox )->setLayer( mChartItem->sourceLayer() );
116 mFlipAxesCheckBox->setEnabled(
true );
121 mFlipAxesCheckBox->setEnabled(
false );
125 whileBlocking( mSortCheckBox )->setCheckState( mChartItem->sortFeatures() ? Qt::Checked : Qt::Unchecked );
127 whileBlocking( mSortDirectionButton )->setEnabled( mChartItem->sortFeatures() );
128 whileBlocking( mSortDirectionButton )->setArrowType( mChartItem->sortAscending() ? Qt::UpArrow : Qt::DownArrow );
130 whileBlocking( mSortExpressionWidget )->setEnabled( mChartItem->sortFeatures() );
131 whileBlocking( mSortExpressionWidget )->setLayer( mChartItem->sourceLayer() );
132 whileBlocking( mSortExpressionWidget )->setField( mChartItem->sortExpression() );
134 mSeriesListWidget->clear();
135 const QList<QgsLayoutItemChart::SeriesDetails> seriesList = mChartItem->seriesList();
136 for (
const QgsLayoutItemChart::SeriesDetails &series : seriesList )
138 addSeriesListItem( series.name() );
141 if ( !seriesList.isEmpty() )
143 mSeriesListWidget->setCurrentRow( 0 );
147 mSeriesPropertiesButton->setEnabled(
false );
150 whileBlocking( mFilterOnlyVisibleFeaturesCheckBox )->setChecked( mChartItem->filterOnlyVisibleFeatures() );
151 mLinkedMapLabel->setEnabled( mFilterOnlyVisibleFeaturesCheckBox->isChecked() );
152 mLinkedMapComboBox->setEnabled( mFilterOnlyVisibleFeaturesCheckBox->isChecked() );
153 whileBlocking( mLinkedMapComboBox )->setItem( mChartItem->map() );
155 whileBlocking( mIntersectAtlasCheckBox )->setChecked( mChartItem->filterToAtlasFeature() );
159 mSeriesListWidget->clear();
163void QgsLayoutChartWidget::mChartTypeComboBox_currentIndexChanged(
int )
170 const QString plotType = mChartTypeComboBox->currentData().toString();
171 if ( mChartItem->plot()->type() == plotType )
176 QgsPlot *oldPlot = mChartItem->plot();
180 Qgs2DXyPlot *newPlot2DXy =
dynamic_cast<Qgs2DXyPlot *
>( newPlot );
183 mFlipAxesCheckBox->setEnabled(
true );
184 mFlipAxesCheckBox->setChecked( newPlot2DXy->
flipAxes() );
188 mFlipAxesCheckBox->setEnabled(
false );
189 mFlipAxesCheckBox->setChecked(
false );
192 mChartItem->beginCommand( tr(
"Change Chart Type" ) );
193 mChartItem->setPlot( newPlot );
194 mChartItem->update();
195 mChartItem->endCommand();
198void QgsLayoutChartWidget::mChartPropertiesButton_clicked()
207 const QString plotType = mChartTypeComboBox->currentData().toString();
209 if ( !abstractMetadata )
221 widget->
setPlot( mChartItem->plot() );
229 mChartItem->beginCommand( tr(
"Modify Chart" ) );
231 mChartItem->endCommand();
232 mChartItem->update();
238void QgsLayoutChartWidget::mFlipAxesCheckBox_stateChanged(
int state )
245 Qgs2DXyPlot *plot2DXy =
dynamic_cast<Qgs2DXyPlot *
>( mChartItem->plot() );
251 mChartItem->beginCommand( tr(
"Modify Chart" ) );
253 mChartItem->endCommand();
254 mChartItem->update();
257void QgsLayoutChartWidget::changeLayer(
QgsMapLayer *layer )
264 QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( layer );
270 mChartItem->beginCommand( tr(
"Change Chart Source Layer" ) );
271 mChartItem->setSourceLayer( vl );
272 mChartItem->update();
273 mChartItem->endCommand();
274 updateButtonsState();
277void QgsLayoutChartWidget::changeSortExpression(
const QString &expression,
bool )
284 mChartItem->beginCommand( tr(
"Change Chart Source Sort Expression" ) );
285 mChartItem->setSortExpression( expression );
286 mChartItem->update();
287 mChartItem->endCommand();
290void QgsLayoutChartWidget::mSortCheckBox_stateChanged(
int state )
295 if ( state == Qt::Checked )
297 mSortDirectionButton->setEnabled(
true );
298 mSortExpressionWidget->setEnabled(
true );
302 mSortDirectionButton->setEnabled(
false );
303 mSortExpressionWidget->setEnabled(
false );
306 mChartItem->beginCommand( tr(
"Toggle Atlas Sorting" ) );
307 mChartItem->setSortFeatures( state == Qt::Checked );
308 mChartItem->update();
309 mChartItem->endCommand();
312void QgsLayoutChartWidget::mSortDirectionButton_clicked()
319 Qt::ArrowType at = mSortDirectionButton->arrowType();
320 at = ( at == Qt::UpArrow ) ? Qt::DownArrow : Qt::UpArrow;
321 mSortDirectionButton->setArrowType( at );
323 mChartItem->beginCommand( tr(
"Change Chart Source Sort Direction" ) );
324 mChartItem->setSortAscending( at == Qt::UpArrow );
325 mChartItem->update();
326 mChartItem->endCommand();
329QListWidgetItem *QgsLayoutChartWidget::addSeriesListItem(
const QString &name )
331 QListWidgetItem *item =
new QListWidgetItem( name,
nullptr );
332 item->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable );
333 mSeriesListWidget->addItem( item );
337void QgsLayoutChartWidget::mSeriesListWidget_currentItemChanged( QListWidgetItem *current, QListWidgetItem * )
339 mSeriesPropertiesButton->setEnabled(
static_cast<bool>( current ) );
342void QgsLayoutChartWidget::mSeriesListWidget_itemChanged( QListWidgetItem *item )
349 QList<QgsLayoutItemChart::SeriesDetails> seriesList = mChartItem->seriesList();
350 const int idx = mSeriesListWidget->row( item );
351 if ( idx >= seriesList.size() )
356 mChartItem->beginCommand( tr(
"Rename Chart Series" ) );
357 seriesList[idx].setName( item->text() );
358 mChartItem->setSeriesList( seriesList );
359 mChartItem->endCommand();
362void QgsLayoutChartWidget::mAddSeriesPushButton_clicked()
369 QList<QgsLayoutItemChart::SeriesDetails> seriesList = mChartItem->seriesList();
370 const QString itemName = tr(
"Series %1" ).arg( seriesList.size() + 1 );
371 addSeriesListItem( itemName );
373 mChartItem->beginCommand( tr(
"Add Chart Series" ) );
374 seriesList << QgsLayoutItemChart::SeriesDetails( itemName );
375 mChartItem->setSeriesList( seriesList );
376 mChartItem->endCommand();
377 mChartItem->update();
379 mSeriesListWidget->setCurrentRow( mSeriesListWidget->count() - 1 );
380 mSeriesListWidget_currentItemChanged( mSeriesListWidget->currentItem(),
nullptr );
381 updateButtonsState();
384void QgsLayoutChartWidget::mRemoveSeriesPushButton_clicked()
386 QListWidgetItem *item = mSeriesListWidget->currentItem();
387 if ( !item || !mChartItem )
392 QList<QgsLayoutItemChart::SeriesDetails> seriesList = mChartItem->seriesList();
393 const int idx = mSeriesListWidget->row( item );
394 if ( idx >= seriesList.size() )
399 QListWidgetItem *deletedItem = mSeriesListWidget->takeItem( mSeriesListWidget->row( item ) );
402 mChartItem->beginCommand( tr(
"Remove Chart Series" ) );
403 seriesList.removeAt( idx );
404 mChartItem->setSeriesList( seriesList );
405 mChartItem->endCommand();
406 mChartItem->update();
407 updateButtonsState();
410void QgsLayoutChartWidget::mSeriesPropertiesButton_clicked()
412 QListWidgetItem *item = mSeriesListWidget->currentItem();
413 if ( !item || !mChartItem )
418 QList<QgsLayoutItemChart::SeriesDetails> seriesList = mChartItem->seriesList();
419 const int idx = mSeriesListWidget->row( item );
420 if ( idx >= seriesList.size() )
425 QgsLayoutChartSeriesDetailsWidget *widget =
new QgsLayoutChartSeriesDetailsWidget( mChartItem->sourceLayer(), idx, seriesList[idx],
this );
434 QList<QgsLayoutItemChart::SeriesDetails> seriesList = mChartItem->seriesList();
435 const int idx = widget->
index();
436 if ( idx >= seriesList.size() )
441 mChartItem->beginCommand( tr(
"Modify Chart Series" ) );
442 seriesList[idx].setXExpression( widget->
xExpression() );
443 seriesList[idx].setYExpression( widget->
yExpression() );
445 mChartItem->setSeriesList( seriesList );
446 mChartItem->endCommand();
447 mChartItem->update();
453void QgsLayoutChartWidget::mLinkedMapComboBox_itemChanged(
QgsLayoutItem *item )
460 mChartItem->beginCommand( tr(
"Change Chart Map Item" ) );
461 mChartItem->setMap( qobject_cast<QgsLayoutItemMap *>( item ) );
462 mChartItem->endCommand();
463 mChartItem->update();
466void QgsLayoutChartWidget::mFilterOnlyVisibleFeaturesCheckBox_stateChanged(
int state )
473 mChartItem->beginCommand( tr(
"Toggle Visible Features Only Filter" ) );
474 const bool useOnlyVisibleFeatures = ( state == Qt::Checked );
475 mChartItem->setFilterOnlyVisibleFeatures( useOnlyVisibleFeatures );
476 mChartItem->endCommand();
477 mChartItem->update();
480 mLinkedMapComboBox->setEnabled( state == Qt::Checked );
481 mLinkedMapLabel->setEnabled( state == Qt::Checked );
484void QgsLayoutChartWidget::mIntersectAtlasCheckBox_stateChanged(
int state )
491 mChartItem->beginCommand( tr(
"Toggle Chart Atlas Filter" ) );
492 const bool filterToAtlas = ( state == Qt::Checked );
493 mChartItem->setFilterToAtlasFeature( filterToAtlas );
494 mChartItem->endCommand();
495 mChartItem->update();
498void QgsLayoutChartWidget::updateButtonsState()
505 const bool enable = qobject_cast<QgsVectorLayer *>( mLayerComboBox->currentLayer() ) !=
nullptr;
506 mSortCheckBox->setEnabled( enable );
507 mAddSeriesPushButton->setEnabled( enable );
508 mRemoveSeriesPushButton->setEnabled( mSeriesListWidget->count() > 0 );
Base class for 2-dimensional plot/chart/graphs with an X and Y axes.
void setFlipAxes(bool flipAxes)
Sets whether the X and Y axes are flipped.
bool flipAxes() const
Returns whether the X and Y axes are flipped.
static QgsApplication * instance()
Returns the singleton instance of the QgsApplication.
static QgsPlotRegistry * plotRegistry()
Returns the application's plot registry, used for plot types.
static void initPlotWidgets()
Initializes plot widgets.
A layout item subclass that renders chart plots.
void itemChanged(QgsLayoutItem *item)
Emitted whenever the currently selected item changes.
Base class for graphical items within a QgsLayout.
int type() const override
Returns a unique graphics item type identifier.
void changed()
Emitted when the object's properties change.
void layerChanged(QgsMapLayer *layer)
Emitted whenever the currently selected layer changes.
Base class for all map layer types.
Interface for master layout type objects, such as print layouts and reports.
QgsPlot * createPlot(const QString &type) const
Creates a new instance of a plot given the type.
QMap< QString, QString > plotTypes() const
Returns a map of available plot types to translated name.
QgsPlotAbstractMetadata * plotMetadata(const QString &type) const
Returns the metadata for the specified plot type.
virtual void initFromPlot(const QgsPlot *plot)
Initializes properties of this plot from an existing plot, transferring all applicable settings.
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.