@@ -107,18 +107,24 @@ QColor DialogTransformEditor::RowWidget::color() const
107107
108108void DialogTransformEditor::on_listCurves_itemSelectionChanged ()
109109{
110- auto selected = ui->listCurves ->selectedItems ();
111- if (selected.size () != 1 )
110+ auto selected_curves = ui->listCurves ->selectedItems ();
111+ if (selected_curves.size () < 1 )
112+ {
113+ return ;
114+ }
115+ if (selected_curves.size () > 1 )
112116 {
117+ // multi-selected curves may have different transforms
118+ ui->listTransforms ->clearSelection ();
113119 return ;
114120 }
115- auto item = selected. front ();
116- auto row_widget = dynamic_cast <RowWidget*>(ui->listCurves ->itemWidget (item ));
121+
122+ auto row_widget = dynamic_cast <RowWidget*>(ui->listCurves ->itemWidget (selected_curves. front () ));
117123 auto curve_name = row_widget->text ();
124+ auto curve_info = _plotwidget->curveFromTitle (curve_name);
118125
119- auto curve_it = _plotwidget->curveFromTitle (curve_name);
120126 int transform_row = 0 ;
121- if (auto ts = dynamic_cast <TransformedTimeseries*>(curve_it ->curve ->data ()))
127+ if (auto ts = dynamic_cast <TransformedTimeseries*>(curve_info ->curve ->data ()))
122128 {
123129 if (ts->transform ())
124130 {
@@ -154,77 +160,135 @@ void DialogTransformEditor::on_listCurves_itemSelectionChanged()
154160void DialogTransformEditor::on_listTransforms_itemSelectionChanged ()
155161{
156162 auto selected_curves = ui->listCurves ->selectedItems ();
157- if (selected_curves.size () != 1 )
163+ if (selected_curves.size () < 1 )
158164 {
159165 return ;
160166 }
161- auto row_widget = dynamic_cast <RowWidget*>(ui->listCurves ->itemWidget (selected_curves.front ()));
162-
163- QString curve_name = row_widget->text ();
164167
165168 auto selected_transforms = ui->listTransforms ->selectedItems ();
166169 if (selected_transforms.size () != 1 )
167170 {
171+ ui->stackedWidgetArguments ->setCurrentIndex (0 );
168172 return ;
169173 }
170- QString transform_ID = selected_transforms.front ()->text ();
171-
172- auto curve_info = _plotwidget->curveFromTitle (curve_name);
173- auto qwt_curve = curve_info->curve ;
174- auto ts = dynamic_cast <TransformedTimeseries*>(curve_info->curve ->data ());
175174
176175 QSignalBlocker block (ui->lineEditAlias );
177176
178- if (transform_ID.isEmpty () || transform_ID == ui->listTransforms ->item (0 )->text ())
177+ QString transform_ID = selected_transforms.front ()->text ();
178+ if (transform_ID == ui->listTransforms ->item (0 )->text ())
179+ transform_ID.clear ();
180+
181+ if (transform_ID.isEmpty ())
179182 {
180- ts->setTransform ({});
181- ts->updateCache (true );
182183 ui->stackedWidgetArguments ->setCurrentIndex (0 );
184+ }
183185
186+ if (transform_ID.isEmpty () || selected_curves.size () > 1 )
187+ {
184188 ui->lineEditAlias ->setText (" " );
185189 ui->lineEditAlias ->setEnabled (false );
186- qwt_curve->setTitle (curve_name);
187190 }
188- else
189- {
190- ts->setTransform (transform_ID);
191- ts->updateCache (true );
192- ui->lineEditAlias ->setEnabled (true );
193191
194- QString curve_title = qwt_curve->title ().text ();
195- if (ts->alias ().isEmpty ())
192+ TransformedTimeseries* ts = nullptr ;
193+
194+ for (auto item : selected_curves)
195+ {
196+ auto row_widget = dynamic_cast <RowWidget*>(ui->listCurves ->itemWidget (item));
197+ QString curve_name = row_widget->text ();
198+ auto curve_info = _plotwidget->curveFromTitle (curve_name);
199+ auto qwt_curve = curve_info->curve ;
200+ ts = dynamic_cast <TransformedTimeseries*>(curve_info->curve ->data ());
201+
202+ auto src_name = QString::fromStdString (curve_info->src_name );
203+ bool has_default_title =
204+ ts->alias ().isEmpty () ||
205+ ts->alias ().compare (QString (" %1[%2]" ).arg (src_name).arg (ts->transformName ())) == 0 ;
206+
207+ if (transform_ID.isEmpty ())
196208 {
197- auto src_name = QString::fromStdString (curve_info->src_name );
198- auto new_title = QString (" %1[%2]" ).arg (src_name).arg (transform_ID);
199- ts->setAlias (new_title);
200- }
209+ ts->setTransform ({});
210+ ts->updateCache (true );
201211
202- ui->lineEditAlias ->setText (ts->alias ());
203- qwt_curve->setTitle (ts->alias ());
212+ if (has_default_title)
213+ {
214+ ts->setAlias (QString ());
215+ }
204216
205- auto widget = ts-> transform ()-> optionsWidget ( );
206- int index = ui-> stackedWidgetArguments -> indexOf (widget);
207- if (index == - 1 && widget)
217+ qwt_curve-> setTitle (curve_name );
218+ }
219+ else
208220 {
209- index = ui->stackedWidgetArguments ->addWidget (widget);
221+ ts->setTransform (transform_ID);
222+ ts->updateCache (true );
223+
224+ if (has_default_title)
225+ {
226+ auto new_default_title = QString (" %1[%2]" ).arg (src_name).arg (transform_ID);
227+ ts->setAlias (new_default_title);
228+ }
229+
230+ qwt_curve->setTitle (ts->alias ());
231+
232+ if (selected_curves.size () == 1 )
233+ {
234+ ui->lineEditAlias ->setText (ts->alias ());
235+ ui->lineEditAlias ->setEnabled (true );
236+ }
210237 }
238+ }
211239
212- ui->stackedWidgetArguments ->setCurrentIndex (index);
240+ // use the last selected curve, as the transform widget presenter
241+ if (ts && ts->transform ())
242+ {
243+ QWidget* widget = ts->transform ()->optionsWidget ();
213244
214- if (_connected_transform_widgets. count ( widget) == 0 )
245+ if (widget)
215246 {
216- connect (ts->transform ().get (), &TransformFunction::parametersChanged, this , [=]() {
217- ts->updateCache (true );
218- if (ui->checkBoxAutoZoom ->isChecked ())
219- {
220- _plotwidget->zoomOut (false );
221- }
222- else
223- {
224- _plotwidget->replot ();
225- }
226- });
227- _connected_transform_widgets.insert (widget);
247+ int index = ui->stackedWidgetArguments ->indexOf (widget);
248+ if (index == -1 && widget)
249+ {
250+ index = ui->stackedWidgetArguments ->addWidget (widget);
251+ }
252+
253+ ui->stackedWidgetArguments ->setCurrentIndex (index);
254+
255+ if (_connected_transform_widgets.count (widget) == 0 )
256+ {
257+ connect (ts->transform ().get (), &TransformFunction::parametersChanged, this , [=]() {
258+ if (ui->listCurves ->selectedItems ().size () > 1 )
259+ {
260+ // Copy state from visible widget and apply to all selected curves.
261+ QDomDocument doc;
262+ QDomElement transform_state = doc.createElement (" transform" );
263+ ts->transform ()->xmlSaveState (doc, transform_state);
264+
265+ for (auto item : ui->listCurves ->selectedItems ())
266+ {
267+ auto row_widget = dynamic_cast <RowWidget*>(ui->listCurves ->itemWidget (item));
268+ QString curve_name = row_widget->text ();
269+ auto curve_info = _plotwidget->curveFromTitle (curve_name);
270+ auto item_ts = dynamic_cast <TransformedTimeseries*>(curve_info->curve ->data ());
271+
272+ item_ts->transform ()->xmlLoadState (transform_state);
273+ item_ts->updateCache (true );
274+ }
275+ }
276+ else
277+ {
278+ ts->updateCache (true );
279+ }
280+
281+ if (ui->checkBoxAutoZoom ->isChecked ())
282+ {
283+ _plotwidget->zoomOut (false );
284+ }
285+ else
286+ {
287+ _plotwidget->replot ();
288+ }
289+ });
290+ _connected_transform_widgets.insert (widget);
291+ }
228292 }
229293 }
230294
0 commit comments