From 889c41c04fff9809ba3065cade3b2a1a3bf5e2a8 Mon Sep 17 00:00:00 2001 From: Olivier Lagrasse <olivier.lagrasse@gmail.com> Date: Mon, 2 Feb 2009 11:57:43 +0000 Subject: [PATCH] interface : widget 3D + resolution probleme de chemins relatifs --- interface/Makefile | 10 +- interface/bin/info_window.ui | 60 ---------- interface/bin/vite.qrc | 7 -- .../{bin => src/icon}/folder_yellow_open.png | Bin interface/{bin => src/icon}/help_index.png | Bin interface/{bin/no.png => src/icon/quit.png} | Bin interface/src/img/logo.png | Bin 0 -> 15225 bytes interface/src/info_window.ui | 106 ++++++++++++++++++ interface/src/interface_graphic.cpp | 23 ++-- interface/src/interface_graphic.hpp | 19 +++- interface/{bin => src}/main_window.ui | 26 +---- interface/src/render_area.cpp | 76 ++++++++++++- interface/src/render_area.hpp | 33 +++++- interface/src/resource.hpp | 6 +- interface/src/vite.qrc | 14 +++ 15 files changed, 270 insertions(+), 110 deletions(-) delete mode 100644 interface/bin/info_window.ui delete mode 100644 interface/bin/vite.qrc rename interface/{bin => src/icon}/folder_yellow_open.png (100%) rename interface/{bin => src/icon}/help_index.png (100%) rename interface/{bin/no.png => src/icon/quit.png} (100%) create mode 100644 interface/src/img/logo.png create mode 100644 interface/src/info_window.ui rename interface/{bin => src}/main_window.ui (87%) create mode 100644 interface/src/vite.qrc diff --git a/interface/Makefile b/interface/Makefile index cc1c662b..e53473d2 100644 --- a/interface/Makefile +++ b/interface/Makefile @@ -27,7 +27,7 @@ doc: rebuild: - cd ./src && qmake-qt4 -project "TARGET=vite" "OBJECTS_DIR=../bin" "DESTDIR=../bin" "CONFIG+=uitools" "QT+=opengl" && qmake-qt4 -makefile -o Makefile src.pro && make all + cd ./src && qmake-qt4 -project "RESOURCES= vite.qrc" "OBJECTS_DIR=../bin" "DESTDIR=../bin" "CONFIG+=uitools" "QT+=opengl" && qmake-qt4 -makefile -o Makefile src.pro && make all @echo " " @echo "Rebuilt and compiled! (release)" @echo " " @@ -41,7 +41,7 @@ plugins: debugs: - cd ./src && qmake-qt4 -project && qmake-qt4 -makefile -o Makefile "OBJECTS_DIR=../debug" "CONFIG+=uitools debug console" "QT+=opengl" "DESTDIR = ../debug" src.pro && make all + cd ./src && qmake-qt4 -project && qmake-qt4 -makefile -o Makefile "RESOURCES= vite.qrc" "OBJECTS_DIR=../debug" "CONFIG+=uitools debug console" "QT+=opengl" "DESTDIR = ../debug" src.pro && make all mv src/*.o bin/ @echo " " @echo "Compilation completed! (debug)" @@ -49,7 +49,7 @@ debugs: tests: rebuild - cd ./tests && qmake-qt4 -project && qmake-qt4 -makefile -o Makefile "OBJECTS_DIR=../bin" "CONFIG+=uitools" "QT+= opengl" "DESTDIR = ../bin" tests.pro && make all + cd ./tests && qmake-qt4 -project && qmake-qt4 -makefile -o Makefile "RESOURCES= vite.qrc" "OBJECTS_DIR=../bin" "CONFIG+=uitools" "QT+= opengl" "DESTDIR = ../bin" tests.pro && make all mv tests/*.o bin/ @echo " " @echo "Compilation completed! (test)" @@ -64,7 +64,7 @@ clean: # Must be called with option -i, otherwise an error occured in the first instructions, the followings won't be executed. wash: - cd ./src && rm *~ *.o *pro Makefile - cd ./tests && rm *~ *.o *pro Makefile + cd ./src && rm *~ *.o *pro Makefile qrc_vite.cpp core + cd ./tests && rm *~ *.o *pro Makefile core cd ./bin && rm *.o cd ./debug && rm * diff --git a/interface/bin/info_window.ui b/interface/bin/info_window.ui deleted file mode 100644 index 273264fb..00000000 --- a/interface/bin/info_window.ui +++ /dev/null @@ -1,60 +0,0 @@ -<ui version="4.0" > - <class>info_window_2</class> - <widget class="QMainWindow" name="info_window_2" > - <property name="geometry" > - <rect> - <x>0</x> - <y>0</y> - <width>607</width> - <height>187</height> - </rect> - </property> - <property name="windowTitle" > - <string>Informations</string> - </property> - <widget class="QWidget" name="centralwidget" > - <layout class="QHBoxLayout" name="horizontalLayout_2" > - <item> - <layout class="QHBoxLayout" name="horizontalLayout" > - <item> - <widget class="QGroupBox" name="groupBox" > - <property name="maximumSize" > - <size> - <width>300</width> - <height>16777215</height> - </size> - </property> - <property name="focusPolicy" > - <enum>Qt::StrongFocus</enum> - </property> - <property name="title" > - <string>Trace Resume</string> - </property> - </widget> - </item> - <item> - <widget class="QGroupBox" name="info_window" > - <property name="title" > - <string>Selection Informations</string> - </property> - </widget> - </item> - </layout> - </item> - </layout> - </widget> - <widget class="QMenuBar" name="menubar" > - <property name="geometry" > - <rect> - <x>0</x> - <y>0</y> - <width>607</width> - <height>26</height> - </rect> - </property> - </widget> - <widget class="QStatusBar" name="statusbar" /> - </widget> - <resources/> - <connections/> -</ui> diff --git a/interface/bin/vite.qrc b/interface/bin/vite.qrc deleted file mode 100644 index 3b43f1da..00000000 --- a/interface/bin/vite.qrc +++ /dev/null @@ -1,7 +0,0 @@ -<RCC> - <qresource prefix="icon_menu" > - <file>folder_yellow_open.png</file> - <file>no.png</file> - <file>help_index.png</file> - </qresource> -</RCC> diff --git a/interface/bin/folder_yellow_open.png b/interface/src/icon/folder_yellow_open.png similarity index 100% rename from interface/bin/folder_yellow_open.png rename to interface/src/icon/folder_yellow_open.png diff --git a/interface/bin/help_index.png b/interface/src/icon/help_index.png similarity index 100% rename from interface/bin/help_index.png rename to interface/src/icon/help_index.png diff --git a/interface/bin/no.png b/interface/src/icon/quit.png similarity index 100% rename from interface/bin/no.png rename to interface/src/icon/quit.png diff --git a/interface/src/img/logo.png b/interface/src/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f98673cce751ae30c3833bea446d6fa6c5a5512b GIT binary patch literal 15225 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 P0|SGntDnm{r-UW|G=K(+ literal 0 HcmV?d00001 diff --git a/interface/src/info_window.ui b/interface/src/info_window.ui new file mode 100644 index 00000000..7cef83ff --- /dev/null +++ b/interface/src/info_window.ui @@ -0,0 +1,106 @@ +<ui version="4.0" > + <class>info_window</class> + <widget class="QMainWindow" name="info_window" > + <property name="geometry" > + <rect> + <x>0</x> + <y>0</y> + <width>607</width> + <height>187</height> + </rect> + </property> + <property name="windowTitle" > + <string>Informations</string> + </property> + <widget class="QWidget" name="centralwidget" > + <layout class="QHBoxLayout" name="horizontalLayout_2" > + <item> + <layout class="QHBoxLayout" name="horizontalLayout" > + <item> + <widget class="QGroupBox" name="info_trace" > + <property name="maximumSize" > + <size> + <width>300</width> + <height>16777215</height> + </size> + </property> + <property name="focusPolicy" > + <enum>Qt::StrongFocus</enum> + </property> + <property name="title" > + <string>Trace Resume</string> + </property> + <widget class="QTextEdit" name="info_trace_text" > + <property name="geometry" > + <rect> + <x>10</x> + <y>20</y> + <width>271</width> + <height>91</height> + </rect> + </property> + <property name="readOnly" > + <bool>true</bool> + </property> + <property name="html" > + <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Trace informations</p></body></html></string> + </property> + <property name="textInteractionFlags" > + <set>Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set> + </property> + </widget> + </widget> + </item> + <item> + <widget class="QGroupBox" name="info_selection" > + <property name="title" > + <string>Selection Informations</string> + </property> + <widget class="QTextEdit" name="info_selection_text" > + <property name="geometry" > + <rect> + <x>10</x> + <y>20</y> + <width>271</width> + <height>91</height> + </rect> + </property> + <property name="readOnly" > + <bool>true</bool> + </property> + <property name="html" > + <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Selection informations</p></body></html></string> + </property> + <property name="textInteractionFlags" > + <set>Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set> + </property> + </widget> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + <widget class="QMenuBar" name="menubar" > + <property name="geometry" > + <rect> + <x>0</x> + <y>0</y> + <width>607</width> + <height>26</height> + </rect> + </property> + </widget> + <widget class="QStatusBar" name="statusbar" /> + </widget> + <resources/> + <connections/> +</ui> diff --git a/interface/src/interface_graphic.cpp b/interface/src/interface_graphic.cpp index bbbe9a0c..425e6a71 100644 --- a/interface/src/interface_graphic.cpp +++ b/interface/src/interface_graphic.cpp @@ -19,31 +19,38 @@ Interface_graphic::Interface_graphic(QWidget *parent):QWidget(parent){ QFile file_info(UI_INFO_WINDOW_NAME); - + /* Load the main window from a .ui file */ file_main.open(QFile::ReadOnly); CKFP(_ui_main_window = loader.load(&file_main, this), "Cannot open the .ui file : " << UI_MAIN_WINDOW_NAME); file_main.close(); + /* Load the informative window from a .ui file */ file_info.open(QFile::ReadOnly); CKFP(_ui_info_window = loader.load(&file_info, _ui_main_window), "Cannot open the .ui file : " << UI_MAIN_WINDOW_NAME); file_info.close(); - + /* Set some windows properties */ _ui_info_window->setWindowOpacity(0.7);/* Change alpha value of the informative window */ - _ui_info_window->setWindowFlags(_ui_info_window->windowFlags() | Qt::CustomizeWindowHint);/* Always display info_window on top */ + _ui_info_window->setWindowFlags(_ui_info_window->windowFlags() | Qt::WindowStaysOnTopHint);/* Always display info_window on top */ - CKFP(_ui_render_area = qFindChild<QWidget*>(this, "render_area"), "Cannot find the render_area QWidget in the .ui file"); + /* Load widget from the .ui file */ + CKFP(_ui_render_area_layout = qFindChild<QVBoxLayout*>(this, "render_area_layout"), "Cannot find the render_area layout in the .ui file"); CKFP(_ui_fullscreen_menu = qFindChild<QAction*>(this, "fullscreen"), "Cannot find the fullscreen menu in the .ui file"); - + CKFP(_ui_info_trace_text = qFindChild<QTextEdit*>(this, "info_trace_text"), "Cannot find the info_trace_text QTextEdit widget in the .ui file"); + + /* Create the render area and bind it to a layout (_ui_render_area_layout) */ + _ui_render_area = new Render_area(); + _ui_render_area_layout->addWidget(_ui_render_area); /* Special function of Qt which allows methods declared as slots and which name are 'on_[widget]_[action]()' to be called when the 'widget' triggered the signal corresponding to 'action'. */ QMetaObject::connectSlotsByName(this); - _ui_main_window->show();/* Display the main window */ - _ui_info_window->show();/* Display the info window */ + /* Display both the main and informative windows */ + _ui_main_window->show(); + _ui_info_window->show(); } @@ -59,6 +66,8 @@ void Interface_graphic::error(const string s) const{ void Interface_graphic::warning(const string s) const{ + QString buf = s.c_str(); + _ui_info_trace_text->insertHtml(buf+"<br />"); } diff --git a/interface/src/interface_graphic.hpp b/interface/src/interface_graphic.hpp index 85e232a2..3302c72e 100644 --- a/interface/src/interface_graphic.hpp +++ b/interface/src/interface_graphic.hpp @@ -8,6 +8,7 @@ #include "interface.hpp" +#include "render_area.hpp" /*! @@ -38,7 +39,23 @@ class Interface_graphic : public QWidget, public Interface{ /*! * \brief This variable contains the OpenGL render area. */ - QWidget* _ui_render_area; + Render_area* _ui_render_area; + + /*! + * \brief Layout which will contain the render area. + */ + QVBoxLayout* _ui_render_area_layout; + + /*! + * \brief Text area which informs the user about the trace resume. + */ + QTextEdit* _ui_info_trace_text; + + /*! + * \brief The parser attribute. + */ + // Parser* _parser; + public: diff --git a/interface/bin/main_window.ui b/interface/src/main_window.ui similarity index 87% rename from interface/bin/main_window.ui rename to interface/src/main_window.ui index 4b3871bf..ff631407 100644 --- a/interface/bin/main_window.ui +++ b/interface/src/main_window.ui @@ -132,18 +132,7 @@ </layout> </item> <item> - <layout class="QVBoxLayout" name="verticalLayout" > - <item> - <widget class="Render_area" name="render_area" > - <property name="toolTip" > - <string>Render area</string> - </property> - <property name="whatsThis" > - <string>An OpenGL render area for ViTE.</string> - </property> - </widget> - </item> - </layout> + <layout class="QVBoxLayout" name="render_area_layout" /> </item> </layout> </widget> @@ -188,7 +177,7 @@ <action name="open" > <property name="icon" > <iconset resource="vite.qrc" > - <normaloff>:/icon_menu/folder_yellow_open.png</normaloff>:/icon_menu/folder_yellow_open.png</iconset> + <normaloff>:/icon/icon/folder_yellow_open.png</normaloff>:/icon/icon/folder_yellow_open.png</iconset> </property> <property name="text" > <string>&Open</string> @@ -202,7 +191,7 @@ <action name="quit" > <property name="icon" > <iconset resource="vite.qrc" > - <normaloff>:/icon_menu/no.png</normaloff>:/icon_menu/no.png</iconset> + <normaloff>:/icon/icon/quit.png</normaloff>:/icon/icon/quit.png</iconset> </property> <property name="text" > <string>&Quit</string> @@ -214,7 +203,7 @@ </property> <property name="icon" > <iconset resource="vite.qrc" > - <normaloff>:/icon_menu/help_index.png</normaloff>:/icon_menu/help_index.png</iconset> + <normaloff>:/icon/icon/help_index.png</normaloff>:/icon/icon/help_index.png</iconset> </property> <property name="text" > <string>&Help</string> @@ -237,13 +226,6 @@ </property> </action> </widget> - <customwidgets> - <customwidget> - <class>Render_area</class> - <extends></extends> - <header>analogclock.h</header> - </customwidget> - </customwidgets> <resources> <include location="vite.qrc" /> </resources> diff --git a/interface/src/render_area.cpp b/interface/src/render_area.cpp index a3736b81..2cf34625 100644 --- a/interface/src/render_area.cpp +++ b/interface/src/render_area.cpp @@ -10,8 +10,80 @@ Render_area::Render_area(QWidget *parent) : QGLWidget(parent) -{} +{ + + rot=0.0f; + + QTimer *timer = new QTimer(this); + connect(timer, SIGNAL(timeout()), this, SLOT(updateGL())); + timer->start(10); + + + +} Render_area::~Render_area() - {} + { + glDeleteLists(object, 1); + } + + +void Render_area::initializeGL() +{ + glClearColor(1.0f, 1.0f, 1.0f, 1.0f); + + object = glGenLists(1); + glNewList(object, GL_COMPILE); + { + glBegin(GL_QUADS); + { + + glColor3ub(255,0,0); //red face + glVertex3d(1,1,1); + glVertex3d(1,1,-1); + glVertex3d(-1,1,-1); + glVertex3d(-1,1,1); + } + glEnd(); + } + glEndList(); + + glEnable(GL_DEPTH_TEST); + +} + +void Render_area::resizeGL(int width, int height) +{ + int side = qMin(width, height); + glViewport((width - side) / 2, (height - side) / 2, side, side); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(-15, +15, +15, -15, -10, 15.0); + glMatrixMode(GL_MODELVIEW); +} + +void Render_area::paintGL() +{ + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glLoadIdentity(); + gluLookAt(0,0,2,0,0,0,0,1,0); + + glRotatef(rot, 0.0f, 1.0f, 0.0f); + + rot+=1.0f; + if (rot>1000.0f) rot=0.0f; + + + + glCallList(object); + + + + + glFlush(); + +} diff --git a/interface/src/render_area.hpp b/interface/src/render_area.hpp index 7f5b6bfc..1f04f4aa 100644 --- a/interface/src/render_area.hpp +++ b/interface/src/render_area.hpp @@ -5,15 +5,42 @@ #ifndef RENDER_AREA_HPP #define RENDER_AREA_HPP -#include <QGLWidget> -// #include <QWidget> - #include <QtDesigner/QDesignerExportWidget> +#include "resource.hpp" + + + +#include <QtDesigner/QDesignerExportWidget> class QDESIGNER_WIDGET_EXPORT Render_area : public QGLWidget { Q_OBJECT + protected: + + GLuint object; + float rot; + GLuint texture; + + + /*! + * \brief Call by the system to initialize the OpenGL render area. + */ + void initializeGL(); + + /*! + * \brief Call by the system when the render area was resized (occurs during a window resizement). + * \arg width : the new width of the render area. + * height : the new height of the render area. + */ + void resizeGL(int width, int height); + + /*! + * \brief Call by the system each time the render area need to be updated. + */ + void paintGL(); + public: + /*! * \brief The default constructor */ diff --git a/interface/src/resource.hpp b/interface/src/resource.hpp index 17497daa..1bcd3768 100644 --- a/interface/src/resource.hpp +++ b/interface/src/resource.hpp @@ -20,9 +20,9 @@ using namespace std; - -#define UI_MAIN_WINDOW_NAME "main_window.ui"/* name of the main window ui file. This file must be included in the same folder than the compiled program. */ -#define UI_INFO_WINDOW_NAME "info_window.ui"/* name of the info window ui file. This file must be included in the same folder than the compiled program. */ +/* These paths corresponding to the path in the resource file ('vite.qrc' in the 'bin' folder) */ +#define UI_MAIN_WINDOW_NAME ":/window/main_window.ui"/* The main window ui file. */ +#define UI_INFO_WINDOW_NAME ":/window/info_window.ui"/* The info window ui file. */ diff --git a/interface/src/vite.qrc b/interface/src/vite.qrc new file mode 100644 index 00000000..8a536493 --- /dev/null +++ b/interface/src/vite.qrc @@ -0,0 +1,14 @@ +<RCC> + <qresource prefix="icon" > + <file>icon/folder_yellow_open.png</file> + <file>icon/help_index.png</file> + <file>icon/quit.png</file> + </qresource> + <qresource prefix="img" > + <file>img/logo.png</file> + </qresource> + <qresource prefix="window" > + <file>info_window.ui</file> + <file>main_window.ui</file> + </qresource> +</RCC> -- GitLab