25 #include <QCoreApplication>
27 #include <QProgressDialog>
38 #include <SimoxUtility/algorithm/string/string_tools.h>
43 using namespace Controller;
44 using namespace Data_Structure;
45 using namespace Parser;
49 executor(new Executor(
50 stopStrategyFactory.getStopStrategy(StopperFactory::getFactory()->getPidStopper()),
51 StarterFactory::getFactory()->getStarter())),
52 applicationController(packages, executor),
53 detailedApplicationController(executor),
54 scenarioListController(packages, executor),
55 settingsController(packages, executor),
56 openScenarioController(packages, executor),
60 editModeAction =
new QAction(
"Edit Mode",
this);
62 QSettings q_settings(QString(settingsFile.c_str()), QSettings::NativeFormat);
63 bool editModeState = q_settings.value(
"editMode",
false).toBool();
71 bool ScenarioManagerWidgetController::isPackageAutoDiscoveryEnabled()
75 return getProperty<bool>(
"AutodiscoverPackages").getValue();
83 void ScenarioManagerWidgetController::autoDiscoverArmarXPackages()
85 QSettings autosettings(QString(settingsFile.c_str()), QSettings::NativeFormat);
89 std::sort(packagesStd.begin(), packagesStd.end(),
90 [](
const std::string& lhs,
const std::string& rhs) ->
bool {
91 return simox::alg::to_lower(lhs) < simox::alg::to_lower(rhs);
95 ARMARX_INFO <<
"Discovered the following ArmarX packages: ";
96 for(
const auto& pkg : packagesStd)
98 packages.push_back(QString::fromStdString(pkg));
102 autosettings.setValue(
"packages", packages);
107 QSettings autosettings(QString(settingsFile.c_str()), QSettings::NativeFormat);
108 QStringList scenarios = settings->value(
"scenarios", QStringList()).toStringList();
109 scenarios.removeDuplicates();
110 if (not scenarios.empty())
112 autosettings.setValue(
"scenarios", scenarios);
114 QStringList packages = settings->value(
"packages", QStringList()).toStringList();
115 packages.removeDuplicates();
116 if (not packages.empty())
118 autosettings.setValue(
"packages", packages);
125 QSettings autosettings(QString(settingsFile.c_str()), QSettings::NativeFormat);
126 auto scenarios = autosettings.value(
"scenarios", QStringList()).toStringList();
127 auto packages = autosettings.value(
"packages", QStringList()).toStringList();
128 scenarios.removeDuplicates();
129 packages.removeDuplicates();
130 settings->setValue(
"scenarios", scenarios);
131 settings->setValue(
"packages", packages);
137 QMetaObject::invokeMethod(
this,
"init", Qt::QueuedConnection);
141 ScenarioManagerWidgetController::init()
149 QObject::connect(widget.scenarioView,
150 SIGNAL(createScenario()),
151 &scenarioListController,
152 SLOT(createScenario()));
155 widget.scenarioView, SIGNAL(createScenario()), widget.applicationDatabase, SLOT(show()));
157 QObject::connect(widget.scenarioView,
158 SIGNAL(removeItem(QModelIndex)),
159 &scenarioListController,
160 SLOT(removeItem(QModelIndex)));
162 QObject::connect(widget.scenarioView,
163 SIGNAL(itemClicked(QModelIndex)),
164 &scenarioListController,
165 SLOT(showApplication(QModelIndex)));
167 QObject::connect(widget.scenarioView,
169 &scenarioListController,
172 QObject::connect(widget.scenarioView,
173 SIGNAL(stopApplication(
int,
int, QModelIndex)),
174 &scenarioListController,
175 SLOT(stop(
int,
int, QModelIndex)));
177 QObject::connect(widget.scenarioView,
178 SIGNAL(restartApplication(
int,
int, QModelIndex)),
179 &scenarioListController,
180 SLOT(restart(
int,
int, QModelIndex)));
182 QObject::connect(&settingsController, SIGNAL(packageRemoved()),
this, SLOT(
updateModels()));
184 QObject::connect(&settingsController,
185 SIGNAL(packageAdded(std::string)),
189 QObject::connect(&scenarioListController, SIGNAL(updated()),
this, SLOT(
updateModels()));
192 &scenarioListController,
194 &detailedApplicationController,
197 QObject::connect(&scenarioListController,
199 &detailedApplicationController,
202 QObject::connect(&scenarioListController,
203 SIGNAL(statusUpdated()),
204 widget.detailedApplicationView,
205 SLOT(updateStatus()));
207 QObject::connect(widget.applicationDatabase,
208 SIGNAL(openSettings()),
210 SLOT(showSettings()));
212 QObject::connect(widget.applicationDatabase,
213 SIGNAL(itemClicked(QModelIndex)),
214 &applicationController,
215 SLOT(on_itemClicked(QModelIndex)));
217 QObject::connect(&applicationController,
219 &detailedApplicationController,
222 QObject::connect(&applicationController,
224 &detailedApplicationController,
227 QObject::connect(&openScenarioController, SIGNAL(updated()),
this, SLOT(
updateModels()));
229 QObject::connect(widget.scenarioView,
230 SIGNAL(showOpenDialog()),
231 &openScenarioController,
232 SLOT(showOpenScenarioView()));
234 QObject::connect(widget.detailedApplicationView,
235 SIGNAL(startButtonClicked()),
236 &detailedApplicationController,
239 QObject::connect(widget.detailedApplicationView,
240 SIGNAL(stopButtonClicked()),
241 &detailedApplicationController,
244 QObject::connect(widget.detailedApplicationView,
245 SIGNAL(restartButtonClicked()),
246 &detailedApplicationController,
249 QObject::connect(widget.detailedApplicationView,
250 SIGNAL(toolButtonClicked()),
251 &detailedApplicationController,
252 SLOT(showInStandardEditor()));
254 QObject::connect(widget.detailedApplicationView,
255 SIGNAL(addParameterButtonClicked()),
256 &detailedApplicationController,
257 SLOT(showPropertyAddView()));
259 QObject::connect(widget.detailedApplicationView,
260 SIGNAL(addIceEnvButtonClicked()),
261 &detailedApplicationController,
262 SLOT(showIceEnvVariableAddView()));
265 QObject::connect(widget.detailedApplicationView,
266 SIGNAL(applicationEnabledChange(
bool)),
267 &scenarioListController,
268 SLOT(updateModel()));
270 QObject::connect(&openScenarioController,
271 SIGNAL(showPackageDialog()),
273 SLOT(showPackageAdderView()));
275 QObject::connect(widget.detailedApplicationView,
277 &scenarioListController,
280 QObject::connect(&applicationController,
282 widget.applicationDatabase,
285 if(isPackageAutoDiscoveryEnabled())
288 autoDiscoverArmarXPackages();
291 widget.scenarioView->setModel(scenarioListController.
getTreeModel());
293 connect(editModeAction, SIGNAL(toggled(
bool)),
this, SLOT(
editMode(
bool)));
295 editModeAction->setCheckable(
true);
296 editModeAction->setToolTip(
297 "If toggled the application database and the application property view will be shown.");
299 QSettings settings(QString(settingsFile.c_str()), QSettings::NativeFormat);
300 QStringList packages = settings.value(
"packages").toStringList();
301 packages.removeDuplicates();
303 if (packages.empty())
306 if (application.get() !=
nullptr)
308 for (
const auto& package : application->getArmarXPackageNames())
310 packages << QString::fromStdString(package);
313 settings.setValue(
"packages", packages);
316 bool editModeState = settings.value(
"editMode",
false).toBool();
317 editModeAction->setChecked(editModeState);
320 settingsController.
init();
330 if (parent != customToolbar->parent())
332 customToolbar->setParent(parent);
335 return customToolbar.data();
338 customToolbar =
new QToolBar(parent);
339 customToolbar->setIconSize(QSize(16, 16));
340 customToolbar->addAction(
341 QIcon(
":/icons/configure-3.png"),
"Configure", &settingsController, SLOT(showSettings()));
342 QToolTip::showText(customToolbar->mapToGlobal(QPoint(0, 0)),
343 "Additional Packages can be opened in the settings");
344 customToolbar->addAction(editModeAction);
346 QAction* killallAction =
new QAction(
"Kill All",
this);
347 customToolbar->addAction(killallAction);
348 killallAction->setToolTip(
349 "Kill all armarx applications except guis on this pc (executes 'armarx killAll')");
350 connect(killallAction,
352 [] { [[maybe_unused]]
auto result = std::system(
"armarx killAll"); });
354 return customToolbar.data();
371 QSettings settings(QString(settingsFile.c_str()), QSettings::NativeFormat);
372 QStringList packages = settings.value(
"packages").toStringList();
373 packages.removeDuplicates();
375 QProgressDialog progress(
"Loading scenarios from " + QString::number(packages.size()) +
381 progress.setWindowModality(Qt::WindowModal);
384 bool didNotFindSomePackages =
false;
385 for (
int i = 0; i < packages.size(); i++)
387 std::string name = packages.at(i).toStdString();
388 progress.setLabelText(QString(
"Loading scenarios from package ") + name.c_str());
389 progress.setValue(i + 1);
390 qApp->processEvents();
392 QStringList openedScenarios = settings.value(
"scenarios").toStringList();
394 openedScenarios = openedScenarios.toSet().toList();
397 for (
const QString& it : openedScenarios)
399 openedList.push_back(it.toStdString());
402 PackagePtr package = parser.parsePackage(name, openedList);
403 if (package ==
nullptr)
405 didNotFindSomePackages =
true;
409 for (
const auto& scenario : *package->getScenarios())
414 executor->setStarter(
415 StarterFactory::getFactory()->getIceStarter(
418 executor->setStopStrategy(
419 stopStrategyFactory.getKillStrategy(StopperFactory::getFactory()->getIceStopper(
425 this->packages->push_back(package);
428 if (didNotFindSomePackages)
430 std::stringstream ss;
431 ss <<
"To remove unavailable packages, "
432 <<
"open the configuration (wrench icon at the top of the ScenarioManager), "
433 <<
"switch to the 'Cache Settings' tab, "
434 <<
"and press 'Close unavailable packages'. Cheers!";
445 PackagePtr package = parser.parsePackage(name, StringList());
447 this->packages->push_back(package);
459 widget.detailedApplicationView->updateStatus();
468 QSettings settings(QString(settingsFile.c_str()), QSettings::NativeFormat);
469 settings.setValue(
"editMode", edit);
470 widget.detailedApplicationView->setVisible(edit);
471 widget.applicationDatabase->setVisible(edit);