25 #include <QCoreApplication>
27 #include <QProgressDialog>
31 #include <SimoxUtility/algorithm/string/string_tools.h>
44 using namespace Controller;
45 using namespace Data_Structure;
46 using namespace Parser;
50 executor(new Executor(
51 stopStrategyFactory.getStopStrategy(StopperFactory::getFactory()->getPidStopper()),
52 StarterFactory::getFactory()->getStarter())),
53 applicationController(packages, executor),
54 detailedApplicationController(executor),
55 scenarioListController(packages, executor),
56 settingsController(packages, executor),
57 openScenarioController(packages, executor),
61 editModeAction =
new QAction(
"Edit Mode",
this);
63 QSettings q_settings(QString(settingsFile.c_str()), QSettings::NativeFormat);
64 bool editModeState = q_settings.value(
"editMode",
false).toBool();
73 ScenarioManagerWidgetController::isPackageAutoDiscoveryEnabled()
75 const std::string autodiscoverPropertyName =
"AutodiscoverPackages";
79 return getProperty<bool>(autodiscoverPropertyName).getValue();
82 ARMARX_INFO << autodiscoverPropertyName +
" property not found";
88 ScenarioManagerWidgetController::autoDiscoverArmarXPackages()
90 QSettings autosettings(QString(settingsFile.c_str()), QSettings::NativeFormat);
94 std::sort(packagesStd.begin(),
96 [](
const std::string& lhs,
const std::string& rhs) ->
bool
97 { return simox::alg::to_lower(lhs) < simox::alg::to_lower(rhs); });
100 ARMARX_INFO <<
"Discovered the following ArmarX packages: ";
101 for (
const auto& pkg : packagesStd)
103 packages.push_back(QString::fromStdString(pkg));
107 autosettings.setValue(
"packages", packages);
113 QSettings autosettings(QString(settingsFile.c_str()), QSettings::NativeFormat);
114 QStringList scenarios = settings->value(
"scenarios", QStringList()).toStringList();
115 scenarios.removeDuplicates();
116 if (not scenarios.empty())
118 autosettings.setValue(
"scenarios", scenarios);
120 QStringList packages = settings->value(
"packages", QStringList()).toStringList();
121 packages.removeDuplicates();
122 if (not packages.empty())
124 autosettings.setValue(
"packages", packages);
131 QSettings autosettings(QString(settingsFile.c_str()), QSettings::NativeFormat);
132 auto scenarios = autosettings.value(
"scenarios", QStringList()).toStringList();
133 auto packages = autosettings.value(
"packages", QStringList()).toStringList();
134 scenarios.removeDuplicates();
135 packages.removeDuplicates();
136 settings->setValue(
"scenarios", scenarios);
137 settings->setValue(
"packages", packages);
143 QMetaObject::invokeMethod(
this,
"init", Qt::QueuedConnection);
147 ScenarioManagerWidgetController::init()
155 QObject::connect(widget.scenarioView,
156 SIGNAL(createScenario()),
157 &scenarioListController,
158 SLOT(createScenario()));
161 widget.scenarioView, SIGNAL(createScenario()), widget.applicationDatabase, SLOT(show()));
163 QObject::connect(widget.scenarioView,
164 SIGNAL(removeItem(QModelIndex)),
165 &scenarioListController,
166 SLOT(removeItem(QModelIndex)));
168 QObject::connect(widget.scenarioView,
169 SIGNAL(itemClicked(QModelIndex)),
170 &scenarioListController,
171 SLOT(showApplication(QModelIndex)));
173 QObject::connect(widget.scenarioView,
174 SIGNAL(startApplication(
int,
int, QModelIndex)),
175 &scenarioListController,
176 SLOT(start(
int,
int, QModelIndex)));
178 QObject::connect(widget.scenarioView,
179 SIGNAL(stopApplication(
int,
int, QModelIndex)),
180 &scenarioListController,
181 SLOT(stop(
int,
int, QModelIndex)));
183 QObject::connect(widget.scenarioView,
184 SIGNAL(restartApplication(
int,
int, QModelIndex)),
185 &scenarioListController,
186 SLOT(restart(
int,
int, QModelIndex)));
188 QObject::connect(&settingsController, SIGNAL(packageRemoved()),
this, SLOT(
updateModels()));
190 QObject::connect(&settingsController,
191 SIGNAL(packageAdded(std::string)),
195 QObject::connect(&scenarioListController, SIGNAL(updated()),
this, SLOT(
updateModels()));
198 &scenarioListController,
200 &detailedApplicationController,
203 QObject::connect(&scenarioListController,
205 &detailedApplicationController,
208 QObject::connect(&scenarioListController,
209 SIGNAL(statusUpdated()),
210 widget.detailedApplicationView,
211 SLOT(updateStatus()));
213 QObject::connect(widget.applicationDatabase,
214 SIGNAL(openSettings()),
216 SLOT(showSettings()));
218 QObject::connect(widget.applicationDatabase,
219 SIGNAL(itemClicked(QModelIndex)),
220 &applicationController,
221 SLOT(on_itemClicked(QModelIndex)));
223 QObject::connect(&applicationController,
225 &detailedApplicationController,
228 QObject::connect(&applicationController,
230 &detailedApplicationController,
233 QObject::connect(&openScenarioController, SIGNAL(updated()),
this, SLOT(
updateModels()));
235 QObject::connect(widget.scenarioView,
236 SIGNAL(showOpenDialog()),
237 &openScenarioController,
238 SLOT(showOpenScenarioView()));
240 QObject::connect(widget.detailedApplicationView,
241 SIGNAL(startButtonClicked()),
242 &detailedApplicationController,
245 QObject::connect(widget.detailedApplicationView,
246 SIGNAL(stopButtonClicked()),
247 &detailedApplicationController,
250 QObject::connect(widget.detailedApplicationView,
251 SIGNAL(restartButtonClicked()),
252 &detailedApplicationController,
255 QObject::connect(widget.detailedApplicationView,
256 SIGNAL(toolButtonClicked()),
257 &detailedApplicationController,
258 SLOT(showInStandardEditor()));
260 QObject::connect(widget.detailedApplicationView,
261 SIGNAL(addParameterButtonClicked()),
262 &detailedApplicationController,
263 SLOT(showPropertyAddView()));
265 QObject::connect(widget.detailedApplicationView,
266 SIGNAL(addIceEnvButtonClicked()),
267 &detailedApplicationController,
268 SLOT(showIceEnvVariableAddView()));
271 QObject::connect(widget.detailedApplicationView,
272 SIGNAL(applicationEnabledChange(
bool)),
273 &scenarioListController,
274 SLOT(updateModel()));
276 QObject::connect(&openScenarioController,
277 SIGNAL(showPackageDialog()),
279 SLOT(showPackageAdderView()));
281 QObject::connect(widget.detailedApplicationView,
283 &scenarioListController,
286 QObject::connect(&applicationController,
288 widget.applicationDatabase,
291 if (isPackageAutoDiscoveryEnabled())
294 autoDiscoverArmarXPackages();
297 widget.scenarioView->setModel(scenarioListController.
getTreeModel());
299 connect(editModeAction, SIGNAL(toggled(
bool)),
this, SLOT(
editMode(
bool)));
301 editModeAction->setCheckable(
true);
302 editModeAction->setToolTip(
303 "If toggled the application database and the application property view will be shown.");
305 QSettings settings(QString(settingsFile.c_str()), QSettings::NativeFormat);
306 QStringList packages = settings.value(
"packages").toStringList();
307 packages.removeDuplicates();
309 if (packages.empty())
312 if (application.get() !=
nullptr)
314 for (
const auto& package : application->getArmarXPackageNames())
316 packages << QString::fromStdString(package);
319 settings.setValue(
"packages", packages);
322 bool editModeState = settings.value(
"editMode",
false).toBool();
323 editModeAction->setChecked(editModeState);
326 settingsController.
init();
336 if (parent != customToolbar->parent())
338 customToolbar->setParent(parent);
341 return customToolbar.data();
344 customToolbar =
new QToolBar(parent);
345 customToolbar->setIconSize(QSize(16, 16));
346 customToolbar->addAction(
347 QIcon(
":/icons/configure-3.png"),
"Configure", &settingsController, SLOT(showSettings()));
348 QToolTip::showText(customToolbar->mapToGlobal(QPoint(0, 0)),
349 "Additional Packages can be opened in the settings");
350 customToolbar->addAction(editModeAction);
352 QAction* killallAction =
new QAction(
"Kill All",
this);
353 customToolbar->addAction(killallAction);
354 killallAction->setToolTip(
355 "Kill all armarx applications except guis on this pc (executes 'armarx killAll')");
356 connect(killallAction,
358 [] { [[maybe_unused]]
auto result = std::system(
"armarx killAll"); });
360 return customToolbar.data();
377 QSettings settings(QString(settingsFile.c_str()), QSettings::NativeFormat);
378 QStringList packages = settings.value(
"packages").toStringList();
379 packages.removeDuplicates();
381 QProgressDialog progress(
"Loading scenarios from " + QString::number(packages.size()) +
387 progress.setWindowModality(Qt::WindowModal);
390 bool didNotFindSomePackages =
false;
391 for (
int i = 0; i < packages.size(); i++)
393 std::string name = packages.at(i).toStdString();
394 progress.setLabelText(QString(
"Loading scenarios from package ") + name.c_str());
395 progress.setValue(i + 1);
396 qApp->processEvents();
398 QStringList openedScenarios = settings.value(
"scenarios").toStringList();
400 openedScenarios = openedScenarios.toSet().values();
403 for (
const QString& it : openedScenarios)
405 openedList.push_back(it.toStdString());
408 PackagePtr package = parser.parsePackage(name, openedList);
409 if (package ==
nullptr)
411 didNotFindSomePackages =
true;
415 this->packages->push_back(package);
418 if (didNotFindSomePackages)
420 std::stringstream ss;
421 ss <<
"To remove unavailable packages, "
422 <<
"open the configuration (wrench icon at the top of the ScenarioManager), "
423 <<
"switch to the 'Cache Settings' tab, "
424 <<
"and press 'Close unavailable packages'. Cheers!";
435 PackagePtr package = parser.parsePackage(name, StringList());
437 this->packages->push_back(package);
449 widget.detailedApplicationView->updateStatus();
458 QSettings settings(QString(settingsFile.c_str()), QSettings::NativeFormat);
459 settings.setValue(
"editMode", edit);
460 widget.detailedApplicationView->setVisible(edit);
461 widget.applicationDatabase->setVisible(edit);