23
23
#include < QByteArray>
24
24
25
25
QgsRasterPipe::QgsRasterPipe ()
26
- : mProvider(0 )
27
- , mRenderer(0 )
28
- , mResampleFilter(0 )
29
- , mProjector(0 )
26
+ : mProvider( 0 )
27
+ , mRenderer( 0 )
28
+ , mResampleFilter( 0 )
29
+ , mProjector( 0 )
30
30
{
31
31
}
32
32
33
33
QgsRasterPipe::~QgsRasterPipe ()
34
34
{
35
- foreach ( QgsRasterInterface* filter, mFilters )
35
+ foreach ( QgsRasterInterface* filter, mFilters )
36
36
{
37
37
delete filter;
38
38
}
39
39
}
40
40
41
- bool QgsRasterPipe::connectFilters ( QVector<QgsRasterInterface*> theFilters )
41
+ bool QgsRasterPipe::connectFilters ( QVector<QgsRasterInterface*> theFilters )
42
42
{
43
43
QgsDebugMsg ( " Entered" );
44
- for ( int i = 1 ; i < theFilters.size (); i++ )
44
+ for ( int i = 1 ; i < theFilters.size (); i++ )
45
45
{
46
- if ( ! theFilters[i]->setInput ( theFilters[i-1 ] ) )
47
- {
48
- QgsDebugMsg ( QString ( " cannot connect %1 to %2" ).arg ( typeid (*( theFilters[i]) ).name () ).arg ( typeid (*( theFilters[i-1 ]) ).name () ) );
46
+ if ( ! theFilters[i]->setInput ( theFilters[i-1 ] ) )
47
+ {
48
+ QgsDebugMsg ( QString ( " cannot connect %1 to %2" ).arg ( typeid ( *( theFilters[i] ) ).name () ).arg ( typeid ( *( theFilters[i-1 ] ) ).name () ) );
49
49
return false ;
50
50
}
51
51
}
52
52
return true ;
53
53
}
54
54
55
- bool QgsRasterPipe::insert ( int idx, QgsRasterInterface* theFilter )
55
+ bool QgsRasterPipe::insert ( int idx, QgsRasterInterface* theFilter )
56
56
{
57
- QgsDebugMsg ( QString ( " insert %1 at %2" ).arg ( typeid (*theFilter).name () ).arg ( idx ) );
57
+ QgsDebugMsg ( QString ( " insert %1 at %2" ).arg ( typeid ( *theFilter ).name () ).arg ( idx ) );
58
58
if ( idx > mFilters .size () )
59
59
{
60
60
idx = mFilters .size ();
@@ -63,24 +63,24 @@ bool QgsRasterPipe::insert ( int idx, QgsRasterInterface* theFilter )
63
63
// of the whole pipe, because the types and band numbers may change
64
64
QVector<QgsRasterInterface*> filters = mFilters ;
65
65
66
- filters.insert ( idx, theFilter );
66
+ filters.insert ( idx, theFilter );
67
67
bool success = false ;
68
- if ( connectFilters ( filters ) )
68
+ if ( connectFilters ( filters ) )
69
69
{
70
70
success = true ;
71
- mFilters .insert ( idx, theFilter );
72
- setRole ( theFilter, idx );
71
+ mFilters .insert ( idx, theFilter );
72
+ setRole ( theFilter, idx );
73
73
QgsDebugMsg ( " inserted ok" );
74
74
}
75
75
76
76
// Connect or reconnect (after the test) filters
77
- connectFilters ( mFilters );
78
- return success;
77
+ connectFilters ( mFilters );
78
+ return success;
79
79
}
80
80
81
- bool QgsRasterPipe::replace ( int idx, QgsRasterInterface* theFilter )
81
+ bool QgsRasterPipe::replace ( int idx, QgsRasterInterface* theFilter )
82
82
{
83
- QgsDebugMsg ( QString ( " replace by %1 at %2" ).arg ( typeid (*theFilter).name () ).arg ( idx ) );
83
+ QgsDebugMsg ( QString ( " replace by %1 at %2" ).arg ( typeid ( *theFilter ).name () ).arg ( idx ) );
84
84
if ( idx < 0 || idx >= mFilters .size () )
85
85
{
86
86
return false ;
@@ -93,21 +93,21 @@ bool QgsRasterPipe::replace ( int idx, QgsRasterInterface* theFilter )
93
93
94
94
filters[idx] = theFilter;
95
95
bool success = false ;
96
- if ( connectFilters ( filters ) )
96
+ if ( connectFilters ( filters ) )
97
97
{
98
98
success = true ;
99
99
delete mFilters [idx];
100
100
mFilters [idx] = theFilter;
101
- setRole ( theFilter, idx );
101
+ setRole ( theFilter, idx );
102
102
QgsDebugMsg ( " replaced ok" );
103
103
}
104
104
105
105
// Connect or reconnect (after the test) filters
106
- connectFilters ( mFilters );
107
- return success;
106
+ connectFilters ( mFilters );
107
+ return success;
108
108
}
109
109
110
- QgsRasterPipe::Role QgsRasterPipe::filterRole ( QgsRasterInterface * filter ) const
110
+ QgsRasterPipe::Role QgsRasterPipe::filterRole ( QgsRasterInterface * filter ) const
111
111
{
112
112
if ( dynamic_cast <QgsRasterDataProvider *>( filter ) ) return ProviderRole;
113
113
if ( dynamic_cast <QgsRasterRenderer *>( filter ) ) return RendererRole;
@@ -116,16 +116,23 @@ QgsRasterPipe::Role QgsRasterPipe::filterRole ( QgsRasterInterface * filter ) co
116
116
return UnknownRole;
117
117
}
118
118
119
- void QgsRasterPipe::setRole ( QgsRasterInterface * theFilter, int idx )
119
+ void QgsRasterPipe::setRole ( QgsRasterInterface * theFilter, int idx )
120
120
{
121
- Role role = filterRole ( theFilter );
121
+ Role role = filterRole ( theFilter );
122
122
if ( role == UnknownRole ) return ;
123
- mRoleMap .insert ( role, idx );
123
+ mRoleMap .insert ( role, idx );
124
+ }
125
+
126
+ void QgsRasterPipe::unsetRole ( QgsRasterInterface * theFilter )
127
+ {
128
+ Role role = filterRole ( theFilter );
129
+ if ( role == UnknownRole ) return ;
130
+ mRoleMap .remove ( role );
124
131
}
125
132
126
133
bool QgsRasterPipe::setFilter ( QgsRasterInterface* theFilter )
127
134
{
128
- QgsDebugMsg ( QString ( " %1" ).arg ( typeid (*theFilter).name () ) );
135
+ QgsDebugMsg ( QString ( " %1" ).arg ( typeid ( *theFilter ).name () ) );
129
136
130
137
if ( !theFilter ) return false ;
131
138
@@ -134,28 +141,28 @@ bool QgsRasterPipe::setFilter( QgsRasterInterface* theFilter )
134
141
QgsRasterResampleFilter * resampleFilter;
135
142
QgsRasterProjector * projector;
136
143
137
- Role role = filterRole ( theFilter );
144
+ Role role = filterRole ( theFilter );
138
145
139
146
// We dont know where to place unknown filter
140
147
if ( role == UnknownRole ) return false ;
141
-
148
+
142
149
// if ( mFiltersMap.value ( role ) )
143
- if ( mRoleMap .contains ( role ) )
150
+ if ( mRoleMap .contains ( role ) )
144
151
{
145
152
// An old filter of the same role exists -> replace
146
153
// replace may still fail and return false
147
- return replace ( mRoleMap .value (role), theFilter );
154
+ return replace ( mRoleMap .value ( role ), theFilter );
148
155
}
149
156
150
- int idx = 0 ;
157
+ int idx = 0 ;
151
158
152
159
// Not found, find the best default position for this kind of filter
153
160
// QgsRasterDataProvider - ProviderRole
154
161
// QgsRasterRenderer - RendererRole
155
162
// QgsRasterResampler - ResamplerRole
156
163
// QgsRasterProjector - ProjectorRole
157
164
158
- int providerIdx = mRoleMap .value ( ProviderRole,- 1 );
165
+ int providerIdx = mRoleMap .value ( ProviderRole, - 1 );
159
166
int rendererIdx = mRoleMap .value ( RendererRole, -1 );
160
167
int resamplerIdx = mRoleMap .value ( ResamplerRole, -1 );
161
168
@@ -169,43 +176,78 @@ bool QgsRasterPipe::setFilter( QgsRasterInterface* theFilter )
169
176
}
170
177
else if ( role == ResamplerRole )
171
178
{
172
- idx = qMax ( providerIdx, rendererIdx ) + 1 ;
179
+ idx = qMax ( providerIdx, rendererIdx ) + 1 ;
173
180
}
174
181
else if ( role == ProjectorRole )
175
182
{
176
- idx = qMax ( qMax ( providerIdx,rendererIdx ), resamplerIdx ) + 1 ;
183
+ idx = qMax ( qMax ( providerIdx, rendererIdx ), resamplerIdx ) + 1 ;
177
184
}
178
185
179
- return insert ( idx, theFilter ); // insert may still fail and return false
186
+ return insert ( idx, theFilter ); // insert may still fail and return false
180
187
}
181
188
182
- QgsRasterInterface * QgsRasterPipe::filter ( Role role ) const
189
+ QgsRasterInterface * QgsRasterPipe::filter ( Role role ) const
183
190
{
184
- QgsDebugMsg ( QString ( " role = %1" ).arg ( role ) );
185
- if ( mRoleMap .contains ( role ) )
191
+ QgsDebugMsg ( QString ( " role = %1" ).arg ( role ) );
192
+ if ( mRoleMap .contains ( role ) )
186
193
{
187
- return mFilters .value ( mRoleMap .value ( role) );
194
+ return mFilters .value ( mRoleMap .value ( role ) );
188
195
}
189
196
return 0 ;
190
197
}
191
198
192
- QgsRasterDataProvider * QgsRasterPipe::provider () const
193
- {
194
- return dynamic_cast <QgsRasterDataProvider *>(filter ( ProviderRole));
199
+ QgsRasterDataProvider * QgsRasterPipe::provider () const
200
+ {
201
+ return dynamic_cast <QgsRasterDataProvider *>( filter ( ProviderRole ) );
195
202
}
196
203
197
- QgsRasterRenderer * QgsRasterPipe::renderer () const
198
- {
199
- return dynamic_cast <QgsRasterRenderer *>(filter ( RendererRole ));
204
+ QgsRasterRenderer * QgsRasterPipe::renderer () const
205
+ {
206
+ return dynamic_cast <QgsRasterRenderer *>( filter ( RendererRole ) );
200
207
}
201
208
202
- QgsRasterResampleFilter * QgsRasterPipe::resampleFilter () const
203
- {
204
- return dynamic_cast <QgsRasterResampleFilter *>(filter ( ResamplerRole ));
205
- }
209
+ QgsRasterResampleFilter * QgsRasterPipe::resampleFilter () const
210
+ {
211
+ return dynamic_cast <QgsRasterResampleFilter *>( filter ( ResamplerRole ) );
212
+ }
213
+
214
+ QgsRasterProjector * QgsRasterPipe::projector () const
215
+ {
216
+ return dynamic_cast <QgsRasterProjector*>( filter ( ProjectorRole ) );
217
+ }
218
+
219
+ bool QgsRasterPipe::remove ( int idx )
220
+ {
221
+ QgsDebugMsg ( QString ( " remove at %1" ).arg ( idx ) );
222
+
223
+ if ( idx < 0 || idx >= mFilters .size () )
224
+ {
225
+ return false ;
226
+ }
227
+
228
+ // make a copy of pipe to test connection, we test the connections
229
+ // of the whole pipe, because the types and band numbers may change
230
+ QVector<QgsRasterInterface*> filters = mFilters ;
206
231
207
- QgsRasterProjector * QgsRasterPipe::projector () const
208
- {
209
- return dynamic_cast <QgsRasterProjector*>(filter ( ProjectorRole ));
232
+ filters.remove ( idx );
233
+ bool success = false ;
234
+ if ( connectFilters ( filters ) )
235
+ {
236
+ success = true ;
237
+ unsetRole ( mFilters [idx] );
238
+ delete mFilters [idx];
239
+ mFilters .remove ( idx );
240
+ QgsDebugMsg ( " removed ok" );
241
+ }
242
+
243
+ // Connect or reconnect (after the test) filters
244
+ connectFilters ( mFilters );
245
+ return success;
210
246
}
211
247
248
+ bool QgsRasterPipe::remove ( QgsRasterInterface * theFilter )
249
+ {
250
+ if ( !theFilter ) return false ;
251
+
252
+ return remove ( mFilters .indexOf ( theFilter ) );
253
+ }
0 commit comments