qtSimple.h 11.6 KB
Newer Older
Sylvain Thery's avatar
Sylvain Thery committed
1 2 3
/*******************************************************************************
 * CGoGN: Combinatorial and Geometric modeling with Generic N-dimensional Maps  *
 * version 0.1                                                                  *
4
 * Copyright (C) 2009-2012, IGG Team, LSIIT, University of Strasbourg           *
Sylvain Thery's avatar
Sylvain Thery committed
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
 *                                                                              *
 * This library is free software; you can redistribute it and/or modify it      *
 * under the terms of the GNU Lesser General Public License as published by the *
 * Free Software Foundation; either version 2.1 of the License, or (at your     *
 * option) any later version.                                                   *
 *                                                                              *
 * This library is distributed in the hope that it will be useful, but WITHOUT  *
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or        *
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License  *
 * for more details.                                                            *
 *                                                                              *
 * You should have received a copy of the GNU Lesser General Public License     *
 * along with this library; if not, write to the Free Software Foundation,      *
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.           *
 *                                                                              *
20
 * Web site: http://cgogn.unistra.fr/                                           *
Sylvain Thery's avatar
Sylvain Thery committed
21 22 23 24 25 26 27 28 29 30 31 32
 * Contact information: cgogn@unistra.fr                                        *
 *                                                                              *
 *******************************************************************************/

#ifndef __SIMPLE_QT_GL2__
#define __SIMPLE_QT_GL2__

#include <QApplication>
#include <QDesktopWidget>
#include <QMainWindow>
#include <QWidget>
#include <QtGui>
33
#include "Utils/Qt/qtgl.h"
34

35
#include <set>
Sylvain Thery's avatar
Sylvain Thery committed
36
#include <string>
37
#include "Geometry/vector_gen.h"
38
#include "Utils/gl_matrices.h"
Sylvain Thery's avatar
Sylvain Thery committed
39

Pierre Kraemer's avatar
merge..  
Pierre Kraemer committed
40
namespace CGoGN { namespace Utils { class GLSLShader; } }
Sylvain Thery's avatar
Sylvain Thery committed
41

Sylvain Thery's avatar
Sylvain Thery committed
42
#ifdef WIN32
Sylvain Thery's avatar
Sylvain Thery committed
43
#ifndef CGoGN_UTILS_API
Sylvain Thery's avatar
Sylvain Thery committed
44 45 46 47 48 49
#if defined CGoGN_QT_DLL_EXPORT
#define CGoGN_UTILS_API __declspec(dllexport)
#else
#define CGoGN_UTILS_API __declspec(dllimport)
#endif
#endif
Thery Sylvain's avatar
Thery Sylvain committed
50 51
#else
#define CGoGN_UTILS_API
Sylvain Thery's avatar
Sylvain Thery committed
52
#endif
Sylvain Thery's avatar
Sylvain Thery committed
53

