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 );
53 connect( mSortCheckBox, &QCheckBox::stateChanged,
this, &QgsLayoutChartWidget::mSortCheckBox_stateChanged );
55 connect( mSortDirectionButton, &QToolButton::clicked,
this, &QgsLayoutChartWidget::mSortDirectionButton_clicked );
57 connect( mSeriesListWidget, &QListWidget::currentItemChanged,
this, &QgsLayoutChartWidget::mSeriesListWidget_currentItemChanged );
58 connect( mSeriesListWidget, &QListWidget::itemChanged,
this, &QgsLayoutChartWidget::mSeriesListWidget_itemChanged );
59 connect( mAddSeriesPushButton, &QPushButton::clicked,
this, &QgsLayoutChartWidget::mAddSeriesPushButton_clicked );
60 connect( mRemoveSeriesPushButton, &QPushButton::clicked,
this, &QgsLayoutChartWidget::mRemoveSeriesPushButton_clicked );
61 connect( mSeriesPropertiesButton, &QPushButton::clicked,
this, &QgsLayoutChartWidget::mSeriesPropertiesButton_clicked );
63 setGuiElementValues();
70 if ( mItemPropertiesWidget )
71 mItemPropertiesWidget->setMasterLayout( masterLayout );
84 mChartItem = qobject_cast<QgsLayoutItemChart *>( item );
85 mItemPropertiesWidget->setItem( mChartItem );
92 setGuiElementValues();
97void QgsLayoutChartWidget::setGuiElementValues()
101 whileBlocking( mChartTypeComboBox )->setCurrentIndex( mChartTypeComboBox->findData( mChartItem->plot()->type() ) );
102 whileBlocking( mLayerComboBox )->setLayer( mChartItem->sourceLayer() );
104 whileBlocking( mSortCheckBox )->setCheckState( mChartItem->sortFeatures() ? Qt::Checked : Qt::Unchecked );
106 whileBlocking( mSortDirectionButton )->setEnabled( mChartItem->sortFeatures() );
107 whileBlocking( mSortDirectionButton )->setArrowType( mChartItem->sortAscending() ? Qt::UpArrow : Qt::DownArrow );
109 whileBlocking( mSortExpressionWidget )->setEnabled( mChartItem->sortFeatures() );
110 whileBlocking( mSortExpressionWidget )->setLayer( mChartItem->sourceLayer() );
111 whileBlocking( mSortExpressionWidget )->setField( mChartItem->sortExpression() );
113 mSeriesListWidget->clear();
114 const QList<QgsLayoutItemChart::SeriesDetails> seriesList = mChartItem->seriesList();
117 addSeriesListItem( series.name() );
122 mSeriesListWidget->clear();
126void QgsLayoutChartWidget::mChartTypeComboBox_currentIndexChanged(
int )
133 const QString plotType = mChartTypeComboBox->currentData().toString();
134 if ( mChartItem->plot()->type() == plotType )
140 Qgs2DXyPlot *newPlot2DXy =
dynamic_cast<Qgs2DXyPlot *
>( newPlot );
143 Qgs2DXyPlot *oldPlot2DXy =
dynamic_cast<Qgs2DXyPlot *
>( mChartItem->plot() );
163 mChartItem->beginCommand( tr(
"Change Chart Type" ) );
164 mChartItem->setPlot( newPlot );
165 mChartItem->update();
166 mChartItem->endCommand();
169void QgsLayoutChartWidget::mChartPropertiesButton_clicked()
178 const QString plotType = mChartTypeComboBox->currentData().toString();
180 if ( !abstractMetadata )
192 widget->
setPlot( mChartItem->plot() );
200 mChartItem->beginCommand( tr(
"Modify Chart" ) );
202 mChartItem->endCommand();
203 mChartItem->update();
209void QgsLayoutChartWidget::changeLayer(
QgsMapLayer *layer )
216 QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( layer );
222 mChartItem->beginCommand( tr(
"Change Chart Source Layer" ) );
223 mChartItem->setSourceLayer( vl );
224 mChartItem->update();
225 mChartItem->endCommand();
228void QgsLayoutChartWidget::changeSortExpression(
const QString &expression,
bool )
235 mChartItem->beginCommand( tr(
"Change Chart Source Sort Expression" ) );
236 mChartItem->setSortExpression( expression );
237 mChartItem->update();
238 mChartItem->endCommand();
241void QgsLayoutChartWidget::mSortCheckBox_stateChanged(
int state )
246 if ( state == Qt::Checked )
248 mSortDirectionButton->setEnabled(
true );
249 mSortExpressionWidget->setEnabled(
true );
253 mSortDirectionButton->setEnabled(
false );
254 mSortExpressionWidget->setEnabled(
false );
257 mChartItem->beginCommand( tr(
"Toggle Atlas Sorting" ) );
258 mChartItem->setSortFeatures( state == Qt::Checked );
259 mChartItem->update();
260 mChartItem->endCommand();
263void QgsLayoutChartWidget::mSortDirectionButton_clicked()
270 Qt::ArrowType at = mSortDirectionButton->arrowType();
271 at = ( at == Qt::UpArrow ) ? Qt::DownArrow : Qt::UpArrow;
272 mSortDirectionButton->setArrowType( at );
274 mChartItem->beginCommand( tr(
"Change Chart Source Sort Direction" ) );
275 mChartItem->setSortAscending( at == Qt::UpArrow );
276 mChartItem->update();
277 mChartItem->endCommand();
280QListWidgetItem *QgsLayoutChartWidget::addSeriesListItem(
const QString &name )
282 QListWidgetItem *item =
new QListWidgetItem( name,
nullptr );
283 item->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable );
284 mSeriesListWidget->addItem( item );
288void QgsLayoutChartWidget::mSeriesListWidget_currentItemChanged( QListWidgetItem *current, QListWidgetItem * )
290 mSeriesPropertiesButton->setEnabled(
static_cast<bool>( current ) );
293void QgsLayoutChartWidget::mSeriesListWidget_itemChanged( QListWidgetItem *item )
300 QList<QgsLayoutItemChart::SeriesDetails> seriesList = mChartItem->seriesList();
301 const int idx = mSeriesListWidget->row( item );
302 if ( idx >= seriesList.size() )
307 mChartItem->beginCommand( tr(
"Rename Chart Series" ) );
308 seriesList[idx].setName( item->text() );
309 mChartItem->setSeriesList( seriesList );
310 mChartItem->endCommand();
313void QgsLayoutChartWidget::mAddSeriesPushButton_clicked()
320 QList<QgsLayoutItemChart::SeriesDetails> seriesList = mChartItem->seriesList();
321 const QString itemName = tr(
"Series %1" ).arg( seriesList.size() + 1 );
322 addSeriesListItem( itemName );
324 mChartItem->beginCommand( tr(
"Add Chart Series" ) );
325 seriesList << QgsLayoutItemChart::SeriesDetails( itemName );
326 mChartItem->setSeriesList( seriesList );
327 mChartItem->endCommand();
328 mChartItem->update();
330 mSeriesListWidget->setCurrentRow( mSeriesListWidget->count() - 1 );
331 mSeriesListWidget_currentItemChanged( mSeriesListWidget->currentItem(),
nullptr );
334void QgsLayoutChartWidget::mRemoveSeriesPushButton_clicked()
336 QListWidgetItem *item = mSeriesListWidget->currentItem();
337 if ( !item || !mChartItem )
342 QList<QgsLayoutItemChart::SeriesDetails> seriesList = mChartItem->seriesList();
343 const int idx = mSeriesListWidget->row( item );
344 if ( idx >= seriesList.size() )
349 QListWidgetItem *deletedItem = mSeriesListWidget->takeItem( mSeriesListWidget->row( item ) );
352 mChartItem->beginCommand( tr(
"Remove Chart Series" ) );
353 seriesList.removeAt( idx );
354 mChartItem->setSeriesList( seriesList );
355 mChartItem->endCommand();
356 mChartItem->update();
359void QgsLayoutChartWidget::mSeriesPropertiesButton_clicked()
361 QListWidgetItem *item = mSeriesListWidget->currentItem();
362 if ( !item || !mChartItem )
367 QList<QgsLayoutItemChart::SeriesDetails> seriesList = mChartItem->seriesList();
368 const int idx = mSeriesListWidget->row( item );
369 if ( idx >= seriesList.size() )
374 QgsLayoutChartSeriesDetailsWidget *widget =
new QgsLayoutChartSeriesDetailsWidget( mChartItem->sourceLayer(), idx, seriesList[idx],
this );
382 QList<QgsLayoutItemChart::SeriesDetails> seriesList = mChartItem->seriesList();
383 const int idx = widget->
index();
384 if ( idx >= seriesList.size() )
389 mChartItem->beginCommand( tr(
"Modify Chart Series" ) );
390 seriesList[idx].setXExpression( widget->
xExpression() );
391 seriesList[idx].setYExpression( widget->
yExpression() );
393 mChartItem->setSeriesList( seriesList );
394 mChartItem->endCommand();
395 mChartItem->update();
void setXMaximum(double maximum)
Sets the maximum value of the x axis.
double yMaximum() const
Returns the maximum value of the y axis.
void setYMinimum(double minimum)
Sets the minimum value of the y axis.
double xMinimum() const
Returns the minimum value of the x axis.
QgsPlotAxis & yAxis()
Returns a reference to the plot's y axis.
void setXMinimum(double minimum)
Sets the minimum value of the x axis.
QgsPlotAxis & xAxis()
Returns a reference to the plot's x axis.
double yMinimum() const
Returns the minimum value of the y axis.
void setYMaximum(double maximum)
Sets the maximum value of the y axis.
double xMaximum() const
Returns the maximum value of the x axis.
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.
Chart series details covering all supported series types.
A layout item subclass that renders chart plots.
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.
double gridIntervalMinor() const
Returns the interval of minor grid lines for the axis.
double gridIntervalMajor() const
Returns the interval of major grid lines for the axis.
void setType(Qgis::PlotAxisType type)
Sets the axis type.
void setGridIntervalMajor(double interval)
Sets the interval of major grid lines for the axis.
void setGridIntervalMinor(double interval)
Sets the interval of minor grid lines for the axis.
void setLabelInterval(double interval)
Sets the interval of labels for the axis.
Qgis::PlotAxisType type() const
Returns the axis type.
double labelInterval() const
Returns the interval of labels for the axis.
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.
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.