QGIS API Documentation 3.99.0-Master (2fe06baccd8)
Loading...
Searching...
No Matches
qgsstackeddiagramproperties.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsstackeddiagramproperties.h
3 Properties for stacked diagram layers
4 -------------------
5 begin : August 2024
6 copyright : (C) Germán Carrillo
7 email : german at opengis dot ch
8
9 ***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
19
26#include "qgsgui.h"
27#include "qgshelp.h"
29#include "qgsproject.h"
30#include "qgsvectorlayer.h"
31
32#include <QMimeData>
33
34#include "moc_qgsstackeddiagramproperties.cpp"
35
37 : QgsPanelWidget( parent )
38 , mLayer( layer )
39 , mMapCanvas( canvas )
40{
41 if ( !layer )
42 {
43 return;
44 }
45
46 setupUi( this );
47 connect( mSubDiagramsView, &QAbstractItemView::doubleClicked, this, static_cast<void ( QgsStackedDiagramProperties::* )( const QModelIndex & )>( &QgsStackedDiagramProperties::editSubDiagramRenderer ) );
48
49 connect( mAddSubDiagramButton, &QPushButton::clicked, this, &QgsStackedDiagramProperties::addSubDiagramRenderer );
50 connect( mEditSubDiagramButton, &QAbstractButton::clicked, this, static_cast<void ( QgsStackedDiagramProperties::* )()>( &QgsStackedDiagramProperties::editSubDiagramRenderer ) );
51 connect( mRemoveSubDiagramButton, &QPushButton::clicked, this, &QgsStackedDiagramProperties::removeSubDiagramRenderer );
52
53 // Initialize stacked diagram controls
54 mStackedDiagramModeComboBox->addItem( tr( "Horizontal" ), QgsDiagramSettings::Horizontal );
55 mStackedDiagramModeComboBox->addItem( tr( "Vertical" ), QgsDiagramSettings::Vertical );
56
57 mStackedDiagramSpacingSpinBox->setClearValue( 0 );
59
60 connect( mStackedDiagramModeComboBox, qOverload<int>( &QComboBox::currentIndexChanged ), this, &QgsStackedDiagramProperties::widgetChanged );
61 connect( mStackedDiagramSpacingSpinBox, qOverload<double>( &QgsDoubleSpinBox::valueChanged ), this, &QgsStackedDiagramProperties::widgetChanged );
62 connect( mStackedDiagramSpacingUnitComboBox, &QgsUnitSelectionWidget::changed, this, &QgsStackedDiagramProperties::widgetChanged );
63
65 mSubDiagramsView->setModel( mModel );
66
67 mSubDiagramsView->setStyle( new QgsStackedDiagramsViewStyle( mSubDiagramsView ) );
68
69 connect( mModel, &QAbstractItemModel::dataChanged, this, &QgsStackedDiagramProperties::widgetChanged );
70 connect( mModel, &QAbstractItemModel::rowsInserted, this, &QgsStackedDiagramProperties::widgetChanged );
71 connect( mModel, &QAbstractItemModel::rowsRemoved, this, &QgsStackedDiagramProperties::widgetChanged );
72
74
76}
77
78void QgsStackedDiagramProperties::addSubDiagramRenderer()
79{
80 // Create a single category renderer by default
81 std::unique_ptr<QgsDiagramRenderer> renderer;
82 auto dr = std::make_unique<QgsSingleCategoryDiagramRenderer>();
83 renderer = std::move( dr );
84
85 QItemSelectionModel *sel = mSubDiagramsView->selectionModel();
86 const QModelIndex index = sel->currentIndex();
87
88 if ( index.isValid() )
89 {
90 // add after this subDiagram
91 const QModelIndex currentIndex = mSubDiagramsView->selectionModel()->currentIndex();
92 mModel->insertSubDiagram( currentIndex.row() + 1, renderer.release() );
93 const QModelIndex newIndex = mModel->index( currentIndex.row() + 1, 0 );
94 mSubDiagramsView->selectionModel()->setCurrentIndex( newIndex, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows );
95 }
96 else
97 {
98 // append to root
99 appendSubDiagramRenderer( renderer.release() );
100 }
101 editSubDiagramRenderer();
102}
103
104void QgsStackedDiagramProperties::appendSubDiagramRenderer( QgsDiagramRenderer *dr )
105{
106 const int rows = mModel->rowCount();
107 mModel->insertSubDiagram( rows, dr ); // Transfers ownership
108 const QModelIndex newIndex = mModel->index( rows, 0 );
109 mSubDiagramsView->selectionModel()->setCurrentIndex( newIndex, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows );
110}
111
112void QgsStackedDiagramProperties::editSubDiagramRenderer()
113{
114 editSubDiagramRenderer( mSubDiagramsView->selectionModel()->currentIndex() );
115}
116
117void QgsStackedDiagramProperties::editSubDiagramRenderer( const QModelIndex &index )
118{
119 if ( !index.isValid() )
120 return;
121
122 QgsDiagramRenderer *renderer = mModel->subDiagramForIndex( index );
123 QgsDiagramLayerSettings dls = mModel->diagramLayerSettings();
125
126 if ( panel && panel->dockMode() )
127 {
128 QgsDiagramProperties *widget = new QgsDiagramProperties( mLayer, this, mMapCanvas );
129 widget->setPanelTitle( tr( "Edit Sub Diagram" ) );
130 widget->layout()->setContentsMargins( 0, 0, 0, 0 );
131 widget->syncToRenderer( renderer );
132 widget->syncToSettings( &dls );
133 if ( !couldBeFirstSubDiagram( index ) )
134 {
136 }
137
139 connect( widget, &QgsPanelWidget::panelAccepted, this, &QgsStackedDiagramProperties::subDiagramWidgetPanelAccepted );
140 connect( widget, &QgsDiagramProperties::widgetChanged, this, &QgsStackedDiagramProperties::liveUpdateSubDiagramFromPanel );
141 openPanel( widget );
142 return;
143 }
144
145 QgsStackedDiagramPropertiesDialog dlg( mLayer, this, mMapCanvas );
146 dlg.syncToRenderer( renderer );
147 dlg.syncToSettings( &dls );
148 if ( !couldBeFirstSubDiagram( index ) )
149 {
150 dlg.setAllowedToEditDiagramLayerSettings( false );
151 }
152
153 if ( dlg.exec() )
154 {
155 const QModelIndex index = mSubDiagramsView->selectionModel()->currentIndex();
156 if ( dlg.isAllowedToEditDiagramLayerSettings() )
157 mModel->updateDiagramLayerSettings( dlg.diagramLayerSettings() );
158
159 // This call will emit dataChanged, which in turns triggers widgetChanged()
160 mModel->updateSubDiagram( index, dlg.renderer() );
161 }
162}
163
164void QgsStackedDiagramProperties::removeSubDiagramRenderer()
165{
166 const QItemSelection sel = mSubDiagramsView->selectionModel()->selection();
167 const auto constSel = sel;
168 for ( const QItemSelectionRange &range : constSel )
169 {
170 if ( range.isValid() )
171 mModel->removeRows( range.top(), range.bottom() - range.top() + 1, range.parent() );
172 }
173 // make sure that the selection is gone
174 mSubDiagramsView->selectionModel()->clear();
175}
176
178{
179 mSubDiagramsView->selectionModel()->clearCurrentIndex();
180}
181
183{
184 const QgsDiagramRenderer *dr = mLayer->diagramRenderer();
185
186 if ( dr && dr->diagram() )
187 {
188 const QList<QgsDiagramSettings> settingList = dr->diagramSettings();
189 mStackedDiagramModeComboBox->setCurrentIndex( settingList.at( 0 ).stackedDiagramMode );
190 mStackedDiagramSpacingSpinBox->setValue( settingList.at( 0 ).stackedDiagramSpacing() );
191 mStackedDiagramSpacingUnitComboBox->setUnit( settingList.at( 0 ).stackedDiagramSpacingUnit() );
192
194 {
195 const QgsStackedDiagramRenderer *stackedDiagramRenderer = static_cast<const QgsStackedDiagramRenderer *>( dr );
196 const QList<QgsDiagramRenderer *> renderers = stackedDiagramRenderer->renderers();
197 for ( const QgsDiagramRenderer *renderer : renderers )
198 {
199 appendSubDiagramRenderer( renderer->clone() );
200 }
201 }
202 else
203 {
204 // Take this single renderer as the first stacked renderer
205 appendSubDiagramRenderer( dr->clone() );
206 }
207
208 const QgsDiagramLayerSettings *dls = mLayer->diagramLayerSettings();
209 mModel->updateDiagramLayerSettings( *dls );
210
211 mSubDiagramsView->selectionModel()->clear();
212 }
213}
214
216{
217 auto ds = std::make_unique<QgsDiagramSettings>();
218 ds->stackedDiagramMode = static_cast<QgsDiagramSettings::StackedDiagramMode>( mStackedDiagramModeComboBox->currentData().toInt() );
219 ds->setStackedDiagramSpacingUnit( mStackedDiagramSpacingUnitComboBox->unit() );
220 ds->setStackedDiagramSpacing( mStackedDiagramSpacingSpinBox->value() );
221
222 // Create diagram renderer for the StackedDiagram
224 dr->setDiagram( new QgsStackedDiagram() );
225
226 // Get DiagramSettings from each subdiagram
227 const QList<QgsDiagramRenderer *> renderers = mModel->subRenderers();
228 for ( const QgsDiagramRenderer *renderer : renderers )
229 {
230 const QList<QgsDiagramSettings> ds1 = renderer->diagramSettings();
231 if ( !ds1.isEmpty() )
232 {
233 ds->categoryAttributes += ds1.at( 0 ).categoryAttributes;
234 ds->categoryLabels += ds1.at( 0 ).categoryLabels;
235 ds->categoryColors += ds1.at( 0 ).categoryColors;
236 }
237 dr->addRenderer( renderer->clone() );
238 }
239
240 dr->setDiagramSettings( *ds );
241 mLayer->setDiagramRenderer( dr );
242
243 // Get DiagramLayerSettings from the model
244 QgsDiagramLayerSettings dls = mModel->diagramLayerSettings();
245 mLayer->setDiagramLayerSettings( dls );
246
247 // refresh
249 mLayer->triggerRepaint();
250}
251
252bool QgsStackedDiagramProperties::couldBeFirstSubDiagram( const QModelIndex &index ) const
253{
254 if ( !index.isValid() )
255 return false;
256
257 if ( mModel->rowCount() == 1 )
258 return true;
259
260 // Is there any enabled subdiagram before our index.row()?
261 // If so, ours cannot be the first diagram.
262 const QList<QgsDiagramRenderer *> renderers = mModel->subRenderers();
263
264 for ( int i = 0; i < index.row(); i++ )
265 {
266 const QgsDiagramRenderer *renderer = renderers.at( i );
267 const QList<QgsDiagramSettings> ds = renderer->diagramSettings();
268 if ( !ds.isEmpty() && ds.at( 0 ).enabled )
269 {
270 // First enabled subdiagram found, and we know our row is after.
271 // Therefore, return false to disallow showing DLS settings for it.
272 return false;
273 }
274 }
275 // Either our row is the first subdiagram enabled or it's disabled,
276 // but there are no enabled ones before. So, ours could be the first
277 // enabled one after being edited.
278 // Therefore, we should allow DLS settings on its corresponding widget.
279 return true;
280}
281
282void QgsStackedDiagramProperties::subDiagramWidgetPanelAccepted( QgsPanelWidget *panel )
283{
284 QgsDiagramProperties *widget = qobject_cast<QgsDiagramProperties *>( panel );
285
286 std::unique_ptr<QgsDiagramRenderer> renderer = widget->createRenderer();
287
288 const QModelIndex index = mSubDiagramsView->selectionModel()->currentIndex();
290 mModel->updateDiagramLayerSettings( widget->createDiagramLayerSettings() );
291
292 mModel->updateSubDiagram( index, renderer.release() );
293}
294
295void QgsStackedDiagramProperties::liveUpdateSubDiagramFromPanel()
296{
297 subDiagramWidgetPanelAccepted( qobject_cast<QgsPanelWidget *>( sender() ) );
298}
299
301
302#include "qgsvscrollarea.h"
303
305 : QDialog( parent )
306{
307#ifdef Q_OS_MAC
308 setWindowModality( Qt::WindowModal );
309#endif
310
311 QVBoxLayout *layout = new QVBoxLayout( this );
312 QgsVScrollArea *scrollArea = new QgsVScrollArea( this );
313 scrollArea->setFrameShape( QFrame::NoFrame );
314 layout->addWidget( scrollArea );
315
316 buttonBox = new QDialogButtonBox( QDialogButtonBox::Cancel | QDialogButtonBox::Help | QDialogButtonBox::Ok );
317 mPropsWidget = new QgsDiagramProperties( layer, this, mapCanvas );
318 mPropsWidget->setDockMode( false );
319
320 scrollArea->setWidget( mPropsWidget );
321 layout->addWidget( buttonBox );
322 this->setWindowTitle( "Edit Sub Diagram" );
324
325 connect( buttonBox, &QDialogButtonBox::accepted, this, &QgsStackedDiagramPropertiesDialog::accept );
326 connect( buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject );
327 connect( buttonBox, &QDialogButtonBox::helpRequested, this, &QgsStackedDiagramPropertiesDialog::showHelp );
328}
329
331{
332 mPropsWidget->syncToRenderer( dr );
333}
334
336{
337 mPropsWidget->syncToSettings( dls );
338}
339
341{
342 // Get renderer and diagram layer settings from widget
343 mRenderer = mPropsWidget->createRenderer();
344 mDiagramLayerSettings = mPropsWidget->createDiagramLayerSettings();
345 QDialog::accept();
346}
347
349{
350 return mRenderer.release();
351}
352
357
359{
360 mPropsWidget->setAllowedToEditDiagramLayerSettings( allowed );
361}
362
364{
365 return mPropsWidget->isAllowedToEditDiagramLayerSettings();
366}
367
368void QgsStackedDiagramPropertiesDialog::showHelp()
369{
370 QgsHelp::openHelp( QStringLiteral( "working_with_vector/vector_properties.html#diagrams-properties" ) );
371}
372
374
376 : QAbstractTableModel( parent )
377{
378}
379
384
385Qt::ItemFlags QgsStackedDiagramPropertiesModel::flags( const QModelIndex &index ) const
386{
387 // Flat list, to ease drop handling valid indexes are not dropEnabled
388 if ( !index.isValid() )
389 return Qt::ItemIsDropEnabled;
390
391 Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled;
392
393 if ( index.column() == 0 )
394 flags |= Qt::ItemIsUserCheckable;
395
396 return flags;
397}
398
400{
401 return Qt::MoveAction; // | Qt::CopyAction
402}
403
405{
406 QStringList types;
407 types << QStringLiteral( "application/vnd.text.list" );
408 return types;
409}
410
411QMimeData *QgsStackedDiagramPropertiesModel::mimeData( const QModelIndexList &indexes ) const
412{
413 QMimeData *mimeData = new QMimeData();
414 QByteArray encodedData;
415
416 QDataStream stream( &encodedData, QIODevice::WriteOnly );
417
418 // Sort indexes since their order reflects selection order
419 QModelIndexList sortedIndexes = indexes;
420 std::sort( sortedIndexes.begin(), sortedIndexes.end() );
421
422 for ( const QModelIndex &index : std::as_const( sortedIndexes ) )
423 {
424 // each item consists of several columns - let's add it with just first one
425 if ( !index.isValid() || index.column() != 0 )
426 continue;
427
428 if ( QgsDiagramRenderer *diagram = mRenderers.at( index.row() ) )
429 {
430 QDomDocument doc;
431
432 QDomElement rootElem = doc.createElement( QStringLiteral( "diagram_mime" ) );
433 diagram->writeXml( rootElem, doc, QgsReadWriteContext() );
434 doc.appendChild( rootElem );
435 stream << doc.toString( -1 );
436 }
437 }
438
439 mimeData->setData( QStringLiteral( "application/vnd.text.list" ), encodedData );
440 return mimeData;
441}
442
443bool QgsStackedDiagramPropertiesModel::dropMimeData( const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent )
444{
445 Q_UNUSED( column )
446 Q_UNUSED( parent )
447
448 if ( action == Qt::IgnoreAction )
449 return true;
450
451 if ( !data->hasFormat( QStringLiteral( "application/vnd.text.list" ) ) )
452 return false;
453
454 QByteArray encodedData = data->data( QStringLiteral( "application/vnd.text.list" ) );
455 QDataStream stream( &encodedData, QIODevice::ReadOnly );
456 int rows = 0;
457
458 // the item was dropped at parent, we may decide where to put the items
459 if ( row == -1 )
460 {
461 row = mRenderers.count(); // let's append them (e.g., drop in empty space)
462 }
463
464 while ( !stream.atEnd() )
465 {
466 QString text;
467 stream >> text;
468
469 QDomDocument doc;
470 if ( !doc.setContent( text ) )
471 continue;
472 const QDomElement rootElem = doc.documentElement();
473 if ( rootElem.tagName() != QLatin1String( "diagram_mime" ) || !rootElem.hasChildNodes() )
474 continue;
475 const QDomElement childElem = rootElem.firstChild().toElement();
476
477 QgsDiagramRenderer *diagram = nullptr;
478 if ( childElem.nodeName() == QLatin1String( "SingleCategoryDiagramRenderer" ) )
479 {
480 diagram = new QgsSingleCategoryDiagramRenderer();
481 diagram->readXml( childElem, QgsReadWriteContext() );
482 }
483 else if ( childElem.nodeName() == QLatin1String( "LinearlyInterpolatedDiagramRenderer" ) )
484 {
486 diagram->readXml( childElem, QgsReadWriteContext() );
487 }
488 else if ( childElem.nodeName() == QLatin1String( "StackedDiagramRenderer" ) )
489 {
490 diagram = new QgsStackedDiagramRenderer();
491 diagram->readXml( childElem, QgsReadWriteContext() );
492 }
493
494 if ( diagram )
495 {
496 insertSubDiagram( row + rows, diagram );
497 rows++;
498 }
499 }
500
501 emit subDiagramsMoved(); // Let views know they can clean some things up
502 return true;
503}
504
505QVariant QgsStackedDiagramPropertiesModel::data( const QModelIndex &index, int role ) const
506{
507 if ( !index.isValid() )
508 return QVariant();
509
511
512 if ( role == Qt::DisplayRole || role == Qt::ToolTipRole )
513 {
514 switch ( index.column() )
515 {
516 case 0:
517 if ( dr && dr->diagram() )
518 {
520 {
521 return tr( "Pie Chart" );
522 }
524 {
525 return tr( "Text Diagram" );
526 }
528 {
529 return tr( "Histogram" );
530 }
532 {
533 return tr( "Stacked Bars" );
534 }
536 {
537 return tr( "Stacked Diagram" );
538 }
539 else
540 {
541 return dr->diagram()->diagramName();
542 }
543 }
544 else
545 {
546 return tr( "(no diagram)" );
547 }
548 case 1:
549 if ( !dr )
550 {
551 return tr( "(no renderer)" );
552 }
553 else
554 {
556 return tr( "Fixed" );
558 return tr( "Scaled" );
559 else
560 return tr( "Unknown" );
561 }
562 case 2:
563 if ( dr && dr->diagram() && !dr->diagramSettings().isEmpty() )
564 {
566 {
567 switch ( dr->diagramSettings().at( 0 ).diagramOrientation )
568 {
570 return tr( "Left" );
572 return tr( "Right" );
574 return tr( "Up" );
576 return tr( "Down" );
577 }
578 }
579 }
580 return QVariant();
581 default:
582 return QVariant();
583 }
584 }
585 else if ( role == Qt::CheckStateRole )
586 {
587 if ( index.column() != 0 )
588 return QVariant();
589
590 return ( dr && !dr->diagramSettings().isEmpty() && dr->diagramSettings().at( 0 ).enabled ) ? Qt::Checked : Qt::Unchecked;
591 }
592 else
593 {
594 return QVariant();
595 }
596}
597
598QVariant QgsStackedDiagramPropertiesModel::headerData( int section, Qt::Orientation orientation, int role ) const
599{
600 if ( orientation == Qt::Horizontal && role == Qt::DisplayRole && section >= 0 && section < 3 )
601 {
602 QStringList lst;
603 lst << tr( "Diagram type" ) << tr( "Size" ) << tr( "Orientation" );
604 return lst[section];
605 }
606
607 return QVariant();
608}
609
610int QgsStackedDiagramPropertiesModel::rowCount( const QModelIndex & ) const
611{
612 return mRenderers.size();
613}
614
615int QgsStackedDiagramPropertiesModel::columnCount( const QModelIndex & ) const
616{
617 return 3;
618}
619
620bool QgsStackedDiagramPropertiesModel::setData( const QModelIndex &index, const QVariant &value, int role )
621{
622 if ( !index.isValid() )
623 return false;
624
626
627 if ( role == Qt::CheckStateRole )
628 {
629 if ( dr && !dr->diagramSettings().isEmpty() )
630 {
631 QgsDiagramSettings ds = dr->diagramSettings().at( 0 );
632 ds.enabled = ( value.toInt() == Qt::Checked );
633
635 {
637 dsr->setDiagramSettings( ds );
638 }
639 else
640 {
642 dlir->setDiagramSettings( ds );
643 }
644
645 emit dataChanged( index, index );
646 return true;
647 }
648 }
649 return false;
650}
651
652bool QgsStackedDiagramPropertiesModel::removeRows( int row, int count, const QModelIndex &parent )
653{
654 if ( row < 0 || row >= mRenderers.size() )
655 return false;
656
657 beginRemoveRows( parent, row, row + count - 1 );
658 while ( count-- )
659 mRenderers.removeAt( row );
660 endRemoveRows();
661
662 return true;
663}
664
666{
667 if ( index.isValid() )
668 return mRenderers.at( index.row() );
669 return nullptr;
670}
671
673{
674 beginInsertRows( QModelIndex(), index, index );
675 mRenderers.insert( index, newSubDiagram );
676 endInsertRows();
677}
678
680{
681 if ( !index.isValid() )
682 return;
683
684 delete mRenderers.at( index.row() );
685 mRenderers.replace( index.row(), dr );
686 emit dataChanged( index, index );
687}
688
689QList<QgsDiagramRenderer *> QgsStackedDiagramPropertiesModel::subRenderers() const
690{
691 return mRenderers;
692}
693
698
703
704// ------------------------------ View style --------------------------------
708
709void QgsStackedDiagramsViewStyle::drawPrimitive( PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget ) const
710{
711 if ( element == QStyle::PE_IndicatorItemViewItemDrop && !option->rect.isNull() )
712 {
713 QStyleOption opt( *option );
714 opt.rect.setLeft( 0 );
715 // draw always as line above, because we move item to that index
716 opt.rect.setHeight( 0 );
717 if ( widget )
718 opt.rect.setRight( widget->width() );
719 QProxyStyle::drawPrimitive( element, &opt, painter, widget );
720 return;
721 }
722 QProxyStyle::drawPrimitive( element, option, painter, widget );
723}
@ Millimeters
Millimeters.
Definition qgis.h:5184
@ Points
Points (e.g., for font sizes).
Definition qgis.h:5188
@ MapUnits
Map units.
Definition qgis.h:5185
@ Pixels
Pixels.
Definition qgis.h:5186
@ Inches
Inches.
Definition qgis.h:5189
@ MetersInMapUnits
Meters value as Map units.
Definition qgis.h:5191
Stores the settings for rendering of all diagrams for a layer.
A widget which configures diagrams for a vector layer.
void syncToSettings(const QgsDiagramLayerSettings *dls)
Updates the widget to reflect the diagram layer settings.
bool isAllowedToEditDiagramLayerSettings() const
Returns whether this widget is allowed to edit diagram layer settings.
void syncToRenderer(const QgsDiagramRenderer *dr)
Updates the widget to reflect the diagram renderer.
void setAllowedToEditDiagramLayerSettings(bool allowed)
Sets whether the widget should show diagram layer settings.
Evaluates and returns the diagram settings relating to a diagram for a specific feature.
virtual QString rendererName() const =0
QgsDiagram * diagram() const
virtual QList< QgsDiagramSettings > diagramSettings() const =0
Returns list with all diagram settings in the renderer.
virtual void readXml(const QDomElement &elem, const QgsReadWriteContext &context)=0
Reads diagram state from a DOM element.
void setDiagram(QgsDiagram *d)
virtual QgsDiagramRenderer * clone() const =0
Returns new instance that is equivalent to this one.
Stores the settings for rendering a single diagram.
StackedDiagramMode
Orientation of the stacked diagrams.
virtual QString diagramName() const =0
Gets a descriptive name for this diagram type.
static void enableAutoGeometryRestore(QWidget *widget, const QString &key=QString())
Register the widget to allow its position to be automatically saved and restored when open and closed...
Definition qgsgui.cpp:221
static void openHelp(const QString &key)
Opens help topic for the given help key using default system web browser.
Definition qgshelp.cpp:38
static const QString DIAGRAM_NAME_HISTOGRAM
Alters the size of rendered diagrams using linear scaling.
void setDiagramSettings(const QgsDiagramSettings &s)
static const QString DIAGRAM_RENDERER_NAME_LINEARLY_INTERPOLATED
Map canvas is a class for displaying all GIS data types on a canvas.
Base class for any widget that can be shown as an inline panel.
void openPanel(QgsPanelWidget *panel)
Open a panel or dialog depending on dock mode setting If dock mode is true this method will emit the ...
bool dockMode() const
Returns the dock mode state.
void panelAccepted(QgsPanelWidget *panel)
Emitted when the panel is accepted by the user.
QgsPanelWidget(QWidget *parent=nullptr)
Base class for any widget that can be shown as an inline panel.
void widgetChanged()
Emitted when the widget state changes.
static QgsPanelWidget * findParentPanel(QWidget *widget)
Traces through the parents of a widget to find if it is contained within a QgsPanelWidget widget.
void setPanelTitle(const QString &panelTitle)
Set the title of the panel when shown in the interface.
static const QString DIAGRAM_NAME_PIE
static QgsProject * instance()
Returns the QgsProject singleton instance.
void setDirty(bool b=true)
Flag the project as dirty (modified).
QgsProxyStyle(QWidget *parent)
Constructor for QgsProxyStyle.
A container for the context for various read/write operations on objects.
Renders the diagrams for all features with the same settings.
void setDiagramSettings(const QgsDiagramSettings &s)
static const QString DIAGRAM_RENDERER_NAME_SINGLE_CATEGORY
static const QString DIAGRAM_NAME_STACKED_BAR
QgsStackedDiagramPropertiesDialog(QgsVectorLayer *layer, QWidget *parent=nullptr, QgsMapCanvas *mapCanvas=nullptr)
Constructor for QgsStackedDiagramPropertiesDialog.
QgsDiagramLayerSettings diagramLayerSettings() const
Gets diagram layer settings built from the diagram properties widget.
void setAllowedToEditDiagramLayerSettings(bool allowed) const
Delegates to the main widget to set whether the widget should show diagram layer settings to be edite...
void syncToRenderer(const QgsDiagramRenderer *dr) const
Delegates to the diagram properties widget to sync with the given renderer.
void syncToSettings(const QgsDiagramLayerSettings *dls) const
Delegates to the diagram properties widget to sync with the given diagram layer settings.
bool isAllowedToEditDiagramLayerSettings() const
Returns whether the main widget is allowed to edit diagram layer settings.
void accept() override
Applies changes from the widget to the internal renderer and diagram layer settings.
QgsDiagramRenderer * renderer()
Gets a renderer object built from the diagram properties widget.
Model for sub diagrams in a stacked diagram view.
Qt::DropActions supportedDropActions() const override
QMimeData * mimeData(const QModelIndexList &indexes) const override
void updateSubDiagram(const QModelIndex &index, QgsDiagramRenderer *dr)
Replaces the diagram located at index by dr. Takes ownership.
bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override
bool removeRows(int row, int count, const QModelIndex &parent=QModelIndex()) override
void insertSubDiagram(const int index, QgsDiagramRenderer *newSubDiagram)
Inserts a new diagram at the specified position. Takes ownership.
QList< QgsDiagramRenderer * > mRenderers
QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const override
QgsDiagramRenderer * subDiagramForIndex(const QModelIndex &index) const
Returns the diagram renderer at the specified index. Does not transfer ownership.
void updateDiagramLayerSettings(QgsDiagramLayerSettings dls)
Sets the diagram layer settings for the model.
Qt::ItemFlags flags(const QModelIndex &index) const override
QgsDiagramLayerSettings diagramLayerSettings() const
Returns the diagram layer settings from the model.
QList< QgsDiagramRenderer * > subRenderers() const
Returns the list of diagram renderers from the model. Does not transfer ownership.
int columnCount(const QModelIndex &=QModelIndex()) const override
void subDiagramsMoved()
Informs views that subdiagrams were moved in the model.
bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole) override
QgsStackedDiagramPropertiesModel(QObject *parent=nullptr)
constructor
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override
int rowCount(const QModelIndex &=QModelIndex()) const override
void clearCurrentIndex()
Clears current item from the view.
void syncToLayer()
Updates the widget to reflect the layer's current diagram settings.
QgsStackedDiagramProperties(QgsVectorLayer *layer, QWidget *parent, QgsMapCanvas *canvas)
Renders diagrams using mixed diagram render types.
void setDiagramSettings(const QgsDiagramSettings &s)
static const QString DIAGRAM_RENDERER_NAME_STACKED
void addRenderer(QgsDiagramRenderer *renderer)
Adds a renderer to the stacked renderer object.
QList< QgsDiagramRenderer * > renderers(bool sortByDiagramMode=false) const
Returns an ordered list with the renderers of the stacked renderer object.
A diagram composed of several subdiagrams, located side by side.
static const QString DIAGRAM_NAME_STACKED
View style which shows a drop indicator line between items.
QgsStackedDiagramsViewStyle(QWidget *parent)
Constructor for QgsStackedDiagramsViewStyle.
void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget=nullptr) const override
static const QString DIAGRAM_NAME_TEXT
void changed()
Emitted when the selected unit is changed, or the definition of the map unit scale is changed.
A QScrollArea subclass which only displays a vertical scrollbar and fits the width to the contents.
Represents a vector layer which manages a vector based dataset.