window.h 10.6 KB
Newer Older
1 2 3 4 5
#ifndef _WINDOW_H_
#define _WINDOW_H_

#include "ui_window.h"

Pierre Kraemer's avatar
Pierre Kraemer committed
6
#include "system.h"
7

Pierre Kraemer's avatar
Pierre Kraemer committed
8 9 10 11 12 13 14
class QVBoxLayout;
class QSplitter;

class CamerasDialog;
class PluginsDialog;
class MapsDialog;

15
class Texture;
16 17 18 19 20 21 22

class Window : public QMainWindow, Ui::Window
{
	Q_OBJECT

public:
	/**
23
	 * \fn Window(QWidget* parent = NULL)
24 25 26 27
	 * \brief Default (and unique) constructor
	 *
	 * \param parent the parent of the window
	 */
28 29
	Window(QWidget* parent = NULL);

30 31 32 33 34 35
	/**
	 * \fn ~Window()
	 * \brief the class destructor
	 */
	~Window();

36 37 38
	const QString& getAppPath() { return m_appPath; }
	void setAppPath(const QString& path) { m_appPath = path; }

Pierre Kraemer's avatar
Pierre Kraemer committed
39 40 41
	/*********************************************************
	 * MANAGE DOCK
	 *********************************************************/
42 43 44 45 46 47 48

	/**
	 * \fn QTabWidget* getDockTabWidget()
	 * \brief Accessor to the QTabWidget of this interface
	 *
	 * \return a pointer to the TabWidget, NULL if not allocated yet
	 */
49
	QTabWidget* getDockTabWidget() const { return m_dockTabWidget; }
50 51

	/**
Pierre Kraemer's avatar
Pierre Kraemer committed
52
	 * \fn void addTabInDock(QWidget* tabWidget, const QString& tabText)
53 54
	 * \brief Adds the widget as a new tab in the interface's dock
	 *
Pierre Kraemer's avatar
Pierre Kraemer committed
55
	 * \param tabWidget the created and allocated pointer to the QWidget to add in the dock
56 57 58 59
	 * \param tabText The text that will appears in the tab label
	 *
	 * \see removeTabInDock()
	 */
Pierre Kraemer's avatar
Pierre Kraemer committed
60
	void addTabInDock(QWidget* tabWidget, const QString& tabText);
61 62 63 64 65 66 67 68 69 70 71

	/**
	 * \fn void removeTabInDock(QWidget* tabWidget)
	 * \brief removes a given widget from the tab
	 *
	 * \param tabWidget the reference to the widget you want to remove
	 *
	 * If the widget does belong to the tab, it will be destroyed.
	 *
	 * \see addWidgetInDockTab()
	 */
Pierre Kraemer's avatar
Pierre Kraemer committed
72 73
	void removeTabInDock(QWidget* tabWidget);

74 75 76
	void enablePluginTabWidgets(Plugin* plugin);
	void disablePluginTabWidgets(Plugin* plugin);

Pierre Kraemer's avatar
Pierre Kraemer committed
77 78 79
	/*********************************************************
	 * MANAGE MENU ACTIONS
	 *********************************************************/
80 81

	/**
Pierre Kraemer's avatar
Pierre Kraemer committed
82
	 * \fn bool addMenuAction(const QString& menuPath, QAction* action)
83 84 85
	 * \brief adds an action in the program menu bar
	 *
	 * \param menuPath the menu path (see details below) to specify a location for the action in the menu.
Pierre Kraemer's avatar
Pierre Kraemer committed
86
	 * \param action a pointer to the allocated action to add in the menu. All the details on that action (such as
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
	 *          QObject::connect() calls) are not dealt in this function.
	 *
	 *  The menu path is a string used to specify the location of the new action in the menu bar.
	 *  In such path every menu step of the path should be separate by ';'. The action is the last substring after
	 *  the last ';', and will be added in the menu with that name. All non-existing menu specified in the path
	 *  shall be created.
	 *
	 *  <b>Example 1:</b> if you want to add an entry <em>"action"</em> to the existing menu <em>"Plugins"</em> the
	 *                  menu path shall be: <em>Plugins;action</em>
	 *
	 *  <b>Example 2:</b> if you want to add an entry <em>"action"</em> in a new menu <em>"config"</em> that is also a
	 *                  submenu of a new menu <em>"Settings"</em>, the menu path
	 *                  shall be: <em>Settings;config;action</em>
	 *
	 *  A new action should at least belong to one menu (already existing or not). Otherwise the method will fail.
	 *
Pierre Kraemer's avatar
Pierre Kraemer committed
103
	 *  This method is called by Plugin methods
104 105 106 107
	 *
	 *  \return a boolean whether the method succeeded or not.
	 *
	 * If the function failed, the error code ( Error::code ) is affected with a value
Pierre Kraemer's avatar
Pierre Kraemer committed
108
	 *    depending on the error. This error can be shown with Error::showError
109 110
	 *
	 * \see deleteMenuAction()
Pierre Kraemer's avatar
Pierre Kraemer committed
111
	 * \see Plugin::addMenuAction()
112
	 */
Pierre Kraemer's avatar
Pierre Kraemer committed
113
	bool addMenuAction(const QString& menuPath, QAction* action);
114 115

