diff --git a/source/ArmarXGui/applications/ArmarXGui/ArmarXMainWindow.cpp b/source/ArmarXGui/applications/ArmarXGui/ArmarXMainWindow.cpp index 8ca9b2fa87bd2b448bc97f53ae26122c6feb34a4..c78239e60a30b0e1754958d40c02f136e7017853 100644 --- a/source/ArmarXGui/applications/ArmarXGui/ArmarXMainWindow.cpp +++ b/source/ArmarXGui/applications/ArmarXGui/ArmarXMainWindow.cpp @@ -98,6 +98,8 @@ #include <sstream> //#include <omp.h> +// To start ArViz Godot +#include <fcntl.h> #define ARMARX_ORGANIZATION "KIT" @@ -1217,6 +1219,9 @@ namespace armarx connect(action, SIGNAL(clicked(QString, QString)), this, SLOT(createArmarXWidget(QString, QString)), Qt::UniqueConnection); } + + addArVizGodotIcon(); + AddArmarXWidgetAction* completerAction = new AddArmarXWidgetAction("", ui->menuAdd_Widget, this); InfixCompleter* completer = new InfixCompleter(widgetNameList, searchField); connect(searchField, SIGNAL(textEdited(QString)), completer, SLOT(setCompletionInfix(QString))); @@ -1281,9 +1286,60 @@ namespace armarx } } - void ArmarXMainWindow::updateRecentlyOpenedFileList() + void ArmarXMainWindow::addArVizGodotIcon() { + const char* path = std::getenv("arviz_godot_DIR"); + if (path == nullptr) + { + return; + } + + std::filesystem::path buildDirectory(path); + std::filesystem::path mainDirectory = buildDirectory.parent_path(); + + std::filesystem::path binaryPath = buildDirectory / "bin" / "arviz-godot"; + std::filesystem::path iconPath = mainDirectory / "source" / "arviz_godot" / "project" / "icon.png"; + + if (not std::filesystem::exists(binaryPath) or not std::filesystem::exists(iconPath)) + { + return; + } + + QIcon icon(iconPath.c_str()); + QString name("ArViz Godot"); + + QAction* action = new QAction(icon, name, this); + + bool allowText = false; + addActionToToolBar(action, allowText); + + auto slot = [action, this, binaryPath]() + { + pid_t pid = fork(); + if (pid == -1) + { + ARMARX_ERROR << "Failed to start ArViz Godot"; + return; + } + + if (pid != 0) + { + return; + } + + int null = open("/dev/null", O_WRONLY); + dup2(null, STDOUT_FILENO); + dup2(null, STDERR_FILENO); + + execl(binaryPath.c_str(), "arviz-godot", nullptr); + }; + + connect(action, &QAction::triggered, this, slot, Qt::UniqueConnection); + } + + void ArmarXMainWindow::updateRecentlyOpenedFileList() + { QStringList recentlyFiles = mainSettings.value("RecentlyFiles").toStringList(); QMenu* menu = ui->menuRecently_Opened_Files; auto actions = menu->actions(); @@ -1304,8 +1360,6 @@ namespace armarx connect(action, SIGNAL(triggered()), action, SLOT(openFile())); menu->addAction(action); } - - } void ArmarXMainWindow::updateStatusOfOpenWidgets() diff --git a/source/ArmarXGui/applications/ArmarXGui/ArmarXMainWindow.h b/source/ArmarXGui/applications/ArmarXGui/ArmarXMainWindow.h index 0feb70b88cab1dc0d6c87f43d3bb4cdac40dce7e..64a351bdefc747a6daa6e2bff554793acefd6be1 100644 --- a/source/ArmarXGui/applications/ArmarXGui/ArmarXMainWindow.h +++ b/source/ArmarXGui/applications/ArmarXGui/ArmarXMainWindow.h @@ -186,6 +186,11 @@ namespace armarx void updateAvailableWidgetList(); void updateOpenWidgetList(); + /** + * Add the (optional) icon button to start ArViz Godot to the main widgets if ArViz Godot is available. + */ + void addArVizGodotIcon(); + /** * sets a SoQtExamine rViewer up. This ExaminerViewer is contained by the class member QWidget* view */