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