ArmarXMainWindow.h
Go to the documentation of this file.
1 /*
2  * This file is part of ArmarX.
3  *
4  * Copyright (C) 2011-2016, High Performance Humanoid Technologies (H2T), Karlsruhe Institute of Technology (KIT), all rights reserved.
5  *
6  * ArmarX is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  * ArmarX is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
17  *
18  * @package
19  * @author
20  * @date
21  * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
22  * GNU General Public License
23  */
24 #pragma once
25 
28 
29 // Qt
30 #include <QAction>
31 #include <QDir>
32 #include <QDockWidget>
33 #include <QMainWindow>
34 #include <QPluginLoader>
35 
36 // Coin3D & SoQt
37 #include <Inventor/nodes/SoNode.h>
38 #include <Inventor/nodes/SoSeparator.h>
39 
40 // ArmarX
41 #include <QSplashScreen>
42 
46 
48 #include "Widgets/ViewerWidget.h"
49 
50 class QToolButton;
51 class QLabel;
52 class QScrollArea;
53 class QSignalMapper;
54 class QListWidgetItem;
55 class QActionGroup;
56 class QLineEdit;
57 
58 namespace Ui
59 {
60  class ArmarXMainWindow;
61 }
62 
63 // project
64 namespace armarx
65 {
66  class GuiUseCaseSelector;
67  class AddArmarXWidgetAction;
68 
69  class ArmarXDockWidget;
70 
71  struct Viewer3DInfo
72  {
73  SoNode* node;
74  QPointer<QDialog> sceneConfigDialog;
75  };
76 
77  /**
78  * \brief The ArmarXMainWindow class
79  */
80  class ArmarXMainWindow : public QMainWindow, virtual public armarx::Logging
81  {
82  Q_OBJECT
83 
84  public:
86  const std::vector<std::string>& packages,
87  const QString& configToLoad,
88  bool disablePreloading);
89  ~ArmarXMainWindow() override;
90 
91  /**
92  * loads a plugin with the given file path
93  */
94  void loadPlugin(QString filePath);
95 
96  /**
97  * emits the closeRequest signal
98  */
99  void closeEvent(QCloseEvent* event) override;
100 
102  void addToRecentlyOpenedFileList(QString configFilepath);
103 
104  /**
105  * @brief getDefaultPackageNames returns the names of all packages which are searched for plugins when the ArmarXGuiApp is started.
106  * @return vector of strings containing the names of the default packages
107  */
108  std::vector<std::string> getDefaultPackageNames();
109 
110  /**
111  * Provides access to a viewer widget, if existent
112  */
114 
115  /*!
116  * \brief Provides access to the coin3d mutex. Use this mutex to protect access to the 3d scene.
117  * \return
118  */
119  std::shared_ptr<std::recursive_mutex> getMutex3D();
120 
121  bool existsWidget(const QString& widgetName);
122  QString getLibraryPathFromPackage(const QString& packageName);
123 
124  QStringList getFavoriteWidgets();
125 
126  public slots:
127  void loadPluginsFromPackage(const QString& packageName);
128  void loadGuiConfig(QString configFilepath = "", bool showAsOpenGuiConfig = true);
129  void appendFileToWindowTitle(const QString& filepath = "");
130 
131  signals:
132  /**
133  * emitted, when the main window should be closed
134  */
135  void closeRequest();
136 
137 
138  void updateSceneList(QMap<QString, Viewer3DInfo>);
139  private slots:
140  void closeAllWidgets();
141  void closeAllWidgetsWithDialog();
142  void saveGuiConfig();
143  void saveGuiConfigAs();
144  void updateStatusOfOpenWidgets();
145  void enterFullscreenMode();
146  void leaveFullscreenMode();
147  void toggleWidgetLock();
148 
149 
150  /**
151  * shows a file dialog for loading a gui plugin
152  */
153  void pluginDialog();
154 
155 
156  // void listIndexes(const QModelIndexList & indexes);
157  ArmarXWidgetControllerPtr createArmarXWidget(QString widgetName,
158  QString customInstanceName,
159  QSettings* settings = NULL);
160  ArmarXWidgetControllerPtr addArmarXWidget(ArmarXWidgetControllerPtr newWidgetController,
161  bool createViewerWidget = true);
162  void addArmarXWidgetCanceled(ArmarXWidgetControllerPtr newWidgetController);
163  void removeArmarXWidget(QObject* widget);
164  void removeViewerWidget(QObject* widget);
165 
166  void on_actionClear_tip_blacklist_triggered();
167 
168  void on_actionAbout_triggered();
169 
170  void on_actionLoadLastConfig_toggled(bool toggled);
171 
172  void on_actionArmarX_Documentation_triggered();
173 
174  void on_actionOpen_Use_Case_triggered();
175 
176  void on_actionClear_plugin_cache_triggered();
177 
178  void updateOpenWidgetButtonStatus(QString widgetName);
179 
180  void openWidgetButtonClicked();
181 
182  void onContextMenuFavoritesRequested(const QPoint& pos);
183  void onNumberOfMaxFavoritesChanged(int i);
184 
185  void updatefavoriteActions();
186 
187  private:
188  /**
189  * @brief updates the menu entry with the available widgets.
190  */
191  void updateAvailableWidgetList();
192  void updateOpenWidgetList();
193 
194  /**
195  * Add the (optional) icon button to start ArViz Godot to the main widgets if ArViz Godot is available.
196  */
197  void addArVizGodotIcon();
198 
199  /**
200  * sets a SoQtExamine rViewer up. This ExaminerViewer is contained by the class member QWidget* view
201  */
202  Viewer3DWidgetPtr setupViewerWidget();
203 
204  /**
205  * loads all gui plugins in home/armarx recursively
206  */
207  void loadPlugins(const QString& pluginDir, bool searchRecursive = true);
208 
209 
210  void loadPlugins(const QSet<QString>& pluginDirs, bool searchRecursive = true);
211  void loadPlugins(const QStringList& fileNames);
212 
213  QAction* addActionToToolBar(QAction* action, bool allowText);
214 
215  PluginCache pluginCache;
216  QDir pluginsDir;
217  QStringList loadedPackages;
218  std::vector<QPluginLoader*> pluginsToLoad;
219  QList<QDir> directoriesToCheck;
220 
221  ::Ui::ArmarXMainWindow* ui;
222 
224 
225  std::vector<ArmarXGuiInterface*> plugins;
226  QStringList loadedPluginFilepaths;
227 
228  QList<QWidget*> widgetsList;
229  // WidgetCreatorMap availableWidgets;
230 
231  QMap<QString, Viewer3DInfo> viewer3DMap;
232 
233  QSignalMapper* signalMapper;
234  QActionGroup* layoutActions;
235  using OpenWidgetMap = QMap<QString, QPair<QDockWidget*, ArmarXWidgetControllerPtr>>;
236  OpenWidgetMap listOpenWidgets;
237  std::vector<ArmarXWidgetControllerPtr> pendingWidgets;
238  QListWidgetItem* viewerItem;
239 
240  QPointer<TipDialog> tipDialog;
241  const int widgetUsageHistoryLength = 100;
242 
243 
244  std::vector<std::string> defaultPackageNames;
245 
246 
247  // Emergency Stop
248  EmergencyStopWidgetPtr emergencyStopWidget;
249 
250  QAction* leaveFullScreenActionF11;
251  QAction* leaveFullScreenActionEsc;
252 
253  bool widgetsLocked;
254 
255  private:
256  QPointer<QDockWidget> getBiggestOpenWidget();
257  QMenu* getCategoryMenu(const std::string& categoryString, QMenu* menu, QIcon widgetIcon);
258  const std::string settingsFile;
259  QSettings mainSettings;
260  QString configFilepath;
261  QString guiWindowBaseName;
262  QTimer* connectionStatusTimer;
263  QSplashScreen* splashSceen;
264  QString splashscreenPrefix;
265  GuiUseCaseSelector* guiUseCaseSelector;
266  QStringList mainWidgetNames;
267  QToolButton* openWidgetButton;
268  QLineEdit* searchField;
269  AddArmarXWidgetAction* addWidgetAction;
270  std::shared_ptr<std::recursive_mutex> mutex3d;
271  QMap<QString, QAction*> actionList;
272 
273  QLabel* favoritesLabel;
274  std::vector<QAction*> favoriteActions;
275  QStringList favoriteActionWidgetNames;
276 
277  friend class WidgetNameDialog;
278  friend class Viewer3DWidget;
279  };
280 
281  /////////////////////////////////////////////////////////////////////////
282  //// Additional Helper Classes
283  /////////////////////////////////////////////////////////////////////////
284 
285  class WidgetNameDialog;
286 
287  /**
288  * \brief The ArmarXDockWidget class
289  */
290  class ArmarXDockWidget : public QDockWidget
291  {
292  public:
294  ~ArmarXDockWidget() override;
295  void setArmarXWidget(QWidget* widget);
296  void closeEvent(QCloseEvent* event) override;
297 
298  void lockWidget();
299  void unlockWidget();
300 
301  private:
303  QScrollArea* scrollArea;
304 
305  QWidget* savedTitleBar;
306  };
307 
308  class AddArmarXWidgetAction : public QAction
309  {
310  Q_OBJECT
311  public:
312  AddArmarXWidgetAction(QString widgetName,
313  QObject* parent = 0,
314  ArmarXMainWindow* mainGui = 0);
315  ~AddArmarXWidgetAction() override;
316 
317  public slots:
318  void triggered(QString widgetName = QString());
319  void addArmarXWidget();
320  void dialogAccepted();
321  signals:
322  void clicked(QString widgetName, QString customInstanceName);
323  void accepted();
324 
325  private:
326  ArmarXMainWindow* mainGui;
327  WidgetNameDialog* dialog;
328  };
329 
330  class OpenRecentlyOpenedFileAction : public QAction
331  {
332  Q_OBJECT
333  public:
334  OpenRecentlyOpenedFileAction(QString text,
335  QObject* parent = 0,
336  ArmarXMainWindow* mainGui = 0);
337  public slots:
338  void openFile();
339 
340  private:
341  ArmarXMainWindow* mainGui;
342  };
343 
344 
345 } // namespace armarx
armarx::Viewer3DInfo::sceneConfigDialog
QPointer< QDialog > sceneConfigDialog
Definition: ArmarXMainWindow.h:74
armarx::AddArmarXWidgetAction::triggered
void triggered(QString widgetName=QString())
Definition: ArmarXMainWindow.cpp:1611
armarx::ArmarXDockWidget::lockWidget
void lockWidget()
Definition: ArmarXMainWindow.cpp:1699
armarx::ArmarXMainWindow::getFavoriteWidgets
QStringList getFavoriteWidgets()
Definition: ArmarXMainWindow.cpp:399
armarx::ArmarXMainWindow::closeEvent
void closeEvent(QCloseEvent *event) override
emits the closeRequest signal
Definition: ArmarXMainWindow.cpp:546
armarx::ArmarXMainWindow::~ArmarXMainWindow
~ArmarXMainWindow() override
Definition: ArmarXMainWindow.cpp:260
armarx::ArmarXMainWindow
The ArmarXMainWindow class.
Definition: ArmarXMainWindow.h:80
armarx::Viewer3DWidget
The Viewer3DWidget class.
Definition: ViewerWidget.h:55
armarx::ArmarXMainWindow::updateRecentlyOpenedFileList
void updateRecentlyOpenedFileList()
Definition: ArmarXMainWindow.cpp:1472
RunningTask.h
armarx::AddArmarXWidgetAction::~AddArmarXWidgetAction
~AddArmarXWidgetAction() override
Definition: ArmarXMainWindow.cpp:1605
armarx::ArmarXMainWindow::appendFileToWindowTitle
void appendFileToWindowTitle(const QString &filepath="")
Definition: ArmarXMainWindow.cpp:877
plugins
EmergencyStopWidget.h
armarx::ArmarXMainWindow::loadPlugin
void loadPlugin(QString filePath)
loads a plugin with the given file path
Definition: ArmarXMainWindow.cpp:525
armarx::ArmarXMainWindow::addToRecentlyOpenedFileList
void addToRecentlyOpenedFileList(QString configFilepath)
Definition: ArmarXMainWindow.cpp:603
IceInternal::Handle< EmergencyStopWidget >
ArmarXGuiPlugin.h
armarx::ArmarXMainWindow::updateSceneList
void updateSceneList(QMap< QString, Viewer3DInfo >)
armarx::ArmarXDockWidget::ArmarXDockWidget
ArmarXDockWidget(QString name, ArmarXWidgetControllerPtr controller)
Definition: ArmarXMainWindow.cpp:1655
armarx::ArmarXMainWindow::existsWidget
bool existsWidget(const QString &widgetName)
Definition: ArmarXMainWindow.cpp:518
controller
Definition: AddOperation.h:39
Ui
ArmarX Headers.
Definition: ArmarXMainWindow.h:58
armarx::ArmarXMainWindow::getMutex3D
std::shared_ptr< std::recursive_mutex > getMutex3D()
Provides access to the coin3d mutex. Use this mutex to protect access to the 3d scene.
armarx::ArmarXMainWindow::getLibraryPathFromPackage
QString getLibraryPathFromPackage(const QString &packageName)
Definition: ArmarXMainWindow.cpp:388
armarx::ArmarXMainWindow::getViewerWidget
Viewer3DWidgetPtr getViewerWidget()
Provides access to a viewer widget, if existent.
Definition: ArmarXMainWindow.cpp:628
armarx::WidgetNameDialog
The WidgetNameDialog class.
Definition: WidgetNameDialog.h:42
armarx::ArmarXMainWindow::getDefaultPackageNames
std::vector< std::string > getDefaultPackageNames()
getDefaultPackageNames returns the names of all packages which are searched for plugins when the Arma...
Definition: ArmarXMainWindow.cpp:622
ViewerWidget.h
armarx::ArmarXDockWidget::setArmarXWidget
void setArmarXWidget(QWidget *widget)
Definition: ArmarXMainWindow.cpp:1675
armarx::ArmarXMainWindow::loadGuiConfig
void loadGuiConfig(QString configFilepath="", bool showAsOpenGuiConfig=true)
Definition: ArmarXMainWindow.cpp:642
armarx::ArmarXDockWidget::unlockWidget
void unlockWidget()
Definition: ArmarXMainWindow.cpp:1711
armarx::OpenRecentlyOpenedFileAction
Definition: ArmarXMainWindow.h:330
armarx::AddArmarXWidgetAction::AddArmarXWidgetAction
AddArmarXWidgetAction(QString widgetName, QObject *parent=0, ArmarXMainWindow *mainGui=0)
Definition: ArmarXMainWindow.cpp:1596
armarx::ArmarXMainWindow::ArmarXMainWindow
ArmarXMainWindow(const armarx::ManagedIceObjectRegistryInterfacePtr &registry, const std::vector< std::string > &packages, const QString &configToLoad, bool disablePreloading)
Definition: ArmarXMainWindow.cpp:112
armarx::OpenRecentlyOpenedFileAction::OpenRecentlyOpenedFileAction
OpenRecentlyOpenedFileAction(QString text, QObject *parent=0, ArmarXMainWindow *mainGui=0)
Definition: ArmarXMainWindow.cpp:1730
armarx::AddArmarXWidgetAction::accepted
void accepted()
armarx::ArmarXMainWindow::closeRequest
void closeRequest()
emitted, when the main window should be closed
armarx::Logging
Base Class for all Logging classes.
Definition: Logging.h:232
IceUtil::Handle< ManagedIceObjectRegistryInterface >
armarx::ArmarXDockWidget
The ArmarXDockWidget class.
Definition: ArmarXMainWindow.h:290
armarx::Viewer3DInfo::node
SoNode * node
Definition: ArmarXMainWindow.h:73
Logging.h
armarx::GuiUseCaseSelector
Definition: GuiUseCaseSelector.h:40
armarx::ArmarXMainWindow::loadPluginsFromPackage
void loadPluginsFromPackage(const QString &packageName)
Definition: ArmarXMainWindow.cpp:435
armarx::ArmarXDockWidget::~ArmarXDockWidget
~ArmarXDockWidget() override
Definition: ArmarXMainWindow.cpp:1668
armarx::AddArmarXWidgetAction
Definition: ArmarXMainWindow.h:308
armarx::AddArmarXWidgetAction::clicked
void clicked(QString widgetName, QString customInstanceName)
armarx::AddArmarXWidgetAction::addArmarXWidget
void addArmarXWidget()
Definition: ArmarXMainWindow.cpp:1632
armarx::OpenRecentlyOpenedFileAction::openFile
void openFile()
Definition: ArmarXMainWindow.cpp:1738
PluginCache.h
armarx::ArmarXDockWidget::closeEvent
void closeEvent(QCloseEvent *event) override
Definition: ArmarXMainWindow.cpp:1681
armarx::AddArmarXWidgetAction::dialogAccepted
void dialogAccepted()
Definition: ArmarXMainWindow.cpp:1649
armarx::Viewer3DInfo
Definition: ArmarXMainWindow.h:71
armarx::PluginCache
Definition: PluginCache.h:36
armarx
This file offers overloads of toIce() and fromIce() functions for STL container types.
Definition: ArmarXTimeserver.cpp:28
Application.h