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