	/**
Pierre Kraemer's avatar
Pierre Kraemer committed
116
	 * \fn void deleteMenuAction(QAction* action)
117 118
	 * \brief delete an action from the menu bar
	 *
Pierre Kraemer's avatar
Pierre Kraemer committed
119
	 * \param action pointer to the allocated action to delete.
120 121 122 123 124
	 *
	 *  If this action was the only action remaining in a menu, this menu will also be deleted.
	 *
	 *  \warning DO NOT use this method with an action that hasn't been added with addMenuAction()
	 *
Pierre Kraemer's avatar
Pierre Kraemer committed
125
	 *  This method is called by Plugin methods
126 127
	 *
	 *  \see addMenuAction()
Pierre Kraemer's avatar
Pierre Kraemer committed
128
	 *  \see Plugin::removeMenuAction()
129
	 */
Pierre Kraemer's avatar
Pierre Kraemer committed
130 131 132 133 134 135 136
	void removeMenuAction(QAction* action);

	/*********************************************************
	 * MANAGE TOOLBAR ACTIONS
	 *********************************************************/

	bool addToolbarAction(QAction* action);
137

Pierre Kraemer's avatar
Pierre Kraemer committed
138 139
	void removeToolbarAction(QAction* action);

140 141 142 143 144 145 146
	/*********************************************************
	 * MANAGE CAMERAS
	 *********************************************************/

	Camera* addCamera(const QString& name);
	Camera* addCamera();
	void removeCamera(const QString& name);
147 148 149
	Camera* getCamera(const QString& name) const;
	QList<Camera*> getCamerasList() const { return h_cameras.values(); }
	const CameraHash& getCamerasHash() const { return h_cameras; }
150 151 152 153 154 155 156 157

	/*********************************************************
	 * MANAGE VIEWS
	 *********************************************************/

	View* addView(const QString& name);
	View* addView();
	void removeView(const QString& name);
158 159 160 161 162 163 164
	View* getView(const QString& name) const;
	QList<View*> getViewsList() const { return h_views.values(); }
	const ViewHash& getViewsHash() const { return h_views; }

	View* getCurrentView() const { return m_currentView; }
	void setCurrentView(View* view);

Pierre Kraemer's avatar
Pierre Kraemer committed
165
	void splitView(const QString& name, Qt::Orientation orientation);
166

Pierre Kraemer's avatar
Pierre Kraemer committed
167 168 169
	/*********************************************************
	 * MANAGE PLUGINS
	 *********************************************************/
170 171 172 173 174 175 176 177

	/**
	 * \fn bool loadPlugin(QString pluginPath)
	 * \brief Loads and references a Plugin
	 *
	 * \param pluginPath the absolute path of the Plugin location
	 *
	 * The Plugin is loaded and referenced under a name that is the Plugin file name
Pierre Kraemer's avatar
Pierre Kraemer committed
178
	 * where the extension ('.so', '.dylib') and the prefix 'lib' were removed.
179 180 181 182 183 184
	 *
	 *  <b>Example:</b> <em>/path/libExample.so</em> will be referenced as <em>Example</em>
	 *
	 * You have to make sure that a Plugin file with a similar name hasn't been loaded yet, otherwise
	 * the loading will fail.
	 *
Pierre Kraemer's avatar
Pierre Kraemer committed
185 186
	 * This method calls the Plugin::enable() method of the concerned Plugin. That is why
	 * when Plugin are written, this method is overriden and used as an initialization method.
187
	 *
Pierre Kraemer's avatar
Pierre Kraemer committed
188
	 * \warning In the program this method is called under specific and controlled circumstances, you should probably not call it.
189
	 *
Pierre Kraemer's avatar
Pierre Kraemer committed
190
	 * \return a boolean whether the loading succeeded or not.
191 192
	 *
	 * If the function failed, the error code ( Error::code ) is affected with a value
Pierre Kraemer's avatar
Pierre Kraemer committed
193
	 * depending on the error. This error can be shown with Error::showError
194 195
	 *
	 * \see unloadPlugin()
Pierre Kraemer's avatar
Pierre Kraemer committed
196 197 198
	 * \see getPlugins()
	 * \see Plugin::enable()
	 */
199
	Plugin* loadPlugin(const QString& pluginFilePath);
200 201 202 203 204 205 206

	/**
	 * \fn void unloadPlugin(QString pluginName)
	 * \brief Unload the Plugin of a given name
	 *
	 * \param pluginName the name under which the Plugin is referenced
	 *
Pierre Kraemer's avatar
Pierre Kraemer committed
207
	 * The Plugin of the given name is dereferenced and deleted, if it exists and was previously
208 209
	 * referenced, if not, the method does nothing.
	 *
Pierre Kraemer's avatar
Pierre Kraemer committed
210 211
	 * This method calls the Plugin::disable() method of the concerned Plugin. That is why,
	 * when Plugin are written, this method is overriden and used as a destruction method.
212 213 214 215
	 *
	 * \warning In the program this method is called under specific and controlled circumstances, you should probably not call it.
	 *
	 * \see loadPlugin()
Pierre Kraemer's avatar
Pierre Kraemer committed
216
	 * \see getPlugins()
217 218
	 * \see Plugin::disable()
	 */
Pierre Kraemer's avatar
Pierre Kraemer committed
219
	void unloadPlugin(const QString& pluginName);
220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238

