curvelist_panel.cpp
Go to the documentation of this file.
1 /*
2  * This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this
4  * file, You can obtain one at https://mozilla.org/MPL/2.0/.
5  */
6 
7 #include "curvelist_panel.h"
8 #include "ui_curvelist_panel.h"
10 #include <QDebug>
11 #include <QLayoutItem>
12 #include <QMenu>
13 #include <QSettings>
14 #include <QDrag>
15 #include <QMimeData>
16 #include <QHeaderView>
17 #include <QFontDatabase>
18 #include <QMessageBox>
19 #include <QApplication>
20 #include <QPainter>
21 #include <QCompleter>
22 #include <QStandardItem>
23 #include <QWheelEvent>
24 #include <QItemSelectionModel>
25 #include <QScrollBar>
26 #include <QTreeWidget>
27 
28 #include "PlotJuggler/svg_util.h"
29 
30 //-------------------------------------------------
31 
33  const TransformsMap& mapped_math_plots, QWidget* parent)
34  : QWidget(parent)
35  , ui(new Ui::CurveListPanel)
36  , _plot_data(mapped_plot_data)
37  , _custom_view(new CurveTreeView(this))
38  , _tree_view(new CurveTreeView(this))
39  , _transforms_map(mapped_math_plots)
40  , _column_width_dirty(true)
41 {
42  ui->setupUi(this);
43 
44  setFocusPolicy(Qt::ClickFocus);
45 
46  _tree_view->setObjectName("curveTreeView");
47  _custom_view->setObjectName("curveCustomView");
48 
49  auto layout1 = new QHBoxLayout();
50  ui->listPlaceholder1->setLayout(layout1);
51  layout1->addWidget(_tree_view, 1);
52  layout1->setMargin(0);
53 
54  auto layout2 = new QHBoxLayout();
55  ui->listPlaceholder2->setLayout(layout2);
56  layout2->addWidget(_custom_view, 1);
57  layout2->setMargin(0);
58 
59  QSettings settings;
60 
61  int point_size = settings.value("FilterableListWidget/table_point_size", 9).toInt();
62  changeFontSize(point_size);
63 
64  ui->splitter->setStretchFactor(0, 5);
65  ui->splitter->setStretchFactor(1, 1);
66 
67  connect(_custom_view->selectionModel(), &QItemSelectionModel::selectionChanged, this,
69 
70  connect(_custom_view->verticalScrollBar(), &QScrollBar::valueChanged, this,
72 
73  connect(_tree_view->verticalScrollBar(), &QScrollBar::valueChanged, this,
75 
76  connect(_tree_view, &QTreeWidget::itemExpanded, this, &CurveListPanel::refreshValues);
77 }
78 
80 {
81  delete ui;
82 }
83 
85 {
87  _tree_view->clear();
88  _tree_view_items.clear();
89  ui->labelNumberDisplayed->setText("0 of 0");
90 }
91 
92 bool CurveListPanel::addCurve(const std::string& plot_name)
93 {
94  QString plot_id = QString::fromStdString(plot_name);
95  if (_tree_view_items.count(plot_name) > 0)
96  {
97  return false;
98  }
99 
100  QString group_name;
101 
102  auto FindInPlotData = [&](auto& plot_data, const std::string& plot_name) {
103  auto it = plot_data.find(plot_name);
104  if (it != plot_data.end())
105  {
106  auto& plot = it->second;
107  if (plot.group())
108  {
109  group_name = QString::fromStdString(plot.group()->name());
110  }
111  return true;
112  }
113  return false;
114  };
115 
116  bool found = FindInPlotData(_plot_data.numeric, plot_name) ||
117  FindInPlotData(_plot_data.scatter_xy, plot_name) ||
118  FindInPlotData(_plot_data.strings, plot_name);
119 
120  if (!found)
121  {
122  return false;
123  }
124 
125  _tree_view->addItem(group_name, getTreeName(plot_id), plot_id);
126  _tree_view_items.insert(plot_name);
127 
128  _column_width_dirty = true;
129  return true;
130 }
131 
132 void CurveListPanel::addCustom(const QString& item_name)
133 {
134  _custom_view->addItem({}, item_name, item_name);
135  _column_width_dirty = true;
136 }
137 
139 {
140  for (CurveTreeView* view : { _tree_view, _custom_view })
141  {
142  QColor default_color = view->palette().color(QPalette::Text);
143  //------------------------------------------
144  // Propagate change in color and style to the children of a group
145  std::function<void(QTreeWidgetItem*, QColor, bool)> ChangeColorAndStyle;
146  ChangeColorAndStyle = [&](QTreeWidgetItem* cell, QColor color, bool italic) {
147  cell->setForeground(0, color);
148  auto font = cell->font(0);
149  font.setItalic(italic);
150  cell->setFont(0, font);
151  for (int c = 0; c < cell->childCount(); c++)
152  {
153  ChangeColorAndStyle(cell->child(c), color, italic);
154  };
155  };
156 
157  // set everything to default first
158  for (int c = 0; c < view->invisibleRootItem()->childCount(); c++)
159  {
160  ChangeColorAndStyle(view->invisibleRootItem()->child(c), default_color, false);
161  }
162  //------------- Change groups first ---------------------
163 
164  auto ChangeGroupVisitor = [&](QTreeWidgetItem* cell) {
165  if (cell->data(0, CustomRoles::IsGroupName).toBool())
166  {
167  auto group_name = cell->data(0, CustomRoles::Name).toString();
168  auto it = _plot_data.groups.find(group_name.toStdString());
169  if (it != _plot_data.groups.end())
170  {
171  QVariant color_var = it->second->attribute(PJ::TEXT_COLOR);
172  QColor text_color =
173  color_var.isValid() ? color_var.value<QColor>() : default_color;
174 
175  QVariant style_var = it->second->attribute(PJ::ITALIC_FONTS);
176  bool italic = (style_var.isValid() && style_var.value<bool>());
177 
178  ChangeColorAndStyle(cell, text_color, italic);
179 
180  // tooltip doesn't propagate
181  QVariant tooltip = it->second->attribute(TOOL_TIP);
182  cell->setData(0, CustomRoles::ToolTip, tooltip);
183  }
184  }
185  };
186 
187  view->treeVisitor(ChangeGroupVisitor);
188 
189  //------------- Change leaves ---------------------
190 
191  auto ChangeLeavesVisitor = [&](QTreeWidgetItem* cell) {
192  if (cell->childCount() == 0)
193  {
194  const std::string& curve_name =
195  cell->data(0, CustomRoles::Name).toString().toStdString();
196 
197  QVariant text_color;
198 
199  auto GetTextColor = [&](auto& plot_data, const std::string& curve_name) {
200  auto it = plot_data.find(curve_name);
201  if (it != plot_data.end())
202  {
203  auto& series = it->second;
204  QVariant color_var = series.attribute(PJ::TEXT_COLOR);
205  if (color_var.isValid())
206  {
207  cell->setForeground(0, color_var.value<QColor>());
208  }
209 
210  QVariant tooltip_var = series.attribute(PJ::TOOL_TIP);
211  cell->setData(0, CustomRoles::ToolTip, tooltip_var);
212 
213  QVariant style_var = series.attribute(PJ::ITALIC_FONTS);
214  bool italic = (style_var.isValid() && style_var.value<bool>());
215  if (italic)
216  {
217  QFont font = cell->font(0);
218  font.setItalic(italic);
219  cell->setFont(0, font);
220  }
221  if (series.isTimeseries() == false)
222  {
223  cell->setIcon(0, LoadSvg("://resources/svg/xy.svg", _style_dir));
224  }
225  return true;
226  }
227  return false;
228  };
229 
230  bool valid = (GetTextColor(_plot_data.numeric, curve_name) ||
231  GetTextColor(_plot_data.scatter_xy, curve_name) ||
232  GetTextColor(_plot_data.strings, curve_name));
233  }
234  };
235 
236  view->treeVisitor(ChangeLeavesVisitor);
237  }
238 }
239 
241 {
244  _column_width_dirty = false;
245 
246  updateFilter();
248 }
249 
251 {
252  on_lineEditFilter_textChanged(ui->lineEditFilter->text());
253 }
254 
255 void CurveListPanel::keyPressEvent(QKeyEvent* event)
256 {
257  if (event->key() == Qt::Key_Delete)
258  {
260  }
261 }
262 
263 void CurveListPanel::changeFontSize(int point_size)
264 {
265  _tree_view->setFontSize(point_size);
266  _custom_view->setFontSize(point_size);
267 
268  QSettings settings;
269  settings.setValue("FilterableListWidget/table_point_size", point_size);
270 }
271 
273 {
274  // return ui->checkBoxHideSecondColumn->isChecked();
275  return false;
276 }
277 
278 void CurveListPanel::update2ndColumnValues(double tracker_time)
279 {
280  _tracker_time = tracker_time;
281  refreshValues();
282 }
283 
285 {
286  auto default_foreground = _custom_view->palette().foreground();
287 
288  auto FormattedNumber = [](double value) {
289  QSettings settings;
290  int prec = settings.value("Preferences::precision", 3).toInt();
291  QString num_text = QString::number(value, 'f', prec);
292  if (num_text.contains('.'))
293  {
294  int idx = num_text.length() - 1;
295  while (num_text[idx] == '0')
296  {
297  num_text[idx] = ' ';
298  idx--;
299  }
300  if (num_text[idx] == '.')
301  num_text[idx] = ' ';
302  }
303  return num_text + " ";
304  };
305 
306  auto GetValue = [&](const std::string& name) -> QString {
307  {
308  auto it = _plot_data.numeric.find(name);
309  if (it != _plot_data.numeric.end())
310  {
311  auto& plot_data = it->second;
312  auto val = plot_data.getYfromX(_tracker_time);
313  if (val)
314  {
315  return FormattedNumber(val.value());
316  }
317  }
318  }
319 
320  {
321  auto it = _plot_data.strings.find(name);
322  if (it != _plot_data.strings.end())
323  {
324  auto& plot_data = it->second;
325  auto val = plot_data.getYfromX(_tracker_time);
326  if (val)
327  {
328  auto str_view = val.value();
329  char last_byte = str_view.data()[str_view.size() - 1];
330  if (last_byte == '\0')
331  {
332  return QString::fromLocal8Bit(str_view.data(), str_view.size() - 1);
333  }
334  else
335  {
336  return QString::fromLocal8Bit(str_view.data(), str_view.size());
337  }
338  }
339  }
340  }
341  return "-";
342  };
343 
344  for (CurveTreeView* tree_view : { _tree_view, _custom_view })
345  {
346  const int vertical_height = tree_view->visibleRegion().boundingRect().height();
347 
348  auto DisplayValue = [&](QTreeWidgetItem* cell) {
349  QString curve_name = cell->data(0, CustomRoles::Name).toString();
350 
351  if (!curve_name.isEmpty())
352  {
353  auto rect = cell->treeWidget()->visualItemRect(cell);
354 
355  if (rect.bottom() < 0 || cell->isHidden())
356  {
357  return;
358  }
359  if (rect.top() > vertical_height)
360  {
361  return;
362  }
363 
364  if (!is2ndColumnHidden())
365  {
366  QString str_value = GetValue(curve_name.toStdString());
367  cell->setText(1, str_value);
368  }
369  }
370  };
371 
372  tree_view->setViewResizeEnabled(false);
373  tree_view->treeVisitor(DisplayValue);
374  // tree_view->setViewResizeEnabled(true);
375  }
376 }
377 
378 QString StringifyArray(QString str)
379 {
380  static const QRegExp rx("(\\[\\d+\\])");
381  int pos = 0;
382  std::vector<std::pair<int, int>> index_positions;
383 
384  while ((pos = rx.indexIn(str, pos)) != -1)
385  {
386  QString array_index = rx.cap(1);
387 
388  std::pair<int, int> index = { pos + 1, array_index.size() - 2 };
389  index_positions.push_back(index);
390  pos += rx.matchedLength();
391  }
392  if (index_positions.empty())
393  {
394  return str;
395  }
396 
397  QStringList out_list;
398  out_list.push_back(str);
399 
400  for (int i = index_positions.size() - 1; i >= 0; i--)
401  {
402  std::pair<int, int> index = index_positions[i];
403  str.remove(index.first, index.second);
404  out_list.push_front(str);
405  }
406 
407  return out_list.join("/");
408 }
409 
410 QString CurveListPanel::getTreeName(QString name)
411 {
412  auto parts = name.split('/', PJ::SkipEmptyParts);
413 
414  QString out;
415  for (int i = 0; i < parts.size(); i++)
416  {
417  out += StringifyArray(parts[i]);
418  if (i + 1 < parts.size())
419  {
420  out += "/";
421  }
422  }
423  return out;
424 }
425 
426 void CurveListPanel::on_lineEditFilter_textChanged(const QString& search_string)
427 {
428  bool updated = _tree_view->applyVisibilityFilter(search_string) |
429  _custom_view->applyVisibilityFilter(search_string);
430 
431  std::pair<int, int> hc_1 = _tree_view->hiddenItemsCount();
432  std::pair<int, int> hc_2 = _custom_view->hiddenItemsCount();
433 
434  int item_count = hc_1.second + hc_2.second;
435  int visible_count = item_count - hc_1.first - hc_2.first;
436 
437  ui->labelNumberDisplayed->setText(QString::number(visible_count) + QString(" of ") +
438  QString::number(item_count));
439  if (updated)
440  {
441  emit hiddenItemsChanged();
442  }
443 }
444 
446 {
447  QMessageBox::StandardButton reply;
448  reply = QMessageBox::question(nullptr, tr("Warning"),
449  tr("Do you really want to remove these data?\n"),
450  QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
451 
452  if (reply == QMessageBox::Yes)
453  {
456  }
457 
458  updateFilter();
459 }
460 
461 void CurveListPanel::removeCurve(const std::string& name)
462 {
463  QString curve_name = QString::fromStdString(name);
464  _tree_view->removeCurve(curve_name);
465  _tree_view_items.erase(name);
466  _custom_view->removeCurve(curve_name);
467 }
468 
470 {
471  std::array<CurvesView*, 2> views = { _tree_view, _custom_view };
472 
473  std::string suggested_name;
474  for (CurvesView* view : views)
475  {
476  auto curve_names = view->getSelectedNames();
477  if (curve_names.size() > 0)
478  {
479  suggested_name = (curve_names.front());
480  break;
481  }
482  }
483 
484  emit createMathPlot(suggested_name);
485  on_lineEditFilter_textChanged(ui->lineEditFilter->text());
486 }
487 
488 void CurveListPanel::onCustomSelectionChanged(const QItemSelection&,
489  const QItemSelection&)
490 {
491  auto selected = _custom_view->getSelectedNames();
492 
493  bool enabled = (selected.size() == 1);
494  ui->buttonEditCustom->setEnabled(enabled);
495  ui->buttonEditCustom->setToolTip(enabled ? "Edit the selected custom timeserie" :
496  "Select a single custom Timeserie to Edit "
497  "it");
498 }
499 
501 {
502  auto selected = _custom_view->getSelectedNames();
503  if (selected.size() == 1)
504  {
505  editMathPlot(selected.front());
506  }
507 }
508 
509 std::vector<std::string> CurveListPanel::getSelectedNames() const
510 {
511  auto selected = _tree_view->getSelectedNames();
512  auto custom_select = _custom_view->getSelectedNames();
513  selected.insert(selected.end(), custom_select.begin(), custom_select.end());
514  return selected;
515 }
516 
518 {
519  _custom_view->clearSelection();
520  _tree_view->clearSelection();
521 }
522 
524 {
525  _style_dir = theme;
526  ui->buttonAddCustom->setIcon(LoadSvg(":/resources/svg/add_tab.svg", theme));
527  ui->buttonEditCustom->setIcon(LoadSvg(":/resources/svg/pencil-edit.svg", theme));
528  ui->pushButtonTrash->setIcon(LoadSvg(":/resources/svg/trash.svg", theme));
529 
530  auto ChangeIconVisitor = [&](QTreeWidgetItem* cell) {
531  const auto& curve_name = cell->data(0, CustomRoles::Name).toString().toStdString();
532 
533  auto it = _plot_data.scatter_xy.find(curve_name);
534  if (it != _plot_data.scatter_xy.end())
535  {
536  auto& series = it->second;
537  if (series.isTimeseries() == false)
538  {
539  cell->setIcon(0, LoadSvg("://resources/svg/xy.svg", _style_dir));
540  }
541  }
542  };
543 
544  _tree_view->treeVisitor(ChangeIconVisitor);
545 }
546 
548 {
551  emit hiddenItemsChanged();
552 }
553 
555 {
556  QMessageBox msgBox(this);
557  msgBox.setWindowTitle("Warning. Can't be undone.");
558  msgBox.setText(tr("Delete data:\n\n"
559  "[Delete All]: remove timeseries and plots.\n"
560  "[Delete Points]: reset data points, but keep plots and "
561  "timeseries.\n"));
562 
563  QSettings settings;
564  QString theme = settings.value("StyleSheet::theme", "light").toString();
565 
566  QPushButton* buttonAll =
567  msgBox.addButton(tr("Delete All"), QMessageBox::DestructiveRole);
568  buttonAll->setIcon(LoadSvg(":/resources/svg/clear.svg"));
569 
570  QPushButton* buttonPoints =
571  msgBox.addButton(tr("Delete Points"), QMessageBox::DestructiveRole);
572  buttonPoints->setIcon(LoadSvg(":/resources/svg/point_chart.svg"));
573 
574  msgBox.addButton(QMessageBox::Cancel);
575  msgBox.setDefaultButton(QMessageBox::Cancel);
576 
577  msgBox.exec();
578 
579  if (msgBox.clickedButton() == buttonAll)
580  {
581  emit requestDeleteAll(1);
582  }
583  else if (msgBox.clickedButton() == buttonPoints)
584  {
585  emit requestDeleteAll(2);
586  }
587 }
color
color
Definition: color.h:16
CurveListPanel::addCurve
bool addCurve(const std::string &plot_name)
Definition: curvelist_panel.cpp:92
CurveListPanel::createMathPlot
void createMathPlot(const std::string &linked_plot)
CurveListPanel::refreshValues
void refreshValues()
Definition: curvelist_panel.cpp:284
CurveListPanel::is2ndColumnHidden
bool is2ndColumnHidden() const
Definition: curvelist_panel.cpp:272
LoadSvg
const QPixmap & LoadSvg(QString filename, QString style_name="light")
Definition: svg_util.h:26
CurveListPanel::_tree_view_items
std::unordered_set< std::string > _tree_view_items
Definition: curvelist_panel.h:100
CurveListPanel::removeSelectedCurves
void removeSelectedCurves()
Definition: curvelist_panel.cpp:445
CurveListPanel::editMathPlot
void editMathPlot(const std::string &plot_name)
CurveListPanel::updateAppearance
void updateAppearance()
Definition: curvelist_panel.cpp:138
IsGroupName
@ IsGroupName
Definition: curvelist_view.h:47
CurveListPanel::~CurveListPanel
~CurveListPanel() override
Definition: curvelist_panel.cpp:79
CurveTreeView::addItem
void addItem(const QString &prefix, const QString &tree_name, const QString &plot_ID) override
Definition: curvetree_view.cpp:95
CurveListPanel::on_pushButtonTrash_clicked
void on_pushButtonTrash_clicked(bool checked)
Definition: curvelist_panel.cpp:554
CurveListPanel::keyPressEvent
virtual void keyPressEvent(QKeyEvent *event) override
Definition: curvelist_panel.cpp:255
PJ::SkipEmptyParts
const auto SkipEmptyParts
Definition: plotdatabase.h:31
CurveListPanel::ui
Ui::CurveListPanel * ui
Definition: curvelist_panel.h:92
PJ::TransformsMap
std::unordered_map< std::string, std::shared_ptr< TransformFunction > > TransformsMap
Definition: transform_function.h:85
CurveListPanel::_column_width_dirty
bool _column_width_dirty
Definition: curvelist_panel.h:108
CurvesView
Definition: curvelist_view.h:51
CurveListPanel::hiddenItemsChanged
void hiddenItemsChanged()
CurveListPanel::clearSelections
void clearSelections()
Definition: curvelist_panel.cpp:517
CurveListPanel::getTreeName
QString getTreeName(QString name)
Definition: curvelist_panel.cpp:410
CurveTreeView
Definition: curvetree_view.h:14
CurveListPanel
Definition: curvelist_panel.h:29
PJ::PlotDataMapRef::numeric
TimeseriesMap numeric
Numerical timeseries.
Definition: plotdata.h:39
curvelist_panel.h
CurveListPanel::update2ndColumnValues
void update2ndColumnValues(double time)
Definition: curvelist_panel.cpp:278
CurveListPanel::on_buttonEditCustom_clicked
void on_buttonEditCustom_clicked()
Definition: curvelist_panel.cpp:500
CurveListPanel::updateFilter
void updateFilter()
Definition: curvelist_panel.cpp:250
CurveListPanel::_custom_view
CurveTreeView * _custom_view
Definition: curvelist_panel.h:98
Ui
Definition: cheatsheet_dialog.h:6
StringifyArray
QString StringifyArray(QString str)
Definition: curvelist_panel.cpp:378
CurveTreeView::hiddenItemsCount
std::pair< int, int > hiddenItemsCount() override
Definition: curvetree_view.h:36
CurveListPanel::addCustom
void addCustom(const QString &item_name)
Definition: curvelist_panel.cpp:132
CurveListPanel::deleteCurves
void deleteCurves(const std::vector< std::string > &curve_names)
CurveListPanel::getSelectedNames
std::vector< std::string > getSelectedNames() const
Definition: curvelist_panel.cpp:509
CurveListPanel::on_buttonAddCustom_clicked
void on_buttonAddCustom_clicked()
Definition: curvelist_panel.cpp:469
ToolTip
@ ToolTip
Definition: curvelist_view.h:48
CurveTreeView::refreshColumns
void refreshColumns() override
Definition: curvetree_view.cpp:196
CurveListPanel::on_checkBoxShowValues_toggled
void on_checkBoxShowValues_toggled(bool show)
Definition: curvelist_panel.cpp:547
PJ::PlotDataMapRef::scatter_xy
ScatterXYMap scatter_xy
Definition: plotdata.h:36
PJ::ITALIC_FONTS
@ ITALIC_FONTS
Definition: plotdatabase.h:47
CurveListPanel::removeCurve
void removeCurve(const std::string &name)
Definition: curvelist_panel.cpp:461
Name
@ Name
Definition: curvelist_view.h:46
CurveTreeView::applyVisibilityFilter
bool applyVisibilityFilter(const QString &filter_string) override
Definition: curvetree_view.cpp:232
nlohmann::detail::void
j template void())
Definition: json.hpp:4061
CurveTreeView::treeVisitor
void treeVisitor(std::function< void(QTreeWidgetItem *)> visitor)
Definition: curvetree_view.cpp:369
CurveListPanel::refreshColumns
void refreshColumns()
Definition: curvelist_panel.cpp:240
PJ::PlotDataMapRef::groups
std::unordered_map< std::string, PlotGroup::Ptr > groups
Each series can have (optionally) a group. Groups can have their own properties.
Definition: plotdata.h:52
CurveListPanel::on_lineEditFilter_textChanged
void on_lineEditFilter_textChanged(const QString &search_string)
Definition: curvelist_panel.cpp:426
CurveTreeView::hideValuesColumn
virtual void hideValuesColumn(bool hide) override
Definition: curvetree_view.cpp:363
CurveListPanel::_style_dir
QString _style_dir
Definition: curvelist_panel.h:106
PJ::TEXT_COLOR
@ TEXT_COLOR
Definition: plotdatabase.h:43
CurveListPanel::_tree_view
CurveTreeView * _tree_view
Definition: curvelist_panel.h:99
CurveTreeView::getSelectedNames
std::vector< std::string > getSelectedNames() override
Definition: curvetree_view.cpp:203
CurveListPanel::changeFontSize
void changeFontSize(int point_size)
Definition: curvelist_panel.cpp:263
CurveListPanel::onCustomSelectionChanged
void onCustomSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
Definition: curvelist_panel.cpp:488
PJ::TOOL_TIP
@ TOOL_TIP
Definition: plotdatabase.h:51
CurveListPanel::_tracker_time
double _tracker_time
Definition: curvelist_panel.h:102
CurveListPanel::on_stylesheetChanged
void on_stylesheetChanged(QString theme)
Definition: curvelist_panel.cpp:523
CurveTreeView::removeCurve
void removeCurve(const QString &name) override
Definition: curvetree_view.cpp:331
CurveListPanel::requestDeleteAll
void requestDeleteAll(int)
PJ::PlotDataMapRef
Definition: plotdata.h:34
emphasis::italic
@ italic
CurveTreeView::clear
void clear() override
Definition: curvetree_view.cpp:86
CurveListPanel::CurveListPanel
CurveListPanel(PlotDataMapRef &mapped_plot_data, const TransformsMap &mapped_math_plots, QWidget *parent)
Definition: curvelist_panel.cpp:32
CurvesView::setFontSize
void setFontSize(int size)
Definition: curvelist_view.h:79
CurveListPanel::_plot_data
PlotDataMapRef & _plot_data
Definition: curvelist_panel.h:94
CurveListPanel::clear
void clear()
Definition: curvelist_panel.cpp:84
PJ::PlotDataMapRef::strings
StringSeriesMap strings
Series of strings.
Definition: plotdata.h:46
alphanum.hpp
svg_util.h


plotjuggler
Author(s): Davide Faconti
autogenerated on Sun Jan 26 2025 03:23:23