Skip to content

Commit d8eaeaa

Browse files
Merge pull request #1192 from MichelJansson/feature/transform-multiselect
Support curve multi-selection in Transform Editor
2 parents 6ea807e + 156e65e commit d8eaeaa

File tree

2 files changed

+115
-51
lines changed

2 files changed

+115
-51
lines changed

plotjuggler_app/plotwidget_transforms.cpp

Lines changed: 114 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -107,18 +107,24 @@ QColor DialogTransformEditor::RowWidget::color() const
107107

108108
void 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()
154160
void 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

plotjuggler_app/plotwidget_transforms.ui

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@
101101
<set>QAbstractItemView::NoEditTriggers</set>
102102
</property>
103103
<property name="selectionMode">
104-
<enum>QAbstractItemView::SingleSelection</enum>
104+
<enum>QAbstractItemView::ExtendedSelection</enum>
105105
</property>
106106
<property name="selectionBehavior">
107107
<enum>QAbstractItemView::SelectRows</enum>

0 commit comments

Comments
 (0)