1 // Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 // File : GEOMToolsGUI_MaterialPropertiesDlg.cxx
20 // Author : Margarita KARPUNINA, Open CASCADE S.A.S. (margarita.karpunina@opencascade.com)
22 #include "GEOMToolsGUI_MaterialPropertiesDlg.h"
24 #include "Material_Model.h"
25 #include "Material_ResourceMgr.h"
27 #include <GeometryGUI.h>
28 #include <GEOM_Constants.h>
29 #include <GEOM_Displayer.h>
30 #include <GEOM_Actor.h>
34 #include <Basics_OCCTVersion.hxx>
36 #include <SALOME_ListIO.hxx>
37 #include <SALOME_ListIteratorOfListIO.hxx>
39 #include <SVTK_Functor.h>
41 #include <SVTK_ViewModel.h>
42 #include <SVTK_ViewWindow.h>
43 #include <SVTK_View.h>
45 #include <VTKViewer_Algorithm.h>
47 #include <OCCViewer_ViewModel.h>
49 #include <SUIT_Desktop.h>
50 #include <SUIT_MessageBox.h>
51 #include <SUIT_OverrideCursor.h>
52 #include <SUIT_ResourceMgr.h>
53 #include <SUIT_Session.h>
54 #include <SUIT_ViewManager.h>
56 #include <SalomeApp_Application.h>
57 #include <SalomeApp_Study.h>
59 #include <LightApp_SelectionMgr.h>
61 #include <QtxColorButton.h>
62 #include <QtxDoubleSpinBox.h>
65 #include <Graphic3d_AspectFillArea3d.hxx>
68 #include <vtkRenderer.h>
69 #include <vtkProperty.h>
72 #include <QApplication>
73 #include <QButtonGroup>
75 #include <QGridLayout>
77 #include <QHBoxLayout>
80 #include <QListWidget>
82 #include <QMessageBox>
83 #include <QPushButton>
86 #include <QVBoxLayout>
92 \class GEOMToolsGUI_MaterialPropertiesDlg
93 \brief GEOM material properties dialog box class.
95 The dialog box lists all GEOM materials available via the application and allows
96 user to create own materials.
101 \param parent parent widget
103 GEOMToolsGUI_MaterialPropertiesDlg::GEOMToolsGUI_MaterialPropertiesDlg( QWidget* parent )
104 : QtxDialog( parent, true, true, OK | Close | Apply | Help),
108 setWindowTitle( tr( "MATERIAL_PROPERTIES_TLT" ) );
111 SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
113 SUIT_ViewWindow* window = app->desktop()->activeWindow();
114 if ( window && window->getViewManager()->getType() == OCCViewer_Viewer::Type() )
116 else if ( window && window->getViewManager()->getType() == SVTK_Viewer::Type() )
120 // Create main layout
121 QVBoxLayout* main = new QVBoxLayout( mainFrame() );
122 main->setMargin( 0 ); main->setSpacing( SPACING );
124 // Create main widgets
125 myBackMaterialCheck = new QCheckBox( tr( "MATERIAL_BACK_CHK" ), this );
126 QFrame* fr = new QFrame( this );
127 fr->setFrameStyle( QFrame::Box | QFrame::Sunken );
129 main->addWidget( myBackMaterialCheck );
130 main->addWidget( fr );
132 // Create editor widgets
133 myMaterialList = new QListWidget( fr );
134 myMaterialTab = new QTabWidget( fr );
136 QHBoxLayout* frLayout = new QHBoxLayout( fr );
137 frLayout->setMargin( MARGIN ); frLayout->setSpacing( SPACING );
138 frLayout->addWidget( myMaterialList );
139 frLayout->addWidget( myMaterialTab );
140 frLayout->setStretchFactor( myMaterialList, 1 );
141 frLayout->setStretchFactor( myMaterialTab, 2 );
143 // ======================= Create a tab for front material =======================
144 QWidget* w1 = new QWidget( myMaterialTab );
145 QVBoxLayout* vLayout1 = new QVBoxLayout( w1 );
147 QGridLayout* gLayout1 = new QGridLayout( w1 );
148 gLayout1->setMargin( MARGIN ); gLayout1->setSpacing( SPACING );
150 // ----------------- "Ambient" reflection type group box -----------------
151 myAmbientGroupF = new QGroupBox( tr( "AMBIENT_GRP" ), w1 );
152 myAmbientGroupF->setCheckable(true);
153 connect( myAmbientGroupF, SIGNAL( toggled( bool ) ), this, SLOT( onReflectionTypeToggled( bool ) ) );
156 QLabel* ambColorLab1 = new QLabel( tr( "COLOR" ), myAmbientGroupF );
157 myAmbientColorF = new QtxColorButton( myAmbientGroupF );
158 myAmbientColorF->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
159 connect( myAmbientColorF, SIGNAL( changed( QColor ) ), this, SIGNAL( changed() ) );
161 // Ambient coefficient
162 QLabel* ambCoefficientLab1 = new QLabel( tr( "COEFFICIENT" ), myAmbientGroupF );
163 myAmbientCoefntF = new QtxDoubleSpinBox( myAmbientGroupF );
164 myAmbientCoefntF->setMaximum(1);
165 myAmbientCoefntF->setSingleStep(0.05);
166 connect( myAmbientCoefntF, SIGNAL( valueChanged( double ) ), this, SIGNAL( materialChanged() ) );
168 // Ambient group box layout
169 QGridLayout* ambientLayout1 = new QGridLayout( myAmbientGroupF );
170 ambientLayout1->setMargin( MARGIN ); ambientLayout1->setSpacing( SPACING );
171 ambientLayout1->addWidget( ambColorLab1, 0, 0 );
172 ambientLayout1->addWidget( myAmbientColorF, 0, 1 );
173 ambientLayout1->addWidget( ambCoefficientLab1, 1, 0 );
174 ambientLayout1->addWidget( myAmbientCoefntF, 1, 1 );
176 // ----------------- "Diffuse" reflection type group box -----------------
177 myDiffuseGroupF = new QGroupBox( tr( "DIFFUSE_GRP" ), w1 );
178 myDiffuseGroupF->setCheckable(true);
179 connect( myDiffuseGroupF, SIGNAL( toggled( bool ) ), this, SLOT( onReflectionTypeToggled( bool ) ) );
182 QLabel* difColorLab1 = new QLabel( tr( "COLOR" ), myDiffuseGroupF );
183 myDiffuseColorF = new QtxColorButton( myDiffuseGroupF );
184 myDiffuseColorF->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
185 connect( myDiffuseColorF, SIGNAL( changed( QColor ) ), this, SIGNAL( changed() ) );
187 // Diffuse coefficient
188 QLabel* difCoefficientLab1 = new QLabel( tr( "COEFFICIENT" ), myDiffuseGroupF );
189 myDiffuseCoefntF = new QtxDoubleSpinBox( myDiffuseGroupF );
190 myDiffuseCoefntF->setMaximum(1);
191 myDiffuseCoefntF->setSingleStep(0.05);
192 connect( myDiffuseCoefntF, SIGNAL( valueChanged( double ) ), this, SIGNAL( materialChanged() ) );
194 // Diffuse group box layout
195 QGridLayout* diffuseLayout1 = new QGridLayout( myDiffuseGroupF );
196 diffuseLayout1->setMargin( MARGIN ); diffuseLayout1->setSpacing( SPACING );
197 diffuseLayout1->addWidget( difColorLab1, 0, 0 );
198 diffuseLayout1->addWidget( myDiffuseColorF, 0, 1 );
199 diffuseLayout1->addWidget( difCoefficientLab1, 1, 0 );
200 diffuseLayout1->addWidget( myDiffuseCoefntF, 1, 1 );
202 // ----------------- "Specular" reflection type group box -----------------
203 mySpecularGroupF = new QGroupBox( tr( "SPECULAR_GRP" ), w1 );
204 mySpecularGroupF->setCheckable(true);
205 connect( mySpecularGroupF, SIGNAL( toggled( bool ) ), this, SLOT( onReflectionTypeToggled( bool ) ) );
208 QLabel* specColorLab1 = new QLabel( tr( "COLOR" ), mySpecularGroupF );
209 mySpecularColorF = new QtxColorButton( mySpecularGroupF );
210 mySpecularColorF->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
211 connect( mySpecularColorF, SIGNAL( changed( QColor ) ), this, SIGNAL( changed() ) );
213 // Specular coefficient
214 QLabel* specCoefficientLab1 = new QLabel( tr( "COEFFICIENT" ), mySpecularGroupF );
215 mySpecularCoefntF = new QtxDoubleSpinBox( mySpecularGroupF );
216 mySpecularCoefntF->setMaximum(1);
217 mySpecularCoefntF->setSingleStep(0.05);
218 connect( mySpecularCoefntF, SIGNAL( valueChanged( double ) ), this, SIGNAL( materialChanged() ) );
220 // Specular group box layout
221 QGridLayout* specularLayout1 = new QGridLayout( mySpecularGroupF );
222 specularLayout1->setMargin( MARGIN ); specularLayout1->setSpacing( SPACING );
223 specularLayout1->addWidget( specColorLab1, 0, 0 );
224 specularLayout1->addWidget( mySpecularColorF, 0, 1 );
225 specularLayout1->addWidget( specCoefficientLab1, 1, 0 );
226 specularLayout1->addWidget( mySpecularCoefntF, 1, 1 );
228 // ----------------- "Emission" reflection type group box -----------------
229 myEmissionGroupF = new QGroupBox( tr( "EMISSION_GRP" ), w1 );
230 myEmissionGroupF->setCheckable(true);
231 connect( myEmissionGroupF, SIGNAL( toggled( bool ) ), this, SLOT( onReflectionTypeToggled( bool ) ) );
234 QLabel* emisColorLab1 = new QLabel( tr( "COLOR" ), myEmissionGroupF );
235 myEmissionColorF = new QtxColorButton( myEmissionGroupF );
236 myEmissionColorF->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
237 connect( myEmissionColorF, SIGNAL( changed( QColor ) ), this, SIGNAL( changed() ) );
239 // Emission coefficient
240 QLabel* emisCoefficientLab1 = new QLabel( tr( "COEFFICIENT" ), myEmissionGroupF );
241 myEmissionCoefntF = new QtxDoubleSpinBox( myEmissionGroupF );
242 myEmissionCoefntF->setMaximum(1);
243 myEmissionCoefntF->setSingleStep(0.05);
244 connect( myEmissionCoefntF, SIGNAL( valueChanged( double ) ), this, SIGNAL( materialChanged() ) );
246 // Emission group box layout
247 QGridLayout* emissionLayout1 = new QGridLayout( myEmissionGroupF );
248 emissionLayout1->setMargin( MARGIN ); emissionLayout1->setSpacing( SPACING );
249 emissionLayout1->addWidget( emisColorLab1, 0, 0 );
250 emissionLayout1->addWidget( myEmissionColorF, 0, 1 );
251 emissionLayout1->addWidget( emisCoefficientLab1, 1, 0 );
252 emissionLayout1->addWidget( myEmissionCoefntF, 1, 1 );
254 // Erase emission group in case of VTK viewer
255 if ( myViewerType == VTK )
256 myEmissionGroupF->hide();
258 // Add group boxes to the main grid layout of the frame with material properties
259 gLayout1->addWidget( myAmbientGroupF, 0, 0 );
260 gLayout1->addWidget( myDiffuseGroupF, 0, 1 );
261 gLayout1->addWidget( mySpecularGroupF, 1, 0 );
262 gLayout1->addWidget( myEmissionGroupF, 1, 1 );
265 QLabel* shininessLab1 = new QLabel( tr( "SHININESS" ), w1 );
266 myShininessF = new QtxDoubleSpinBox( w1 );
267 myShininessF->setMaximum(1);
268 myShininessF->setSingleStep(0.05);
269 connect( myShininessF, SIGNAL( valueChanged( double ) ), this, SIGNAL( materialChanged() ) );
272 QHBoxLayout* shLayout1 = new QHBoxLayout( w1 );
273 shLayout1->setMargin( MARGIN ); shLayout1->setSpacing( SPACING );
274 shLayout1->addWidget( shininessLab1 );
275 shLayout1->addWidget( myShininessF );
277 // Fill initial vertical layout of the reflection type group box
278 vLayout1->addLayout( gLayout1 );
279 vLayout1->addLayout( shLayout1 );
280 vLayout1->addStretch();
282 // ======================= Create a tab for back material =======================
283 myMaterialBWidget = new QWidget( myMaterialTab );
284 QVBoxLayout* vLayout2 = new QVBoxLayout( myMaterialBWidget );
286 QGridLayout* gLayout2 = new QGridLayout( myMaterialBWidget );
287 gLayout2->setMargin( MARGIN ); gLayout2->setSpacing( SPACING );
289 // ----------------- "Ambient" reflection type group box -----------------
290 myAmbientGroupB = new QGroupBox( tr( "AMBIENT_GRP" ), myMaterialBWidget );
291 myAmbientGroupB->setCheckable(true);
292 connect( myAmbientGroupB, SIGNAL( toggled( bool ) ), this, SLOT( onReflectionTypeToggled( bool ) ) );
295 QLabel* ambColorLab2 = new QLabel( tr( "COLOR" ), myAmbientGroupB );
296 myAmbientColorB = new QtxColorButton( myAmbientGroupB );
297 myAmbientColorB->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
298 connect( myAmbientColorB, SIGNAL( changed( QColor ) ), this, SIGNAL( changed() ) );
300 // Ambient coefficient
301 QLabel* ambCoefficientLab2 = new QLabel( tr( "COEFFICIENT" ), myAmbientGroupB );
302 myAmbientCoefntB = new QtxDoubleSpinBox( myAmbientGroupB );
303 myAmbientCoefntB->setMaximum(1);
304 myAmbientCoefntB->setSingleStep(0.05);
305 connect( myAmbientCoefntB, SIGNAL( valueChanged( double ) ), this, SIGNAL( materialChanged() ) );
307 // Ambient group box layout
308 QGridLayout* ambientLayout2 = new QGridLayout( myAmbientGroupB );
309 ambientLayout2->setMargin( MARGIN ); ambientLayout2->setSpacing( SPACING );
310 ambientLayout2->addWidget( ambColorLab2, 0, 0 );
311 ambientLayout2->addWidget( myAmbientColorB, 0, 1 );
312 ambientLayout2->addWidget( ambCoefficientLab2, 1, 0 );
313 ambientLayout2->addWidget( myAmbientCoefntB, 1, 1 );
315 // ----------------- "Diffuse" reflection type group box -----------------
316 myDiffuseGroupB = new QGroupBox( tr( "DIFFUSE_GRP" ), myMaterialBWidget );
317 myDiffuseGroupB->setCheckable(true);
318 connect( myDiffuseGroupB, SIGNAL( toggled( bool ) ), this, SLOT( onReflectionTypeToggled( bool ) ) );
321 QLabel* difColorLab2 = new QLabel( tr( "COLOR" ), myDiffuseGroupB );
322 myDiffuseColorB = new QtxColorButton( myDiffuseGroupB );
323 myDiffuseColorB->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
324 connect( myDiffuseColorB, SIGNAL( changed( QColor ) ), this, SIGNAL( changed() ) );
326 // Diffuse coefficient
327 QLabel* difCoefficientLab2 = new QLabel( tr( "COEFFICIENT" ), myDiffuseGroupB );
328 myDiffuseCoefntB = new QtxDoubleSpinBox( myDiffuseGroupB );
329 myDiffuseCoefntB->setMaximum(1);
330 myDiffuseCoefntB->setSingleStep(0.05);
331 connect( myDiffuseCoefntB, SIGNAL( valueChanged( double ) ), this, SIGNAL( materialChanged() ) );
333 // Diffuse group box layout
334 QGridLayout* diffuseLayout2 = new QGridLayout( myDiffuseGroupB );
335 diffuseLayout2->setMargin( MARGIN ); diffuseLayout2->setSpacing( SPACING );
336 diffuseLayout2->addWidget( difColorLab2, 0, 0 );
337 diffuseLayout2->addWidget( myDiffuseColorB, 0, 1 );
338 diffuseLayout2->addWidget( difCoefficientLab2, 1, 0 );
339 diffuseLayout2->addWidget( myDiffuseCoefntB, 1, 1 );
341 // ----------------- "Specular" reflection type group box -----------------
342 mySpecularGroupB = new QGroupBox( tr( "SPECULAR_GRP" ), myMaterialBWidget );
343 mySpecularGroupB->setCheckable(true);
344 connect( mySpecularGroupB, SIGNAL( toggled( bool ) ), this, SLOT( onReflectionTypeToggled( bool ) ) );
347 QLabel* specColorLab2 = new QLabel( tr( "COLOR" ), mySpecularGroupB );
348 mySpecularColorB = new QtxColorButton( mySpecularGroupB );
349 mySpecularColorB->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
350 connect( mySpecularColorB, SIGNAL( changed( QColor ) ), this, SIGNAL( changed() ) );
352 // Specular coefficient
353 QLabel* specCoefficientLab2 = new QLabel( tr( "COEFFICIENT" ), mySpecularGroupB );
354 mySpecularCoefntB = new QtxDoubleSpinBox( mySpecularGroupB );
355 mySpecularCoefntB->setMaximum(1);
356 mySpecularCoefntB->setSingleStep(0.05);
357 connect( mySpecularCoefntB, SIGNAL( valueChanged( double ) ), this, SIGNAL( materialChanged() ) );
359 // Specular group box layout
360 QGridLayout* specularLayout2 = new QGridLayout( mySpecularGroupB );
361 specularLayout2->setMargin( MARGIN ); specularLayout2->setSpacing( SPACING );
362 specularLayout2->addWidget( specColorLab2, 0, 0 );
363 specularLayout2->addWidget( mySpecularColorB, 0, 1 );
364 specularLayout2->addWidget( specCoefficientLab2, 1, 0 );
365 specularLayout2->addWidget( mySpecularCoefntB, 1, 1 );
367 // ----------------- "Emission" reflection type group box -----------------
368 myEmissionGroupB = new QGroupBox( tr( "EMISSION_GRP" ), myMaterialBWidget );
369 myEmissionGroupB->setCheckable(true);
370 connect( myEmissionGroupB, SIGNAL( toggled( bool ) ), this, SLOT( onReflectionTypeToggled( bool ) ) );
373 QLabel* emisColorLab2 = new QLabel( tr( "COLOR" ), myEmissionGroupB );
374 myEmissionColorB = new QtxColorButton( myEmissionGroupB );
375 myEmissionColorB->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
376 connect( myEmissionColorB, SIGNAL( changed( QColor ) ), this, SIGNAL( changed() ) );
378 // Emission coefficient
379 QLabel* emisCoefficientLab2 = new QLabel( tr( "COEFFICIENT" ), myEmissionGroupB );
380 myEmissionCoefntB = new QtxDoubleSpinBox( myEmissionGroupB );
381 myEmissionCoefntB->setMaximum(1);
382 myEmissionCoefntB->setSingleStep(0.05);
383 connect( myEmissionCoefntB, SIGNAL( valueChanged( double ) ), this, SIGNAL( materialChanged() ) );
385 // Emission group box layout
386 QGridLayout* emissionLayout2 = new QGridLayout( myEmissionGroupB );
387 emissionLayout2->setMargin( MARGIN ); emissionLayout2->setSpacing( SPACING );
388 emissionLayout2->addWidget( emisColorLab2, 0, 0 );
389 emissionLayout2->addWidget( myEmissionColorB, 0, 1 );
390 emissionLayout2->addWidget( emisCoefficientLab2, 1, 0 );
391 emissionLayout2->addWidget( myEmissionCoefntB, 1, 1 );
393 // Erase emission group in case of VTK viewer
394 if ( myViewerType == VTK )
395 myEmissionGroupB->hide();
397 // Add group boxes to the main grid layout of the frame with material properties
398 gLayout2->addWidget( myAmbientGroupB, 0, 0 );
399 gLayout2->addWidget( myDiffuseGroupB, 0, 1 );
400 gLayout2->addWidget( mySpecularGroupB, 1, 0 );
401 gLayout2->addWidget( myEmissionGroupB, 1, 1 );
404 QLabel* shininessLab2 = new QLabel( tr( "SHININESS" ), myMaterialBWidget );
405 myShininessB = new QtxDoubleSpinBox( myMaterialBWidget );
406 myShininessB->setMaximum(1);
407 myShininessB->setSingleStep(0.05);
408 connect( myShininessB, SIGNAL( valueChanged( double ) ), this, SIGNAL( materialChanged() ) );
411 QHBoxLayout* shLayout2 = new QHBoxLayout( myMaterialBWidget );
412 shLayout2->setMargin( MARGIN ); shLayout2->setSpacing( SPACING );
413 shLayout2->addWidget( shininessLab2 );
414 shLayout2->addWidget( myShininessB );
416 // Fill initial vertical layout of the reflection type group box
417 vLayout2->addLayout( gLayout2 );
418 vLayout2->addLayout( shLayout2 );
419 vLayout2->addStretch();
421 // Add tabs to material tab widget
422 myMaterialTab->addTab( w1, tr( "Front material" ) );
423 myMaterialTab->addTab( myMaterialBWidget, tr( "Back material" ) );
425 // Initialize dialog box
427 setButtonPosition( Right, Close );
428 setDialogFlags( AlignOnce );
429 myMaterialList->setEditTriggers( QAbstractItemView::EditKeyPressed );
430 myMaterialList->installEventFilter( this );
433 QStringList globalMaterials = resourceMgr()->materials( Material_ResourceMgr::Global );
434 QStringList userMaterials = resourceMgr()->materials( Material_ResourceMgr::User );
436 QListWidgetItem* item;
439 item = new QListWidgetItem( tr( "[ Current ]" ) );
440 item->setForeground( QColor( Qt::red ) );
441 item->setData( TypeRole, QVariant( Current ) );
442 myMaterialList->addItem( item );
444 item = new QListWidgetItem( tr( "[ Default ]" ) );
445 item->setForeground( QColor( Qt::green ) );
446 item->setData( TypeRole, QVariant( Default ) );
447 myMaterialList->addItem( item );
450 foreach ( QString sname, globalMaterials ) {
451 item = new QListWidgetItem( sname );
452 item->setForeground( QColor( Qt::blue ) );
453 item->setData( TypeRole, QVariant( Global ) );
454 item->setData( NameRole, QVariant( sname ) );
455 myMaterialList->addItem( item );
459 foreach ( QString sname, userMaterials ) {
460 item = new QListWidgetItem( sname );
461 item->setData( TypeRole, QVariant( User ) );
462 item->setData( NameRole, QVariant( sname ) );
463 item->setFlags( item->flags() | Qt::ItemIsEditable );
464 myMaterialList->addItem( item );
468 connect( myMaterialTab, SIGNAL( currentChanged( int ) ),
469 this, SLOT( onCurrentTabChanged( int ) ) );
470 connect( myBackMaterialCheck, SIGNAL( toggled( bool ) ),
471 this, SLOT( onBackMaterialChecked( bool ) ) );
473 connect( myMaterialList, SIGNAL( itemSelectionChanged() ),
474 this, SLOT( onMaterialChanged() ) );
475 connect( myMaterialList, SIGNAL( itemChanged( QListWidgetItem* ) ),
476 this, SLOT( onItemChanged( QListWidgetItem* ) ) );
477 connect( myMaterialList, SIGNAL( itemDoubleClicked( QListWidgetItem* ) ),
478 this, SLOT( onApply() ) );
480 connect( this, SIGNAL( changed() ), this, SIGNAL( materialChanged() ) );
481 connect( this, SIGNAL( materialChanged() ), this, SLOT( onChanged() ) );
483 connect( this, SIGNAL( dlgApply() ), this, SLOT( onApply() ) );
484 connect( this, SIGNAL( dlgHelp() ), this, SLOT( onHelp() ) );
486 // Initialize current fornt and back material models of the selected shape
488 LightApp_SelectionMgr* aSelMgr = app->selectionMgr();
490 SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>(app->activeStudy());
492 SALOME_ListIO selected;
493 aSelMgr->selectedObjects( selected );
495 Handle(SALOME_InteractiveObject) FirstIOS = selected.First();
496 if ( !FirstIOS.IsNull() ) {
497 SUIT_ViewWindow* window = app->desktop()->activeWindow();
498 int aMgrId = window->getViewManager()->getGlobalId();
503 for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) {
505 PropMap aPropMap = aStudy->getObjectPropMap( aMgrId, It.Value()->getEntry() );
506 aMaterialF = aPropMap.value(FRONT_MATERIAL_PROP).toString();
507 aMaterialB = aPropMap.value(BACK_MATERIAL_PROP).toString();
509 if ( !aMaterialF.isEmpty() ) {
511 QStringList aPropsF = aMaterialF.split(DIGIT_SEPARATOR);
513 myCurrentModelF = Material_Model::getMaterialModel( aPropsF );
515 if ( !aMaterialB.isEmpty() ) {
516 QStringList aPropsB = aMaterialB.split(DIGIT_SEPARATOR);
517 myCurrentModelB = Material_Model::getMaterialModel( aPropsB );
519 myBackMaterialCheck->setChecked( true );
522 myCurrentModelB = Material_Model::getMaterialModel( aPropsF );
524 myBackMaterialCheck->setChecked( false );
525 myMaterialTab->removeTab( 1 );
532 if ( aMaterialF.isEmpty() ) {
533 myCurrentModelF = new Material_Model();
534 myCurrentModelF->fromResources( SUIT_Session::session()->resourceMgr(), "Geometry" );
536 myCurrentModelB = new Material_Model();
537 myCurrentModelB->fromResources( SUIT_Session::session()->resourceMgr(), "Geometry", false );
544 myMaterialList->setCurrentRow( 0 );
545 myMaterialListFId = 0;
546 myMaterialListBId = 0;
548 myIsBTabWasActivated = false;
550 myHelpFileName = "material_page.html";
556 GEOMToolsGUI_MaterialPropertiesDlg::~GEOMToolsGUI_MaterialPropertiesDlg()
558 if ( myCurrentModelF )
559 delete myCurrentModelF;
561 if ( myCurrentModelB )
562 delete myCurrentModelB;
566 \brief Called when "OK" button is clicked
568 void GEOMToolsGUI_MaterialPropertiesDlg::accept()
575 \brief Process key press event
578 bool GEOMToolsGUI_MaterialPropertiesDlg::eventFilter( QObject* o, QEvent* e )
580 if ( o == myMaterialList && e->type() == QEvent::KeyPress ) {
581 QKeyEvent* ke = (QKeyEvent*)e;
582 if ( ke->key() == Qt::Key_Delete ) {
583 QListWidgetItem* item = myMaterialList->currentItem();
584 if ( item && item->data( TypeRole ).toInt() == User ) {
585 if ( QMessageBox::question( this,
586 tr( "Delete user material" ),
587 tr( "Remove material %1?" ).arg( item->text() ),
588 QMessageBox::Yes | QMessageBox::No,
589 QMessageBox::Yes ) == QMessageBox::Yes ) {
590 resourceMgr()->remove( item->data( NameRole ).toString() );
591 resourceMgr()->save();
597 return QtxDialog::eventFilter( o, e );
601 \brief Get GEOM materials resource manager
602 \return materials resource manager
604 Material_ResourceMgr* GEOMToolsGUI_MaterialPropertiesDlg::resourceMgr()
607 myResMgr = new Material_ResourceMgr();
612 \brief Initialize dialog box fields from material model
613 \param model material model
615 void GEOMToolsGUI_MaterialPropertiesDlg::fromModel( Material_Model* model)
617 if ( !model ) return;
619 bool isReflectionTypeActive;
621 if ( isFrontTabActive() ) { // Fill in front material tab
623 // Ambient reflection type
624 isReflectionTypeActive = model->hasAmbientReflection();
625 myAmbientGroupF->setChecked( isReflectionTypeActive );
626 if ( isReflectionTypeActive ) {
627 // Load ambient color
628 myAmbientColorF->setColor( model->color(Material_Model::Ambient) );
629 // Load ambient coefficient
630 myAmbientCoefntF->setValue( model->coefficient(Material_Model::Ambient) );
633 // Diffuse reflection type
634 isReflectionTypeActive = model->hasDiffuseReflection();
635 myDiffuseGroupF->setChecked( isReflectionTypeActive );
636 if ( isReflectionTypeActive ) {
637 // Load diffuse color
638 myDiffuseColorF->setColor( model->color(Material_Model::Diffuse) );
639 // Load diffuse coefficient
640 myDiffuseCoefntF->setValue( model->coefficient(Material_Model::Diffuse) );
643 // Specular reflection type
644 isReflectionTypeActive = model->hasSpecularReflection();
645 mySpecularGroupF->setChecked( isReflectionTypeActive );
646 if ( isReflectionTypeActive ) {
647 // Load specular color
648 mySpecularColorF->setColor( model->color(Material_Model::Specular) );
649 // Load specular coefficient
650 mySpecularCoefntF->setValue( model->coefficient(Material_Model::Specular) );
653 // Emission reflection type
654 isReflectionTypeActive = model->hasEmissionReflection();
655 myEmissionGroupF->setChecked( isReflectionTypeActive );
656 if ( isReflectionTypeActive ) {
657 // Load emission color
658 myEmissionColorF->setColor( model->color(Material_Model::Emission) );
659 // Load emission coefficient
660 myEmissionCoefntF->setValue( model->coefficient(Material_Model::Emission) );
664 myShininessF->setValue( model->shininess() );
667 else { // Fill in back material tab
669 // Ambient reflection type
670 isReflectionTypeActive = model->hasAmbientReflection();
671 myAmbientGroupB->setChecked( isReflectionTypeActive );
672 if ( isReflectionTypeActive ) {
673 // Load ambient color
674 myAmbientColorB->setColor( model->color(Material_Model::Ambient) );
675 // Load ambient coefficient
676 myAmbientCoefntB->setValue( model->coefficient(Material_Model::Ambient) );
679 // Diffuse reflection type
680 isReflectionTypeActive = model->hasDiffuseReflection();
681 myDiffuseGroupB->setChecked( isReflectionTypeActive );
682 if ( isReflectionTypeActive ) {
683 // Load diffuse color
684 myDiffuseColorB->setColor( model->color(Material_Model::Diffuse) );
685 // Load diffuse coefficient
686 myDiffuseCoefntB->setValue( model->coefficient(Material_Model::Diffuse) );
689 // Specular reflection type
690 isReflectionTypeActive = model->hasSpecularReflection();
691 mySpecularGroupB->setChecked( isReflectionTypeActive );
692 if ( isReflectionTypeActive ) {
693 // Load specular color
694 mySpecularColorB->setColor( model->color(Material_Model::Specular) );
695 // Load specular coefficient
696 mySpecularCoefntB->setValue( model->coefficient(Material_Model::Specular) );
699 // Emission reflection type
700 isReflectionTypeActive = model->hasEmissionReflection();
701 myEmissionGroupB->setChecked( isReflectionTypeActive );
702 if ( isReflectionTypeActive ) {
703 // Load emission color
704 myEmissionColorB->setColor( model->color(Material_Model::Emission) );
705 // Load emission coefficient
706 myEmissionCoefntB->setValue( model->coefficient(Material_Model::Emission) );
710 myShininessB->setValue( model->shininess() );
716 \brief Save values from dialog box fields to material model
717 \param model material model
719 void GEOMToolsGUI_MaterialPropertiesDlg::toModel( Material_Model* model ) const
721 if ( !model ) return;
723 if ( isFrontTabActive() )
724 toFrontModel( model );
726 toBackModel( model );
730 \brief Save values from dialog box fields to front material model
731 \param model front material model to be filled
733 void GEOMToolsGUI_MaterialPropertiesDlg::toFrontModel( Material_Model* model ) const
735 if ( !model ) return;
737 // "Ambient" reflection type
738 if ( myAmbientGroupF->isChecked() ) {
739 model->setColor( Material_Model::Ambient, myAmbientColorF->color() );
740 model->setCoefficient( Material_Model::Ambient, myAmbientCoefntF->value() );
743 model->removeColor( Material_Model::Ambient );
744 model->removeCoefficient( Material_Model::Ambient );
747 // "Diffuse" reflection type
748 if ( myDiffuseGroupF->isChecked() ) {
749 model->setColor( Material_Model::Diffuse, myDiffuseColorF->color() );
750 model->setCoefficient( Material_Model::Diffuse, myDiffuseCoefntF->value() );
753 model->removeColor( Material_Model::Diffuse );
754 model->removeCoefficient( Material_Model::Diffuse );
757 // "Specular" reflection type
758 if ( mySpecularGroupF->isChecked() ) {
759 model->setColor( Material_Model::Specular, mySpecularColorF->color() );
760 model->setCoefficient( Material_Model::Specular, mySpecularCoefntF->value() );
763 model->removeColor( Material_Model::Specular );
764 model->removeCoefficient( Material_Model::Specular );
767 // "Emission" reflection type
768 if ( myEmissionGroupF->isChecked() ) {
769 model->setColor( Material_Model::Emission, myEmissionColorF->color() );
770 model->setCoefficient( Material_Model::Emission, myEmissionCoefntF->value() );
773 model->removeColor( Material_Model::Emission );
774 model->removeCoefficient( Material_Model::Emission );
778 model->setShininess( myShininessF->value() );
782 \brief Save values from dialog box fields to back material model
783 \param model back material model to be filled
785 void GEOMToolsGUI_MaterialPropertiesDlg::toBackModel( Material_Model* model ) const
790 // "Ambient" reflection type
791 if ( myAmbientGroupB->isChecked() ) {
792 model->setColor( Material_Model::Ambient, myAmbientColorB->color() );
793 model->setCoefficient( Material_Model::Ambient, myAmbientCoefntB->value() );
796 model->removeColor( Material_Model::Ambient );
797 model->removeCoefficient( Material_Model::Ambient );
800 // "Diffuse" reflection type
801 if ( myDiffuseGroupB->isChecked() ) {
802 model->setColor( Material_Model::Diffuse, myDiffuseColorB->color() );
803 model->setCoefficient( Material_Model::Diffuse, myDiffuseCoefntB->value() );
806 model->removeColor( Material_Model::Diffuse );
807 model->removeCoefficient( Material_Model::Diffuse );
810 // "Specular" reflection type
811 if ( mySpecularGroupB->isChecked() ) {
812 model->setColor( Material_Model::Specular, mySpecularColorB->color() );
813 model->setCoefficient( Material_Model::Specular, mySpecularCoefntB->value() );
816 model->removeColor( Material_Model::Specular );
817 model->removeCoefficient( Material_Model::Specular );
820 // "Emission" reflection type
821 if ( myEmissionGroupB->isChecked() ) {
822 model->setColor( Material_Model::Emission, myEmissionColorB->color() );
823 model->setCoefficient( Material_Model::Emission, myEmissionCoefntB->value() );
826 model->removeColor( Material_Model::Emission );
827 model->removeCoefficient( Material_Model::Emission );
831 model->setShininess( myShininessB->value() );
835 \brief Find unique name for the material name
836 \param name material name template
837 \param item if not 0, used to be ignored when browsing through items list
838 \param addSuffix if \c true, the integrer suffix is always added to the material name (otherwise
839 suffix is added only if item name is not unique)
840 \return new unique material name
842 QString GEOMToolsGUI_MaterialPropertiesDlg::findUniqueName( const QString& name, QListWidgetItem* item, bool addSuffix )
846 for( int i = 2; i < myMaterialList->count(); i++ ) {
847 if ( item == myMaterialList->item( i ) ) continue;
848 QString iname = myMaterialList->item( i )->text();
849 if ( iname == name ) {
853 iname = iname.mid( name.length() ).trimmed();
855 int nx = iname.toInt( &ok );
856 if ( ok ) idx = qMax( idx, nx );
859 return found || addSuffix ? QString( "%1 %2" ).arg( name ).arg( idx+1 ) : name;
863 \brief Check if tab with front material properties is currently active
864 \return true if front material tab is active
866 bool GEOMToolsGUI_MaterialPropertiesDlg::isFrontTabActive() const
868 return ( myMaterialTab->currentIndex() == 0 ? true : false );
872 \brief Called when "Apply" button is pressed
874 void GEOMToolsGUI_MaterialPropertiesDlg::onApply()
876 // save user materials
877 resourceMgr()->save();
879 toFrontModel( myCurrentModelF );
880 if ( myBackMaterialCheck->isChecked() && myIsBTabWasActivated )
881 toBackModel( myCurrentModelB );
883 SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
886 LightApp_SelectionMgr* aSelMgr = app->selectionMgr();
890 SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>(app->activeStudy());
895 SALOME_ListIO selected;
896 aSelMgr->selectedObjects( selected );
897 if ( selected.IsEmpty() )
900 Handle(SALOME_InteractiveObject) FirstIOS = selected.First();
901 if ( FirstIOS.IsNull() )
904 SUIT_ViewWindow* window = app->desktop()->activeWindow();
905 int aMgrId = window->getViewManager()->getGlobalId();
907 // Parse material properties and form a string for persistent purpose
908 QString aMaterialF = myCurrentModelF->getMaterialProperty();
910 if ( myBackMaterialCheck->isChecked() )
911 aMaterialB = myCurrentModelB->getMaterialProperty();
913 if ( myViewerType == VTK ) {
914 // Get material properties from the current model
916 vtkProperty* aPropertyF;
917 if ( !unsetMaterial )
918 aPropertyF = myCurrentModelF->getMaterialVTKProperty();
920 vtkProperty* aPropertyF = myCurrentModelF->getMaterialVTKProperty();
921 vtkProperty* aPropertyB = aPropertyF;
922 if ( myBackMaterialCheck->isChecked() )
923 aPropertyB = myCurrentModelB->getMaterialVTKProperty();
925 SVTK_ViewWindow* vtkVW = dynamic_cast<SVTK_ViewWindow*>( window );
928 SVTK_View* aView = vtkVW->getView();
930 SUIT_OverrideCursor();
931 for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) {
934 if ( unsetMaterial || aMaterialF.isEmpty() )
935 // Unset material for the selected shape
936 aisShape->UnsetMaterial();
938 // Set material for the selected shape
940 aView->SetMaterial( It.Value(), aPropertyF, aPropertyB );
943 aStudy->setObjectProperty( aMgrId, It.Value()->getEntry(), FRONT_MATERIAL_PROP, aMaterialF );
944 aStudy->setObjectProperty( aMgrId, It.Value()->getEntry(), BACK_MATERIAL_PROP, aMaterialB );
947 GeometryGUI::Modified();
950 else if ( myViewerType == OCC ) {
951 // Get material properties from the current model
953 Graphic3d_MaterialAspect aMatF;
954 if ( !unsetMaterial )
955 aMatF = myCurrentModelF->getMaterialOCCAspect();
957 Graphic3d_MaterialAspect aMatF = myCurrentModelF->getMaterialOCCAspect();
958 Graphic3d_MaterialAspect aMatB = aMatF;
959 if ( myBackMaterialCheck->isChecked() )
960 aMatB = myCurrentModelB->getMaterialOCCAspect();
962 Handle(GEOM_AISShape) aisShape;
964 SUIT_OverrideCursor();
965 OCCViewer_Viewer* vm = dynamic_cast<OCCViewer_Viewer*>( window->getViewManager()->getViewModel() );
969 GEOMBase* gb = new GEOMBase();
971 Handle(AIS_InteractiveContext) ic = vm->getAISContext();
972 for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) {
973 aisShape = gb->ConvertIOinGEOMAISShape( It.Value(), true );
974 if ( !aisShape.IsNull() ) {
976 if(!aisShape->HasInteractiveContext())
977 aisShape->SetContext(ic);
980 if ( unsetMaterial || aMaterialF.isEmpty() )
981 // Unset material for the selected shape
982 aisShape->UnsetMaterial();
985 if ( myBackMaterialCheck->isChecked() ) {
986 // Set front material for the selected shape
987 aisShape->SetCurrentFacingModel(Aspect_TOFM_FRONT_SIDE);
988 aisShape->SetMaterial(aMatF);
989 // Set back material for the selected shape
990 aisShape->SetCurrentFacingModel(Aspect_TOFM_BACK_SIDE);
991 aisShape->SetMaterial(aMatB);
992 // Return to the default facing mode
993 aisShape->SetCurrentFacingModel(Aspect_TOFM_BOTH_SIDE);
996 // Set the same front and back (is equal to front) materials for the selected shape
997 aisShape->SetMaterial(aMatF);
1000 if (aisShape->DisplayMode() != AIS_Shaded/*aisShape->DisplayMode() == GEOM_AISShape::ShadingWithEdges*/)
1001 ic->RecomputePrsOnly( aisShape, Standard_False );
1004 aStudy->setObjectProperty( aMgrId, It.Value()->getEntry(), FRONT_MATERIAL_PROP, aMaterialF );
1005 aStudy->setObjectProperty( aMgrId, It.Value()->getEntry(), BACK_MATERIAL_PROP, aMaterialB );
1008 ic->UpdateCurrentViewer();
1009 GeometryGUI::Modified();
1014 \brief Called when "Help" button is pressed
1016 void GEOMToolsGUI_MaterialPropertiesDlg::onHelp()
1018 LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
1020 GeometryGUI* aGeomGUI = dynamic_cast<GeometryGUI*>( app->module( "Geometry" ) );
1021 app->onHelpContextModule(aGeomGUI ? app->moduleName(aGeomGUI->moduleName()) : QString(""), myHelpFileName);
1026 platform = "winapplication";
1028 platform = "application";
1030 SUIT_MessageBox::warning(0, QObject::tr("WRN_WARNING"),
1031 QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
1032 arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(myHelpFileName),
1033 QObject::tr("BUT_OK"));
1038 \brief Called when user check/uncheck "Enable back material" check box
1039 \param theIsChecked the check state of the check box
1041 void GEOMToolsGUI_MaterialPropertiesDlg::onBackMaterialChecked( bool theIsChecked )
1043 if ( theIsChecked ) {
1044 // Tab with back material properties is displayed
1045 myMaterialTab->addTab( myMaterialBWidget, tr( "Back material" ) );
1047 // Create a current model of back material
1048 if ( !myCurrentModelB ) {
1049 myCurrentModelB = new Material_Model();
1050 myCurrentModelB->fromResources( SUIT_Session::session()->resourceMgr(), "Geometry", false );
1053 myMaterialListBId = 0;
1056 // Tab with back material properties is hidden
1057 myMaterialTab->removeTab( 1 );
1059 // Remove the current model for back material
1060 if ( myCurrentModelB ) {
1061 delete myCurrentModelB;
1062 myCurrentModelB = 0;
1068 \brief Called when user activates material tab
1069 \param theIndex the index of the tab which was activated by the user
1071 void GEOMToolsGUI_MaterialPropertiesDlg::onCurrentTabChanged(int theIndex)
1073 blockSignals( true );
1075 // Change selection in the list of materials
1076 if ( isFrontTabActive() )
1077 myMaterialList->setCurrentRow( myMaterialListFId );
1078 else if ( myBackMaterialCheck->isChecked() )
1079 myMaterialList->setCurrentRow( myMaterialListBId );
1081 if ( theIndex == 1 )
1082 myIsBTabWasActivated = true;
1084 blockSignals( false );
1086 onMaterialChanged();
1090 \brief Called when user selects any material item in the materials list
1092 void GEOMToolsGUI_MaterialPropertiesDlg::onMaterialChanged()
1094 blockSignals( true );
1096 QListWidgetItem* item = myMaterialList->currentItem();
1097 int type = item->data( TypeRole ).toInt();
1099 Material_Model* model = 0;
1101 bool isFrontTab = isFrontTabActive();
1104 myMaterialListFId = myMaterialList->currentRow();
1106 myMaterialListBId = myMaterialList->currentRow();
1111 model = ( isFrontTab ? myCurrentModelF : myCurrentModelB );
1115 model = new Material_Model();
1116 model->fromResources( SUIT_Session::session()->resourceMgr(), "Geometry", ( isFrontTab ? true : false ) );
1120 // global material, user material
1121 model = new Material_Model();
1122 model->fromResources( resourceMgr(), item->data( NameRole ).toString() );
1129 if ( type != Current )
1132 blockSignals( false );
1136 \brief Called when any material parameter is changed by the user
1138 void GEOMToolsGUI_MaterialPropertiesDlg::onChanged()
1140 QListWidgetItem* item = myMaterialList->currentItem();
1141 int type = item->data( TypeRole ).toInt();
1143 bool isFrontTab = isFrontTabActive();
1145 // for the current and user schemas do not perform any actions
1146 if ( type == Current ) {
1147 Material_Model model = ( isFrontTab ? *( myCurrentModelF ) : *( myCurrentModelB ) );
1149 model.save( 0, QString(), isFrontTab );
1150 blockSignals( true );
1151 fromModel( &model );
1152 blockSignals( false );
1154 else if ( type == User ) {
1155 Material_Model model;
1157 QString oldName = item->data( NameRole ).toString(), newName = item->text();
1158 if ( oldName == newName ) {
1159 model.save( resourceMgr(), oldName, isFrontTab );
1162 resourceMgr()->remove( oldName );
1163 model.save( resourceMgr(), newName, isFrontTab );
1164 item->setData( NameRole, newName );
1166 blockSignals( true );
1167 fromModel( &model );
1168 blockSignals( false );
1171 // if user tries to change global (or default, or no material) material,
1172 // we create a new user material basing on selected one
1173 QString newName = findUniqueName( tr( "CUSTOM_MATERIAL" ), 0, true );
1174 item = new QListWidgetItem( newName );
1175 item->setData( TypeRole, QVariant( User ) );
1176 item->setData( NameRole, QVariant( newName ) );
1177 item->setFlags( item->flags() | Qt::ItemIsEditable );
1178 myMaterialList->addItem( item );
1180 Material_Model model;
1182 model.save( resourceMgr(), newName, isFrontTab );
1184 myMaterialList->setCurrentItem( item );
1187 myMaterialListFId = myMaterialList->currentRow();
1189 myMaterialListBId = myMaterialList->currentRow();
1195 \brief Called when user material is renamed by the user
1197 void GEOMToolsGUI_MaterialPropertiesDlg::onItemChanged( QListWidgetItem* item )
1199 QString newName = item->text();
1200 QString uniqueName = findUniqueName( newName, item );
1201 if ( uniqueName != newName ) {
1202 myMaterialList->blockSignals( true );
1203 item->setText( uniqueName );
1204 myMaterialList->blockSignals( false );
1210 \brief Called when widget effect is changed
1212 void GEOMToolsGUI_MaterialPropertiesDlg::onReflectionTypeToggled( bool theIsOn )
1214 QGroupBox* anObj = (QGroupBox*)sender();
1216 // Set an empty values for color and coefficient
1217 // of the checked/unchecked reflection type
1221 // Make changes on front material tab
1222 if ( anObj == myAmbientGroupF ) {
1223 myAmbientColorF->setColor( c );
1224 myAmbientCoefntF->setValue( 0.0 );
1226 else if ( anObj == myDiffuseGroupF ) {
1227 myDiffuseColorF->setColor( c );
1228 myDiffuseCoefntF->setValue( 0.0 );
1230 else if ( anObj == mySpecularGroupF ) {
1231 mySpecularColorF->setColor( c );
1232 mySpecularCoefntF->setValue( 0.0 );
1234 else if ( anObj == myEmissionGroupF ) {
1235 myEmissionColorF->setColor( c );
1236 myEmissionCoefntF->setValue( 0.0 );
1239 // Make changes on back material tab
1240 if ( anObj == myAmbientGroupB ) {
1241 myAmbientColorB->setColor( c );
1242 myAmbientCoefntB->setValue( 0.0 );
1244 else if ( anObj == myDiffuseGroupB ) {
1245 myDiffuseColorB->setColor( c );
1246 myDiffuseCoefntB->setValue( 0.0 );
1248 else if ( anObj == mySpecularGroupB ) {
1249 mySpecularColorB->setColor( c );
1250 mySpecularCoefntB->setValue( 0.0 );
1252 else if ( anObj == myEmissionGroupB ) {
1253 myEmissionColorB->setColor( c );
1254 myEmissionCoefntB->setValue( 0.0 );