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

#include "ui_window.h"

6
#include "types.h"
7

Pierre Kraemer's avatar
Pierre Kraemer committed
8 9 10
class QVBoxLayout;
class QSplitter;

Pierre Kraemer's avatar
Pierre Kraemer committed
11 12 13 14 15 16
namespace CGoGN
{

namespace SCHNApps
{

Pierre Kraemer's avatar
Pierre Kraemer committed
17 18 19 20
class CamerasDialog;
class PluginsDialog;
class MapsDialog;

Pierre Kraemer's avatar
Pierre Kraemer committed
21
struct Texture;
22 23 24 25 26 27 28

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

public:
	/**
Pierre Kraemer's avatar
Pierre Kraemer committed
29 30
	 * \fn Window()
	 * \brief Constructor
31
	 */
Pierre Kraemer's avatar
Pierre Kraemer committed
32 33 34
	Window();

	Window(const Window& w);
35

36 37
	/**
	 * \fn ~Window()
Pierre Kraemer's avatar
Pierre Kraemer committed
38
	 * \brief Destructor
39 40 41
	 */
	~Window();

Pierre Kraemer's avatar
Pierre Kraemer committed
42 43 44 45 46
	void launch()
	{
		this->QMainWindow::show();
	}

47 48
	const QString& getAppPath() { return m_appPath; }

Pierre Kraemer's avatar
Pierre Kraemer committed
49 50 51
	/*********************************************************
	 * MANAGE DOCK
	 *********************************************************/
52 53 54 55 56 57 58

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

	/**
Pierre Kraemer's avatar
Pierre Kraemer committed
62
	 * \fn void addTabInDock(QWidget* tabWidget, const QString& tabText)
63 64
	 * \brief Adds the widget as a new tab in the interface's dock
	 *
Pierre Kraemer's avatar
Pierre Kraemer committed
65
	 * \param tabWidget the created and allocated pointer to the QWidget to add in the dock
66 67 68 69
	 * \param tabText The text that will appears in the tab label
	 *
	 * \see removeTabInDock()
	 */
70
	void addTabInDock(QWidget* tabWidget, const QString& tabText, bool enable);
71 72 73 74 75 76 77 78 79 80 81

	/**
	 * \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
82 83
	void removeTabInDock(QWidget* tabWidget);

84 85 86
	void enablePluginTabWidgets(Plugin* plugin);
	void disablePluginTabWidgets(Plugin* plugin);

Pierre Kraemer's avatar
Pierre Kraemer committed
87 88 89
	/*********************************************************
	 * MANAGE MENU ACTIONS
	 *********************************************************/
90 91

	/**
Pierre Kraemer's avatar
Pierre Kraemer committed
92
	 * \fn bool addMenuAction(const QString& menuPath, QAction* action)
93 94 95
	 * \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
96
	 * \param action a pointer to the allocated action to add in the menu. All the details on that action (such as
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
	 *          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
113
	 *  This method is called by Plugin methods
114 115 116 117
	 *
	 *  \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
118
	 *    depending on the error. This error can be shown with Error::showError
119 120
	 *
	 * \see deleteMenuAction()
Pierre Kraemer's avatar
Pierre Kraemer committed
121
	 * \see Plugin::addMenuAction()
122
	 */
Pierre Kraemer's avatar
Pierre Kraemer committed
123
	bool addMenuAction(const QString& menuPath, QAction* action);
124 125

	/**
Pierre Kraemer's avatar
Pierre Kraemer committed
126
	 * \fn void deleteMenuAction(QAction* action)
127 128
	 * \brief delete an action from the menu bar
	 *
Pierre Kraemer's avatar
Pierre Kraemer committed
129
	 * \param action pointer to the allocated action to delete.
130 131 132 133 134
	 *
	 *  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
135
	 *  This method is called by Plugin methods
136 137
	 *
	 *  \see addMenuAction()
Pierre Kraemer's avatar
Pierre Kraemer committed
138
	 *  \see Plugin::removeMenuAction()
139
	 */
Pierre Kraemer's avatar
Pierre Kraemer committed
140 141 142 143 144 145 146
	void removeMenuAction(QAction* action);

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

	bool addToolbarAction(QAction* action);
147

Pierre Kraemer's avatar
Pierre Kraemer committed
148 149
	void removeToolbarAction(QAction* action);

150 151 152 153 154 155 156
	/*********************************************************
	 * MANAGE CAMERAS
	 *********************************************************/

	Camera* addCamera(const QString& name);
	Camera* addCamera();
	void removeCamera(const QString& name);
157 158 159
	Camera* getCamera(const QString& name) const;
	QList<Camera*> getCamerasList() const { return h_cameras.values(); }
	const CameraHash& getCamerasHash() const { return h_cameras; }
160 161 162 163 164 165 166 167

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

	View* addView(const QString& name);
	View* addView();
	void removeView(const QString& name);
168 169 170 171 172 173 174
	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
175
	void splitView(const QString& name, Qt::Orientation orientation);
176

Pierre Kraemer's avatar
Pierre Kraemer committed
177 178 179
	/*********************************************************
	 * MANAGE PLUGINS
	 *********************************************************/
180 181 182 183 184 185 186 187

