SkillDashboardWidgetController.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of ArmarX.
3  *
4  * Copyright (C) 2011-2016, High Performance Humanoid Technologies (H2T), Karlsruhe Institute of Technology (KIT), all rights reserved.
5  *
6  * ArmarX is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  * ArmarX is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
17  *
18  * \package ArmarXGui::gui-plugins::OperatorViewWidgetController
19  * \author Leonie Leven
20  * \date 2024
21  * \copyright http://www.gnu.org/licenses/gpl-2.0.txt
22  * GNU General Public License
23  */
24 
26 
27 #include <string>
28 
29 #include <QDebug>
30 #include <QHBoxLayout>
31 #include <QPalette>
32 #include <QStringList>
33 #include <QTimer>
34 
40 
41 
42 // Qt headers
43 #include <cmath>
44 #include <fstream>
45 #include <iostream>
46 
47 #include <QLabel>
48 #include <QLineEdit>
49 #include <QMessageBox>
50 #include <QPushButton>
51 #include <QString>
52 #include <QTimer>
53 #include <QToolButton>
54 #include <Qt>
55 #include <QtGlobal>
56 #include <QtWidgets/QSlider>
57 #include <QtWidgets/QTableWidgetItem>
58 
59 #include <nlohmann/json.hpp>
60 
61 static const std::string config_key_skilldashboard = "skilldashboard";
62 static const std::string config_key_start_in = "start_in";
63 
64 namespace armarx
65 {
67  {
68  addWidget<SkillDashboardWidget>();
69  }
70 
72  DEFAULT_SETTINGS_PLUGIN_NAME("SkillDashboardGuiPlugin"),
73  DEFAULT_SETTINGS_CUSTOM_TEXT("custom text")
74  {
75 
76  // init gui
77  ARMARX_INFO << "Setup UI";
78  ui.setupUi(getWidget());
79  this->shortcutLayout = new QVBoxLayout();
80  this->dialog = new SkillDashboardConfigWindow();
81  this->editModeAction = new QAction("Edit Mode", this);
82  this->editModeAction->setCheckable(true);
83  this->editModeAction->setToolTip("If toggled the shortcut config buttons and the reload, "
84  "add and export button will be shown.");
85 
86  connect(this->editModeAction, SIGNAL(toggled(bool)), this, SLOT(editMode(bool)));
87 
88  connect(
89  ui.addButton, &QPushButton::clicked, this, [this]() { openConfigWindow("", "", ""); });
90  connect(ui.reloadButton, &QPushButton::clicked, this, &SkillDashboardWidget::loadButtons);
91  connect(
92  this, &SkillDashboardWidget::loadButtonInit, this, &SkillDashboardWidget::loadButtons);
93  connect(ui.exportButton, &QPushButton::clicked, this, &SkillDashboardWidget::exportButtons);
94 
95  connect(this,
97  this,
98  &SkillDashboardWidget::activateButton);
99 
100  connect(this->dialog,
102  this,
103  &SkillDashboardWidget::onShortcutNameChanged);
104 
105  this->editMode(true);
106 
107  ARMARX_INFO << "Done: Setup UI";
108  }
109 
110  void
112  {
113  ARMARX_TRACE;
114  if (not dashboardManagerName.empty())
115  {
116  usingProxy(dashboardManagerName);
117  }
118  else
119  {
120  ARMARX_IMPORTANT << "empty";
121  }
122  if (not this->skillManagerOberserverName.empty())
123  {
124  usingProxy(this->skillManagerOberserverName);
125  }
126  else
127  {
128  ARMARX_IMPORTANT << "empty";
129  }
130  }
131 
132  void
134  {
135  ARMARX_TRACE;
136  this->connected.store(true);
137  getProxy(this->dashboardPrx, this->dashboardManagerName);
138  getProxy(this->managerPrx, this->skillManagerOberserverName);
139  this->exampleTask = std::thread([&] { exampleThreadMethod(); });
140  emit loadButtonInit();
141  }
142 
143  void
144  SkillDashboardWidget::activateButton(const std::string& name)
145  {
146  this->shortcutButtons.at(name)->setDisabled(false);
147  }
148 
149  void
150  SkillDashboardWidget::exampleThreadMethod()
151  {
152  while (this->connected.load())
153  {
154  if (not this->runningSkills.empty())
155  {
156  for (auto it = this->runningSkills.cbegin(); it != this->runningSkills.cend();)
157  {
158  skills::core::dto::Execution::Status status =
159  skills::core::dto::Execution::Status::Succeeded;
160 
161  try
162  {
163  IceUtil::Optional<skills::manager::dto::SkillStatusUpdate> update =
164  this->managerPrx->getSkillExecutionStatus(it->second);
165  if (update)
166  {
167  status = update->status;
168  }
169  }
170  catch (Ice::Exception const&)
171  {
172  ARMARX_WARNING << "Could not get skill status." << deactivateSpam(10);
173  }
174 
175  if (status == skills::core::dto::Execution::Status::Succeeded ||
176  status == skills::core::dto::Execution::Status::Failed ||
177  status == skills::core::dto::Execution::Status::Aborted)
178  {
179  emit skillFinished(it->first);
180  this->runningSkills.erase(it++);
181  }
182  else
183  {
184  ++it;
185  }
186  }
187  }
188  }
189  }
190 
191  void
192  SkillDashboardWidget::onShortcutNameChanged()
193  {
194 
195  if ((this->shortcutButtons.find(this->dialog->getShortcutName().toStdString()) !=
196  this->shortcutButtons.end()) and
197  (this->dialog->getShortcutName().toStdString() != this->currentShortcutName))
198  {
199  this->dialog->setInfoText(
200  "A shortcut with this name already exists! The old one will be overwritten.");
202  << "A shortcut with this name already exists! The old one will be overwritten!";
203  }
204  else
205  {
206  this->dialog->setInfoText("");
207  }
208  }
209 
210  void
211  SkillDashboardWidget::openConfigWindow(const std::string& name,
212  const std::string& id,
213  const std::string& args)
214  {
215 
216  this->dialog->setShortcutName(name);
217  this->dialog->setSkillId(id);
218  this->dialog->setSkillConfig(args);
219 
220 
221  if (this->dialog->exec() == QDialog::Accepted)
222  {
223  try
224  {
225  SkillShortcut newShortcut{
226  .shortcutName = this->dialog->getShortcutName().toStdString(),
227  .skillId = this->dialog->getSkillId().toStdString(),
228  .skillArgs = this->dialog->getSkillConfig().toStdString()};
229  this->dashboardPrx->addNewShortcut(newShortcut);
230  }
231  catch (Ice::Exception const&)
232  {
233  ARMARX_WARNING << "Could not send new Shortcut." << deactivateSpam(10);
234  }
235  loadButtons();
236  }
237  }
238 
239  std::string
241  {
242  auto now = std::chrono::system_clock::now();
243  std::time_t now_c = std::chrono::system_clock::to_time_t(now);
244  std::tm local_tm;
245  localtime_r(&now_c, &local_tm);
246  std::ostringstream oss;
247  oss << std::put_time(&local_tm, "%Y-%m-%d_%H-%M-%S");
248  return oss.str();
249  }
250 
251  void
252  SkillDashboardWidget::exportButtons()
253  {
254  std::vector<SkillShortcut> shortcuts;
255  try
256  {
257  shortcuts = this->dashboardPrx->getShortcuts();
258  }
259  catch (Ice::Exception const&)
260  {
261  ARMARX_WARNING << "Could not fetch default states." << deactivateSpam(10);
262  }
263 
264  nlohmann::json j;
265  for (const auto& shortcut : shortcuts)
266  {
267  nlohmann::json skillArgs_json = nlohmann::json::parse(shortcut.skillArgs);
268 
269  j["shortcuts"].push_back({{"skill_shortcut_name", shortcut.shortcutName},
270  {"skill_id", shortcut.skillId},
271  {"skill_args", skillArgs_json}});
272  }
273 
274  std::string packageName = ui.packageEdit->text().toStdString();
275  std::string folderName = ui.folderEdit->text().toStdString();
276  std::string fileName = ui.fileNameEdit->text().toStdString();
277 
278  size_t pos = fileName.find("%TIMESTAMP%");
279  if (pos != std::string::npos)
280  {
281  std::string timestamp = getCurrentDateTime();
282  fileName.replace(pos, 11, timestamp); // 11 length of %TIMESTAMP%
283  }
284 
285  std::string absoluteFilename;
286  armarx::CMakePackageFinder finder(packageName);
287  if (finder.packageFound())
288  {
289  ARMARX_INFO << "Package found...";
290 
291  std::string packageDataDir = finder.getDataDir();
292 
293  // add the data directory to the search list of ArmarXDataPath
294  ArmarXDataPath::addDataPaths(packageDataDir);
295  std::filesystem::create_directory(packageDataDir + "/" + folderName);
296 
297  std::string relativeFilename(folderName);
298 
299  if (ArmarXDataPath::getAbsolutePath(relativeFilename, absoluteFilename))
300  {
301  ARMARX_INFO << "Located file at:" << absoluteFilename;
302  std::string filename = fileName + ".json";
303  std::ofstream outFile(absoluteFilename + "/" + filename);
304  outFile << std::setw(4) << j << std::endl;
305  outFile.close();
306  ARMARX_INFO << "JSON has been written";
307  }
308  }
309  }
310 
311  void
312  SkillDashboardWidget::loadButtons()
313  {
314  this->shortcutButtons.clear();
315  this->configButtons.clear();
316  this->deleteButtons.clear();
317  std::vector<SkillShortcut> shortcuts;
318  try
319  {
320  shortcuts = this->dashboardPrx->getShortcuts();
321  }
322  catch (Ice::Exception const&)
323  {
324  ARMARX_WARNING << "Could not fetch default states." << deactivateSpam(10);
325  }
326  clearLayout(this->shortcutLayout);
327  QWidget* container = getWidget();
328  QLayout* existingLayout = container->layout();
329 
330  for (SkillShortcut& shortcut : shortcuts)
331  {
332  QPushButton* button = new QPushButton(QString::fromStdString(shortcut.shortcutName));
333  button->setStyleSheet("padding-right: 30px;");
334 
335  // Config-Button
336  QToolButton* configButton = new QToolButton();
337  QIcon iconConfig =
338  getWidget()->style()->standardIcon(QStyle::SP_FileDialogContentsView);
339  configButton->setIcon(iconConfig);
340  configButton->setToolTip("Settings");
341 
342  // Delete-Button
343  QToolButton* deleteButton = new QToolButton();
344  QIcon iconDelete = getWidget()->style()->standardIcon(QStyle::QStyle::SP_TrashIcon);
345  deleteButton->setIcon(iconDelete);
346  deleteButton->setToolTip("Delete");
347 
348 
349  QHBoxLayout* buttonLayout = new QHBoxLayout(button);
350  buttonLayout->setContentsMargins(0, 0, 0, 0);
351  buttonLayout->addStretch();
352  buttonLayout->addWidget(configButton);
353  buttonLayout->addWidget(deleteButton);
354 
355 
356  this->shortcutLayout->addWidget(button);
357  if (QVBoxLayout* hLayout = qobject_cast<QVBoxLayout*>(existingLayout))
358  {
359  hLayout->addLayout(this->shortcutLayout);
360  }
361 
362  this->shortcutButtons[shortcut.shortcutName] = button;
363  this->deleteButtons[shortcut.shortcutName] = deleteButton;
364  this->configButtons[shortcut.shortcutName] = configButton;
365 
366  connect(button,
367  &QPushButton::clicked,
368  this,
369  [this, name = shortcut.shortcutName]() { executeSkill(name); });
370  connect(configButton,
371  &QToolButton::clicked,
372  this,
373  [this, name = shortcut.shortcutName]() { editShortcut(name); });
374 
375  connect(deleteButton,
376  &QToolButton::clicked,
377  this,
378  [this, name = shortcut.shortcutName]() { deleteShortcut(name); });
379  }
380  }
381 
382  void
383  SkillDashboardWidget::executeSkill(const std::string& name)
384  {
385  SkillShortcut shortcut;
386  try
387  {
388  shortcut = this->dashboardPrx->getShortcut(name);
389  }
390  catch (Ice::Exception const&)
391  {
392  ARMARX_WARNING << "Could not fetch shortcut." << deactivateSpam(10);
393  }
394 
395  size_t pos = shortcut.skillId.find('/');
396  std::string provider = "";
397  std::string nameSkill = "";
398  nlohmann::json json = nlohmann::json::parse(shortcut.skillArgs);
401  aron::data::dto::DictPtr paramterDto = data->toAronDictDTO();
402 
403  if (pos != std::string::npos)
404  {
405  provider = shortcut.skillId.substr(0, pos);
406  nameSkill = shortcut.skillId.substr(pos + 1);
407  skills::manager::dto::ProviderID providerId{.providerName = provider};
408 
409  skills::manager::dto::SkillID skillId{.providerId = providerId, .skillName = nameSkill};
410 
411  char hostname[HOST_NAME_MAX];
412  gethostname(hostname, HOST_NAME_MAX);
413 
414  skills::manager::dto::SkillExecutionRequest request{
415  .skillId = skillId,
416  .executorName = "Skills.Dashboard GUI (hostname: " + std::string(hostname) + ")",
417  .parameters = paramterDto};
418 
419  try
420  {
421  skills::manager::dto::SkillExecutionID executionId =
422  this->managerPrx->executeSkillAsync(request);
423  this->runningSkills[shortcut.shortcutName] = executionId;
424  this->shortcutButtons.at(shortcut.shortcutName)->setDisabled(true);
425  }
426  catch (Ice::Exception const&)
427  {
428  ARMARX_WARNING << "Could not send execute request." << deactivateSpam(10);
429  }
430  }
431  else
432  {
433  ARMARX_IMPORTANT << "Invalid SkillID";
434  }
435  }
436 
437  void
438  SkillDashboardWidget::editShortcut(const std::string& name)
439  {
440  this->currentShortcutName = name;
441 
442  SkillShortcut shortcut;
443  try
444  {
445  shortcut = this->dashboardPrx->getShortcut(name);
446  }
447  catch (Ice::Exception const&)
448  {
449  ARMARX_WARNING << "Could not fetch shortcut." << deactivateSpam(10);
450  }
451  openConfigWindow(shortcut.shortcutName, shortcut.skillId, shortcut.skillArgs);
452  this->currentShortcutName = "not set";
453  }
454 
455  void
456  SkillDashboardWidget::deleteShortcut(const std::string& name)
457  {
458  ARMARX_INFO << "delete shortcut: " << name;
459  try
460  {
461  this->dashboardPrx->deleteShortcut(name);
462  //this->shortcutButtons.erase(this->shortcutButtons.find(name));
463  }
464  catch (Ice::Exception const&)
465  {
466  ARMARX_WARNING << "Could not delete shortcut." << deactivateSpam(10);
467  }
468  loadButtons();
469  }
470 
471  void
472  SkillDashboardWidget::clearLayout(QLayout* layout)
473  {
474  if (!layout)
475  return;
476 
477  while (QLayoutItem* item = layout->takeAt(0))
478  {
479  if (QWidget* widget = item->widget())
480  {
481  widget->deleteLater();
482  }
483  else if (QLayout* subLayout = item->layout())
484  {
485  clearLayout(subLayout);
486  }
487  delete item;
488  }
489  }
490 
491  QPointer<QWidget>
493  {
494  if (customToolbar)
495  {
496  if (parent != customToolbar->parent())
497  {
498  customToolbar->setParent(parent);
499  }
500 
501  return customToolbar.data();
502  }
503 
504  customToolbar = new QToolBar(parent);
505  customToolbar->setIconSize(QSize(16, 16));
506  customToolbar->addAction(editModeAction);
507 
508  return customToolbar.data();
509  }
510 
511  void
512  SkillDashboardWidget::editMode(bool edit)
513  {
514  if (edit)
515  {
516  for (const auto& button : this->deleteButtons)
517  {
518  button.second->setVisible(true);
519  }
520  for (const auto& button : this->configButtons)
521  {
522  button.second->setVisible(true);
523  }
524  ui.addButton->setVisible(true);
525  ui.reloadButton->setVisible(true);
526  ui.exportButton->setVisible(true);
527  }
528  else
529  {
530  for (const auto& button : this->deleteButtons)
531  {
532  button.second->setVisible(false);
533  }
534  for (const auto& button : this->configButtons)
535  {
536  button.second->setVisible(false);
537  }
538  ui.addButton->setVisible(false);
539  ui.reloadButton->setVisible(false);
540  ui.exportButton->setVisible(false);
541  }
542  }
543 
544  void
546  {
547  this->connected.store(false);
548  this->exampleTask.join();
549  }
550 
551  void
553  {
554  }
555 
556  QPointer<QDialog>
558  {
559  ARMARX_TRACE;
560 
561  if (not m_config_dialog)
562  {
563  m_config_dialog = new armarx::SimpleConfigDialog{parent};
564  m_config_dialog->addProxyFinder<SkillDashboardInterfacePrx>(
565  {::config_key_skilldashboard, "SkillDashboard", "*"});
566  m_config_dialog->addProxyFinder<skills::manager::dti::SkillManagerInterfacePrx>(
567  "SkillMemory", "", "SkillMem*");
568  }
569  return qobject_cast<QDialog*>(m_config_dialog);
570  }
571 
572  void
574  {
575  ARMARX_TRACE;
576  dashboardManagerName = settings
577  ->value(QString::fromStdString(::config_key_skilldashboard),
578  "SkillDashboardInterface")
579  .toString()
580  .toStdString();
581  this->skillManagerOberserverName =
582  settings->value("SkillMemory", "SkillMemory").toString().toStdString();
583  }
584 
585  void
587  {
588  ARMARX_TRACE;
589  settings->setValue(QString::fromStdString(::config_key_skilldashboard),
590  QString::fromStdString(dashboardManagerName));
591  settings->setValue("SkillMemory", QString::fromStdString(this->skillManagerOberserverName));
592  }
593 
594  void
596  {
597  ARMARX_TRACE;
598  if (m_config_dialog)
599  {
600  this->dashboardManagerName = m_config_dialog->getProxyName(::config_key_skilldashboard);
601  this->skillManagerOberserverName = m_config_dialog->getProxyName("SkillMemory");
602  }
603  }
604 
605 
606 } // namespace armarx
armarx::aron::data::dto::DictPtr
::IceInternal::Handle< Dict > DictPtr
Definition: aron_conversions.h:36
SingleTypeVariantList.h
ARMARX_IMPORTANT
#define ARMARX_IMPORTANT
Definition: Logging.h:190
armarx::SkillDashboardConfigWindow
Definition: SkillDashboardConfigWindow.h:39
armarx::aron::data::converter::AronNlohmannJSONConverter::ConvertFromNlohmannJSONObject
static data::DictPtr ConvertFromNlohmannJSONObject(const nlohmann::json &, const armarx::aron::Path &p={})
Definition: NLohmannJSONConverter.cpp:25
armarx::CMakePackageFinder
The CMakePackageFinder class provides an interface to the CMake Package finder capabilities.
Definition: CMakePackageFinder.h:52
armarx::SkillDashboardWidget::skillFinished
void skillFinished(const std::string &name)
armarx::SkillDashboardConfigWindow::getSkillConfig
QString getSkillConfig()
Definition: SkillDashboardConfigWindow.cpp:63
ARMARX_TRACE
#define ARMARX_TRACE
Definition: trace.h:77
armarx::status
status
Definition: FiniteStateMachine.h:244
armarx::SkillDashboardWidget::configured
void configured() override
This function must be implemented by the user, if he supplies a config dialog.
Definition: SkillDashboardWidgetController.cpp:595
armarx::SkillDashboardWidget::onInitComponent
void onInitComponent() override
Pure virtual hook for the subclass.
Definition: SkillDashboardWidgetController.cpp:111
LocalTimeServer.h
armarx::SkillDashboardConfigWindow::setSkillId
void setSkillId(const std::string &id)
Definition: SkillDashboardConfigWindow.cpp:75
SkillDashboardWidgetController.h
data
uint8_t data[1]
Definition: EtherCATFrame.h:68
filename
std::string filename
Definition: VisualizationRobot.cpp:86
timestamp
std::string timestamp()
Definition: CartographerAdapter.cpp:85
armarx::SkillDashboardWidget::loadButtonInit
void loadButtonInit()
armarx::SkillDashboardConfigWindow::setSkillConfig
void setSkillConfig(const std::string &config)
Definition: SkillDashboardConfigWindow.cpp:81
armarx::armem::server::ltm::util::mongodb::detail::update
bool update(mongocxx::collection &coll, const nlohmann::json &query, const nlohmann::json &update)
Definition: mongodb.cpp:68
armarx::SimpleConfigDialog::addProxyFinder
void addProxyFinder(const std::vector< EntryData > &entryData)
Definition: SimpleConfigDialog.h:103
armarx::SkillDashboardWidget::getCustomTitlebarWidget
QPointer< QWidget > getCustomTitlebarWidget(QWidget *parent) override
getTitleToolbar returns a pointer to the a toolbar widget of this controller.
Definition: SkillDashboardWidgetController.cpp:492
armarx::aron::data::DictPtr
std::shared_ptr< Dict > DictPtr
Definition: Dict.h:41
TimeUtil.h
ARMARX_INFO
#define ARMARX_INFO
Definition: Logging.h:181
armarx::ArmarXDataPath::addDataPaths
static void addDataPaths(const std::string &dataPathList)
Definition: ArmarXDataPath.cpp:554
armarx::SkillDashboardConfigWindow::setShortcutName
void setShortcutName(const std::string &name)
Definition: SkillDashboardConfigWindow.cpp:69
armarx::SkillDashboardWidget::saveSettings
void saveSettings(QSettings *settings) override
Implement to save the settings as part of the GUI configuration.
Definition: SkillDashboardWidgetController.cpp:586
DEFAULT_SETTINGS_PLUGIN_NAME
#define DEFAULT_SETTINGS_PLUGIN_NAME
Definition: PriorMemoryEditorPlugin.cpp:92
armarx::SkillDashboardWidget::onConnectComponent
void onConnectComponent() override
Pure virtual hook for the subclass.
Definition: SkillDashboardWidgetController.cpp:133
armarx::SkillDashboardWidget::getConfigDialog
QPointer< QDialog > getConfigDialog(QWidget *parent) override
getConfigDialog returns a pointer to the a configuration widget of this controller.
Definition: SkillDashboardWidgetController.cpp:557
armarx::SkillDashboardWidget::SkillDashboardWidget
SkillDashboardWidget()
Definition: SkillDashboardWidgetController.cpp:71
armarx::SkillDashboardWidget::ui
Ui::SkillDashboardWidget ui
Definition: SkillDashboardWidgetController.h:121
armarx::Logging::deactivateSpam
SpamFilterDataPtr deactivateSpam(float deactivationDurationSec=10.0f, const std::string &identifier="", bool deactivate=true) const
disables the logging for the current line for the given amount of seconds.
Definition: Logging.cpp:99
armarx::ArmarXWidgetController::getWidget
virtual QPointer< QWidget > getWidget()
getWidget returns a pointer to the a widget of this controller.
Definition: ArmarXWidgetController.cpp:54
armarx::SkillDashboardWidget::loadSettings
void loadSettings(QSettings *settings) override
Implement to load the settings that are part of the GUI configuration.
Definition: SkillDashboardWidgetController.cpp:573
armarx::getCurrentDateTime
std::string getCurrentDateTime()
Definition: SkillDashboardWidgetController.cpp:240
armarx::ArmarXDataPath::getAbsolutePath
static bool getAbsolutePath(const std::string &relativeFilename, std::string &storeAbsoluteFilename, const std::vector< std::string > &additionalSearchPaths={}, bool verbose=true)
Definition: ArmarXDataPath.cpp:109
armarx::SkillDashboardGuiPlugin::SkillDashboardGuiPlugin
SkillDashboardGuiPlugin()
Definition: SkillDashboardWidgetController.cpp:66
armarx::SkillDashboardConfigWindow::setInfoText
void setInfoText(const std::string &info)
Definition: SkillDashboardConfigWindow.cpp:87
ARMARX_WARNING
#define ARMARX_WARNING
Definition: Logging.h:193
armarx::ManagedIceObject::getProxy
Ice::ObjectPrx getProxy(long timeoutMs=0, bool waitForScheduler=true) const
Returns the proxy of this object (optionally it waits for the proxy)
Definition: ManagedIceObject.cpp:407
armarx::SkillDashboardWidget::onDisconnectComponent
void onDisconnectComponent() override
Hook for subclass.
Definition: SkillDashboardWidgetController.cpp:545
armarx::SkillDashboardConfigWindow::getSkillId
QString getSkillId()
Definition: SkillDashboardConfigWindow.cpp:57
ArmarXDataPath.h
armarx::SkillDashboardConfigWindow::shortcutNameHasChanged
void shortcutNameHasChanged()
armarx::ManagedIceObject::usingProxy
bool usingProxy(const std::string &name, const std::string &endpoints="")
Registers a proxy for retrieval after initialization and adds it to the dependency list.
Definition: ManagedIceObject.cpp:154
armarx
This file offers overloads of toIce() and fromIce() functions for STL container types.
Definition: ArmarXTimeserver.cpp:27
Application.h
armarx::SkillDashboardWidget::onExitComponent
void onExitComponent() override
Hook for subclass.
Definition: SkillDashboardWidgetController.cpp:552
armarx::SkillDashboardConfigWindow::getShortcutName
QString getShortcutName()
Definition: SkillDashboardConfigWindow.cpp:51
armarx::SimpleConfigDialog
A config-dialog containing one (or multiple) proxy finders.
Definition: SimpleConfigDialog.h:84