0029571: Samples: build qt samples together with OCCT
[occt.git] / samples / qt / Common / src / DocumentCommon.cxx
1 #include "DocumentCommon.h"
2
3 #include "ApplicationCommon.h"
4 #include "Transparency.h"
5 #include "Material.h"
6
7 #include <QStatusBar>
8 #include <QApplication>
9 #include <QColor>
10 #include <QColorDialog>
11
12 #include <Aspect_DisplayConnection.hxx>
13 #include <AIS_InteractiveObject.hxx>
14 #include <Graphic3d_NameOfMaterial.hxx>
15 #include <OpenGl_GraphicDriver.hxx>
16 #if !defined(_WIN32) && !defined(__WIN32__) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX))
17 #include <OSD_Environment.hxx>
18 #endif
19 #include <TCollection_AsciiString.hxx>
20
21 // =======================================================================
22 // function : Viewer
23 // purpose  :
24 // =======================================================================
25 Handle(V3d_Viewer) DocumentCommon::Viewer (const Standard_ExtString ,
26                                            const Standard_CString ,
27                                            const Standard_Real theViewSize,
28                                            const V3d_TypeOfOrientation theViewProj,
29                                            const Standard_Boolean theComputedMode,
30                                            const Standard_Boolean theDefaultComputedMode )
31 {
32   static Handle(OpenGl_GraphicDriver) aGraphicDriver;
33
34   if (aGraphicDriver.IsNull())
35   {
36     Handle(Aspect_DisplayConnection) aDisplayConnection;
37 #if !defined(_WIN32) && !defined(__WIN32__) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX))
38     aDisplayConnection = new Aspect_DisplayConnection (OSD_Environment ("DISPLAY").Value());
39 #endif
40     aGraphicDriver = new OpenGl_GraphicDriver (aDisplayConnection);
41   }
42
43   Handle(V3d_Viewer) aViewer = new V3d_Viewer (aGraphicDriver);
44   aViewer->SetDefaultViewSize (theViewSize);
45   aViewer->SetDefaultViewProj (theViewProj);
46   aViewer->SetComputedMode (theComputedMode);
47   aViewer->SetDefaultComputedMode (theDefaultComputedMode);
48   return aViewer;
49 }
50
51 DocumentCommon::DocumentCommon( const int theIndex, ApplicationCommonWindow* app )
52 : QObject( app ),
53 myApp( app ),
54 myIndex( theIndex ),
55 myNbViews( 0 )
56 {
57   TCollection_ExtendedString a3DName ("Visu3D");
58
59   myViewer = Viewer (a3DName.ToExtString(), "", 1000.0, V3d_XposYnegZpos, Standard_True, Standard_True);
60
61   myViewer->SetDefaultLights();
62   myViewer->SetLightOn();
63
64   myContext = new AIS_InteractiveContext (myViewer);
65 }
66
67 DocumentCommon::~DocumentCommon()
68 {
69 }
70
71 ApplicationCommonWindow* DocumentCommon::getApplication()
72 {
73   return myApp;
74 }
75
76 MDIWindow* DocumentCommon::createNewMDIWindow()
77 {
78   QMdiArea* ws = myApp->getWorkspace();
79   return new MDIWindow (this, ws, 0);
80 }
81
82 void DocumentCommon::onCreateNewView()
83 {
84   QMdiArea* ws = myApp->getWorkspace();
85   MDIWindow* w = createNewMDIWindow();
86   
87   if (!w)
88     return;
89
90   ws->addSubWindow (w);
91   myViews.append (w);
92
93   connect( w,    SIGNAL( selectionChanged() ),
94            this, SIGNAL( selectionChanged() ) );
95   connect( w, SIGNAL( message( const QString&, int ) ),
96            myApp->statusBar(), SLOT( showMessage( const QString&, int ) ) );
97   connect( w, SIGNAL( sendCloseView( MDIWindow* ) ),
98            this, SLOT( onCloseView( MDIWindow* ) ) );
99
100   QString aName;
101   w->setWindowTitle( aName.sprintf( "Document %d:%d", myIndex, ++myNbViews ) );
102   QString dir = ApplicationCommonWindow::getResourceDir() + QString( "/" );
103   
104   w->setWindowIcon( QPixmap( dir + QObject::tr("ICON_DOC") ) );
105
106   if ( ws->subWindowList().isEmpty() )
107   {
108     // Due to strange Qt4.2.3 feature the child window icon is not drawn
109     // in the main menu if showMaximized() is called for a non-visible child window
110     // Therefore calling show() first...
111     w->show();
112     w->showMaximized();
113   }
114   else
115     w->show();
116
117   w->setFocus();
118
119   getApplication()->onSelectionChanged();
120 }
121
122 void DocumentCommon::onCloseView(MDIWindow* theView)
123 {
124     removeView(theView);
125     if( countOfWindow() == 0 )
126         emit sendCloseDocument( this );
127 }
128
129 void DocumentCommon::removeView(MDIWindow* theView)
130 {
131     if ( myViews.count( theView ) )
132     {
133     myViews.removeAll(theView);
134     delete theView;
135   }
136 }
137 void DocumentCommon::removeViews()
138 {
139   while( myViews.count() )
140   {
141     removeView( myViews.first() );
142   }
143 }
144
145 int DocumentCommon::countOfWindow()
146 {
147   return myViews.count();
148 }
149
150 Handle(AIS_InteractiveContext) DocumentCommon::getContext()
151 {
152   return myContext;
153 }
154
155 void DocumentCommon::fitAll()
156 {
157   QList<MDIWindow*>::iterator i;
158   for ( i = myViews.begin(); i != myViews.end(); i++ )
159     (*i)->fitAll();
160 }
161
162 void DocumentCommon::onWireframe()
163 {
164     QApplication::setOverrideCursor( Qt::WaitCursor );
165     for( myContext->InitSelected(); myContext->MoreSelected(); myContext->NextSelected() )
166         myContext->SetDisplayMode( myContext->SelectedInteractive(), 0, false );
167     myContext->UpdateCurrentViewer();
168     getApplication()->onSelectionChanged();
169     QApplication::restoreOverrideCursor();
170 }
171
172 void DocumentCommon::onShading()
173 {
174     QApplication::setOverrideCursor( Qt::WaitCursor );
175     for( myContext->InitSelected(); myContext->MoreSelected(); myContext->NextSelected() )
176         myContext->SetDisplayMode( myContext->SelectedInteractive(), 1, false );
177     myContext->UpdateCurrentViewer();
178     getApplication()->onSelectionChanged();
179     QApplication::restoreOverrideCursor();
180 }
181
182 void DocumentCommon::onColor()
183 {
184     QColor aColor ;
185     myContext->InitSelected();
186     Handle(AIS_InteractiveObject) Current = myContext->SelectedInteractive() ;
187     if ( Current->HasColor () )
188     {
189         Quantity_Color aShapeColor;
190         myContext->Color( Current, aShapeColor );
191         aColor.setRgb( aShapeColor.Red() * 255, aShapeColor.Green() * 255, aShapeColor.Blue() * 255 );
192     }
193     else
194         aColor.setRgb( 255, 255, 255 );
195
196     QColor aRetColor = QColorDialog::getColor( aColor );
197     if ( aRetColor.isValid() )
198     {
199         Quantity_Color color( aRetColor.red() / 255., aRetColor.green() / 255.,
200                         aRetColor.blue() / 255., Quantity_TOC_RGB );
201         for (; myContext->MoreSelected(); myContext->NextSelected() )
202             myContext->SetColor( myContext->SelectedInteractive(), color, Standard_False);
203         myContext->UpdateCurrentViewer();
204     }
205 }
206
207 void DocumentCommon::onMaterial( int theMaterial )
208 {
209     for ( myContext->InitSelected(); myContext->MoreSelected (); myContext->NextSelected () )
210         myContext->SetMaterial( myContext->SelectedInteractive(), (Graphic3d_NameOfMaterial)theMaterial, Standard_False);
211     myContext->UpdateCurrentViewer();
212 }
213
214 void DocumentCommon::onMaterial()
215 {
216     DialogMaterial* m = new DialogMaterial();
217     connect( m, SIGNAL( sendMaterialChanged( int ) ), this, SLOT( onMaterial( int ) ) );
218     m->exec();
219 }
220
221 void DocumentCommon::onTransparency( int theTrans )
222 {
223     for( myContext->InitSelected(); myContext->MoreSelected(); myContext->NextSelected() )
224         myContext->SetTransparency (myContext->SelectedInteractive(), ((Standard_Real)theTrans) / 10.0, Standard_False);
225     myContext->UpdateCurrentViewer();
226 }
227
228 void DocumentCommon::onTransparency()
229 {
230     DialogTransparency* aDialog = new DialogTransparency();
231     connect( aDialog, SIGNAL( sendTransparencyChanged( int ) ), this, SLOT( onTransparency( int ) ) );
232     aDialog->exec();
233 }
234
235 void DocumentCommon::onDelete()
236 {
237     myContext->EraseSelected (Standard_False);
238     myContext->ClearSelected (Standard_False);
239     myContext->UpdateCurrentViewer();
240     getApplication()->onSelectionChanged();
241 }