	/**
	 * \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
188
	 * where the extension ('.so', '.dylib') and the prefix 'lib' were removed.
189 190 191 192 193 194
	 *
	 *  <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
195 196
	 * 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.
197
	 *
Pierre Kraemer's avatar
Pierre Kraemer committed
198
	 * \warning In the program this method is called under specific and controlled circumstances, you should probably not call it.
199
	 *
Pierre Kraemer's avatar
Pierre Kraemer committed
200
	 * \return a boolean whether the loading succeeded or not.
201 202
	 *
	 * If the function failed, the error code ( Error::code ) is affected with a value
Pierre Kraemer's avatar
Pierre Kraemer committed
203
	 * depending on the error. This error can be shown with Error::showError
204 205
	 *
	 * \see unloadPlugin()
Pierre Kraemer's avatar
Pierre Kraemer committed
206 207 208
	 * \see getPlugins()
	 * \see Plugin::enable()
	 */
209
	Plugin* loadPlugin(const QString& pluginFilePath);
Pierre Kraemer's avatar
Pierre Kraemer committed
210
	void loadPlugin_py(std::string path);
211 212 213 214 215 216 217

	/**
	 * \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
218
	 * The Plugin of the given name is dereferenced and deleted, if it exists and was previously
219 220
	 * referenced, if not, the method does nothing.
	 *
Pierre Kraemer's avatar
Pierre Kraemer committed
221 222
	 * 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.
223 224 225 226
	 *
	 * \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
227
	 * \see getPlugins()
228 229
	 * \see Plugin::disable()
	 */
Pierre Kraemer's avatar
Pierre Kraemer committed
230
	void unloadPlugin(const QString& pluginName);
231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249

	/**
	 * \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
250 251 252
	 */
//	Plugin *checkPluginDependencie(QString name, Plugin *dependantPlugin);

253 254 255
	Plugin* getPlugin(const QString& name) const;
	QList<Plugin*> getPluginsList() const { return h_plugins.values(); }
	const PluginHash& getPluginsHash() const { return h_plugins; }
256

257 258 259
	/*********************************************************
	 * MANAGE MAPS
	 *********************************************************/
Pierre Kraemer's avatar
Pierre Kraemer committed
260

261
	GenericMap* createMap(unsigned int dim);
262
	bool addMap(MapHandlerGen* map);
263
	void removeMap(const QString& name);
264 265 266
	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
267

268 269 270 271 272 273
	/*********************************************************
	 * MANAGE TEXTURES
	 *********************************************************/

	Texture* getTexture(const QString& image);
	void releaseTexture(const QString& image);
274 275

protected:
276 277
	QString m_appPath;

Pierre Kraemer's avatar
Pierre Kraemer committed
278
	bool m_initialization;
279

Pierre Kraemer's avatar
Pierre Kraemer committed
280 281 282
	QVBoxLayout* m_centralLayout;
	QSplitter* m_rootSplitter;
	bool b_rootSplitterInitialized;
283

284
	View* m_firstView;
285
	View* m_currentView;
286

Pierre Kraemer's avatar
Pierre Kraemer committed
287 288
	QDockWidget* m_dock;
	QTabWidget* m_dockTabWidget;
289

Pierre Kraemer's avatar
Pierre Kraemer committed
290
	PluginHash h_plugins;
291
	ViewHash h_views;
Pierre Kraemer's avatar
Pierre Kraemer committed
292
	CameraHash h_cameras;
293
	MapHash h_maps;
294

295 296
	TextureHash h_textures;

Pierre Kraemer's avatar
Pierre Kraemer committed
297 298 299
	CamerasDialog* m_camerasDialog;
	PluginsDialog* m_pluginsDialog;
	MapsDialog* m_mapsDialog;
300 301

public slots:
302 303 304 305 306 307
	/**
	 * \fn void cb_about_SCHNApps();
	 * \brief function that is called when the "about SCHNApps" menu action is triggered
	 */
	void cb_aboutSCHNApps();

308 309 310 311
	/**
	 * \fn void cb_about_CGoGN();
	 * \brief function that is called when the "about CGOGN" menu action is triggered
	 */
312
	void cb_aboutCGoGN();
313 314
	
	void cb_showHideDock();
315

316
	/**
317 318 319
	 * \fn void cb_manageCameras()
	 * \brief method called when the "Cameras" action is triggered.
	 * Show the cameras management dialog:
320
	 */
321
	void cb_manageCameras();
322

323
	/**
324 325 326
	 * \fn void cb_managePlugins()
	 * \brief method called when the "Plugins" action is triggered.
	 * Show the plugins management dialog
327
	 */
328 329
	void cb_managePlugins();

330 331
	void cb_manageMaps();

332 333 334 335 336 337 338
signals:
	void cameraAdded(Camera* camera);
	void cameraRemoved(Camera* camera);

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

339 340
	void mapAdded(MapHandlerGen* map);
	void mapRemoved(MapHandlerGen* map);
341 342 343

	void pluginAdded(Plugin* plugin);
	void pluginRemoved(Plugin* plugin);
344 345
};

Pierre Kraemer's avatar
Pierre Kraemer committed
346 347 348 349
} // namespace SCHNApps

} // namespace CGoGN

350
#endif