ScenarioManagerWidgetController.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of ArmarX.
3  *
4  * ArmarX is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  *
8  * ArmarX is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  *
16  * @package ScenarioManager::gui-plugins::ScenarioManagerWidgetController
17  * @author [Cedric Seehausen] ( [usdnr@student.kit.edu] )
18  * @date 2016
19  * @copyright http://www.gnu.org/licenses/gpl.txt
20  * GNU General Public License
21  */
22 
24 
25 #include <QCoreApplication>
26 #include <QMetaType>
27 #include <QProgressDialog>
28 #include <QToolBar>
29 #include <QToolTip>
30 
34 
36 
37 #include "gui/namelocationview.h"
38 #include <SimoxUtility/algorithm/string/string_tools.h>
39 
40 using namespace armarx;
41 using namespace ScenarioManager;
42 using namespace Exec;
43 using namespace Controller;
44 using namespace Data_Structure;
45 using namespace Parser;
46 
48  packages(new std::vector<PackagePtr>()),
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),
57  settingsFile(armarx::ArmarXDataPath::GetDefaultUserConfigPath() + "/ScenarioManager.conf")
58 {
59  widget.setupUi(getWidget());
60  editModeAction = new QAction("Edit Mode", this);
61 
62  QSettings q_settings(QString(settingsFile.c_str()), QSettings::NativeFormat);
63  bool editModeState = q_settings.value("editMode", false).toBool();
64  editMode(editModeState);
65 }
66 
68 {
69 }
70 
71 bool ScenarioManagerWidgetController::isPackageAutoDiscoveryEnabled()
72 {
73  if(hasProperty("AutodiscoverPackages"))
74  {
75  return getProperty<bool>("AutodiscoverPackages").getValue();
76  }
77  ARMARX_WARNING << "AutodiscoverPackages property not found";
78 
79  return false; // Property not available. Default: don't use autodiscovery
80 }
81 
82 
83 void ScenarioManagerWidgetController::autoDiscoverArmarXPackages()
84 {
85  QSettings autosettings(QString(settingsFile.c_str()), QSettings::NativeFormat);
86 
87 
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);
92  });
93 
94  QStringList packages;
95  ARMARX_INFO << "Discovered the following ArmarX packages: ";
96  for(const auto& pkg : packagesStd)
97  {
98  packages.push_back(QString::fromStdString(pkg));
99  ARMARX_INFO << "- " << pkg;
100  }
101 
102  autosettings.setValue("packages", packages);
103 }
104 void
106 {
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())
111  {
112  autosettings.setValue("scenarios", scenarios);
113  }
114  QStringList packages = settings->value("packages", QStringList()).toStringList();
115  packages.removeDuplicates();
116  if (not packages.empty())
117  {
118  autosettings.setValue("packages", packages);
119  }
120 }
121 
122 void
124 {
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);
132 }
133 
134 
136 {
137  QMetaObject::invokeMethod(this, "init", Qt::QueuedConnection);
138 }
139 
140 void
141 ScenarioManagerWidgetController::init()
142 {
143  scenarioListController.setIceAdmin(
144  getArmarXManager()->getIceManager()->getIceGridSession()->getAdmin());
145  detailedApplicationController.setIceAdmin(
146  getArmarXManager()->getIceManager()->getIceGridSession()->getAdmin());
147  detailedApplicationController.setDetailedApplicationView(widget.detailedApplicationView);
148 
149  QObject::connect(widget.scenarioView,
150  SIGNAL(createScenario()),
151  &scenarioListController,
152  SLOT(createScenario()));
153 
154  QObject::connect(
155  widget.scenarioView, SIGNAL(createScenario()), widget.applicationDatabase, SLOT(show()));
156 
157  QObject::connect(widget.scenarioView,
158  SIGNAL(removeItem(QModelIndex)),
159  &scenarioListController,
160  SLOT(removeItem(QModelIndex)));
161 
162  QObject::connect(widget.scenarioView,
163  SIGNAL(itemClicked(QModelIndex)),
164  &scenarioListController,
165  SLOT(showApplication(QModelIndex)));
166 
167  QObject::connect(widget.scenarioView,
168  SIGNAL(startApplication(int, int, QModelIndex, ScenarioStartModes)),
169  &scenarioListController,
170  SLOT(start(int, int, QModelIndex, ScenarioStartModes)));
171 
172  QObject::connect(widget.scenarioView,
173  SIGNAL(stopApplication(int, int, QModelIndex)),
174  &scenarioListController,
175  SLOT(stop(int, int, QModelIndex)));
176 
177  QObject::connect(widget.scenarioView,
178  SIGNAL(restartApplication(int, int, QModelIndex)),
179  &scenarioListController,
180  SLOT(restart(int, int, QModelIndex)));
181 
182  QObject::connect(&settingsController, SIGNAL(packageRemoved()), this, SLOT(updateModels()));
183 
184  QObject::connect(&settingsController,
185  SIGNAL(packageAdded(std::string)),
186  this,
187  SLOT(reparsePackage(std::string)));
188 
189  QObject::connect(&scenarioListController, SIGNAL(updated()), this, SLOT(updateModels()));
190 
191  QObject::connect(
192  &scenarioListController,
193  SIGNAL(applicationInstanceClicked(Data_Structure::ApplicationInstancePtr, ScenarioItem*)),
194  &detailedApplicationController,
195  SLOT(showApplicationInstance(Data_Structure::ApplicationInstancePtr, ScenarioItem*)));
196 
197  QObject::connect(&scenarioListController,
198  SIGNAL(scenarioClicked(Data_Structure::ScenarioPtr)),
199  &detailedApplicationController,
200  SLOT(showScenario(Data_Structure::ScenarioPtr)));
201 
202  QObject::connect(&scenarioListController,
203  SIGNAL(statusUpdated()),
204  widget.detailedApplicationView,
205  SLOT(updateStatus()));
206 
207  QObject::connect(widget.applicationDatabase,
208  SIGNAL(openSettings()),
209  &settingsController,
210  SLOT(showSettings()));
211 
212  QObject::connect(widget.applicationDatabase,
213  SIGNAL(itemClicked(QModelIndex)),
214  &applicationController,
215  SLOT(on_itemClicked(QModelIndex)));
216 
217  QObject::connect(&applicationController,
218  SIGNAL(applicationClicked(Data_Structure::ApplicationPtr)),
219  &detailedApplicationController,
220  SLOT(showApplication(Data_Structure::ApplicationPtr)));
221 
222  QObject::connect(&applicationController,
223  SIGNAL(packageClicked(Data_Structure::PackagePtr)),
224  &detailedApplicationController,
225  SLOT(showPackage(Data_Structure::PackagePtr)));
226 
227  QObject::connect(&openScenarioController, SIGNAL(updated()), this, SLOT(updateModels()));
228 
229  QObject::connect(widget.scenarioView,
230  SIGNAL(showOpenDialog()),
231  &openScenarioController,
232  SLOT(showOpenScenarioView()));
233 
234  QObject::connect(widget.detailedApplicationView,
235  SIGNAL(startButtonClicked()),
236  &detailedApplicationController,
237  SLOT(start()));
238 
239  QObject::connect(widget.detailedApplicationView,
240  SIGNAL(stopButtonClicked()),
241  &detailedApplicationController,
242  SLOT(stop()));
243 
244  QObject::connect(widget.detailedApplicationView,
245  SIGNAL(restartButtonClicked()),
246  &detailedApplicationController,
247  SLOT(save()));
248 
249  QObject::connect(widget.detailedApplicationView,
250  SIGNAL(toolButtonClicked()),
251  &detailedApplicationController,
252  SLOT(showInStandardEditor()));
253 
254  QObject::connect(widget.detailedApplicationView,
255  SIGNAL(addParameterButtonClicked()),
256  &detailedApplicationController,
257  SLOT(showPropertyAddView()));
258 
259  QObject::connect(widget.detailedApplicationView,
260  SIGNAL(addIceEnvButtonClicked()),
261  &detailedApplicationController,
262  SLOT(showIceEnvVariableAddView()));
263 
264 
265  QObject::connect(widget.detailedApplicationView,
266  SIGNAL(applicationEnabledChange(bool)),
267  &scenarioListController,
268  SLOT(updateModel()));
269 
270  QObject::connect(&openScenarioController,
271  SIGNAL(showPackageDialog()),
272  &settingsController,
273  SLOT(showPackageAdderView()));
274 
275  QObject::connect(widget.detailedApplicationView,
277  &scenarioListController,
279 
280  QObject::connect(&applicationController,
281  SIGNAL(modelUpdated(FilterableTreeModelSortFilterProxyModelPtr)),
282  widget.applicationDatabase,
284 
285  if(isPackageAutoDiscoveryEnabled())
286  {
287  ARMARX_IMPORTANT << "ArmarX package autodiscovery enabled.";
288  autoDiscoverArmarXPackages();
289  }
290 
291  widget.scenarioView->setModel(scenarioListController.getTreeModel());
292 
293  connect(editModeAction, SIGNAL(toggled(bool)), this, SLOT(editMode(bool)));
294 
295  editModeAction->setCheckable(true);
296  editModeAction->setToolTip(
297  "If toggled the application database and the application property view will be shown.");
298 
299  QSettings settings(QString(settingsFile.c_str()), QSettings::NativeFormat);
300  QStringList packages = settings.value("packages").toStringList();
301  packages.removeDuplicates();
302 
303  if (packages.empty())
304  {
306  if (application.get() != nullptr)
307  {
308  for (const auto& package : application->getArmarXPackageNames())
309  {
310  packages << QString::fromStdString(package);
311  }
312  }
313  settings.setValue("packages", packages);
314  }
315 
316  bool editModeState = settings.value("editMode", false).toBool();
317  editModeAction->setChecked(editModeState);
318  editMode(editModeState);
319 
320  settingsController.init();
321 
322  reparsePackages();
323 }
324 
325 QPointer<QWidget>
327 {
328  if (customToolbar)
329  {
330  if (parent != customToolbar->parent())
331  {
332  customToolbar->setParent(parent);
333  }
334 
335  return customToolbar.data();
336  }
337 
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);
345  {
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,
351  &QAction::triggered,
352  [] { [[maybe_unused]] auto result = std::system("armarx killAll"); });
353  }
354  return customToolbar.data();
355 }
356 
357 void
359 {
360 }
361 
362 void
364 {
365  scenarioListController.stopUpdateTask();
366 }
367 
368 void
370 {
371  QSettings settings(QString(settingsFile.c_str()), QSettings::NativeFormat);
372  QStringList packages = settings.value("packages").toStringList();
373  packages.removeDuplicates();
374 
375  QProgressDialog progress("Loading scenarios from " + QString::number(packages.size()) +
376  " packages ...",
377  "",
378  0,
379  packages.size(),
380  getWidget());
381  progress.setWindowModality(Qt::WindowModal);
382 
383  PackageBuilder parser;
384  bool didNotFindSomePackages = false;
385  for (int i = 0; i < packages.size(); i++)
386  {
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();
391 
392  QStringList openedScenarios = settings.value("scenarios").toStringList();
393  // remove duplicates
394  openedScenarios = openedScenarios.toSet().toList();
395 
396  StringList openedList;
397  for (const QString& it : openedScenarios)
398  {
399  openedList.push_back(it.toStdString());
400  }
401 
402  PackagePtr package = parser.parsePackage(name, openedList);
403  if (package == nullptr)
404  {
405  didNotFindSomePackages = true;
406  continue;
407  }
408 
409  for (const auto& scenario : *package->getScenarios())
410  {
411  StatusManager statusManager;
412  if (statusManager.isIceScenario(scenario))
413  {
414  executor->setStarter(
415  StarterFactory::getFactory()->getIceStarter(
416  getArmarXManager()->getIceManager()->getIceGridSession()->getAdmin()),
417  scenario);
418  executor->setStopStrategy(
419  stopStrategyFactory.getKillStrategy(StopperFactory::getFactory()->getIceStopper(
420  getArmarXManager()->getIceManager()->getIceGridSession()->getAdmin())),
421  scenario);
422  }
423  }
424 
425  this->packages->push_back(package);
426  }
427 
428  if (didNotFindSomePackages)
429  {
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!";
435  ARMARX_INFO << ss.str();
436  }
437 
438  updateModels();
439 }
440 
441 void
443 {
444  PackageBuilder parser;
445  PackagePtr package = parser.parsePackage(name, StringList());
446 
447  this->packages->push_back(package);
448 
449  updateModels();
450 }
451 
452 void
454 {
455  settingsController.updateModel();
456  openScenarioController.updateModel();
457  scenarioListController.updateModel();
458  applicationController.updatePackages();
459  widget.detailedApplicationView->updateStatus();
460 
461  //widget.applicationDatabase->setModel(applicationController.getModel());
462  //widget.scenarioView->setModel(scenarioListController.getTreeModel());
463 }
464 
465 void
467 {
468  QSettings settings(QString(settingsFile.c_str()), QSettings::NativeFormat);
469  settings.setValue("editMode", edit);
470  widget.detailedApplicationView->setVisible(edit);
471  widget.applicationDatabase->setVisible(edit);
472 }
ScenarioItem
TreeItem representing data contained in a Scenario or an Application.
Definition: scenarioitem.h:38
ScenarioManager::Controller::SettingsController::init
void init()
Definition: SettingsController.cpp:95
armarx::ManagedIceObject::getIceManager
IceManagerPtr getIceManager() const
Returns the IceManager.
Definition: ManagedIceObject.cpp:353
ScenarioManager::Data_Structure::ApplicationInstancePtr
std::shared_ptr< ApplicationInstance > ApplicationInstancePtr
Definition: ApplicationInstance.h:33
ScenarioManager::Data_Structure::ScenarioPtr
std::shared_ptr< Scenario > ScenarioPtr
Definition: Scenario.h:36
ScenarioManager::Controller::SettingsController::updateModel
void updateModel()
Updates the packages displayed in the settingsview by reloading all packages into the model.
Definition: SettingsController.cpp:248
ARMARX_IMPORTANT
#define ARMARX_IMPORTANT
Definition: Logging.h:183
ScenarioManager::Controller::ApplicationDatabaseController::updatePackages
void updatePackages()
Updates the packages displayed in the ApplicationDatabaseView by reloading all packages and applicati...
Definition: ApplicationDatabaseController.cpp:65
ScenarioManager::Data_Structure::ApplicationPtr
std::shared_ptr< Application > ApplicationPtr
Definition: Application.h:119
armarx::CMakePackageFinder::FindAllArmarXSourcePackages
static std::vector< std::string > FindAllArmarXSourcePackages()
Definition: CMakePackageFinder.cpp:438
namelocationview.h
armarx::ManagedIceObject::getArmarXManager
ArmarXManagerPtr getArmarXManager() const
Returns the ArmarX manager used to add and remove components.
Definition: ManagedIceObject.cpp:348
armarx::ScenarioManagerWidgetController::loadSettings
void loadSettings(QSettings *settings) override
Definition: ScenarioManagerWidgetController.cpp:105
ScenarioManager::Controller::ScenarioListController::setIceAdmin
void setIceAdmin(IceGrid::AdminPrx iceAdmin)
Set an IceAdmin for the controller.
Definition: ScenarioListController.cpp:1029
armarx::ScenarioManagerWidgetController::onExitComponent
void onExitComponent() override
Hook for subclass.
Definition: ScenarioManagerWidgetController.cpp:363
armarx::PropertyUser::hasProperty
bool hasProperty(const std::string &name)
Definition: PropertyUser.cpp:243
armarx::navigation::algorithms::save
bool save(const Costmap &costmap, const std::filesystem::path &directory)
Definition: persistence.cpp:101
PackageBuilder.h
ScenarioStartModes
ScenarioStartModes
Definition: scenariolistview.h:44
ArmarXMainWindow.h
ScenarioManager::Data_Structure::PackagePtr
std::shared_ptr< Package > PackagePtr
Definition: Package.h:121
armarx::ScenarioManagerWidgetController::reparsePackages
void reparsePackages()
Definition: ScenarioManagerWidgetController.cpp:369
armarx::ScenarioManagerWidgetController::updateModels
void updateModels()
Definition: ScenarioManagerWidgetController.cpp:453
armarx::ArmarXDataPath
Definition: ArmarXDataPath.h:57
ScenarioManager::Controller::ScenarioListController::stopUpdateTask
void stopUpdateTask()
Definition: ScenarioListController.cpp:141
FilterableTreeModelSortFilterProxyModelPtr
std::shared_ptr< FilterableTreeModelSortFilterProxyModel > FilterableTreeModelSortFilterProxyModelPtr
Definition: filterabletreemodelsortfilterproxymodel.h:65
ScenarioManager::Controller::DetailedApplicationController::setDetailedApplicationView
void setDetailedApplicationView(DetailedApplicationView *ptr)
Sets the view this controller manages.
Definition: DetailedApplicationController.cpp:58
armarx::ScenarioManagerWidgetController::ScenarioManagerWidgetController
ScenarioManagerWidgetController()
Controller Constructor.
Definition: ScenarioManagerWidgetController.cpp:47
armarx::ScenarioManagerWidgetController::getCustomTitlebarWidget
QPointer< QWidget > getCustomTitlebarWidget(QWidget *parent) override
getTitleToolbar returns a pointer to the a toolbar widget of this controller.
Definition: ScenarioManagerWidgetController.cpp:326
ScenarioManager::Controller::OpenScenarioController::updateModel
void updateModel()
Reloads the packages into the model.
Definition: openscenariocontroller.cpp:195
XMLScenarioParser.h
ScenarioManager::StatusManager::isIceScenario
bool isIceScenario(Data_Structure::ScenarioPtr scenario)
Definition: StatusManager.cpp:85
ScenarioManager::Controller::DetailedApplicationController::setIceAdmin
void setIceAdmin(IceGrid::AdminPrx iceAdmin)
Set an IceAdmin for the controller.
Definition: DetailedApplicationController.cpp:304
ScenarioManager::StatusManager
Definition: StatusManager.h:7
armarx::Application::getInstance
static ApplicationPtr getInstance()
Retrieve shared pointer to the application object.
Definition: Application.cpp:289
armarx::ScenarioManagerWidgetController::reparsePackage
void reparsePackage(std::string name)
Definition: ScenarioManagerWidgetController.cpp:442
IceStorm::parser
Parser * parser
Definition: Parser.cpp:33
ScenarioManager
Definition: Application.cpp:166
ARMARX_INFO
#define ARMARX_INFO
Definition: Logging.h:174
std
Definition: Application.h:66
ScenarioManagerWidgetController.h
IceUtil::Handle< Application >
armarx::ScenarioManagerWidgetController::onConnectComponent
void onConnectComponent() override
Definition: ScenarioManagerWidgetController.cpp:358
armarx::ArmarXWidgetController::getWidget
virtual QPointer< QWidget > getWidget()
getWidget returns a pointer to the a widget of this controller.
Definition: ArmarXWidgetController.cpp:54
Logging.h
armarx::ScenarioManagerWidgetController::~ScenarioManagerWidgetController
~ScenarioManagerWidgetController() override
Controller destructor.
Definition: ScenarioManagerWidgetController.cpp:67
ARMARX_WARNING
#define ARMARX_WARNING
Definition: Logging.h:186
armarx::ScenarioManagerWidgetController::saveSettings
void saveSettings(QSettings *settings) override
Definition: ScenarioManagerWidgetController.cpp:123
armarx
This file offers overloads of toIce() and fromIce() functions for STL container types.
Definition: ArmarXTimeserver.cpp:28
ScenarioManager::Controller::ScenarioListController::getTreeModel
FilterableTreeModelSortFilterProxyModelPtr getTreeModel()
Returns the model used by the ScenarioListView and managed by this controller.
Definition: ScenarioListController.cpp:90
ScenarioManager::Controller::ScenarioListController::updateModel
void updateModel()
Updates the model by reloading all scenarios and applications.
Definition: ScenarioListController.cpp:654
armarx::ScenarioManagerWidgetController::editMode
void editMode(bool edit)
Definition: ScenarioManagerWidgetController.cpp:466
ScenarioManager::Parser::StringList
std::vector< std::string > StringList
Definition: PackageBuilder.h:34
armarx::ScenarioManagerWidgetController::onInitComponent
void onInitComponent() override
Definition: ScenarioManagerWidgetController.cpp:135