QGIS API Documentation 4.3.0-Master (4a47d6a9bb1)
Loading...
Searching...
No Matches
qgsmodelcomponentgraphicitem.h
Go to the documentation of this file.
1/***************************************************************************
2 qgsmodelcomponentgraphicitem.h
3 ----------------------------------
4 Date : March 2020
5 Copyright : (C) 2020 Nyall Dawson
6 Email : nyall dot dawson at gmail dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
16#ifndef QGSMODELCOMPONENTGRAPHICITEM_H
17#define QGSMODELCOMPONENTGRAPHICITEM_H
18
19#include "qgis.h"
20#include "qgis_gui.h"
23
24#include <QFont>
25#include <QGraphicsObject>
26#include <QPicture>
27#include <QPointer>
28
29class QgsProcessingModelComponent;
30class QgsProcessingModelParameter;
31class QgsProcessingModelChildAlgorithm;
32class QgsProcessingModelOutput;
33class QgsProcessingModelComment;
34class QgsProcessingModelAlgorithm;
35class QgsModelDesignerFlatButtonGraphicItem;
36class QgsModelDesignerFoldButtonGraphicItem;
37class QgsModelDesignerSocketGraphicItem;
38class QgsModelGraphicsView;
40class QgsProcessingModelGroupBox;
41class QgsModelArrowItem;
42
44
51class GUI_EXPORT QgsModelComponentGraphicItem : public QGraphicsObject, public QgsProcessingWidgetContextGenerator
52{
53 Q_OBJECT
54
55 public:
57 enum State
58 {
59 Normal,
60 Selected,
61 Hover,
62 };
63
65 enum Flag SIP_ENUM_BASETYPE( IntFlag )
66 {
67 // For future API flexibility only and to avoid sip issues, remove when real entries are added to flags.
68 Unused = 1 << 0,
69 };
70 Q_DECLARE_FLAGS( Flags, Flag )
71
72
80 QgsModelComponentGraphicItem( QgsProcessingModelComponent *component SIP_TRANSFER, QgsProcessingModelAlgorithm *model, QGraphicsItem *parent SIP_TRANSFERTHIS );
81
82 ~QgsModelComponentGraphicItem() override;
83
87 virtual Flags flags() const;
88
92 QgsProcessingModelComponent *component();
93
97 const QgsProcessingModelComponent *component() const SIP_SKIP;
98
102 QgsProcessingModelAlgorithm *model();
103
107 const QgsProcessingModelAlgorithm *model() const SIP_SKIP;
108
112 QgsModelGraphicsView *view();
113
118 QFont font() const;
119
124 void setFont( const QFont &font );
125
131 void moveComponentBy( qreal dx, qreal dy );
132
136 void previewItemMove( qreal dx, qreal dy );
137
141 void setItemRect( QRectF rect );
142
143#ifndef SIP_RUN
144
150 virtual QColor linkColor( Qt::Edge edge, int index ) const;
151
155 QRectF previewItemRectChange( QRectF rect );
156
160 void finalizePreviewedItemRectChange( QRectF rect );
161
165 virtual void modelHoverEnterEvent( QgsModelViewMouseEvent *event );
166
170 virtual void modelHoverMoveEvent( QgsModelViewMouseEvent *event );
171
175 virtual void modelHoverLeaveEvent( QgsModelViewMouseEvent *event );
176
180 virtual void modelDoubleClickEvent( QgsModelViewMouseEvent *event );
181#endif
182 void mouseDoubleClickEvent( QGraphicsSceneMouseEvent *event ) override;
183 void hoverEnterEvent( QGraphicsSceneHoverEvent *event ) override;
184 void hoverMoveEvent( QGraphicsSceneHoverEvent *event ) override;
185 void hoverLeaveEvent( QGraphicsSceneHoverEvent *event ) override;
186 QVariant itemChange( GraphicsItemChange change, const QVariant &value ) override;
187 QRectF boundingRect() const override;
188 bool contains( const QPointF &point ) const override;
189 void paint( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr ) override;
190
194 QRectF itemRect( bool storedRect = false ) const;
195
201 QString label() const;
202
208 void setLabel( const QString &label );
209
213 State state() const;
214
218 virtual int linkPointCount( Qt::Edge edge ) const;
219
223 virtual QString linkPointText( Qt::Edge edge, int index ) const;
224
228 QPointF linkPoint( Qt::Edge edge, int index, bool incoming ) const;
229
237 QPointF calculateAutomaticLinkPoint( QgsModelComponentGraphicItem *other, Qt::Edge &edge SIP_OUT ) const;
238
246 QPointF calculateAutomaticLinkPoint( const QPointF &point, Qt::Edge &edge SIP_OUT ) const;
247
254 QgsModelDesignerSocketGraphicItem *outSocketAt( int index ) const;
255
256
262 virtual void editComment() {}
263
267 virtual bool canDeleteComponent() { return false; }
268
274 virtual void deleteComponent() {}
275
282 QList< QgsModelArrowItem * > incomingArrows();
283
290 QList< QgsModelArrowItem * > outgoingArrows();
291
297 void registerWidgetContextGenerator( QgsProcessingWidgetContextGenerator *generator );
298
299 QgsProcessingParameterWidgetContext createWidgetContext() override;
300
301 signals:
302
303 // TODO - rework this, should be triggered externally when the model actually changes!
304
308 void requestModelRepaint();
309
317 void aboutToChange( const QString &text, const QString &id = QString() );
318
323 void changed();
324
328 void repaintArrows();
329
333 void updateArrowPaths();
334
338 void sizePositionChanged();
339
340 protected slots:
341
347 virtual void editComponent() {}
348
349 protected:
355 virtual void paintBackground( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr );
356
360 void paintOutline( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr );
361
366 QString truncatedTextForItem( const QString &text ) const;
367
371 virtual QColor fillColor( State state ) const = 0;
372
376 virtual QColor strokeColor( State state ) const = 0;
377
381 virtual QColor textColor( State state ) const = 0;
382
386 virtual Qt::PenStyle strokeStyle( State state ) const;
387
393 virtual QColor outlineColor() const { return QColor(); }
394
398 virtual Qt::Alignment titleAlignment() const;
399
403 virtual QPicture iconPicture() const;
404
408 virtual QPixmap iconPixmap() const;
409
413 virtual void updateStoredComponentPosition( const QPointF &pos, const QSizeF &size ) = 0;
414
418 void updateButtonPositions();
419
425 SIP_SKIP static constexpr QColor FALLBACK_COLOR = QColor( 128, 128, 128 ); /* mid gray */
426
427 private:
428 QSizeF itemSize() const;
429
430 void updateToolTip( const QPointF &pos );
431
432 void fold( Qt::Edge edge, bool folded );
433
434 std::unique_ptr<QgsProcessingModelComponent> mComponent;
435 QgsProcessingModelAlgorithm *mModel = nullptr;
436
437 bool mInitialized = false;
438 QgsModelDesignerFoldButtonGraphicItem *mExpandTopButton = nullptr;
439 QgsModelDesignerFoldButtonGraphicItem *mExpandBottomButton = nullptr;
440
441 QString mLabel;
442
443 QgsModelDesignerFlatButtonGraphicItem *mEditButton = nullptr;
444 QgsModelDesignerFlatButtonGraphicItem *mDeleteButton = nullptr;
445
446 QList< QgsModelDesignerSocketGraphicItem * > mInSockets;
447 QList< QgsModelDesignerSocketGraphicItem * > mOutSockets;
448
449 QgsProcessingWidgetContextGenerator *mWidgetContextGenerator = nullptr;
450
451 static constexpr double MIN_COMPONENT_WIDTH = 70;
452 static constexpr double MIN_COMPONENT_HEIGHT = 30;
453
454 static constexpr double DEFAULT_BUTTON_WIDTH = 16;
455 static constexpr double DEFAULT_BUTTON_HEIGHT = 16;
456 static constexpr double BUTTON_MARGIN = 2;
457 static constexpr double TEXT_MARGIN = 4;
458 static constexpr double RECT_PEN_SIZE = 2;
459 static constexpr double RECT_OUTLINE_SIZE = 10;
460 QSizeF mButtonSize { DEFAULT_BUTTON_WIDTH, DEFAULT_BUTTON_HEIGHT };
461
462 QFont mFont;
463
464 bool mIsHovering = false;
465 QSizeF mTempSize;
466};
467Q_DECLARE_OPERATORS_FOR_FLAGS( QgsModelComponentGraphicItem::Flags )
468
469
475class GUI_EXPORT QgsModelParameterGraphicItem : public QgsModelComponentGraphicItem
476{
477 Q_OBJECT
478
479 public:
488 QgsModelParameterGraphicItem( QgsProcessingModelParameter *parameter SIP_TRANSFER, QgsProcessingModelAlgorithm *model, QGraphicsItem *parent SIP_TRANSFERTHIS );
489
490 void contextMenuEvent( QGraphicsSceneContextMenuEvent *event ) override;
491 bool canDeleteComponent() override;
492
493 QColor linkColor( Qt::Edge edge, int index ) const override;
494
495 protected:
496 QColor fillColor( State state ) const override;
497 QColor strokeColor( State state ) const override;
498 QColor textColor( State state ) const override;
499 QPicture iconPicture() const override;
500
501 int linkPointCount( Qt::Edge edge ) const override;
502 QString linkPointText( Qt::Edge edge, int index ) const override;
503 void updateStoredComponentPosition( const QPointF &pos, const QSizeF &size ) override;
504
505 protected slots:
506
507 void deleteComponent() override;
508
509 private:
510 QPicture mPicture;
511};
512
519class GUI_EXPORT QgsModelChildAlgorithmGraphicItem : public QgsModelComponentGraphicItem
520{
521 Q_OBJECT
522
523 public:
532 QgsModelChildAlgorithmGraphicItem( QgsProcessingModelChildAlgorithm *child SIP_TRANSFER, QgsProcessingModelAlgorithm *model, QGraphicsItem *parent SIP_TRANSFERTHIS );
533 void contextMenuEvent( QGraphicsSceneContextMenuEvent *event ) override;
534 bool canDeleteComponent() override;
535
539 void setResults( const QgsProcessingModelChildAlgorithmResult &results );
540
548 void setSourceFeatureCount( const QString &parameterName, long long featureCount );
549
557 void setSinkFeatureCount( const QString &outputName, long long featureCount );
558
564 QgsProcessingModelChildAlgorithmResult results() { return mResults; };
565
569 void setProgress( double progress );
570
576 void setStarted();
577
583 void setOutdated();
584
591 int indexForInput( const QString &parameterName ) const;
592
599 int indexForOutput( const QString &output ) const;
600
601 signals:
602
608 void runFromHere();
609
615 void runSelected();
616
622 void showPreviousResults();
623
629 void showLog();
630
637 void rebuildConfigurationDockWidget();
638
639 protected:
640 void paintBackground( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr ) override;
641
642 QColor fillColor( State state ) const override;
643 QColor strokeColor( State state ) const override;
644 QColor textColor( State state ) const override;
645 QColor outlineColor() const override;
646 QPixmap iconPixmap() const override;
647 QPicture iconPicture() const override;
648
649 int linkPointCount( Qt::Edge edge ) const override;
650 QString linkPointText( Qt::Edge edge, int index ) const override;
651 void updateStoredComponentPosition( const QPointF &pos, const QSizeF &size ) override;
652
653 protected slots:
654
655 void deleteComponent() override;
656
657 private slots:
658 void deactivateAlgorithm();
659 void activateAlgorithm();
660
661 private:
662 QPicture mPicture;
663 QPixmap mPixmap;
664 bool mStarted = false;
665 bool mOutdated = false;
666 QgsProcessingModelChildAlgorithmResult mResults;
667 double mProgress = -1;
668 bool mIsValid = true;
669};
670
671
678class GUI_EXPORT QgsModelOutputGraphicItem : public QgsModelComponentGraphicItem
679{
680 Q_OBJECT
681
682 public:
691 QgsModelOutputGraphicItem( QgsProcessingModelOutput *output SIP_TRANSFER, QgsProcessingModelAlgorithm *model, QGraphicsItem *parent SIP_TRANSFERTHIS );
692
693 bool canDeleteComponent() override;
694
695 protected:
696 QColor fillColor( State state ) const override;
697 QColor strokeColor( State state ) const override;
698 QColor textColor( State state ) const override;
699 QPicture iconPicture() const override;
700 void updateStoredComponentPosition( const QPointF &pos, const QSizeF &size ) override;
701
702 protected slots:
703
704 void deleteComponent() override;
705
706 private:
707 QPicture mPicture;
708};
709
710
717class GUI_EXPORT QgsModelCommentGraphicItem : public QgsModelComponentGraphicItem
718{
719 Q_OBJECT
720
721 public:
730 QgsModelCommentGraphicItem( QgsProcessingModelComment *comment SIP_TRANSFER, QgsModelComponentGraphicItem *parentItem, QgsProcessingModelAlgorithm *model, QGraphicsItem *parent SIP_TRANSFERTHIS );
731 ~QgsModelCommentGraphicItem() override;
732 void contextMenuEvent( QGraphicsSceneContextMenuEvent *event ) override;
733 bool canDeleteComponent() override;
734
738 QgsModelComponentGraphicItem *parentComponentItem() const;
739
740 protected:
741 QColor fillColor( State state ) const override;
742 QColor strokeColor( State state ) const override;
743 QColor textColor( State state ) const override;
744 Qt::PenStyle strokeStyle( State state ) const override;
745 void updateStoredComponentPosition( const QPointF &pos, const QSizeF &size ) override;
746
747 protected slots:
748
749 void deleteComponent() override;
750 void editComponent() override;
751
752 private:
753 QgsProcessingModelComment *modelComponent();
754
755 std::unique_ptr<QgsProcessingModelComponent> mParentComponent;
756 QPointer<QgsModelComponentGraphicItem> mParentItem;
757};
758
759
766class GUI_EXPORT QgsModelGroupBoxGraphicItem : public QgsModelComponentGraphicItem
767{
768 Q_OBJECT
769
770 public:
779 QgsModelGroupBoxGraphicItem( QgsProcessingModelGroupBox *box SIP_TRANSFER, QgsProcessingModelAlgorithm *model, QGraphicsItem *parent SIP_TRANSFERTHIS );
780 ~QgsModelGroupBoxGraphicItem() override;
781 void contextMenuEvent( QGraphicsSceneContextMenuEvent *event ) override;
782 bool canDeleteComponent() override;
783
789 void applyEdit( const QgsProcessingModelGroupBox &groupBox );
790
791 protected:
792 QColor fillColor( State state ) const override;
793 QColor strokeColor( State state ) const override;
794 QColor textColor( State state ) const override;
795 Qt::PenStyle strokeStyle( State state ) const override;
796 Qt::Alignment titleAlignment() const override;
797 void updateStoredComponentPosition( const QPointF &pos, const QSizeF &size ) override;
798
799 protected slots:
800
801 void deleteComponent() override;
802 void editComponent() override;
803
804 private:
805};
806
808
809#endif // QGSMODELCOMPONENTGRAPHICITEM_H
A mouse event which is the result of a user interaction with a QgsModelGraphicsView.
An interface for objects which can create Processing widget contexts.
virtual QgsProcessingParameterWidgetContext createWidgetContext()=0
This method needs to be reimplemented in all classes which implement this interface and return a Proc...
#define SIP_TRANSFERTHIS
Definition qgis_sip.h:52
#define SIP_ENUM_BASETYPE(type)
Definition qgis_sip.h:272
#define SIP_SKIP
Definition qgis_sip.h:133
#define SIP_TRANSFER
Definition qgis_sip.h:35
#define SIP_OUT
Definition qgis_sip.h:57
Q_DECLARE_OPERATORS_FOR_FLAGS(QgsProjectionSelectionWidget::CrsOptions)