ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
ecvItemSelectionDlg.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 
8 #include "ecvItemSelectionDlg.h"
9 
10 // Qt
11 #include <QDialog>
12 #include <QListWidgetItem>
13 
14 ccItemSelectionDlg::ccItemSelectionDlg(bool multiSelectionEnabled,
15  QWidget* parent /*=0*/,
16  QString itemName /*="entities"*/,
17  QString labelStr /*=QString()*/)
18  : QDialog(parent, Qt::Tool), Ui::ItemSelectionDlg() {
19  setupUi(this);
20 
21  // multi-selection mode
22  if (multiSelectionEnabled) {
23  label->setText(tr("Please select one or several %1:\n(press CTRL+A to "
24  "select all)")
25  .arg(itemName));
26  listWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);
27  } else {
28  label->setText(tr("Please select one %1").arg(itemName));
29  }
30 
31  if (!labelStr.isNull()) {
32  label->setText(labelStr);
33  }
34 }
35 
36 void ccItemSelectionDlg::setItems(const QStringList& items,
37  int defaultSelectedIndex) {
38  for (int i = 0; i < items.size(); ++i) {
39  // add one line per entity in the combo-box
40  listWidget->insertItem(static_cast<int>(i),
41  new QListWidgetItem(items[i]));
42  }
43 
44  // default selection
45  if (defaultSelectedIndex >= 0 && defaultSelectedIndex < items.size()) {
46  listWidget->item(defaultSelectedIndex)->setSelected(true);
47  // listWidget->setItemSelected(listWidget->item(defaultSelectedIndex),
48  // true);
49  }
50 }
51 
53  // get selected items
54  QList<QListWidgetItem*> list = listWidget->selectedItems();
55  return list.empty() ? -1 : listWidget->row(list.front());
56 }
57 
58 void ccItemSelectionDlg::getSelectedIndexes(std::vector<int>& indexes) const {
59  // get selected items
60  QList<QListWidgetItem*> list = listWidget->selectedItems();
61 
62  try {
63  indexes.resize(static_cast<size_t>(list.size()));
64  } catch (const std::bad_alloc&) {
65  // not enough memory?!
66  return;
67  }
68 
69  for (int i = 0; i < list.size(); ++i) {
70  indexes[i] = listWidget->row(list[i]);
71  }
72 }
73 
75  int selectedIndex /*=0*/,
76  QWidget* parent /*=0*/,
77  QString label /*=QString()*/) {
78  ccItemSelectionDlg epDlg(false, parent, tr("entity"), label);
79 
80  QStringList items;
81  for (size_t i = 0; i < entities.size(); ++i) {
82  // add one line per entity
83  items << QString("%1 (ID=%2)")
84  .arg(entities[i]->getName())
85  .arg(entities[i]->getUniqueID());
86  }
87  epDlg.setItems(items, selectedIndex);
88 
89  if (!epDlg.exec()) {
90  // cancelled by the user
91  return -1;
92  }
93 
94  return epDlg.getSelectedIndex();
95 }
96 
98  std::vector<int>& selectedIndexes,
99  QWidget* parent /*=0*/,
100  QString label /*=QString()*/) {
101  selectedIndexes.clear();
102 
103  ccItemSelectionDlg epDlg(true, parent, tr("entities"), label);
104 
105  QStringList items;
106  for (size_t i = 0; i < entities.size(); ++i) {
107  // add one line per entity
108  items << QString("%1 (ID=%2)")
109  .arg(entities[i]->getName())
110  .arg(entities[i]->getUniqueID());
111  }
112  epDlg.setItems(items, -1);
113 
114  if (!epDlg.exec()) return false;
115 
116  epDlg.getSelectedIndexes(selectedIndexes);
117  return true;
118 }
std::vector< ccHObject * > Container
Standard instances container (for children, etc.)
Definition: ecvHObject.h:337
Dialog to select one or multiple items.
ccItemSelectionDlg(bool multiSelectionEnabled, QWidget *parent=0, QString itemName="entities", QString label=QString())
Default constructor.
void getSelectedIndexes(std::vector< int > &indexes) const
Returns selected indexes (multi-selection mode)
void setItems(const QStringList &items, int defaultSelectedIndex=0)
Sets the list of items.
int getSelectedIndex() const
Returns selected index (unique selection mode)
static int SelectEntity(const ccHObject::Container &entities, int defaultSelectedIndex=0, QWidget *parent=0, QString label=QString())
Static shortcut: unique selection mode.
static bool SelectEntities(const ccHObject::Container &entities, std::vector< int > &indexes, QWidget *parent=0, QString label=QString())
Static shortcut: multi-selection mode.