ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
ecvCustomLabelsWidget.cpp
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
9 
10 #include <QHBoxLayout>
11 #include <QHeaderView>
12 #include <QPushButton>
13 #include <QTableWidget>
14 #include <QVBoxLayout>
15 
17  : QWidget(parent) {
18  setupUI();
19 }
20 
22 
23 void ecvCustomLabelsWidget::setupUI() {
24  QVBoxLayout* mainLayout = new QVBoxLayout(this);
25  mainLayout->setContentsMargins(0, 0, 0, 0);
26  mainLayout->setSpacing(4);
27 
28  // Table for Value/Label pairs
29  m_table = new QTableWidget(0, 2, this);
30  m_table->setHorizontalHeaderLabels(QStringList()
31  << tr("Value") << tr("Label"));
32  m_table->horizontalHeader()->setStretchLastSection(true);
33  m_table->setSelectionBehavior(QAbstractItemView::SelectRows);
34  m_table->setMinimumHeight(120);
35  m_table->setMaximumHeight(200);
36  mainLayout->addWidget(m_table);
37 
38  // Add/Remove buttons
39  QHBoxLayout* buttonLayout = new QHBoxLayout();
40  buttonLayout->setContentsMargins(0, 0, 0, 0);
41 
42  m_addButton = new QPushButton(tr("Add"), this);
43  m_removeButton = new QPushButton(tr("Remove"), this);
44 
45  connect(m_addButton, &QPushButton::clicked, this,
46  &ecvCustomLabelsWidget::onAddButtonClicked);
47  connect(m_removeButton, &QPushButton::clicked, this,
48  &ecvCustomLabelsWidget::onRemoveButtonClicked);
49 
50  buttonLayout->addWidget(m_addButton);
51  buttonLayout->addWidget(m_removeButton);
52  buttonLayout->addStretch();
53 
54  mainLayout->addLayout(buttonLayout);
55 }
56 
57 void ecvCustomLabelsWidget::onAddButtonClicked() {
58  int row = m_table->rowCount();
59  m_table->insertRow(row);
60 
61  // Default value: 0.0
62  QTableWidgetItem* valueItem = new QTableWidgetItem("0.0");
63  m_table->setItem(row, 0, valueItem);
64 
65  // Default label: empty
66  QTableWidgetItem* labelItem = new QTableWidgetItem("");
67  m_table->setItem(row, 1, labelItem);
68 
69  // Select the new row
70  m_table->selectRow(row);
71  // Edit the value cell
72  m_table->editItem(valueItem);
73 }
74 
75 void ecvCustomLabelsWidget::onRemoveButtonClicked() {
76  QList<QTableWidgetSelectionRange> ranges = m_table->selectedRanges();
77  if (ranges.isEmpty()) {
78  // No selection, remove last row
79  if (m_table->rowCount() > 0) {
80  m_table->removeRow(m_table->rowCount() - 1);
81  }
82  } else {
83  // Remove selected rows (from bottom to top to avoid index shifting)
84  QList<int> rowsToRemove;
85  for (const QTableWidgetSelectionRange& range : ranges) {
86  for (int row = range.topRow(); row <= range.bottomRow(); ++row) {
87  if (!rowsToRemove.contains(row)) {
88  rowsToRemove.append(row);
89  }
90  }
91  }
92  std::sort(rowsToRemove.begin(), rowsToRemove.end(),
93  std::greater<int>());
94  for (int row : rowsToRemove) {
95  m_table->removeRow(row);
96  }
97  }
98 }
99 
100 QList<QPair<double, QString>> ecvCustomLabelsWidget::getLabels() const {
101  QList<QPair<double, QString>> labels;
102  for (int row = 0; row < m_table->rowCount(); ++row) {
103  QTableWidgetItem* valueItem = m_table->item(row, 0);
104  QTableWidgetItem* labelItem = m_table->item(row, 1);
105 
106  if (valueItem && labelItem) {
107  bool ok = false;
108  double value = valueItem->text().toDouble(&ok);
109  if (ok) {
110  labels.append(qMakePair(value, labelItem->text()));
111  }
112  }
113  }
114  return labels;
115 }
116 
118  const QList<QPair<double, QString>>& labels) {
119  m_table->setRowCount(0);
120  for (const QPair<double, QString>& label : labels) {
121  int row = m_table->rowCount();
122  m_table->insertRow(row);
123 
124  QTableWidgetItem* valueItem =
125  new QTableWidgetItem(QString::number(label.first));
126  m_table->setItem(row, 0, valueItem);
127 
128  QTableWidgetItem* labelItem = new QTableWidgetItem(label.second);
129  m_table->setItem(row, 1, labelItem);
130  }
131 }
132 
133 void ecvCustomLabelsWidget::clearLabels() { m_table->setRowCount(0); }
~ecvCustomLabelsWidget() override
void setLabels(const QList< QPair< double, QString >> &labels)
ecvCustomLabelsWidget(QWidget *parent=nullptr)
QList< QPair< double, QString > > getLabels() const