curvelist_view.cpp
Go to the documentation of this file.
1 #include "curvelist_view.h"
2 #include <QApplication>
3 #include <QDrag>
4 #include <QMessageBox>
5 #include <QMimeData>
6 #include <QDebug>
7 #include <QScrollBar>
8 #include "curvelist_panel.h"
9 
10 CurveTableView::CurveTableView(CurveListPanel* parent) : QTableWidget(parent), CurvesView(parent)
11 {
12  setColumnCount(2);
13  setEditTriggers(NoEditTriggers);
14  setDragEnabled(false);
15  setDefaultDropAction(Qt::IgnoreAction);
16  setDragDropOverwriteMode(false);
17  setDragDropMode(NoDragDrop);
18  viewport()->installEventFilter(this);
19 
20  setSelectionBehavior(QAbstractItemView::SelectRows);
21  setSelectionMode(ExtendedSelection);
22  setFocusPolicy(Qt::ClickFocus);
23 
24  verticalHeader()->setVisible(false);
25  horizontalHeader()->setVisible(false);
26 
27  horizontalHeader()->setStretchLastSection(true);
28 
29  setColumnWidth(1, 100);
30 
31  setHorizontalHeaderItem(0, new QTableWidgetItem("Time series"));
32  setHorizontalHeaderItem(1, new QTableWidgetItem("Current value"));
33 
34  setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
35  setShowGrid(false);
36 }
37 
38 void CurveTableView::addItem(const QString& item_name)
39 {
40  if (_inserted_curves.contains(item_name))
41  {
42  return;
43  }
44 
45  auto item = new SortedTableItem<QTableWidgetItem>(item_name);
46  QFont font = QFontDatabase::systemFont(QFontDatabase::GeneralFont);
47  font.setPointSize(_point_size);
48  item->setFont(font);
49  const int row = rowCount();
50  QTableWidget::setRowCount(row + 1);
51  QTableWidget::setItem(row, 0, item);
52 
53  auto val_cell = new QTableWidgetItem("-");
54  val_cell->setTextAlignment(Qt::AlignRight);
55  val_cell->setFlags(Qt::NoItemFlags | Qt::ItemIsEnabled);
56  font = QFontDatabase::systemFont(QFontDatabase::FixedFont);
57  font.setPointSize(_point_size - 2);
58  val_cell->setFont(font);
59 
60  QTableWidget::setItem(row, 1, val_cell);
61 
62  _inserted_curves.insert({ item_name });
63 }
64 
66 {
67  sortByColumn(0, Qt::AscendingOrder);
69 }
70 
71 std::vector<std::string> CurveTableView::getSelectedNames()
72 {
73  std::vector<std::string> non_hidden_list;
74 
75  for (const QTableWidgetItem* cell : selectedItems())
76  {
77  non_hidden_list.push_back(cell->text().toStdString());
78  }
79  return non_hidden_list;
80 }
81 
83 {
84  if (rowCount() == 0)
85  {
86  return;
87  }
88  setViewResizeEnabled(false);
89 
90  for (int row = 0; row < rowCount(); row++)
91  {
92  auto cell = item(row, 0);
93  QFont font = QFontDatabase::systemFont(QFontDatabase::GeneralFont);
94  font.setPointSize(_point_size);
95  cell->setFont(font);
96 
97  cell = item(row, 1);
98  font = QFontDatabase::systemFont(QFontDatabase::FixedFont);
99  font.setPointSize(_point_size - 2 );
100  cell->setFont(font);
101  }
102  setViewResizeEnabled(true);
103 }
104 
105 void CurveTableView::removeCurve(const QString& name)
106 {
107  for (int row = 0; row < model()->rowCount(); row++)
108  {
109  if (item(row, 0)->text() == name)
110  {
111  removeRow(row);
112  break;
113  }
114  }
115  _inserted_curves.remove(name);
116 }
117 
118 bool CurveTableView::applyVisibilityFilter(const QString& search_string)
119 {
120  setViewResizeEnabled(false);
121 
122  bool updated = false;
123  _hidden_count = 0;
124 
125  QStringList spaced_items = search_string.split(' ');
126 
127  for (int row = 0; row < model()->rowCount(); row++)
128  {
129  auto cell = item(row, 0);
130  QString name = cell->text();
131  bool toHide = false;
132 
133  if (search_string.isEmpty() == false)
134  {
135  for (const auto& item : spaced_items)
136  {
137  if (name.contains(item, Qt::CaseInsensitive) == false)
138  {
139  toHide = true;
140  break;
141  }
142  }
143  }
144  if (toHide)
145  {
146  _hidden_count++;
147  }
148 
149  if (toHide != isRowHidden(row))
150  {
151  updated = true;
152  }
153 
154  setRowHidden(row, toHide);
155  }
156 
157  setViewResizeEnabled(true);
158  return updated;
159 }
160 
162 {
163  verticalHeader()->setSectionResizeMode(QHeaderView::Fixed);
164  if (enable)
165  {
166  horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
167  horizontalHeader()->setSectionResizeMode(1, QHeaderView::Fixed);
168  }
169  else
170  {
171  horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);
172  horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch);
173  }
174 }
175 
177 {
178  setViewResizeEnabled(true);
179  if (hide)
180  {
181  hideColumn(1);
182  }
183  else
184  {
185  showColumn(1);
186  }
187 }
188 
190 {
191 }
192 
193 bool CurvesView::eventFilterBase(QObject* object, QEvent* event)
194 {
195  QAbstractItemView* table_widget = qobject_cast<QAbstractItemView*>(object);
196 
197  if (qobject_cast<QScrollBar*>(object))
198  {
199  return false;
200  }
201 
202  auto obj = object;
203  while (obj && !table_widget)
204  {
205  obj = obj->parent();
206  table_widget = qobject_cast<QAbstractItemView*>(obj);
207  }
208 
209  bool ctrl_modifier_pressed = (QGuiApplication::keyboardModifiers() == Qt::ControlModifier);
210 
211  if (event->type() == QEvent::MouseButtonPress)
212  {
213  QMouseEvent* mouse_event = static_cast<QMouseEvent*>(event);
214 
215  _dragging = false;
216  _drag_start_pos = mouse_event->pos();
217 
218  if (mouse_event->button() == Qt::LeftButton)
219  {
220  _newX_modifier = false;
221  }
222  else if (mouse_event->button() == Qt::RightButton)
223  {
224  _newX_modifier = true;
225  }
226  else
227  {
228  return true;
229  }
230  return false;
231  }
232  else if (event->type() == QEvent::MouseMove)
233  {
234  QMouseEvent* mouse_event = static_cast<QMouseEvent*>(event);
235  double distance_from_click = (mouse_event->pos() - _drag_start_pos).manhattanLength();
236 
237  if ((mouse_event->buttons() == Qt::LeftButton || mouse_event->buttons() == Qt::RightButton) &&
238  distance_from_click >= QApplication::startDragDistance() && !_dragging)
239  {
240  _dragging = true;
241  QDrag* drag = new QDrag(table_widget);
242  QMimeData* mimeData = new QMimeData;
243 
244  QByteArray mdata;
245  QDataStream stream(&mdata, QIODevice::WriteOnly);
246 
247  auto selected_names = getSelectedNames();
248  std::sort(selected_names.begin(), selected_names.end());
249 
250  for (const auto& curve_name : selected_names)
251  {
252  stream << QString::fromStdString(curve_name);
253  }
254 
255  if (!_newX_modifier)
256  {
257  mimeData->setData("curveslist/add_curve", mdata);
258  }
259  else
260  {
261  if (selected_names.size() != 2)
262  {
263  if (selected_names.size() >= 1)
264  {
265  QMessageBox::warning(table_widget, "New in version 2.3+",
266  "To create a new XY curve, you must select two "
267  "timeseries and "
268  "drag&drop them using the RIGHT mouse button.",
269  QMessageBox::Ok);
270  }
271  return true;
272  }
273  mimeData->setData("curveslist/new_XY_axis", mdata);
274 
275  QPixmap cursor(QSize(80, 30));
276  cursor.fill(Qt::transparent);
277 
278  QPainter painter;
279  painter.begin(&cursor);
280 
281  QString text("XY");
282  painter.setFont(QFont("Arial", 14));
283 
284  painter.setBackground(Qt::transparent);
285  painter.setPen(table_widget->palette().foreground().color());
286  painter.drawText(QRect(0, 0, 80, 30), Qt::AlignCenter, text);
287  painter.end();
288 
289  drag->setDragCursor(cursor, Qt::MoveAction);
290  }
291 
292  drag->setMimeData(mimeData);
293  drag->exec(Qt::CopyAction | Qt::MoveAction);
294  }
295  return true;
296  }
297  else if (event->type() == QEvent::Wheel)
298  {
299  QWheelEvent* wheel_event = dynamic_cast<QWheelEvent*>(event);
300 
301  if (ctrl_modifier_pressed)
302  {
303  int prev_size = _point_size;
304  if (wheel_event->delta() < 0)
305  {
306  _point_size = std::max(8, prev_size-1);
307  }
308  else if (wheel_event->delta() > 0)
309  {
310  _point_size = std::min(14, prev_size+1);
311  }
312  if (_point_size != prev_size)
313  {
315  }
316  return true;
317  }
318  }
319  return false;
320 }
void addItem(const QString &item_name) override
basic_object< reference > object
Definition: forward.hpp:717
virtual std::vector< std::string > getSelectedNames()=0
void changeFontSize(int point_size)
CurvesView(CurveListPanel *parent)
virtual void hideValuesColumn(bool hide) override
QPoint _drag_start_pos
QSet< QString > _inserted_curves
std::vector< std::string > getSelectedNames() override
#define min(A, B)
Definition: Log.c:64
#define max(A, B)
Definition: Socket.h:88
CurveListPanel * _parent_panel
void setViewResizeEnabled(bool enable) override
static int sort(lua_State *L)
Definition: ltablib.c:397
const char * name
CurveTableView(CurveListPanel *parent)
void refreshFontSize() override
bool _newX_modifier
std::enable_if_t< all< Args... >::value, enable_t > enable
Definition: sol.hpp:1726
void refreshColumns() override
bool applyVisibilityFilter(const QString &filter_string) override
bool eventFilterBase(QObject *object, QEvent *event)
void removeCurve(const QString &name) override


plotjuggler
Author(s): Davide Faconti
autogenerated on Sun Dec 6 2020 03:47:33