Code_TYMPAN  4.4.0
Industrial site acoustic simulation
TabPointsWidget.cpp
Go to the documentation of this file.
1 #include <qmenu.h>
2 #include <QStringList>
3 
7 
8 #define TR(id) OLocalizator::getString("TabPointsWidget", (id))
9 
10 bool ItemDelegate::eventFilter(QObject* object, QEvent* event)
11 {
12  if (event->type() == QEvent::KeyPress)
13  {
14  QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
15  if (keyEvent->key() == Qt::Key_Comma)
16  {
17  keyEvent = new QKeyEvent(QEvent::KeyPress, Qt::Key_Period, Qt::NoModifier, 0, 0, 0, ".");
18  QApplication::sendEvent(object, keyEvent);
19  return true;
20  }
21  }
22  return QStyledItemDelegate::eventFilter(object, event);
23 }
24 
25 TabPointsWidget::TabPointsWidget(TYTabPoint& listPoints, QWidget* parent)
26  : QTableWidget(parent), _listPoints(listPoints)
27 {
28  setColumnCount(3);
29 
30  // Set horizontal header
31  QStringList stringList;
32  stringList.append("X");
33  stringList.append("Y");
34  stringList.append("Z");
35 
36  setHorizontalHeaderLabels(stringList);
37 
38  setSelectionBehavior(QAbstractItemView::SelectRows);
39 
40  connect(this, &TabPointsWidget::cellChanged, this, &TabPointsWidget::tabValueChanged);
41  this->setItemDelegate(new ItemDelegate(this));
42 }
43 
45 {
46  // Filling the table
47  disconnect(this, &TabPointsWidget::cellChanged, this, &TabPointsWidget::tabValueChanged);
48 
49  clearContents();
50  setRowCount(static_cast<int>(_listPoints.size()));
51  for (int row = 0; row < _listPoints.size(); row++)
52  {
53  setItem(row, 0, new QTableWidgetItem((QString().setNum(_listPoints[row]._x, 'f', 2))));
54  setItem(row, 1, new QTableWidgetItem((QString().setNum(_listPoints[row]._y, 'f', 2))));
55  setItem(row, 2, new QTableWidgetItem((QString().setNum(_listPoints[row]._z, 'f', 2))));
56 
57  setAttributes(row);
58  }
59 
60  connect(this, &TabPointsWidget::cellChanged, this, &TabPointsWidget::tabValueChanged);
61 }
62 
64 {
65  bool ok(false);
66  double x(0.), y(0.), z(0.);
67 
68  // Filling the list
69  _listPoints.clear();
70  for (int row = 0; row < rowCount(); row++)
71  {
72  x = item(row, 0)->text().toDouble(&ok);
73  y = item(row, 1)->text().toDouble(&ok);
74  z = item(row, 2)->text().toDouble(&ok);
75 
76  if (ok)
77  {
78  _listPoints.push_back(TYPoint(x, y, z));
79  }
80  }
81 }
82 
83 void TabPointsWidget::tabValueChanged(int row, int col)
84 {
85  // Translate input value to double to see if it's a correct number
86  bool ok = false;
87  item(row, col)->text().toDouble(&ok);
88 
89  // If value is not a valid number, get the original value in points list
90  if (!ok)
91  {
92  item(row, col)->setText(QString().setNum(0.0, 'f', 2));
93  }
94 }
95 
97 {
98  item(row, 0)->setFlags(Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsEnabled);
99  item(row, 1)->setFlags(Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsEnabled);
100  item(row, 2)->setFlags(Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsEnabled);
101 }
102 
104 {
105  setItem(row, 0, new QTableWidgetItem((QString().setNum(0.0, 'f', 2))));
106  setItem(row, 1, new QTableWidgetItem((QString().setNum(0.0, 'f', 2))));
107  setItem(row, 2, new QTableWidgetItem((QString().setNum(0.0, 'f', 2))));
108 }
109 
110 void TabPointsWidget::contextMenuEvent(QContextMenuEvent* e)
111 {
112  QPoint point = mapFrom(this, e->pos());
113  if ((point.x() >= 0) && (point.y() >= 0) && (point.x() <= width()) && (point.y() <= height()))
114  {
115  QPoint resPoint = QPoint(point.x(), point.y());
116  QTableWidgetItem* element = itemAt(resPoint);
117  if (element)
118  {
119  int row = indexAt(resPoint).row();
120  row = row >= 0 ? row : 0; // Securite
121  row = row < rowCount() ? row : rowCount() - 1;
122 
123  int col = indexAt(resPoint).column();
124  col = col >= 0 ? col : 0; // Securite
125  col = col < columnCount() ? col : columnCount() - 1;
126 
127  QAction *insertLine = NULL, *appendLine = NULL, *deleteLine = NULL;
128 
129  QMenu* pPopup = new QMenu(this);
130 
131  insertLine = pPopup->addAction(TR("id_insert_row_item"));
132  appendLine = pPopup->addAction(TR("id_append_row_item"));
133  deleteLine = pPopup->addAction(TR("id_delete_row_item"));
134 
135  QAction* ret = pPopup->exec(mapToGlobal(point));
136 
137  if (ret == insertLine)
138  {
139  insertRow(row);
140 
141  initRow(row);
142  setAttributes(row);
143  }
144  else if (ret == appendLine)
145  {
146  setRowCount(rowCount() + 1);
147  int lastRow = rowCount() - 1;
148 
149  initRow(lastRow);
150  setAttributes(lastRow);
151  }
152  else if (ret == deleteLine)
153  {
154  removeRow(row);
155  }
156  }
157  }
158 }
std::vector< TYPoint > TYTabPoint
Collection de TYPoint.
Definition: TYDefines.h:340
#define TR(id)
bool eventFilter(QObject *object, QEvent *event) override
void tabValueChanged(int, int)
virtual void apply()
void setAttributes(int row)
virtual void update()
virtual void contextMenuEvent(QContextMenuEvent *e)
void initRow(int row)
TYTabPoint & _listPoints
TabPointsWidget(TYTabPoint &listPoints, QWidget *parent=nullptr)