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  QString num_text = QString::number(value, 'f', 3);
290  if (num_text.contains('.'))
291  {
292  int idx = num_text.length() - 1;
293  while (num_text[idx] == '0')
294  {
295  num_text[idx] = ' ';
296  idx--;
297  }
298  if (num_text[idx] == '.')
299  num_text[idx] = ' ';
300  }
301  return num_text + " ";
302  };
303 
304  auto GetValue = [&](const std::string& name) -> QString {
305  {
306  auto it = _plot_data.numeric.find(name);
307  if (it != _plot_data.numeric.end())
308  {
309  auto& plot_data = it->second;
310  auto val = plot_data.getYfromX(_tracker_time);
311  if (val)
312  {
313  return FormattedNumber(val.value());
314  }
315  }
316  }
317 
318  {
319  auto it = _plot_data.strings.find(name);
320  if (it != _plot_data.strings.end())
321  {
322  auto& plot_data = it->second;
323  auto val = plot_data.getYfromX(_tracker_time);
324  if (val)
325  {
326  auto str_view = val.value();
327  char last_byte = str_view.data()[str_view.size() - 1];
328  if (last_byte == '\0')
329  {
330  return QString::fromLocal8Bit(str_view.data(), str_view.size() - 1);
331  }
332  else
333  {
334  return QString::fromLocal8Bit(str_view.data(), str_view.size());
335  }
336  }
337  }
338  }
339  return "-";
340  };
341 
342  for (CurveTreeView* tree_view : { _tree_view, _custom_view })
343  {
344  const int vertical_height = tree_view->visibleRegion().boundingRect().height();
345 
346  auto DisplayValue = [&](QTreeWidgetItem* cell) {
347  QString curve_name = cell->data(0, CustomRoles::Name).toString();
348 
349  if (!curve_name.isEmpty())
350  {
351  auto rect = cell->treeWidget()->visualItemRect(cell);
352 
353  if (rect.bottom() < 0 || cell->isHidden())
354  {
355  return;
356  }
357  if (rect.top() > vertical_height)
358  {
359  return;
360  }
361 
362  if (!is2ndColumnHidden())
363  {
364  QString str_value = GetValue(curve_name.toStdString());
365  cell->setText(1, str_value);
366  }
367  }
368  };
369 
370  tree_view->setViewResizeEnabled(false);
371  tree_view->treeVisitor(DisplayValue);
372  // tree_view->setViewResizeEnabled(true);
373  }
374 }
375 
376 QString StringifyArray(QString str)
377 {
378  static const QRegExp rx("(\\[\\d+\\])");
379  int pos = 0;
380  std::vector<std::pair<int, int>> index_positions;
381 
382  while ((pos = rx.indexIn(str, pos)) != -1)
383  {
384  QString array_index = rx.cap(1);
385 
386  std::pair<int, int> index = { pos + 1, array_index.size() - 2 };
387  index_positions.push_back(index);
388  pos += rx.matchedLength();
389  }
390  if (index_positions.empty())
391  {
392  return str;
393  }
394 
395  QStringList out_list;
396  out_list.push_back(str);
397 
398  for (int i = index_positions.size() - 1; i >= 0; i--)
399  {
400  std::pair<int, int> index = index_positions[i];
401  str.remove(index.first, index.second);
402  out_list.push_front(str);
403  }
404 
405  return out_list.join("/");
406 }
407 
408 QString CurveListPanel::getTreeName(QString name)
409 {
410  auto parts = name.split('/', PJ::SkipEmptyParts);
411 
412  QString out;
413  for (int i = 0; i < parts.size(); i++)
414  {
415  out += StringifyArray(parts[i]);
416  if (i + 1 < parts.size())
417  {
418  out += "/";
419  }
420  }
421  return out;
422 }
423 
424 void CurveListPanel::on_lineEditFilter_textChanged(const QString& search_string)
425 {
426  bool updated = _tree_view->applyVisibilityFilter(search_string) |
427  _custom_view->applyVisibilityFilter(search_string);
428 
429  std::pair<int, int> hc_1 = _tree_view->hiddenItemsCount();
430  std::pair<int, int> hc_2 = _custom_view->hiddenItemsCount();
431 
432  int item_count = hc_1.second + hc_2.second;
433  int visible_count = item_count - hc_1.first - hc_2.first;
434 
435  ui->labelNumberDisplayed->setText(QString::number(visible_count) + QString(" of ") +
436  QString::number(item_count));
437  if (updated)
438  {
439  emit hiddenItemsChanged();
440  }
441 }
442 
444 {
445  QMessageBox::StandardButton reply;
446  reply = QMessageBox::question(nullptr, tr("Warning"),
447  tr("Do you really want to remove these data?\n"),
448  QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
449 
450  if (reply == QMessageBox::Yes)
451  {
454  }
455 
456  updateFilter();
457 }
458 
459 void CurveListPanel::removeCurve(const std::string& name)
460 {
461  QString curve_name = QString::fromStdString(name);
462  _tree_view->removeCurve(curve_name);
463  _tree_view_items.erase(name);
464  _custom_view->removeCurve(curve_name);
465 }
466 
468 {
469  std::array<CurvesView*, 2> views = { _tree_view, _custom_view };
470 
471  std::string suggested_name;
472  for (CurvesView* view : views)
473  {
474  auto curve_names = view->getSelectedNames();
475  if (curve_names.size() > 0)
476  {
477  suggested_name = (curve_names.front());
478  break;
479  }
480  }
481 
482  emit createMathPlot(suggested_name);
483  on_lineEditFilter_textChanged(ui->lineEditFilter->text());
484 }
485 
486 void CurveListPanel::onCustomSelectionChanged(const QItemSelection&,
487  const QItemSelection&)
488 {
489  auto selected = _custom_view->getSelectedNames();
490 
491  bool enabled = (selected.size() == 1);
492  ui->buttonEditCustom->setEnabled(enabled);
493  ui->buttonEditCustom->setToolTip(enabled ? "Edit the selected custom timeserie" :
494  "Select a single custom Timeserie to Edit "
495  "it");
496 }
497 
499 {
500  auto selected = _custom_view->getSelectedNames();
501  if (selected.size() == 1)
502  {
503  editMathPlot(selected.front());
504  }
505 }
506 
507 std::vector<std::string> CurveListPanel::getSelectedNames() const
508 {
509  auto selected = _tree_view->getSelectedNames();
510  auto custom_select = _custom_view->getSelectedNames();
511  selected.insert(selected.end(), custom_select.begin(), custom_select.end());
512  return selected;
513 }
514 
516 {
517  _custom_view->clearSelection();
518  _tree_view->clearSelection();
519 }
520 
522 {
523  _style_dir = theme;
524  ui->buttonAddCustom->setIcon(LoadSvg(":/resources/svg/add_tab.svg", theme));
525  ui->buttonEditCustom->setIcon(LoadSvg(":/resources/svg/pencil-edit.svg", theme));
526  ui->pushButtonTrash->setIcon(LoadSvg(":/resources/svg/trash.svg", theme));
527 
528  auto ChangeIconVisitor = [&](QTreeWidgetItem* cell) {
529  const auto& curve_name = cell->data(0, CustomRoles::Name).toString().toStdString();
530 
531  auto it = _plot_data.scatter_xy.find(curve_name);
532  if (it != _plot_data.scatter_xy.end())
533  {
534  auto& series = it->second;
535  if (series.isTimeseries() == false)
536  {
537  cell->setIcon(0, LoadSvg("://resources/svg/xy.svg", _style_dir));
538  }
539  }
540  };
541 
542  _tree_view->treeVisitor(ChangeIconVisitor);
543 }
544 
546 {
549  emit hiddenItemsChanged();
550 }
551 
553 {
554  QMessageBox msgBox(this);
555  msgBox.setWindowTitle("Warning. Can't be undone.");
556  msgBox.setText(tr("Delete data:\n\n"
557  "[Delete All]: remove timeseries and plots.\n"
558  "[Delete Points]: reset data points, but keep plots and "
559  "timeseries.\n"));
560 
561  QSettings settings;
562  QString theme = settings.value("StyleSheet::theme", "light").toString();
563 
564  QPushButton* buttonAll =
565  msgBox.addButton(tr("Delete All"), QMessageBox::DestructiveRole);
566  buttonAll->setIcon(LoadSvg(":/resources/svg/clear.svg"));
567 
568  QPushButton* buttonPoints =
569  msgBox.addButton(tr("Delete Points"), QMessageBox::DestructiveRole);
570  buttonPoints->setIcon(LoadSvg(":/resources/svg/point_chart.svg"));
571 
572  msgBox.addButton(QMessageBox::Cancel);
573  msgBox.setDefaultButton(QMessageBox::Cancel);
574 
575  msgBox.exec();
576 
577  if (msgBox.clickedButton() == buttonAll)
578  {
579  emit requestDeleteAll(1);
580  }
581  else if (msgBox.clickedButton() == buttonPoints)
582  {
583  emit requestDeleteAll(2);
584  }
585 }
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:443
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:552
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:515
CurveListPanel::getTreeName
QString getTreeName(QString name)
Definition: curvelist_panel.cpp:408
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:498
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:376
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:507
CurveListPanel::on_buttonAddCustom_clicked
void on_buttonAddCustom_clicked()
Definition: curvelist_panel.cpp:467
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:545
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:459
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:424
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:486
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:521
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 Aug 11 2024 02:24:22