32#include <QApplication>
34#include <QDragEnterEvent>
40#include "moc_qgsmodelgraphicsview.cpp"
42using namespace Qt::StringLiterals;
46#define MIN_VIEW_SCALE 0.05
47#define MAX_VIEW_SCALE 1000.0
49QgsModelGraphicsView::QgsModelGraphicsView( QWidget *parent )
50 : QGraphicsView( parent )
52 setResizeAnchor( QGraphicsView::AnchorViewCenter );
53 setMouseTracking(
true );
54 viewport()->setMouseTracking(
true );
55 setAcceptDrops(
true );
64 setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOn );
65 setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOn );
67 connect( horizontalScrollBar(), &QScrollBar::valueChanged,
this, &QgsModelGraphicsView::friendlySetSceneRect );
68 connect( verticalScrollBar(), &QScrollBar::valueChanged,
this, &QgsModelGraphicsView::friendlySetSceneRect );
70 mSnapper.setSnapToGrid(
true );
73QgsModelGraphicsView::~QgsModelGraphicsView()
78void QgsModelGraphicsView::dragEnterEvent( QDragEnterEvent *event )
80 if ( event->mimeData()->hasFormat( u
"application/x-vnd.qgis.qgis.algorithmid"_s ) || event->mimeData()->hasFormat( u
"application/x-vnd.qgis.qgis.parametertypeid"_s ) || event->mimeData()->hasText() )
81 event->acceptProposedAction();
86void QgsModelGraphicsView::dropEvent( QDropEvent *event )
88 const QPointF dropPoint = mapToScene( event->pos() );
89 if ( event->mimeData()->hasFormat( u
"application/x-vnd.qgis.qgis.algorithmid"_s ) )
91 QByteArray data =
event->mimeData()->data( u
"application/x-vnd.qgis.qgis.algorithmid"_s );
92 QDataStream stream( &data, QIODevice::ReadOnly );
94 stream >> algorithmId;
96 QTimer::singleShot( 0,
this, [
this, dropPoint, algorithmId] { emit algorithmDropped( algorithmId, dropPoint ); } );
99 else if ( event->mimeData()->hasFormat( u
"application/x-vnd.qgis.qgis.parametertypeid"_s ) )
101 QByteArray data =
event->mimeData()->data( u
"application/x-vnd.qgis.qgis.parametertypeid"_s );
102 QDataStream stream( &data, QIODevice::ReadOnly );
104 stream >> paramTypeId;
106 QTimer::singleShot( 0,
this, [
this, dropPoint, paramTypeId] { emit inputDropped( paramTypeId, dropPoint ); } );
109 else if ( event->mimeData()->hasText() )
111 const QString itemId =
event->mimeData()->text();
112 QTimer::singleShot( 0,
this, [
this, dropPoint, itemId] { emit inputDropped( itemId, dropPoint ); } );
121void QgsModelGraphicsView::dragMoveEvent( QDragMoveEvent *event )
123 if ( event->mimeData()->hasFormat( u
"application/x-vnd.qgis.qgis.algorithmid"_s ) || event->mimeData()->hasFormat( u
"application/x-vnd.qgis.qgis.parametertypeid"_s ) || event->mimeData()->hasText() )
124 event->acceptProposedAction();
129void QgsModelGraphicsView::wheelEvent( QWheelEvent *event )
136 mTool->wheelEvent( event );
139 if ( !mTool || !event->isAccepted() )
146void QgsModelGraphicsView::wheelZoom( QWheelEvent *event )
150 double zoomFactor = settings.
value( u
"qgis/zoom_factor"_s, 2 ).toDouble();
151 bool reverseZoom = settings.
value( u
"qgis/reverse_wheel_zoom"_s,
false ).toBool();
152 bool zoomIn = reverseZoom ?
event->angleDelta().y() < 0 :
event->angleDelta().y() > 0;
155 zoomFactor = 1.0 + ( zoomFactor - 1.0 ) / 120.0 * std::fabs( event->angleDelta().y() );
157 if ( event->modifiers() & Qt::ControlModifier )
160 zoomFactor = 1.0 + ( zoomFactor - 1.0 ) / 20.0;
164 double scaleFactor = ( zoomIn ? 1 / zoomFactor : zoomFactor );
167 QRect viewportRect( 0, 0, viewport()->width(), viewport()->height() );
171 QPointF scenePoint = mapToScene( event->position().x(), event->position().y() );
175 QgsPointXY newCenter( scenePoint.x() + ( ( oldCenter.x() - scenePoint.x() ) * scaleFactor ), scenePoint.y() + ( ( oldCenter.y() - scenePoint.y() ) * scaleFactor ) );
176 centerOn( newCenter.x(), newCenter.y() );
181 scaleSafe( zoomFactor );
185 scaleSafe( 1 / zoomFactor );
189void QgsModelGraphicsView::scaleSafe(
double scale )
191 double currentScale = transform().m11();
192 scale *= currentScale;
194 setTransform( QTransform::fromScale( scale, scale ) );
197QPointF QgsModelGraphicsView::deltaForKeyEvent( QKeyEvent *event )
200 double increment = 1.0;
201 if ( event->modifiers() & Qt::ShiftModifier )
206 else if ( event->modifiers() & Qt::AltModifier )
209 double viewScale = transform().m11();
212 increment = 1 / viewScale;
218 switch ( event->key() )
236 return QPointF( deltaX, deltaY );
239void QgsModelGraphicsView::mousePressEvent( QMouseEvent *event )
247 mTool->modelPressEvent( me.get() );
248 event->setAccepted( me->isAccepted() );
251 if ( !mTool || !event->isAccepted() )
253 if ( event->button() == Qt::MiddleButton && mTool != mSpacePanTool && mTool != mSpaceZoomTool )
256 setTool( mMidMouseButtonPanTool );
261 QGraphicsView::mousePressEvent( event );
266void QgsModelGraphicsView::mouseReleaseEvent( QMouseEvent *event )
274 mTool->modelReleaseEvent( me.get() );
275 event->setAccepted( me->isAccepted() );
278 if ( !mTool || !event->isAccepted() )
279 QGraphicsView::mouseReleaseEvent( event );
282void QgsModelGraphicsView::mouseMoveEvent( QMouseEvent *event )
287 mMouseCurrentXY =
event->pos();
289 QPointF cursorPos = mapToScene( mMouseCurrentXY );
292 auto me = std::make_unique<QgsModelViewMouseEvent>(
this, event,
false );
300 if ( me->isSnapped() )
302 cursorPos = me->snappedPoint();
305 mSnapMarker->setPos( me->snappedPoint() );
306 mSnapMarker->setVisible(
true );
309 else if ( mSnapMarker )
311 mSnapMarker->setVisible(
false );
314 mTool->modelMoveEvent( me.get() );
315 event->setAccepted( me->isAccepted() );
318 if ( !mTool || !event->isAccepted() )
319 QGraphicsView::mouseMoveEvent( event );
322void QgsModelGraphicsView::mouseDoubleClickEvent( QMouseEvent *event )
330 mTool->modelDoubleClickEvent( me.get() );
331 event->setAccepted( me->isAccepted() );
334 if ( !mTool || !event->isAccepted() )
335 QGraphicsView::mouseDoubleClickEvent( event );
338void QgsModelGraphicsView::keyPressEvent( QKeyEvent *event )
345 mTool->keyPressEvent( event );
348 if ( mTool && event->isAccepted() )
351 if ( event->key() == Qt::Key_Space && !event->isAutoRepeat() && mTool != mMidMouseButtonPanTool )
353 if ( !( event->modifiers() & Qt::ControlModifier ) )
356 setTool( mSpacePanTool );
361 setTool( mSpaceZoomTool );
365 else if ( event->key() == Qt::Key_Left || event->key() == Qt::Key_Right || event->key() == Qt::Key_Up || event->key() == Qt::Key_Down )
367 QgsModelGraphicsScene *s = modelScene();
368 const QList<QgsModelComponentGraphicItem *> itemList = s->selectedComponentItems();
369 if ( !itemList.empty() )
371 QPointF delta = deltaForKeyEvent( event );
373 startMacroCommand( tr(
"Move Items" ) );
374 for ( QgsModelComponentGraphicItem *item : itemList )
376 item->moveComponentBy( delta.x(), delta.y() );
378 itemList.at( 0 )->changed();
385void QgsModelGraphicsView::keyReleaseEvent( QKeyEvent *event )
392 mTool->keyReleaseEvent( event );
395 if ( !mTool || !event->isAccepted() )
396 QGraphicsView::keyReleaseEvent( event );
399void QgsModelGraphicsView::setModelScene( QgsModelGraphicsScene *scene )
403 connect( scene, &QgsModelGraphicsScene::sceneRectChanged,
this, &QgsModelGraphicsView::friendlySetSceneRect );
407 mSnapMarker =
new QgsModelViewSnapMarker();
409 scene->addItem( mSnapMarker );
412QgsModelGraphicsScene *QgsModelGraphicsView::modelScene()
const
414 return qobject_cast<QgsModelGraphicsScene *>( QgsModelGraphicsView::scene() );
438 emit toolSet( mTool );
443 if ( mTool && mTool == tool )
446 emit toolSet(
nullptr );
447 setCursor( Qt::ArrowCursor );
456void QgsModelGraphicsView::startMacroCommand(
const QString &text )
458 emit macroCommandStarted( text );
461void QgsModelGraphicsView::endMacroCommand()
463 emit macroCommandEnded();
466void QgsModelGraphicsView::beginCommand(
const QString &text )
468 emit commandBegun( text );
471void QgsModelGraphicsView::endCommand()
476void QgsModelGraphicsView::abortCommand()
478 emit commandAborted();
481void QgsModelGraphicsView::snapSelected()
483 QgsModelGraphicsScene *s = modelScene();
484 const QList<QgsModelComponentGraphicItem *> itemList = s->selectedComponentItems();
485 startMacroCommand( tr(
"Snap Items" ) );
486 if ( !itemList.empty() )
488 bool prevSetting = mSnapper.snapToGrid();
489 mSnapper.setSnapToGrid(
true );
490 for ( QgsModelComponentGraphicItem *item : itemList )
492 bool wasSnapped =
false;
493 QRectF snapped = mSnapper.snapRectWithResize( item->mapRectToScene( item->itemRect() ), transform().m11(), wasSnapped );
496 item->setItemRect( snapped );
499 mSnapper.setSnapToGrid( prevSetting );
504void QgsModelGraphicsView::friendlySetSceneRect()
506 if ( mBlockScrollbarSignals )
509 const QRectF currentSceneRect = sceneRect();
511 const QRectF modelSceneRect = modelScene()->sceneRect();
512 const QRectF visibleRect = mapToScene( viewport()->rect() ).boundingRect();
514 newSceneRect.setLeft( std::min( modelSceneRect.left(), visibleRect.left() ) );
515 newSceneRect.setRight( std::max( modelSceneRect.right(), visibleRect.right() ) );
516 newSceneRect.setTop( std::min( modelSceneRect.top(), visibleRect.top() ) );
517 newSceneRect.setBottom( std::max( modelSceneRect.bottom(), visibleRect.bottom() ) );
520 newSceneRect.setLeft( std::floor( newSceneRect.left() ) );
521 newSceneRect.setTop( std::floor( newSceneRect.top() ) );
522 newSceneRect.setRight( std::ceil( newSceneRect.right() ) );
523 newSceneRect.setBottom( std::ceil( newSceneRect.bottom() ) );
529 constexpr int MIN_VIEW_SHIFT_THRESHOLD_PIXELS = 20;
530 if ( std::abs( newSceneRect.left() - currentSceneRect.left() ) > MIN_VIEW_SHIFT_THRESHOLD_PIXELS
531 || std::abs( newSceneRect.right() - currentSceneRect.right() ) > MIN_VIEW_SHIFT_THRESHOLD_PIXELS
532 || std::abs( newSceneRect.top() - currentSceneRect.top() ) > MIN_VIEW_SHIFT_THRESHOLD_PIXELS
533 || std::abs( newSceneRect.bottom() - currentSceneRect.bottom() ) > MIN_VIEW_SHIFT_THRESHOLD_PIXELS )
535 mBlockScrollbarSignals++;
536 setSceneRect( newSceneRect );
537 mBlockScrollbarSignals--;
541void QgsModelGraphicsView::copySelectedItems( QgsModelGraphicsView::ClipboardOperation operation )
543 copyItems( modelScene()->selectedComponentItems(), operation );
546void QgsModelGraphicsView::copyItems(
const QList<QgsModelComponentGraphicItem *> &items, QgsModelGraphicsView::ClipboardOperation operation )
553 QDomElement documentElement = doc.createElement( u
"ModelComponentClipboard"_s );
554 if ( operation == ClipboardCut )
556 emit macroCommandStarted( tr(
"Cut Items" ) );
557 emit commandBegun( QString() );
560 QList<QVariant> paramComponents;
561 QList<QVariant> groupBoxComponents;
562 QList<QVariant> algComponents;
564 QList<QgsModelComponentGraphicItem *> selectedCommentParents;
565 QList<QgsProcessingModelOutput> selectedOutputs;
566 QList<QgsProcessingModelOutput> selectedOutputsComments;
567 for ( QgsModelComponentGraphicItem *item : items )
569 if (
const QgsModelCommentGraphicItem *commentItem =
dynamic_cast<QgsModelCommentGraphicItem *
>( item ) )
571 selectedCommentParents << commentItem->parentComponentItem();
572 if (
const QgsModelOutputGraphicItem *outputItem =
dynamic_cast<QgsModelOutputGraphicItem *
>( commentItem->parentComponentItem() ) )
574 selectedOutputsComments << *( static_cast<const QgsProcessingModelOutput *>( outputItem->component() ) );
577 else if (
const QgsModelOutputGraphicItem *outputItem =
dynamic_cast<QgsModelOutputGraphicItem *
>( item ) )
579 selectedOutputs << *( static_cast<const QgsProcessingModelOutput *>( outputItem->component() ) );
583 for ( QgsModelComponentGraphicItem *item : items )
585 if (
const QgsProcessingModelParameter *param =
dynamic_cast<QgsProcessingModelParameter *
>( item->component() ) )
587 QgsProcessingModelParameter component = *param;
590 if ( !selectedCommentParents.contains( item ) )
593 component.comment()->setDescription( QString() );
596 QVariantMap paramDef;
597 paramDef.insert( u
"component"_s, component.toVariant() );
599 paramDef.insert( u
"definition"_s, def->
toVariantMap() );
601 paramComponents << paramDef;
603 else if ( QgsProcessingModelGroupBox *groupBox =
dynamic_cast<QgsProcessingModelGroupBox *
>( item->component() ) )
605 groupBoxComponents << groupBox->toVariant();
607 else if (
const QgsProcessingModelChildAlgorithm *alg =
dynamic_cast<QgsProcessingModelChildAlgorithm *
>( item->component() ) )
609 QgsProcessingModelChildAlgorithm childAlg = *alg;
612 if ( !selectedCommentParents.contains( item ) )
615 childAlg.comment()->setDescription( QString() );
619 QMap<QString, QgsProcessingModelOutput> clipboardOutputs;
620 const QMap<QString, QgsProcessingModelOutput> existingOutputs = childAlg.modelOutputs();
621 for (
auto it = existingOutputs.constBegin(); it != existingOutputs.constEnd(); ++it )
624 for (
const QgsProcessingModelOutput &candidate : selectedOutputs )
626 if ( candidate.childId() == childAlg.childId() && candidate.name() == it.value().name() && candidate.childOutputName() == it.value().childOutputName() )
635 bool commentFound =
false;
636 for (
const QgsProcessingModelOutput &candidate : selectedOutputsComments )
638 if ( candidate.childId() == childAlg.childId() && candidate.name() == it.value().name() && candidate.childOutputName() == it.value().childOutputName() )
645 QgsProcessingModelOutput output = it.value();
647 output.comment()->setDescription( QString() );
649 clipboardOutputs.insert( it.key(), output );
652 childAlg.setModelOutputs( clipboardOutputs );
654 algComponents << childAlg.toVariant();
657 QVariantMap components;
658 components.insert( u
"parameters"_s, paramComponents );
659 components.insert( u
"groupboxes"_s, groupBoxComponents );
660 components.insert( u
"algs"_s, algComponents );
662 if ( operation == ClipboardCut )
664 emit deleteSelectedItems();
666 emit macroCommandEnded();
669 QMimeData *mimeData =
new QMimeData;
670 mimeData->setData( u
"text/xml"_s, doc.toByteArray() );
671 mimeData->setText( doc.toByteArray() );
672 QClipboard *clipboard = QApplication::clipboard();
673 clipboard->setMimeData( mimeData );
676void QgsModelGraphicsView::pasteItems( QgsModelGraphicsView::PasteMode mode )
682 QClipboard *clipboard = QApplication::clipboard();
683 const QMimeData *mimeData = clipboard->mimeData();
686 if ( doc.setContent( mimeData->data( u
"text/xml"_s ) ) )
688 QDomElement docElem = doc.documentElement();
691 if ( res.contains( u
"parameters"_s ) && res.contains( u
"algs"_s ) )
696 case PasteModeCursor:
697 case PasteModeInPlace:
700 pt = mapToScene( mapFromGlobal( QCursor::pos() ) );
703 case PasteModeCenter:
706 pt = mapToScene( viewport()->rect().center() );
711 beginCommand( tr(
"Paste Items" ) );
715 QList<QgsProcessingModelGroupBox> pastedGroups;
716 for (
const QVariant &v : res.value( u
"groupboxes"_s ).toList() )
718 QgsProcessingModelGroupBox box;
720 box.loadVariant( v.toMap(),
true );
724 modelScene()->model()->addGroupBox( box );
726 if ( !pastedBounds.isValid() )
727 pastedBounds = QRectF( box.position() - QPointF( box.size().width() / 2.0, box.size().height() / 2.0 ), box.size() );
729 pastedBounds = pastedBounds.united( QRectF( box.position() - QPointF( box.size().width() / 2.0, box.size().height() / 2.0 ), box.size() ) );
732 QStringList pastedParameters;
733 for (
const QVariant &v : res.value( u
"parameters"_s ).toList() )
735 QVariantMap param = v.toMap();
736 QVariantMap componentDef = param.value( u
"component"_s ).toMap();
737 QVariantMap paramDef = param.value( u
"definition"_s ).toMap();
741 QgsProcessingModelParameter p;
742 p.loadVariant( componentDef );
745 QString name = p.parameterName();
746 QString description = paramDefinition->description();
748 while ( modelScene()->model()->parameterDefinition( name ) )
751 name = u
"%1 (%2)"_s.arg( p.parameterName() ).arg( next );
752 description = u
"%1 (%2)"_s.arg( paramDefinition->description() ).arg( next );
754 paramDefinition->setName( name );
755 paramDefinition->setDescription( description );
756 p.setParameterName( name );
758 modelScene()->model()->addModelParameter( paramDefinition.release(), p );
759 pastedParameters << p.parameterName();
761 if ( !pastedBounds.isValid() )
762 pastedBounds = QRectF( p.position() - QPointF( p.size().width() / 2.0, p.size().height() / 2.0 ), p.size() );
764 pastedBounds = pastedBounds.united( QRectF( p.position() - QPointF( p.size().width() / 2.0, p.size().height() / 2.0 ), p.size() ) );
766 if ( !p.comment()->description().isEmpty() )
767 pastedBounds = pastedBounds.united( QRectF( p.comment()->position() - QPointF( p.comment()->size().width() / 2.0, p.comment()->size().height() / 2.0 ), p.comment()->size() ) );
770 QStringList pastedAlgorithms;
771 for (
const QVariant &v : res.value( u
"algs"_s ).toList() )
773 QgsProcessingModelChildAlgorithm alg;
774 alg.loadVariant( v.toMap() );
777 if ( modelScene()->model()->childAlgorithms().contains( alg.childId() ) )
779 alg.generateChildId( *modelScene()->model() );
783 pastedAlgorithms << alg.childId();
785 if ( !pastedBounds.isValid() )
786 pastedBounds = QRectF( alg.position() - QPointF( alg.size().width() / 2.0, alg.size().height() / 2.0 ), alg.size() );
788 pastedBounds = pastedBounds.united( QRectF( alg.position() - QPointF( alg.size().width() / 2.0, alg.size().height() / 2.0 ), alg.size() ) );
790 if ( !alg.comment()->description().isEmpty() )
791 pastedBounds = pastedBounds.united( QRectF( alg.comment()->position() - QPointF( alg.comment()->size().width() / 2.0, alg.comment()->size().height() / 2.0 ), alg.comment()->size() ) );
793 const QMap<QString, QgsProcessingModelChildAlgorithm> existingAlgs = modelScene()->model()->childAlgorithms();
795 const QMap<QString, QgsProcessingModelOutput> outputs = alg.modelOutputs();
796 QMap<QString, QgsProcessingModelOutput> pastedOutputs;
797 for (
auto it = outputs.constBegin(); it != outputs.constEnd(); ++it )
799 QString name = it.value().name();
805 for (
auto algIt = existingAlgs.constBegin(); algIt != existingAlgs.constEnd(); ++algIt )
807 const QMap<QString, QgsProcessingModelOutput> algOutputs = algIt->modelOutputs();
808 for (
auto outputIt = algOutputs.constBegin(); outputIt != algOutputs.constEnd(); ++outputIt )
810 if ( outputIt.value().name() == name )
822 name = u
"%1 (%2)"_s.arg( it.value().name() ).arg( next );
825 QgsProcessingModelOutput newOutput = it.value();
826 newOutput.setName( name );
827 newOutput.setDescription( name );
828 pastedOutputs.insert( name, newOutput );
830 pastedBounds = pastedBounds.united( QRectF( newOutput.position() - QPointF( newOutput.size().width() / 2.0, newOutput.size().height() / 2.0 ), newOutput.size() ) );
832 if ( !alg.comment()->description().isEmpty() )
833 pastedBounds = pastedBounds.united(
834 QRectF( newOutput.comment()->position() - QPointF( newOutput.comment()->size().width() / 2.0, newOutput.comment()->size().height() / 2.0 ), newOutput.comment()->size() )
837 alg.setModelOutputs( pastedOutputs );
839 modelScene()->model()->addChildAlgorithm( alg );
842 QPointF offset( 0, 0 );
845 case PasteModeInPlace:
848 case PasteModeCursor:
849 case PasteModeCenter:
851 offset = pt - pastedBounds.topLeft();
856 if ( !offset.isNull() )
858 for ( QgsProcessingModelGroupBox pastedGroup : std::as_const( pastedGroups ) )
860 pastedGroup.setPosition( pastedGroup.position() + offset );
861 modelScene()->model()->addGroupBox( pastedGroup );
863 for (
const QString &pastedParam : std::as_const( pastedParameters ) )
865 modelScene()->model()->parameterComponent( pastedParam ).setPosition( modelScene()->model()->parameterComponent( pastedParam ).position() + offset );
866 modelScene()->model()->parameterComponent( pastedParam ).comment()->setPosition( modelScene()->model()->parameterComponent( pastedParam ).comment()->position() + offset );
868 for (
const QString &pastedAlg : std::as_const( pastedAlgorithms ) )
870 modelScene()->model()->childAlgorithm( pastedAlg ).setPosition( modelScene()->model()->childAlgorithm( pastedAlg ).position() + offset );
871 modelScene()->model()->childAlgorithm( pastedAlg ).comment()->setPosition( modelScene()->model()->childAlgorithm( pastedAlg ).comment()->position() + offset );
873 const QMap<QString, QgsProcessingModelOutput> outputs = modelScene()->model()->childAlgorithm( pastedAlg ).modelOutputs();
874 for (
auto it = outputs.begin(); it != outputs.end(); ++it )
876 modelScene()->model()->childAlgorithm( pastedAlg ).modelOutput( it.key() ).setPosition( modelScene()->model()->childAlgorithm( pastedAlg ).modelOutput( it.key() ).position() + offset );
879 ->childAlgorithm( pastedAlg )
880 .modelOutput( it.key() )
882 ->setPosition( modelScene()->model()->childAlgorithm( pastedAlg ).modelOutput( it.key() ).comment()->position() + offset );
891 modelScene()->rebuildRequired();
894QgsModelViewSnapMarker::QgsModelViewSnapMarker()
895 : QGraphicsRectItem( QRectF( 0, 0, 0, 0 ) )
898 QFontMetrics fm( f );
899 mSize = fm.horizontalAdvance(
'X' );
900 setPen( QPen( Qt::transparent, mSize ) );
902 setFlags( flags() | QGraphicsItem::ItemIgnoresTransformations );
903 setZValue( QgsModelGraphicsScene::ZSnapIndicator );
906void QgsModelViewSnapMarker::paint( QPainter *p,
const QStyleOptionGraphicsItem *, QWidget * )
908 QPen pen( QColor( 255, 0, 0 ) );
911 p->setBrush( Qt::NoBrush );
913 double halfSize = mSize / 2.0;
914 p->drawLine( QLineF( -halfSize, -halfSize, halfSize, halfSize ) );
915 p->drawLine( QLineF( -halfSize, halfSize, halfSize, -halfSize ) );
Manages snapping grids and preset snap lines in a layout, and handles snapping points to the nearest ...
Base class for the definition of processing parameters.
virtual QVariantMap toVariantMap() const
Saves this parameter to a QVariantMap.
static QgsProcessingParameterDefinition * parameterFromVariantMap(const QVariantMap &map)
Creates a new QgsProcessingParameterDefinition using the configuration from a supplied variant map.
A container for the context for various read/write operations on objects.
A rectangle specified with double values.
Stores settings for use within QGIS.
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
static QDomElement writeVariant(const QVariant &value, QDomDocument &doc)
Write a QVariant to a QDomElement.
static QVariant readVariant(const QDomElement &element)
Read a QVariant from a QDomElement.