	/**
	 * \fn Plugin* checkPluginDependencie(QString name, Plugin* dependantPlugin)
	 * \brief checks for a dependencie Plugin, and set the dependencie link for the found Plugin
	 *
	 * \param name the name of the Plugin you have to check the existence in order to make a dependencie
	 * \param dependantPlugin a reference to the Plugin that asks for the dependencie that will be set as a
	 *          dependant Plugin for the found Plugin
	 *
	 * \warning In the program this method is called under specific and controlled circumstances
	 *          by the Plugins you should probably not call it.
	 *
	 * \return a pointer to the found dependencie Plugin, NULL if this Plugin wasn't referenced
	 *
	 * If the function failed, the error code ( Error::code ) is affected with a value
	     depending on the error. This error can be shown with Error::showError
	 *
	 * \see loadPlugin()
	 * \see VisualPlugin::addDependencie()
Pierre Kraemer's avatar
Pierre Kraemer committed
239 240 241
	 */
//	Plugin *checkPluginDependencie(QString name, Plugin *dependantPlugin);

242 243 244
	Plugin* getPlugin(const QString& name) const;
	QList<Plugin*> getPluginsList() const { return h_plugins.values(); }
	const PluginHash& getPluginsHash() const { return h_plugins; }
245

246 247 248
	/*********************************************************
	 * MANAGE MAPS
	 *********************************************************/
Pierre Kraemer's avatar
Pierre Kraemer committed
249

250
	bool addMap(MapHandlerGen* map);
251
	void removeMap(const QString& name);
252 253 254
	MapHandlerGen* getMap(const QString& name) const;
	QList<MapHandlerGen*> getMapsList() const { return h_maps.values(); }
	const MapHash& getMapsHash() const { return h_maps; }
Pierre Kraemer's avatar
Pierre Kraemer committed
255

256 257 258 259 260 261
	/*********************************************************
	 * MANAGE TEXTURES
	 *********************************************************/

	Texture* getTexture(const QString& image);
	void releaseTexture(const QString& image);
262 263

protected:
264 265
	QString m_appPath;

Pierre Kraemer's avatar
Pierre Kraemer committed
266
	bool m_initialization;
267

Pierre Kraemer's avatar
Pierre Kraemer committed
268 269 270
	QVBoxLayout* m_centralLayout;
	QSplitter* m_rootSplitter;
	bool b_rootSplitterInitialized;
271

272
	View* m_firstView;
273
	View* m_currentView;
274

Pierre Kraemer's avatar
Pierre Kraemer committed
275 276
	QDockWidget* m_dock;
	QTabWidget* m_dockTabWidget;
277

Pierre Kraemer's avatar
Pierre Kraemer committed
278
	PluginHash h_plugins;
279
	ViewHash h_views;
Pierre Kraemer's avatar
Pierre Kraemer committed
280
	CameraHash h_cameras;
281
	MapHash h_maps;
282

283 284
	TextureHash h_textures;

Pierre Kraemer's avatar
Pierre Kraemer committed
285 286 287
	CamerasDialog* m_camerasDialog;
	PluginsDialog* m_pluginsDialog;
	MapsDialog* m_mapsDialog;
288 289

public slots:
290 291 292 293 294 295
	/**
	 * \fn void cb_about_SCHNApps();
	 * \brief function that is called when the "about SCHNApps" menu action is triggered
	 */
	void cb_aboutSCHNApps();

296 297 298 299
	/**
	 * \fn void cb_about_CGoGN();
	 * \brief function that is called when the "about CGOGN" menu action is triggered
	 */
300
	void cb_aboutCGoGN();
301 302
	
	void cb_showHideDock();
303

304
	/**
305 306 307
	 * \fn void cb_manageCameras()
	 * \brief method called when the "Cameras" action is triggered.
	 * Show the cameras management dialog:
308
	 */
309
	void cb_manageCameras();
310

311
	/**
312 313 314
	 * \fn void cb_managePlugins()
	 * \brief method called when the "Plugins" action is triggered.
	 * Show the plugins management dialog
315
	 */
316 317
	void cb_managePlugins();

318 319
	void cb_manageMaps();

320 321 322 323 324 325 326
signals:
	void cameraAdded(Camera* camera);
	void cameraRemoved(Camera* camera);

	void viewAdded(View* view);
	void viewRemoved(View* view);

327 328
	void mapAdded(MapHandlerGen* map);
	void mapRemoved(MapHandlerGen* map);
329 330 331

	void pluginAdded(Plugin* plugin);
	void pluginRemoved(Plugin* plugin);
332 333 334
};

#endif