From 78934243c7fb73f1edada4650e5e7ba110f44e85 Mon Sep 17 00:00:00 2001 From: jean_patrick_mathes <uomnk@student.kit.edu> Date: Fri, 5 Aug 2022 16:01:10 +0200 Subject: [PATCH] Add button to start ArViz Godot when it is available --- .../ArmarXGui/ArmarXMainWindow.cpp | 60 ++++++++++++++++++- .../applications/ArmarXGui/ArmarXMainWindow.h | 5 ++ 2 files changed, 62 insertions(+), 3 deletions(-) diff --git a/source/ArmarXGui/applications/ArmarXGui/ArmarXMainWindow.cpp b/source/ArmarXGui/applications/ArmarXGui/ArmarXMainWindow.cpp index 8ca9b2fa..c78239e6 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 0feb70b8..64a351bd 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 */ -- GitLab