25#include <QCoreApplication>
27#include <QProgressDialog>
31#include <SimoxUtility/algorithm/string/string_tools.h>
51 stopStrategyFactory.getStopStrategy(
StopperFactory::getFactory()->getPidStopper()),
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();
73ScenarioManagerWidgetController::isPackageAutoDiscoveryEnabled()
75 const std::string autodiscoverPropertyName =
"AutodiscoverPackages";
82 ARMARX_INFO << autodiscoverPropertyName +
" property not found";
88ScenarioManagerWidgetController::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);
147ScenarioManagerWidgetController::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();
371 scenarioListController.stopUpdateTask();
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);
445 settingsController.updateModel();
446 openScenarioController.updateModel();
447 scenarioListController.updateModel();
448 applicationController.updatePackages();
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);
TreeItem representing data contained in a Scenario or an Application.
void setDetailedApplicationView(DetailedApplicationView *ptr)
Sets the view this controller manages.
void setIceAdmin(IceGrid::AdminPrx iceAdmin)
Set an IceAdmin for the controller.
void setIceAdmin(IceGrid::AdminPrx iceAdmin)
Set an IceAdmin for the controller.
FilterableTreeModelSortFilterProxyModelPtr getTreeModel()
Returns the model used by the ScenarioListView and managed by this controller.
Starts, stops and restarts applications and scenarios.
Abstract base class for factory classes that create ApplicationStarter.
Abstract base class for factory classes that create ApplicationStopper.
static ApplicationPtr getInstance()
Retrieve shared pointer to the application object.
The ArmarXDataPath class provides static methods to handle ArmarX data directories.
static std::vector< std::string > FindAllArmarXSourcePackages()
Property< PropertyType > getProperty(const std::string &name)
IceManagerPtr getIceManager() const
Returns the IceManager.
ArmarXManagerPtr getArmarXManager() const
Returns the ArmarX manager used to add and remove components.
bool hasProperty(const std::string &name)
std::shared_ptr< FilterableTreeModelSortFilterProxyModel > FilterableTreeModelSortFilterProxyModelPtr
#define ARMARX_INFO
The normal logging level.
#define ARMARX_IMPORTANT
The logging level for always important information, but expected behaviour (in contrast to ARMARX_WAR...
std::shared_ptr< Scenario > ScenarioPtr
std::shared_ptr< Application > ApplicationPtr
std::shared_ptr< Package > PackagePtr
std::shared_ptr< ApplicationInstance > ApplicationInstancePtr
std::vector< std::string > StringList
This file offers overloads of toIce() and fromIce() functions for STL container types.
IceUtil::Handle< Application > ApplicationPtr