QueryWidget.cpp
Go to the documentation of this file.
1 #include "QueryWidget.h"
2 
3 #include <limits>
4 #include <mutex>
5 
6 #include <QCheckBox>
7 #include <QGroupBox>
8 #include <QHBoxLayout>
9 #include <QLabel>
10 #include <QLineEdit>
11 #include <QPushButton>
12 #include <QScrollArea>
13 #include <QSpinBox>
14 #include <QTabWidget>
15 #include <QVBoxLayout>
16 #include <QWidget>
17 
19 
20 namespace armarx::armem::gui
21 {
22 
24  {
25  auto* vlayout = new QVBoxLayout();
26  auto* hlayout = new QHBoxLayout();
27 
28  {
29  _availableMemoriesGroupBox = new QGroupBox("Available memories");
30  auto vboxlayout = new QVBoxLayout();
31  vboxlayout->setMargin(1);
32  vboxlayout->setSizeConstraint(QLayout::SizeConstraint::SetMinAndMaxSize);
33  vboxlayout->setAlignment(Qt::AlignTop);
34  _de_selectMemoryServers = new QPushButton(selectText);
35  allMemoryServersSelected = false;
36  vboxlayout->addWidget(_de_selectMemoryServers);
37  _availableMemoriesGroupBox->setLayout(vboxlayout);
38  hlayout->addWidget(_availableMemoriesGroupBox);
39  }
40 
41  QFrame* vFrame = new QFrame;
42  vFrame->setFrameShape(QFrame::VLine);
43  hlayout->addWidget(vFrame);
44 
45  {
46  _additionalSettingsGroupBox = new QGroupBox("Additional query settings");
47  auto vboxlayout = new QVBoxLayout();
48  vboxlayout->setMargin(1);
49  vboxlayout->setSizeConstraint(QLayout::SizeConstraint::SetMinAndMaxSize);
50  vboxlayout->setAlignment(Qt::AlignTop);
51  _additionalSettingsGroupBox->setLayout(vboxlayout);
52 
53  _dataCheckBox = new QCheckBox("Get Data");
54  _dataCheckBox->setChecked(true);
55  vboxlayout->addWidget(_dataCheckBox);
56 
57  _dropRemovedCheckBox = new QCheckBox("Drop disconnected memories");
58  _dropRemovedCheckBox->setChecked(true);
59  vboxlayout->addWidget(_dropRemovedCheckBox);
60 
61  _dropDisabledCheckBox = new QCheckBox("Drop disabled memories");
62  _dropDisabledCheckBox->setChecked(false);
63  vboxlayout->addWidget(_dropDisabledCheckBox);
64 
65  auto* recDepthHLayout = new QHBoxLayout();
66  _recursionDepthLabel = new QLabel("Link resolution depth:");
67  recDepthHLayout->addWidget(_recursionDepthLabel);
68  _recursionDepthLabel->setFixedWidth(200);
69 
70  _recursionDepthSpinner = new QSpinBox(); // NOLINT
71  _recursionDepthSpinner->setRange(-1, std::numeric_limits<int>::max());
72  _recursionDepthSpinner->setValue(0);
73  _recursionDepthSpinner->setEnabled(_dataCheckBox->isChecked());
74  _recursionDepthSpinner->setSpecialValueText(QString("Unlimited"));
75  recDepthHLayout->addWidget(_recursionDepthSpinner);
76  recDepthHLayout->addStretch();
77  vboxlayout->addLayout(recDepthHLayout);
78 
79  /*
80  auto* exportPathHLayout = new QHBoxLayout();
81  _exportPathLabel = new QLabel("Export path:");
82  exportPathHLayout->addWidget(_exportPathLabel);
83  _exportPathLabel->setFixedWidth(200);
84 
85  _exportPathLineEdit = new QLineEdit();
86  exportPathHLayout->addWidget(_exportPathLineEdit);
87  exportPathHLayout->setStretchFactor(_exportPathLineEdit, 4);
88 
89  _exportPathConfirmButton = new QPushButton("Confirm Path");
90  exportPathHLayout->addWidget(_exportPathConfirmButton);
91  _exportPathConfirmButton->setFixedWidth(100);
92  vboxlayout->addLayout(exportPathHLayout);
93 
94  auto* exportNameHLayout = new QHBoxLayout();
95  _exportNameLabel = new QLabel("Export name:");
96  exportNameHLayout->addWidget(_exportNameLabel);
97  _exportNameLabel->setFixedWidth(200);
98 
99  _exportNameLineEdit = new QLineEdit();
100  exportNameHLayout->addWidget(_exportNameLineEdit);
101  exportNameHLayout->setStretchFactor(_exportNameLineEdit, 4);
102 
103  _exportNameConfirmButton = new QPushButton("Confirm Name");
104  exportNameHLayout->addWidget(_exportNameConfirmButton);
105  _exportNameConfirmButton->setFixedWidth(100);
106  vboxlayout->addLayout(exportNameHLayout);
107 */
108 
109  auto ltmButtonsLayout = new QVBoxLayout();
110  _storeInLTMButton = new QPushButton("Query and store in LTM");
111  ltmButtonsLayout->addWidget(_storeInLTMButton);
112 
113  auto* ltmRecHLayout = new QHBoxLayout();
114  _startLTMRecordingButton = new QPushButton("Start LTM Recording");
115  _stopLTMRecordingButton = new QPushButton("Stop LTM Recording");
116 
117  ltmRecHLayout->addWidget(_startLTMRecordingButton);
118  ltmRecHLayout->addWidget(_stopLTMRecordingButton);
119  ltmButtonsLayout->addLayout(ltmRecHLayout);
120 
121  vboxlayout->addLayout(ltmButtonsLayout);
122 
123  hlayout->addWidget(_additionalSettingsGroupBox);
124  }
125  vlayout->addLayout(hlayout);
126 
127  // Public connections.
128  /*
129  connect(_exportPathConfirmButton, &QPushButton::pressed, this, [=]() {
130  confirmExportPath(_exportPathLineEdit->text().toStdString());
131  });
132  connect(_exportNameConfirmButton, &QPushButton::pressed, this, [=]() {
133  confirmExportPath(_exportNameLineEdit->text().toStdString());
134  });
135 */
136  connect(_storeInLTMButton, &QPushButton::pressed, this, &This::storeInLTM);
137  connect(_startLTMRecordingButton, &QPushButton::pressed, this, &This::startRecording);
138  connect(_stopLTMRecordingButton, &QPushButton::pressed, this, &This::stopRecording);
139 
140  // Private connections.
141  connect(
142  _dataCheckBox, &QCheckBox::stateChanged, this, &This::setRecursionDepthSpinnerEnabled);
143 
144  connect(_de_selectMemoryServers, &QPushButton::pressed, this, &This::deSelectMemoryServers);
145 
146  setLayout(vlayout);
147  }
148 
149  void
150  QueryWidget::update(const std::vector<std::string>& activeMemoryNames)
151  {
152  std::scoped_lock l(enabledMemoriesMutex);
153  std::vector<std::string> alreadyPresentMemoryCheckboxes;
154 
155  // get information about memories already present and activate inactive ones if necessary
156  int maxIndex = _availableMemoriesGroupBox->layout()
157  ->count(); //as the (de)select button is counted as well
158  for (int i = 1; i < maxIndex; ++i)
159  {
160  auto w = _availableMemoriesGroupBox->layout()->itemAt(i)->widget();
161  QCheckBox* box = static_cast<QCheckBox*>(w);
162  std::string memoryName = box->text().toStdString();
163  if (box->isEnabled() &&
164  std::find(activeMemoryNames.begin(), activeMemoryNames.end(), memoryName) ==
165  activeMemoryNames.end())
166  {
167  // checkbox is enabled but memory is not available anymore
168  box->setVisible(false);
169  box->setChecked(false);
170  box->setEnabled(false);
171  }
172  if (not(box->isEnabled()) &&
173  std::find(activeMemoryNames.begin(), activeMemoryNames.end(), memoryName) !=
174  activeMemoryNames.end())
175  {
176  // checkbox is disabled but memory is available again
177  box->setVisible(true);
178  box->setChecked(false);
179  box->setEnabled(true);
180  }
181  alreadyPresentMemoryCheckboxes.push_back(memoryName);
182  }
183 
184  // Add checkboxes for new memories
185  for (const auto& memoryName : activeMemoryNames)
186  {
187  if (std::find(alreadyPresentMemoryCheckboxes.begin(),
188  alreadyPresentMemoryCheckboxes.end(),
189  memoryName) == alreadyPresentMemoryCheckboxes.end())
190  {
191  // new memory available
192  auto box = new QCheckBox(QString::fromStdString(memoryName));
193  box->setChecked(
194  true); // we do not want all memories to be enabled on startup, to reduce communication overhead
195  box->setVisible(true);
196  box->setEnabled(true);
197  _availableMemoriesGroupBox->layout()->addWidget(box);
198  }
199  }
200  }
201 
204  {
205  return _dataCheckBox->isChecked() ? armem::query::DataMode::WithData
207  }
208 
209  bool
211  {
212  return _dropRemovedCheckBox->isChecked();
213  }
214 
215  bool
217  {
218  return _dropDisabledCheckBox->isChecked();
219  }
220 
221  std::map<std::string, QueryWidget::ActiveMemoryState>
223  {
224  std::scoped_lock l(enabledMemoriesMutex);
225 
226  std::map<std::string, QueryWidget::ActiveMemoryState> states;
227  int maxIndex = _availableMemoriesGroupBox->layout()->count();
228  for (int i = 1; i < maxIndex; ++i)
229  {
230  auto w = _availableMemoriesGroupBox->layout()->itemAt(i)->widget();
231  QCheckBox* box = static_cast<QCheckBox*>(w);
232  std::string memoryName = box->text().toStdString();
233  if (box->isEnabled() && box->isChecked())
234  {
236  }
237  else if (box->isEnabled() && !box->isChecked())
238  {
240  }
241  else
242  {
244  }
245  }
246  return states;
247  }
248 
249  std::vector<std::string>
251  {
252  std::scoped_lock l(enabledMemoriesMutex);
253 
254  std::vector<std::string> enabledMemoryCheckboxes;
255  int maxIndex = _availableMemoriesGroupBox->layout()->count();
256  for (int i = 1; i < maxIndex; ++i)
257  {
258  auto w = _availableMemoriesGroupBox->layout()->itemAt(i)->widget();
259  QCheckBox* box = static_cast<QCheckBox*>(w);
260  std::string memoryName = box->text().toStdString();
261  if (box->isEnabled() && box->isChecked())
262  {
263  // Invisible ones are always unchecked if set to invisible from update method
264  enabledMemoryCheckboxes.push_back(memoryName);
265  }
266  }
267  return enabledMemoryCheckboxes;
268  }
269 
270  int
272  {
273  return _recursionDepthSpinner->value();
274  }
275 
276  void
277  QueryWidget::setRecursionDepthSpinnerEnabled(int state)
278  {
279  switch (state)
280  {
281  case Qt::Checked:
282  _recursionDepthSpinner->setEnabled(true);
283  break;
284  case Qt::Unchecked:
285  default:
286  _recursionDepthSpinner->setEnabled(false);
287  break;
288  }
289  }
290 
291  void
292  QueryWidget::deSelectMemoryServers()
293  {
294  if (!allMemoryServersSelected)
295  {
296  //ARMARX_INFO << "Selecting all memory servers";
297  //not all servers are selected -> select all memory servers:
298  std::scoped_lock l(enabledMemoriesMutex);
299 
300  // get information about memories already present and activate inactive ones if necessary
301  int maxIndex = _availableMemoriesGroupBox->layout()
302  ->count(); //as the (de)select button is counted as well
303  for (int i = 1; i < maxIndex; ++i)
304  {
305  auto w = _availableMemoriesGroupBox->layout()->itemAt(i)->widget();
306  QCheckBox* box = static_cast<QCheckBox*>(w);
307  std::string memoryName = box->text().toStdString();
308  box->setChecked(true);
309  }
310  //set variables and text:
311  allMemoryServersSelected = true;
312  _de_selectMemoryServers->setText(deselectText);
313  }
314  else
315  {
316  //ARMARX_INFO << "Deselecting all memory servers";
317  //memories should be deselected:
318  std::scoped_lock l(enabledMemoriesMutex);
319 
320  // get information about memories already present and activate inactive ones if necessary
321  int maxIndex = _availableMemoriesGroupBox->layout()
322  ->count(); //as the (de)select button is counted as well
323  for (int i = 1; i < maxIndex; ++i)
324  {
325  auto w = _availableMemoriesGroupBox->layout()->itemAt(i)->widget();
326  QCheckBox* box = static_cast<QCheckBox*>(w);
327  box->setChecked(false);
328  }
329 
330  allMemoryServersSelected = false;
331  _de_selectMemoryServers->setText(selectText);
332  }
333  }
334 
335 } // namespace armarx::armem::gui
armarx::armem::gui::QueryWidget::storeInLTM
void storeInLTM()
armarx::armem::query::DataMode::WithData
@ WithData
Get structure and ARON data.
armarx::armem::gui::QueryWidget::QueryWidget
QueryWidget()
Definition: QueryWidget.cpp:23
armarx::armem::gui::QueryWidget::stopRecording
void stopRecording()
armarx::armem::gui::QueryWidget::ActiveMemoryState::NotFound
@ NotFound
armarx::armem::gui::QueryWidget::ActiveMemoryState::FoundAndNotChecked
@ FoundAndNotChecked
armarx::armem::query::DataMode
DataMode
Definition: DataMode.h:6
max
T max(T t1, T t2)
Definition: gdiam.h:51
armarx::armem::gui::QueryWidget::update
void update(const std::vector< std::string > &memoryNames)
Definition: QueryWidget.cpp:150
QueryWidget.h
ExpressionException.h
armarx::armem::gui::QueryWidget::getAvailableMemoryStates
std::map< std::string, ActiveMemoryState > getAvailableMemoryStates() const
Definition: QueryWidget.cpp:222
armarx::armem::gui::QueryWidget::startRecording
void startRecording()
armarx::armem::gui::QueryWidget::dropRemovedMemories
bool dropRemovedMemories() const
Definition: QueryWidget.cpp:210
armarx::armem::gui::QueryWidget::getEnabledMemories
std::vector< std::string > getEnabledMemories() const
Definition: QueryWidget.cpp:250
armarx::armem::gui::QueryWidget::ActiveMemoryState::FoundAndChecked
@ FoundAndChecked
armarx::armem::laser_scans::constants::memoryName
const std::string memoryName
Definition: constants.h:28
armarx::armem::gui
Definition: ActionsMenuBuilder.cpp:5
armarx::armem::query::DataMode::NoData
@ NoData
Just get the structure, but no ARON data.
armarx::armem::gui::QueryWidget::queryLinkRecursionDepth
int queryLinkRecursionDepth() const
Definition: QueryWidget.cpp:271
armarx::armem::gui::QueryWidget::dropDisabledMemories
bool dropDisabledMemories() const
Definition: QueryWidget.cpp:216
armarx::armem::gui::QueryWidget::dataMode
armem::query::DataMode dataMode() const
Definition: QueryWidget.cpp:203