17#include "moc_qgsmodelviewtoollink.cpp"
34 mBezierRubberBand->setBrush( QBrush( QColor( 0, 0, 0, 63 ) ) );
35 mBezierRubberBand->setPen( QPen( QBrush( QColor( 0, 0, 0, 100 ) ), 0, Qt::SolidLine ) );
40 mBezierRubberBand->update( event->
modelPoint(), Qt::KeyboardModifiers() );
45 QgsModelDesignerSocketGraphicItem *socket =
nullptr;
46 for ( QGraphicsItem *item : items )
48 if ( ( socket =
dynamic_cast<QgsModelDesignerSocketGraphicItem *
>( item ) )
49 && ( mFromSocket != socket && mFromSocket->edge() != socket->edge() ) )
52 socket->modelHoverEnterEvent( event );
53 QPointF rubberEndPos = socket->mapToScene( socket->position() );
54 mBezierRubberBand->update( rubberEndPos, Qt::KeyboardModifiers() );
60 if ( mLastHoveredSocket && socket != mLastHoveredSocket )
62 mLastHoveredSocket->modelHoverLeaveEvent( event );
63 mLastHoveredSocket =
nullptr;
66 if ( socket && socket != mLastHoveredSocket )
68 mLastHoveredSocket = socket;
74 if ( event->button() != Qt::LeftButton )
78 mBezierRubberBand->finish( event->
modelPoint() );
79 if ( mLastHoveredSocket )
81 mLastHoveredSocket->modelHoverLeaveEvent(
nullptr );
82 mLastHoveredSocket =
nullptr;
85 view()->setTool( mPreviousViewTool );
92 for ( QGraphicsItem *item : items )
94 if ( QgsModelDesignerSocketGraphicItem *socket =
dynamic_cast<QgsModelDesignerSocketGraphicItem *
>( item ) )
108 if ( mFromSocket->edge() == mToSocket->edge() )
113 view()->beginCommand( tr(
"Edit link" ) );
115 QList<QgsProcessingModelChildParameterSource> sources;
117 QgsProcessingModelComponent *componentFrom =
nullptr;
118 QgsProcessingModelChildAlgorithm *childTo =
nullptr;
128 if ( !mToSocket->isInput() )
130 std::swap( mFromSocket, mToSocket );
133 componentFrom = mFromSocket->component();
134 childTo =
dynamic_cast<QgsProcessingModelChildAlgorithm *
>( mToSocket->component() );
139 QgsProcessingModelChildParameterSource source;
140 if ( QgsProcessingModelChildAlgorithm *childFrom =
dynamic_cast<QgsProcessingModelChildAlgorithm *
>( componentFrom ) )
142 QString outputName = childFrom->algorithm()->outputDefinitions().at( mFromSocket->index() )->name();
143 source = QgsProcessingModelChildParameterSource::fromChildOutput( childFrom->childId(), outputName );
145 else if ( QgsProcessingModelParameter *paramFrom =
dynamic_cast<QgsProcessingModelParameter *
>( componentFrom ) )
147 source = QgsProcessingModelChildParameterSource::fromModelParameter( paramFrom->parameterName() );
150 QList<QgsProcessingModelChildParameterSource> compatibleParamSources =
scene()->model()->availableSourcesForChild( childTo->childId(), toParam );
152 if ( !compatibleParamSources.contains( source ) )
155 const QString title = tr(
"Sockets cannot be connected" );
156 const QString message = tr(
"Either the sockets are incompatible or there is a circular dependency" );
157 scene()->showWarning( message, title, message );
162 childTo->addParameterSources( toParam->
name(), sources );
166 scene()->model()->setChildAlgorithm( *childTo );
168 view()->endCommand();
170 scene()->requestRebuildRequired();
184 mPreviousViewTool = tool;
187 QPointF rubberStartPos = mFromSocket->mapToScene( mFromSocket->position() );
188 mBezierRubberBand->start( rubberStartPos, Qt::KeyboardModifiers() );
195 mBezierRubberBand->finish();
201 mFromSocket = socket;
203 if ( mFromSocket->isInput() )
205 QgsProcessingModelChildAlgorithm *childFrom =
dynamic_cast<QgsProcessingModelChildAlgorithm *
>( mFromSocket->component() );
208 auto currentSources = childFrom->parameterSources().value( param->
name() );
210 QgsProcessingModelChildParameterSource oldSource;
211 for (
const QgsProcessingModelChildParameterSource &source : std::as_const( currentSources ) )
213 switch ( source.source() )
219 view()->beginCommand( tr(
"Edit link" ) );
222 QList<QgsProcessingModelChildParameterSource> newSources;
223 newSources << QgsProcessingModelChildParameterSource::fromStaticValue( param->
defaultValue() );
226 childFrom->addParameterSources( param->
name(), newSources );
228 scene()->model()->setChildAlgorithm( *childFrom );
230 scene()->requestRebuildRequired();
233 QgsModelComponentGraphicItem *item =
nullptr;
234 int socketIndex = -1;
237 item =
scene()->childAlgorithmItem( oldSource.outputChildId() );
238 auto algSource =
dynamic_cast<QgsProcessingModelChildAlgorithm *
>( item->component() );
241 QgsDebugError( QStringLiteral(
"algSource not set, aborting!" ) );
248 item =
scene()->parameterItem( source.parameterName() );
254 QgsDebugError( QStringLiteral(
"item not set, aborting!" ) );
258 mFromSocket = item->outSocketAt( socketIndex );
@ ExpressionText
Parameter value is taken from a text with expressions, evaluated just before the algorithm runs.
@ ModelOutput
Parameter value is linked to an output parameter for the model.
@ ChildOutput
Parameter value is taken from an output generated by a child algorithm.
@ ModelParameter
Parameter value is taken from a parent model parameter.
@ StaticValue
Parameter value is a static value.
@ Expression
Parameter value is taken from an expression, evaluated just before the algorithm runs.
A bezier curve rubber band for use within QgsModelGraphicsView widgets.
A mouse event which is the result of a user interaction with a QgsModelGraphicsView.
QPointF modelPoint() const
Returns the event point location in model coordinates.
QgsProcessingParameterDefinitions parameterDefinitions() const
Returns an ordered list of parameter definitions utilized by the algorithm.
Base class for the definition of processing parameters.
QVariant defaultValue() const
Returns the default value for the parameter.
QgsProcessingAlgorithm * algorithm() const
Returns a pointer to the algorithm which owns this parameter.
QString name() const
Returns the name of the parameter.
static int outputDefinitionIndex(const QgsProcessingAlgorithm *algorithm, const QString &name)
Returns the index of the output matching name for a specified algorithm.
#define QgsDebugError(str)