QGIS API Documentation 3.99.0-Master (e9821da5c6b)
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#include <QString>
34
35#include "moc_qgsstackeddiagramproperties.cpp"
36
37using namespace Qt::StringLiterals;
38
40 : QgsPanelWidget( parent )
41 , mLayer( layer )
42 , mMapCanvas( canvas )
43{
44 if ( !layer )
45 {
46 return;
47 }
48
49 setupUi( this );
50 connect( mSubDiagramsView, &QAbstractItemView::doubleClicked, this, static_cast<void ( QgsStackedDiagramProperties::* )( const QModelIndex & )>( &QgsStackedDiagramProperties::editSubDiagramRenderer ) );
51
52 connect( mAddSubDiagramButton, &QPushButton::clicked, this, &QgsStackedDiagramProperties::addSubDiagramRenderer );
53 connect( mEditSubDiagramButton, &QAbstractButton::clicked, this, static_cast<void ( QgsStackedDiagramProperties::* )()>( &QgsStackedDiagramProperties::editSubDiagramRenderer ) );
54 connect( mRemoveSubDiagramButton, &QPushButton::clicked, this, &QgsStackedDiagramProperties::removeSubDiagramRenderer );
55
56 // Initialize stacked diagram controls
57 mStackedDiagramModeComboBox->addItem( tr( "Horizontal" ), QgsDiagramSettings::Horizontal );
58 mStackedDiagramModeComboBox->addItem( tr( "Vertical" ), QgsDiagramSettings::Vertical );
59
60 mStackedDiagramSpacingSpinBox->setClearValue( 0 );
62
63 connect( mStackedDiagramModeComboBox, qOverload<int>( &QComboBox::currentIndexChanged ), this, &QgsStackedDiagramProperties::widgetChanged );
64 connect( mStackedDiagramSpacingSpinBox, qOverload<double>( &QgsDoubleSpinBox::valueChanged ), this, &QgsStackedDiagramProperties::widgetChanged );
65 connect( mStackedDiagramSpacingUnitComboBox, &QgsUnitSelectionWidget::changed, this, &QgsStackedDiagramProperties::widgetChanged );
66
68 mSubDiagramsView->setModel( mModel );
69
70 mSubDiagramsView->setStyle( new QgsStackedDiagramsViewStyle( mSubDiagramsView ) );
71
72 connect( mModel, &QAbstractItemModel::dataChanged, this, &QgsStackedDiagramProperties::widgetChanged );
73 connect( mModel, &QAbstractItemModel::rowsInserted, this, &QgsStackedDiagramProperties::widgetChanged );
74 connect( mModel, &QAbstractItemModel::rowsRemoved, this, &QgsStackedDiagramProperties::widgetChanged );
75
77
79}
80
81void QgsStackedDiagramProperties::addSubDiagramRenderer()
82{
83 // Create a single category renderer by default
84 std::unique_ptr<QgsDiagramRenderer> renderer;
85 auto dr = std::make_unique<QgsSingleCategoryDiagramRenderer>();
86 renderer = std::move( dr );
87
88 QItemSelectionModel *sel = mSubDiagramsView->selectionModel();
89 const QModelIndex index = sel->currentIndex();
90
91 if ( index.isValid() )
92 {
93 // add after this subDiagram
94 const QModelIndex currentIndex = mSubDiagramsView->selectionModel()->currentIndex();
95 mModel->insertSubDiagram( currentIndex.row() + 1, renderer.release() );
96 const QModelIndex newIndex = mModel->index( currentIndex.row() + 1, 0 );
97 mSubDiagramsView->selectionModel()->setCurrentIndex( newIndex, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows );
98 }
99 else
100 {
101 // append to root
102 appendSubDiagramRenderer( renderer.release() );
103 }
104 editSubDiagramRenderer();
105}
106
107void QgsStackedDiagramProperties::appendSubDiagramRenderer( QgsDiagramRenderer *dr )
108{
109 const int rows = mModel->rowCount();
110 mModel->insertSubDiagram( rows, dr ); // Transfers ownership
111 const QModelIndex newIndex = mModel->index( rows, 0 );
112 mSubDiagramsView->selectionModel()->setCurrentIndex( newIndex, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows );
113}
114
115void QgsStackedDiagramProperties::editSubDiagramRenderer()
116{
117 editSubDiagramRenderer( mSubDiagramsView->selectionModel()->currentIndex() );
118}
119
120void QgsStackedDiagramProperties::editSubDiagramRenderer( const QModelIndex &index )
121{
122 if ( !index.isValid() )
123 return;
124
125 QgsDiagramRenderer *renderer = mModel->subDiagramForIndex( index );
126 QgsDiagramLayerSettings dls = mModel->diagramLayerSettings();
128
129 if ( panel && panel->dockMode() )
130 {
131 QgsDiagramProperties *widget = new QgsDiagramProperties( mLayer, this, mMapCanvas );
132 widget->setPanelTitle( tr( "Edit Sub Diagram" ) );
133 widget->layout()->setContentsMargins( 0, 0, 0, 0 );
134 widget->syncToRenderer( renderer );
135 widget->syncToSettings( &dls );
136 if ( !couldBeFirstSubDiagram( index ) )
137 {
139 }
140
142 connect( widget, &QgsPanelWidget::panelAccepted, this, &QgsStackedDiagramProperties::subDiagramWidgetPanelAccepted );
143 connect( widget, &QgsDiagramProperties::widgetChanged, this, &QgsStackedDiagramProperties::liveUpdateSubDiagramFromPanel );
144 openPanel( widget );
145 return;
146 }
147
148 QgsStackedDiagramPropertiesDialog dlg( mLayer, this, mMapCanvas );
149 dlg.syncToRenderer( renderer );
150 dlg.syncToSettings( &dls );
151 if ( !couldBeFirstSubDiagram( index ) )
152 {
153 dlg.setAllowedToEditDiagramLayerSettings( false );
154 }
155
156 if ( dlg.exec() )
157 {
158 const QModelIndex index = mSubDiagramsView->selectionModel()->currentIndex();
159 if ( dlg.isAllowedToEditDiagramLayerSettings() )
160 mModel->updateDiagramLayerSettings( dlg.diagramLayerSettings() );
161
162 // This call will emit dataChanged, which in turns triggers widgetChanged()
163 mModel->updateSubDiagram( index, dlg.renderer() );
164 }
165}
166
167void QgsStackedDiagramProperties::removeSubDiagramRenderer()
168{
169 const QItemSelection sel = mSubDiagramsView->selectionModel()->selection();
170 const auto constSel = sel;
171 for ( const QItemSelectionRange &range : constSel )
172 {
173 if ( range.isValid() )
174 mModel->removeRows( range.top(), range.bottom() - range.top() + 1, range.parent() );
175 }
176 // make sure that the selection is gone
177 mSubDiagramsView->selectionModel()->clear();
178}
179
181{
182 mSubDiagramsView->selectionModel()->clearCurrentIndex();
183}
184
186{
187 const QgsDiagramRenderer *dr = mLayer->diagramRenderer();
188
189 if ( dr && dr->diagram() )
190 {
191 const QList<QgsDiagramSettings> settingList = dr->diagramSettings();
192 mStackedDiagramModeComboBox->setCurrentIndex( settingList.at( 0 ).stackedDiagramMode );
193 mStackedDiagramSpacingSpinBox->setValue( settingList.at( 0 ).stackedDiagramSpacing() );
194 mStackedDiagramSpacingUnitComboBox->setUnit( settingList.at( 0 ).stackedDiagramSpacingUnit() );
195
197 {
198 const QgsStackedDiagramRenderer *stackedDiagramRenderer = static_cast<const QgsStackedDiagramRenderer *>( dr );
199 const QList<QgsDiagramRenderer *> renderers = stackedDiagramRenderer->renderers();
200 for ( const QgsDiagramRenderer *renderer : renderers )
201 {
202 appendSubDiagramRenderer( renderer->clone() );
203 }
204 }
205 else
206 {
207 // Take this single renderer as the first stacked renderer
208 appendSubDiagramRenderer( dr->clone() );
209 }
210
211 const QgsDiagramLayerSettings *dls = mLayer->diagramLayerSettings();
212 mModel->updateDiagramLayerSettings( *dls );
213
214 mSubDiagramsView->selectionModel()->clear();
215 }
216}
217
219{
220 auto ds = std::make_unique<QgsDiagramSettings>();
221 ds->stackedDiagramMode = static_cast<QgsDiagramSettings::StackedDiagramMode>( mStackedDiagramModeComboBox->currentData().toInt() );
222 ds->setStackedDiagramSpacingUnit( mStackedDiagramSpacingUnitComboBox->unit() );
223 ds->setStackedDiagramSpacing( mStackedDiagramSpacingSpinBox->value() );
224
225 // Create diagram renderer for the StackedDiagram
227 dr->setDiagram( new QgsStackedDiagram() );
228
229 // Get DiagramSettings from each subdiagram
230 const QList<QgsDiagramRenderer *> renderers = mModel->subRenderers();
231 for ( const QgsDiagramRenderer *renderer : renderers )
232 {
233 const QList<QgsDiagramSettings> ds1 = renderer->diagramSettings();
234 if ( !ds1.isEmpty() )
235 {
236 ds->categoryAttributes += ds1.at( 0 ).categoryAttributes;
237 ds->categoryLabels += ds1.at( 0 ).categoryLabels;
238 ds->categoryColors += ds1.at( 0 ).categoryColors;
239 }
240 dr->addRenderer( renderer->clone() );
241 }
242
243 dr->setDiagramSettings( *ds );
244 mLayer->setDiagramRenderer( dr );
245
246 // Get DiagramLayerSettings from the model
247 QgsDiagramLayerSettings dls = mModel->diagramLayerSettings();
248 mLayer->setDiagramLayerSettings( dls );
249
250 // refresh
252 mLayer->triggerRepaint();
253}
254
255bool QgsStackedDiagramProperties::couldBeFirstSubDiagram( const QModelIndex &index ) const
256{
257 if ( !index.isValid() )
258 return false;
259
260 if ( mModel->rowCount() == 1 )
261 return true;
262
263 // Is there any enabled subdiagram before our index.row()?
264 // If so, ours cannot be the first diagram.
265 const QList<QgsDiagramRenderer *> renderers = mModel->subRenderers();
266
267 for ( int i = 0; i < index.row(); i++ )
268 {
269 const QgsDiagramRenderer *renderer = renderers.at( i );
270 const QList<QgsDiagramSettings> ds = renderer->diagramSettings();
271 if ( !ds.isEmpty() && ds.at( 0 ).enabled )
272 {
273 // First enabled subdiagram found, and we know our row is after.
274 // Therefore, return false to disallow showing DLS settings for it.
275 return false;
276 }
277 }
278 // Either our row is the first subdiagram enabled or it's disabled,
279 // but there are no enabled ones before. So, ours could be the first
280 // enabled one after being edited.
281 // Therefore, we should allow DLS settings on its corresponding widget.
282 return true;
283}
284
285void QgsStackedDiagramProperties::subDiagramWidgetPanelAccepted( QgsPanelWidget *panel )
286{
287 QgsDiagramProperties *widget = qobject_cast<QgsDiagramProperties *>( panel );
288
289 std::unique_ptr<QgsDiagramRenderer> renderer = widget->createRenderer();
290
291 const QModelIndex index = mSubDiagramsView->selectionModel()->currentIndex();
293 mModel->updateDiagramLayerSettings( widget->createDiagramLayerSettings() );
294
295 mModel->updateSubDiagram( index, renderer.release() );
296}
297
298void QgsStackedDiagramProperties::liveUpdateSubDiagramFromPanel()
299{
300 subDiagramWidgetPanelAccepted( qobject_cast<QgsPanelWidget *>( sender() ) );
301}
302
304
305#include "qgsvscrollarea.h"
306
308 : QDialog( parent )
309{
310#ifdef Q_OS_MAC
311 setWindowModality( Qt::WindowModal );
312#endif
313
314 QVBoxLayout *layout = new QVBoxLayout( this );
315 QgsVScrollArea *scrollArea = new QgsVScrollArea( this );
316 scrollArea->setFrameShape( QFrame::NoFrame );
317 layout->addWidget( scrollArea );
318
319 buttonBox = new QDialogButtonBox( QDialogButtonBox::Cancel | QDialogButtonBox::Help | QDialogButtonBox::Ok );
320 mPropsWidget = new QgsDiagramProperties( layer, this, mapCanvas );
321 mPropsWidget->setDockMode( false );
322
323 scrollArea->setWidget( mPropsWidget );
324 layout->addWidget( buttonBox );
325 this->setWindowTitle( "Edit Sub Diagram" );
327
328 connect( buttonBox, &QDialogButtonBox::accepted, this, &QgsStackedDiagramPropertiesDialog::accept );
329 connect( buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject );
330 connect( buttonBox, &QDialogButtonBox::helpRequested, this, &QgsStackedDiagramPropertiesDialog::showHelp );
331}
332
334{
335 mPropsWidget->syncToRenderer( dr );
336}
337
339{
340 mPropsWidget->syncToSettings( dls );
341}
342
344{
345 // Get renderer and diagram layer settings from widget
346 mRenderer = mPropsWidget->createRenderer();
347 mDiagramLayerSettings = mPropsWidget->createDiagramLayerSettings();
348 QDialog::accept();
349}
350
352{
353 return mRenderer.release();
354}
355
360
362{
363 mPropsWidget->setAllowedToEditDiagramLayerSettings( allowed );
364}
365
367{
368 return mPropsWidget->isAllowedToEditDiagramLayerSettings();
369}
370
371void QgsStackedDiagramPropertiesDialog::showHelp()
372{
373 QgsHelp::openHelp( u"working_with_vector/vector_properties.html#diagrams-properties"_s );
374}
375
377
379 : QAbstractTableModel( parent )
380{
381}
382
387
388Qt::ItemFlags QgsStackedDiagramPropertiesModel::flags( const QModelIndex &index ) const
389{
390 // Flat list, to ease drop handling valid indexes are not dropEnabled
391 if ( !index.isValid() )
392 return Qt::ItemIsDropEnabled;
393
394 Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled;
395
396 if ( index.column() == 0 )
397 flags |= Qt::ItemIsUserCheckable;
398
399 return flags;
400}
401
403{
404 return Qt::MoveAction; // | Qt::CopyAction
405}
406
408{
409 QStringList types;
410 types << u"application/vnd.text.list"_s;
411 return types;
412}
413
414QMimeData *QgsStackedDiagramPropertiesModel::mimeData( const QModelIndexList &indexes ) const
415{
416 QMimeData *mimeData = new QMimeData();
417 QByteArray encodedData;
418
419 QDataStream stream( &encodedData, QIODevice::WriteOnly );
420
421 // Sort indexes since their order reflects selection order
422 QModelIndexList sortedIndexes = indexes;
423 std::sort( sortedIndexes.begin(), sortedIndexes.end() );
424
425 for ( const QModelIndex &index : std::as_const( sortedIndexes ) )
426 {
427 // each item consists of several columns - let's add it with just first one
428 if ( !index.isValid() || index.column() != 0 )
429 continue;
430
431 if ( QgsDiagramRenderer *diagram = mRenderers.at( index.row() ) )
432 {
433 QDomDocument doc;
434
435 QDomElement rootElem = doc.createElement( u"diagram_mime"_s );
436 diagram->writeXml( rootElem, doc, QgsReadWriteContext() );
437 doc.appendChild( rootElem );
438 stream << doc.toString( -1 );
439 }
440 }
441
442 mimeData->setData( u"application/vnd.text.list"_s, encodedData );
443 return mimeData;
444}
445
446bool QgsStackedDiagramPropertiesModel::dropMimeData( const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent )
447{
448 Q_UNUSED( column )
449 Q_UNUSED( parent )
450
451 if ( action == Qt::IgnoreAction )
452 return true;
453
454 if ( !data->hasFormat( u"application/vnd.text.list"_s ) )
455 return false;
456
457 QByteArray encodedData = data->data( u"application/vnd.text.list"_s );
458 QDataStream stream( &encodedData, QIODevice::ReadOnly );
459 int rows = 0;
460
461 // the item was dropped at parent, we may decide where to put the items
462 if ( row == -1 )
463 {
464 row = mRenderers.count(); // let's append them (e.g., drop in empty space)
465 }
466
467 while ( !stream.atEnd() )
468 {
469 QString text;
470 stream >> text;
471
472 QDomDocument doc;
473 if ( !doc.setContent( text ) )
474 continue;
475 const QDomElement rootElem = doc.documentElement();
476 if ( rootElem.tagName() != "diagram_mime"_L1 || !rootElem.hasChildNodes() )
477 continue;
478 const QDomElement childElem = rootElem.firstChild().toElement();
479
480 QgsDiagramRenderer *diagram = nullptr;
481 if ( childElem.nodeName() == "SingleCategoryDiagramRenderer"_L1 )
482 {
483 diagram = new QgsSingleCategoryDiagramRenderer();
484 diagram->readXml( childElem, QgsReadWriteContext() );
485 }
486 else if ( childElem.nodeName() == "LinearlyInterpolatedDiagramRenderer"_L1 )
487 {
489 diagram->readXml( childElem, QgsReadWriteContext() );
490 }
491 else if ( childElem.nodeName() == "StackedDiagramRenderer"_L1 )
492 {
493 diagram = new QgsStackedDiagramRenderer();
494 diagram->readXml( childElem, QgsReadWriteContext() );
495 }
496
497 if ( diagram )
498 {
499 insertSubDiagram( row + rows, diagram );
500 rows++;
501 }
502 }
503
504 emit subDiagramsMoved(); // Let views know they can clean some things up
505 return true;
506}
507
508QVariant QgsStackedDiagramPropertiesModel::data( const QModelIndex &index, int role ) const
509{
510 if ( !index.isValid() )
511 return QVariant();
512
514
515 if ( role == Qt::DisplayRole || role == Qt::ToolTipRole )
516 {
517 switch ( index.column() )
518 {
519 case 0:
520 if ( dr && dr->diagram() )
521 {
523 {
524 return tr( "Pie Chart" );
525 }
527 {
528 return tr( "Text Diagram" );
529 }
531 {
532 return tr( "Histogram" );
533 }
535 {
536 return tr( "Stacked Bars" );
537 }
539 {
540 return tr( "Stacked Diagram" );
541 }
542 else
543 {
544 return dr->diagram()->diagramName();
545 }
546 }
547 else
548 {
549 return tr( "(no diagram)" );
550 }
551 case 1:
552 if ( !dr )
553 {
554 return tr( "(no renderer)" );
555 }
556 else
557 {
559 return tr( "Fixed" );
561 return tr( "Scaled" );
562 else
563 return tr( "Unknown" );
564 }
565 case 2:
566 if ( dr && dr->diagram() && !dr->diagramSettings().isEmpty() )
567 {
569 {
570 switch ( dr->diagramSettings().at( 0 ).diagramOrientation )
571 {
573 return tr( "Left" );
575 return tr( "Right" );
577 return tr( "Up" );
579 return tr( "Down" );
580 }
581 }
582 }
583 return QVariant();
584 default:
585 return QVariant();
586 }
587 }
588 else if ( role == Qt::CheckStateRole )
589 {
590 if ( index.column() != 0 )
591 return QVariant();
592
593 return ( dr && !dr->diagramSettings().isEmpty() && dr->diagramSettings().at( 0 ).enabled ) ? Qt::Checked : Qt::Unchecked;
594 }
595 else
596 {
597 return QVariant();
598 }
599}
600
601QVariant QgsStackedDiagramPropertiesModel::headerData( int section, Qt::Orientation orientation, int role ) const
602{
603 if ( orientation == Qt::Horizontal && role == Qt::DisplayRole && section >= 0 && section < 3 )
604 {
605 QStringList lst;
606 lst << tr( "Diagram type" ) << tr( "Size" ) << tr( "Orientation" );
607 return lst[section];
608 }
609
610 return QVariant();
611}
612
613int QgsStackedDiagramPropertiesModel::rowCount( const QModelIndex & ) const
614{
615 return mRenderers.size();
616}
617
618int QgsStackedDiagramPropertiesModel::columnCount( const QModelIndex & ) const
619{
620 return 3;
621}
622
623bool QgsStackedDiagramPropertiesModel::setData( const QModelIndex &index, const QVariant &value, int role )
624{
625 if ( !index.isValid() )
626 return false;
627
629
630 if ( role == Qt::CheckStateRole )
631 {
632 if ( dr && !dr->diagramSettings().isEmpty() )
633 {
634 QgsDiagramSettings ds = dr->diagramSettings().at( 0 );
635 ds.enabled = ( value.toInt() == Qt::Checked );
636
638 {
640 dsr->setDiagramSettings( ds );
641 }
642 else
643 {
645 dlir->setDiagramSettings( ds );
646 }
647
648 emit dataChanged( index, index );
649 return true;
650 }
651 }
652 return false;
653}
654
655bool QgsStackedDiagramPropertiesModel::removeRows( int row, int count, const QModelIndex &parent )
656{
657 if ( row < 0 || row >= mRenderers.size() )
658 return false;
659
660 beginRemoveRows( parent, row, row + count - 1 );
661 while ( count-- )
662 mRenderers.removeAt( row );
663 endRemoveRows();
664
665 return true;
666}
667
669{
670 if ( index.isValid() )
671 return mRenderers.at( index.row() );
672 return nullptr;
673}
674
676{
677 beginInsertRows( QModelIndex(), index, index );
678 mRenderers.insert( index, newSubDiagram );
679 endInsertRows();
680}
681
683{
684 if ( !index.isValid() )
685 return;
686
687 delete mRenderers.at( index.row() );
688 mRenderers.replace( index.row(), dr );
689 emit dataChanged( index, index );
690}
691
692QList<QgsDiagramRenderer *> QgsStackedDiagramPropertiesModel::subRenderers() const
693{
694 return mRenderers;
695}
696
701
706
707// ------------------------------ View style --------------------------------
711
712void QgsStackedDiagramsViewStyle::drawPrimitive( PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget ) const
713{
714 if ( element == QStyle::PE_IndicatorItemViewItemDrop && !option->rect.isNull() )
715 {
716 QStyleOption opt( *option );
717 opt.rect.setLeft( 0 );
718 // draw always as line above, because we move item to that index
719 opt.rect.setHeight( 0 );
720 if ( widget )
721 opt.rect.setRight( widget->width() );
722 QProxyStyle::drawPrimitive( element, &opt, painter, widget );
723 return;
724 }
725 QProxyStyle::drawPrimitive( element, option, painter, widget );
726}
@ Millimeters
Millimeters.
Definition qgis.h:5280
@ Points
Points (e.g., for font sizes).
Definition qgis.h:5284
@ MapUnits
Map units.
Definition qgis.h:5281
@ Pixels
Pixels.
Definition qgis.h:5282
@ Inches
Inches.
Definition qgis.h:5285
@ MetersInMapUnits
Meters value as Map units.
Definition qgis.h:5287
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:224
static void openHelp(const QString &key)
Opens help topic for the given help key using default system web browser.
Definition qgshelp.cpp:41
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.