Sylvain Thery's avatar
Sylvain Thery committed
54 55
namespace CGoGN
{
Pierre Kraemer's avatar
merge..  
Pierre Kraemer committed
56

Sylvain Thery's avatar
Sylvain Thery committed
57 58
namespace Utils
{
Pierre Kraemer's avatar
merge..  
Pierre Kraemer committed
59

Sylvain Thery's avatar
Sylvain Thery committed
60 61 62 63 64 65
namespace QT
{

// forward definition
class GLWidget;

Sylvain Thery's avatar
Sylvain Thery committed
66
class CGoGN_UTILS_API SimpleQT : public QMainWindow
Sylvain Thery's avatar
Sylvain Thery committed
67 68 69 70 71
{
	Q_OBJECT

public:
	SimpleQT();
72

73
	SimpleQT(const SimpleQT&) ;
Sylvain Thery's avatar
Sylvain Thery committed
74 75 76

	virtual ~SimpleQT();

77 78
	void operator=(const SimpleQT& v) ;

Sylvain Thery's avatar
Sylvain Thery committed
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
	/**
	 * set the main widget of the dock
	 */
//	void setDockWidget(QWidget *wdg);
	void setDock(QDockWidget *dock);

	/**
	 * set the main widget of the dock
	 */
	QDockWidget* dockWidget();

	/**
	 * connect a widget/signal with a method of inherited object
	 * @param sender the widget sending signal
	 * @param signal use macro SIGNAL(qt_signal)
	 * @param method use macro SLOT(name_of_method(params))
	 */
Pierre Kraemer's avatar
Pierre Kraemer committed
96
	void setCallBack(const QObject* sender, const char* signal, const char* method);
Sylvain Thery's avatar
Sylvain Thery committed
97 98 99 100 101 102 103 104 105 106 107

	/**
	 * set window Title
	 */
	void windowTitle(const char* windowTitle);

	/**
	 * set dock Title
	 */
	void dockTitle(const char* dockTitle);

108 109
	/**
	 * draw a message in status bar
Sylvain Thery's avatar
Sylvain Thery committed
110 111
	 * @param msg message in C format (if NULL swp show/hidden)
	 * @param timeoutms number of ms message stay (0 = until next msg)
112
	 */
Pierre Kraemer's avatar
merge..  
Pierre Kraemer committed
113 114
	void statusMsg(const char* msg, int timeoutms = 0);

Sylvain Thery's avatar
Sylvain Thery committed
115 116 117 118 119 120 121 122 123 124
	/**
	 * add an empty dock to the window
	 */
	QDockWidget* addEmptyDock();

	/**
	 * change dock visibility
	 */
	void visibilityDock(bool visible);

Sylvain Thery's avatar
Sylvain Thery committed
125 126 127 128 129 130 131 132 133
	/**
	 * change console visibility
	 */
	void visibilityConsole(bool visible);

	/**
	 * change dock visibility
	 */
	void toggleVisibilityDock();
Pierre Kraemer's avatar
merge..  
Pierre Kraemer committed
134

Sylvain Thery's avatar
Sylvain Thery committed
135 136 137 138 139
	/**
	 * change console visibility
	 */
	void toggleVisibilityConsole();

Sylvain Thery's avatar
Sylvain Thery committed
140 141
	/**
	 * add an entry to popup menu
142 143
	 * @param label label printed in menu
	 * @param method qt slot (function name)
Sylvain Thery's avatar
Sylvain Thery committed
144
	 */
Pierre Kraemer's avatar
merge..  
Pierre Kraemer committed
145
	void add_menu_entry(const std::string label, const char* method);
Sylvain Thery's avatar
Sylvain Thery committed
146 147 148 149 150 151 152 153 154 155 156

	/**
	 * re-initialize popup menu
	 */
	void init_app_menu();

	/**
	 * set the help message
	 */
	void setHelpMsg(const std::string& msg);

157 158 159 160 161 162
	/**
	 * set mouse tracking on the GLWidget
	 * if true : mouseMove events are generated for each mouse move
	 * if false : mouseMove events are only generated when a button is pressed
	 */
	void setGLWidgetMouseTracking(bool b);
163
	
164

Sylvain Thery's avatar
Sylvain Thery committed
165
protected:
Pierre Kraemer's avatar
Pierre Kraemer committed
166
	GLWidget* m_glWidget;
167

Pierre Kraemer's avatar
Pierre Kraemer committed
168
	QDockWidget* m_dock;
169

Pierre Kraemer's avatar
Pierre Kraemer committed
170
	QDockWidget* m_dockConsole;
Sylvain Thery's avatar
Sylvain Thery committed
171 172 173

	QTextEdit* m_textConsole;

Sylvain Thery's avatar
Sylvain Thery committed
174
	bool m_dockOn;
175 176

	// mouse & matrix
177 178 179 180 181 182 183 184 185
	Utils::GL_Matrices m_mat;

	/// ref to projection matrix
	glm::mat4& m_projection_matrix;
	/// ref to modelview matrix
	glm::mat4& m_modelView_matrix;
	/// ref to transformation matrix
	glm::mat4& m_transfo_matrix;

186 187 188 189 190
	float m_curquat[4];
	float m_lastquat[4];
	float m_trans_x;
	float m_trans_y;
	float m_trans_z;
Sylvain Thery's avatar
Sylvain Thery committed
191 192

	QMenu* m_fileMenu;
193

Sylvain Thery's avatar
Sylvain Thery committed
194
	QMenu* m_appMenu;
195

Sylvain Thery's avatar
Sylvain Thery committed
196 197
	std::string m_helpString;

198 199
	std::stack<glm::mat4> m_stack_trf;

200
	void closeEvent(QCloseEvent *event);
201

202 203 204
	void keyPressEvent(QKeyEvent *event);

	void keyReleaseEvent(QKeyEvent *e);
205
	
Sylvain Thery's avatar
Sylvain Thery committed
206 207 208 209
public:
	/**
	 * set width and pos center of object to draw
	 */
Sylvain Thery's avatar
Sylvain Thery committed
210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228
	template<typename T>
	inline void setParamObject(T width, T* pos)
	{
		float posF[3];
		posF[0]=float(pos[0]);
		posF[1]=float(pos[1]);
		posF[2]=float(pos[2]);
		m_glWidget->setParamObject(float(width), posF);
	}

	template<typename T>
	inline void resetCenterOfRotation(T width, T* pos)
	{
		float posF[3];
		posF[0]=float(pos[0]);
		posF[1]=float(pos[1]);
		posF[2]=float(pos[2]);
		m_glWidget->resetCenterOfRotation(float(width), posF);
	}
Sylvain Thery's avatar
Sylvain Thery committed
229

230

231 232 233 234 235
	/**
	 * make the contex of glWidget current
	 */
	void makeCurrent() { m_glWidget->makeCurrent();}

236 237 238 239 240
	/**
	 * set focal
	 */
	void setFocal(float f) { m_glWidget->setFocal(f); }

241 242 243 244 245 246

	/**
	 * set geometry (override buggy Qt function)
	 */
	void setGeometry(int x, int y, int w, int h);

247 248 249 250 251 252 253 254 255
	/**
	 * get the mouse position in GL widget
	 */
	void glMousePosition(int& x, int& y);

	/**
	 * get a ray (2 points) from a pick point in GL area
	 * @param x mouse position
	 * @param y mouse position
256
	 * @param rayA first computed point of ray
257
	 * @param rayB second computed point of ray
258 259 260
	 * @param radius radius on pixel for clicking precision
	 * @return the distance in modelview world corresponding to radius pixel in screen
	 */
261
	GLfloat getOrthoScreenRay(int x, int y, Geom::Vec3f& rayA, Geom::Vec3f& rayB, int radius=4) { return m_glWidget->getOrthoScreenRay(x,y,rayA,rayB,radius);}
262

263 264 265 266 267
	/**
	 * transform a pixel distance on screen in distance in world
	 * @param pixel_width width on pixel on screen
	 * @param center reference point on world to use (defaut 0,0,0)
	 */
268
	float getWidthInWorld(unsigned int pixel_width, const Geom::Vec3f& center) { return m_glWidget->getWidthInWorld(pixel_width,center);}
269 270


271 272 273
	const glm::mat4& transfoMatrix() const { return m_transfo_matrix; }
	glm::mat4& transfoMatrix() { return m_transfo_matrix; }

Sylvain Thery's avatar
Sylvain Thery committed
274 275 276
	/**
	 * current modelview matrix
	 */
277 278
	const glm::mat4& modelViewMatrix() const { return m_modelView_matrix; }
	glm::mat4& modelViewMatrix() { return m_modelView_matrix; }
Sylvain Thery's avatar
Sylvain Thery committed
279 280 281 282

	/**
	 * current projection matrix
	 */
283 284
	const glm::mat4& projectionMatrix() const { return m_projection_matrix; }
	glm::mat4& projectionMatrix() { return m_projection_matrix; }
Sylvain Thery's avatar
Sylvain Thery committed
285

Pierre Kraemer's avatar
merge..  
Pierre Kraemer committed
286 287
	float* curquat() { return m_curquat; }
	float* lastquat() { return m_lastquat; }
288

Pierre Kraemer's avatar
merge..  
Pierre Kraemer committed
289 290 291
	float& trans_x() { return m_trans_x; }
	float& trans_y() { return m_trans_y; }
	float& trans_z() { return m_trans_z; }
292

293 294
//	glm::mat4* matricesPtr() { return  m_mat.m_matrices;}
	Utils::GL_Matrices* matricesPtr() { return &m_mat;}
Sylvain Thery's avatar
Sylvain Thery committed
295 296 297 298
	/**
	 * shift key pressed ?
	 */
	bool Shift() const { return m_glWidget->Shift(); }
299

Sylvain Thery's avatar
Sylvain Thery committed
300 301 302 303 304 305 306 307 308 309 310
	/**
	 * control key pressed ?
	 */
	bool Control() const { return m_glWidget->Control(); }

	/**
	 * alt key pressed ?
	 */
	bool Alt() const  { return m_glWidget->Alt(); }

	/**
Thery Sylvain's avatar
Thery Sylvain committed
311
	 * height of OpenGL widget (for classic yy = H-y)
Sylvain Thery's avatar
Sylvain Thery committed
312
	 */
Pierre Kraemer's avatar
merge..  
Pierre Kraemer committed
313
	int getHeight() const { return m_glWidget->getHeight(); }
Sylvain Thery's avatar
Sylvain Thery committed
314

Thery Sylvain's avatar
Thery Sylvain committed
315 316 317 318 319 320
	/**
	 * width of OpenGL widget
	 */
	int getWidth() const { return m_glWidget->getWidth(); }


Sylvain Thery's avatar
Sylvain Thery committed
321 322 323
	/**
	 * console QTextEdit ptr
	 */
Pierre Kraemer's avatar
merge..  
Pierre Kraemer committed
324
	QTextEdit* console() { return m_textConsole; }
Sylvain Thery's avatar
Sylvain Thery committed
325 326 327 328

	/**
	 * syncronization between SimpleQTs (experimental)
	 */
329 330 331 332 333 334
	void synchronize(SimpleQT* sqt);

	/**
	 * Register a shader as running in this Widget.
	 * Needed for automatic matrices update
	 */
Pierre Kraemer's avatar
merge..  
Pierre Kraemer committed
335
	void registerShader(GLSLShader* ptr);
336 337 338 339

	/**
	 * Unregister a shader as running in this Widget.
	 */
Pierre Kraemer's avatar
merge..  
Pierre Kraemer committed
340
	void unregisterShader(GLSLShader* ptr);
341

Sylvain Thery's avatar
Sylvain Thery committed
342 343 344 345 346 347 348 349 350 351 352 353 354
	/**
	 * GL initialization CB (context is ok)
	 */
	virtual void cb_initGL() {}

	/**
	 * what to you want to draw ? (need to be implemented)
	 */
	virtual void cb_redraw() = 0;

	/**
	 * Mouse button has been pressed
	 */
355
	virtual void cb_mousePress(int /*button*/, int /*x*/, int /*y*/) {}
Sylvain Thery's avatar
Sylvain Thery committed
356 357 358 359

	/**
	 * Mouse button has been released
	 */
360
	virtual void cb_mouseRelease(int /*button*/, int /*x*/, int /*y*/) {}
Sylvain Thery's avatar
Sylvain Thery committed
361

362 363 364
	/**
	 * Mouse button has been clicked
	 */
365
	virtual void cb_mouseClick(int /*button*/, int /*x*/, int /*y*/) {}
366

Sylvain Thery's avatar
Sylvain Thery committed
367
	/**
368
	 * the mouse has been move (with buttons still pressed)
Sylvain Thery's avatar
Sylvain Thery committed
369
	 */
370
	virtual void cb_mouseMove(int /*buttons*/, int /*x*/, int /*y*/) {}
Sylvain Thery's avatar
Sylvain Thery committed
371

Pierre Kraemer's avatar
Pierre Kraemer committed
372 373 374
	/**
	 * the mouse has been move (with button still pressed)
	 */
375
	virtual void cb_wheelEvent(int /*delta*/, int /*x*/, int /*y*/) {}
Pierre Kraemer's avatar
Pierre Kraemer committed
376

Sylvain Thery's avatar
Sylvain Thery committed
377 378 379
	/**
	 * key press CB (context is ok)
	 */
380
	virtual void cb_keyPress(int /*code*/) {}
Sylvain Thery's avatar
Sylvain Thery committed
381 382 383 384

	/**
	 * key releaase CB (context is ok)
	 */
385
	virtual void cb_keyRelease(int /*code*/) {}
Sylvain Thery's avatar
Sylvain Thery committed
386 387 388 389

	/**
	 * matrices need to be updated (context is ok)
	 */
390
	virtual void cb_updateMatrix();
Sylvain Thery's avatar
Sylvain Thery committed
391 392 393 394

	/**
	 * end of program, some things to clean ?
	 */
395
	virtual void cb_exit() {}
Sylvain Thery's avatar
Sylvain Thery committed
396 397 398 399 400 401 402

	/**
	 * Ask to Qt to update the GL widget.
	 * Equivalent of glutPostRedisplay()
	 */
	void updateGL();

403 404 405 406 407
	/**
	 * Ask to Qt to update matrices and then the GL widget.
	 */
	void updateGLMatrices();

408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432
	/**
	 * apply rotation to transformation matrix
	 */
	void transfoRotate(float angle, float x, float y, float z);

	/**
	 * apply translation to transformation matrix
	 */
	void transfoTranslate(float tx, float ty, float tz);

	/**
	 * apply scale to transformation matrix
	 */
	void transfoScale(float sx, float sy, float sz);

	/**
	 * push the transfo matrix on stack
	 */
	void pushTransfoMatrix();

	/**
	 * pop the transfo matrix from stack
	 */
	bool popTransfoMatrix();

433 434 435 436 437 438
	/**
	 * Open a file selector and return the filename
	 * @param title title of window
	 * @param dir base directory
	 * @param filters file filters (syntax: "label1 (filter1);; label2 (filter2);; ...")
	 */
439
	std::string selectFile(const std::string& title = "open file", const std::string& dir = ".", const std::string& filters = "all (*.*)");
440

441 442 443 444 445 446
	/**
	 * Open a file selector and return the filename (for saving a file)
	 * @param title title of window
	 * @param dir base directory
	 * @param filters file filters (syntax: "label1 (filter1);; label2 (filter2);; ...")
	 */
447
	std::string selectFileSave(const std::string& title = "save file", const std::string& dir =  ".", const std::string& filters = "all (*.*)");
448

449
	void snapshot(const QString& filename, const char* format = 0, const int& quality = -1);
Sylvain Thery's avatar
Sylvain Thery committed
450

451 452 453 454 455

    void exportPOV2file(const QString& filename);

    void importFile2POV(const QString& filename);

Pierre Kraemer's avatar
merge..  
Pierre Kraemer committed
456 457 458 459 460
public slots:
	virtual void cb_New() { std::cerr << "callback not implemented" << std::endl; }
	virtual void cb_Open() { std::cerr << "callback not implemented" << std::endl; }
	virtual void cb_Save() { std::cerr << "callback not implemented" << std::endl; }
	virtual void cb_Quit() { exit(0); }
Sylvain Thery's avatar
Sylvain Thery committed
461 462
	void cb_about_cgogn();
	void cb_about();
Pierre Kraemer's avatar
merge..  
Pierre Kraemer committed
463 464
	void cb_consoleOnOff() { toggleVisibilityConsole(); }
	void cb_consoleClear() { m_textConsole->clear(); }
Sylvain Thery's avatar
Sylvain Thery committed
465 466
};

Pierre Kraemer's avatar
merge..  
Pierre Kraemer committed
467
} // namespace QT
Sylvain Thery's avatar
Sylvain Thery committed
468

Pierre Kraemer's avatar
merge..  
Pierre Kraemer committed
469
} // namespace Utils
Sylvain Thery's avatar
Sylvain Thery committed
470

Pierre Kraemer's avatar
merge..  
Pierre Kraemer committed
471
} // namespace CGoGN
Sylvain Thery's avatar
Sylvain Thery committed
472 473

#endif