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