]> Creatis software - cpPlugins.git/blob - lib/cpPlugins/ActorPropertiesQtDialog.cxx
...
[cpPlugins.git] / lib / cpPlugins / ActorPropertiesQtDialog.cxx
1 #include <cpPlugins/ActorPropertiesQtDialog.h>
2
3 #ifdef cpPlugins_QT4
4
5 #include <cpPlugins/ActorAxesProperties.h>
6 #include <cpPlugins/ActorImageProperties.h>
7 #include <cpPlugins/ActorPolyDataProperties.h>
8
9 #include <vtkActor.h>
10 #include <vtkAxesActor.h>
11 #include <vtkImageActor.h>
12 /*
13   #include <vtkImageData.h>
14   #include <vtkImageProperty.h>
15   #include <vtkMapper.h>
16   #include <vtkProperty.h>
17
18   #include <QCheckBox>
19   #include <QColorDialog>
20   #include <QDoubleSpinBox>
21   #include <QPushButton>
22   #include <QSlider>
23 */
24
25 // -------------------------------------------------------------------------
26 cpPlugins::ActorPropertiesQtDialog::
27 ActorPropertiesQtDialog( QWidget* parent, Qt::WindowFlags f )
28   : QDialog( parent, f ),
29     m_MainWidget( NULL )
30 {
31   this->m_Title = new QLabel( this );
32   this->m_Title->setText( "Visualization properties" );
33   this->m_MainLayout = new QGridLayout( this );
34   this->m_ToolsLayout = new QVBoxLayout( );
35   this->m_ToolsLayout->addWidget( this->m_Title );
36   this->m_MainLayout->addLayout( this->m_ToolsLayout, 0, 0, 1, 1 );
37 }
38
39 // -------------------------------------------------------------------------
40 cpPlugins::ActorPropertiesQtDialog::
41 ~ActorPropertiesQtDialog( )
42 {
43 }
44
45 // -------------------------------------------------------------------------
46 bool cpPlugins::ActorPropertiesQtDialog::
47 addActor( vtkProp* obj )
48 {
49   if( this->m_MainWidget == NULL )
50   {
51     std::stringstream title;
52     title << "Parameters for an object of class";
53     auto mesh = dynamic_cast< vtkActor* >( obj );
54     auto axes = dynamic_cast< vtkAxesActor* >( obj );
55     auto image = dynamic_cast< vtkImageActor* >( obj );
56     if( mesh != NULL )
57     {
58       title << "\"Mesh\"";
59       this->m_MainWidget = new cpPlugins::ActorPolyDataProperties( this );
60     }
61     else if( axes != NULL )
62     {
63       title << "\"Axes\"";
64       this->m_MainWidget = new cpPlugins::ActorAxesProperties( this );
65     }
66     else if( image != NULL )
67     {
68       title << "\"Image\"";
69       this->m_MainWidget = new cpPlugins::ActorImageProperties( this );
70     }
71     /* TODO
72        else if( axes != NULL )
73     */
74
75     if( this->m_MainWidget != NULL )
76     {
77       this->m_Title->setText( title.str( ).c_str( ) );
78       this->m_ToolsLayout->addWidget( this->m_MainWidget );
79       this->m_Buttons = new QDialogButtonBox( QDialogButtonBox::Ok );
80       this->connect(
81         this->m_Buttons, SIGNAL( accepted( ) ), this, SLOT( accept( ) )
82         );
83       this->connect(
84         this->m_Buttons, SIGNAL( rejected( ) ), this, SLOT( reject( ) )
85         );
86       this->m_ToolsLayout->addWidget( this->m_Buttons );
87
88     } // fi
89
90   } // fi
91
92   if( this->m_MainWidget != NULL )
93     return( this->m_MainWidget->addActor( obj ) );
94   else
95     return( false );
96 }
97
98 // -------------------------------------------------------------------------
99 bool cpPlugins::ActorPropertiesQtDialog::
100 addRenderWindow( vtkRenderWindow* win )
101 {
102   if( this->m_MainWidget != NULL && win != NULL )
103     return( this->m_MainWidget->addRenderWindow( win ) );
104   else
105     return( false );
106 }
107
108 // -------------------------------------------------------------------------
109 int cpPlugins::ActorPropertiesQtDialog::
110 exec( )
111 {
112   int ret = this->QDialog::exec( );
113   /* TODO
114      if( ret == 1 )
115      this->updateParameters( );
116      else
117      this->updateView( );
118   */
119   return( ret );
120 }
121
122 // -------------------------------------------------------------------------
123 /* TODO
124 void cpPlugins::ActorPropertiesQtDialog::
125 _addButtons( )
126 {
127   // Add buttons
128   this->m_Buttons = new QDialogButtonBox( QDialogButtonBox::Ok );
129   this->connect(
130     this->m_Buttons, SIGNAL( accepted( ) ), this, SLOT( accept( ) )
131     );
132   this->connect(
133     this->m_Buttons, SIGNAL( rejected( ) ), this, SLOT( reject( ) )
134     );
135   this->m_ToolsLayout->addWidget( this->m_Buttons );
136   this->m_WidgetsUpdated = true;
137 }
138
139 // -------------------------------------------------------------------------
140 void cpPlugins::ActorPropertiesQtDialog::
141 _updateWidgets( )
142 {
143   if( this->m_WidgetsUpdated || this->m_Actors.size( ) == 0 )
144     return;
145   bool     s = this->_configureForAxes( );
146   if( !s ) s = this->_configureForImage( );
147   if( !s ) s = this->_configureForMesh( );
148   this->_addButtons( );
149 }
150
151 // -------------------------------------------------------------------------
152 bool cpPlugins::ActorPropertiesQtDialog::
153 _configureForAxes( )
154 {
155   if( this->m_Actors.size( ) == 0 )
156     return( false );
157   auto actor =
158     dynamic_cast< vtkAxesActor* >( this->m_Actors.begin( )->GetPointer( ) );
159   if( actor == NULL )
160     return( false );
161
162   // Set dialog title
163   std::stringstream title;
164   title << "Parameters for an object of class \"Axes\"";
165   this->m_Title->setText( title.str( ).c_str( ) );
166
167   return( true );
168 }
169
170 // -------------------------------------------------------------------------
171 bool cpPlugins::ActorPropertiesQtDialog::
172 _configureForImage( )
173 {
174   if( this->m_Actors.size( ) == 0 )
175     return( false );
176   auto actor =
177     dynamic_cast< vtkImageActor* >( this->m_Actors.begin( )->GetPointer( ) );
178   if( actor == NULL )
179     return( false );
180   auto image = actor->GetInput( );
181   if( image == NULL )
182     return( false );
183
184   // Get properties
185   auto prop = actor->GetProperty( );
186   double r[ 2 ];
187   image->GetScalarRange( r );
188   double w = actor->GetProperty( )->GetColorWindow( );
189   double l = actor->GetProperty( )->GetColorLevel( );
190   double sw = double( 1000 ) * w / ( r[ 1 ] - r[ 0 ] );
191   double sl = double( 1000 ) * ( l - r[ 0 ] ) / ( r[ 1 ] - r[ 0 ] );
192   double op = double( 10 ) * prop->GetOpacity( );
193
194   // Set dialog title
195   std::stringstream title;
196   title << "Parameters for an object of class \"Image\"";
197   this->m_Title->setText( title.str( ).c_str( ) );
198
199   // Create widgets
200   QDoubleSpinBox* win_box = new QDoubleSpinBox( this );
201   win_box->setObjectName( "win_box" );
202   win_box->setDecimals( 3 );
203   win_box->setMinimum( 0 );
204   win_box->setMaximum( r[ 1 ] - r[ 0 ] );
205   win_box->setValue( w );
206   win_box->connect(
207     win_box, SIGNAL( valueChanged( double ) ),
208     this, SLOT( _boxWindow( double ) )
209     );
210
211   QSlider* win_sld = new QSlider( Qt::Horizontal, this );
212   win_sld->setObjectName( "win_sld" );
213   win_sld->setRange( 0, 1000 );
214   win_sld->setValue( ( unsigned int )( sw ) );
215   win_sld->connect(
216     win_sld, SIGNAL( valueChanged( int ) ),
217     this, SLOT( _sldWindow( int ) )
218     );
219
220   QHBoxLayout* win_layout = new QHBoxLayout( );
221   QLabel* win_label = new QLabel( this );
222   win_label->setText( QString( "Window: " ) );
223   win_layout->addWidget( win_label );
224   win_layout->addWidget( win_box );
225   win_layout->addWidget( win_sld );
226   this->m_ToolsLayout->addLayout( win_layout );
227
228   QDoubleSpinBox* lev_box = new QDoubleSpinBox( this );
229   lev_box->setObjectName( "lev_box" );
230   lev_box->setDecimals( 3 );
231   lev_box->setMinimum( r[ 0 ] );
232   lev_box->setMaximum( r[ 1 ] );
233   lev_box->setValue( l );
234   lev_box->connect(
235     lev_box, SIGNAL( valueChanged( double ) ),
236     this, SLOT( _boxLevel( double ) )
237     );
238
239   QSlider* lev_sld = new QSlider( Qt::Horizontal, this );
240   lev_sld->setObjectName( "lev_sld" );
241   lev_sld->setRange( 0, 1000 );
242   lev_sld->setValue( ( unsigned int )( sl ) );
243   lev_sld->connect(
244     lev_sld, SIGNAL( valueChanged( int ) ),
245     this, SLOT( _sldLevel( int ) )
246     );
247
248   QHBoxLayout* lev_layout = new QHBoxLayout( );
249   QLabel* lev_label = new QLabel( this );
250   lev_label->setText( QString( "Level: " ) );
251   lev_layout->addWidget( lev_label );
252   lev_layout->addWidget( lev_box );
253   lev_layout->addWidget( lev_sld );
254   this->m_ToolsLayout->addLayout( lev_layout );
255
256   // Configure generic objects
257   QSlider* op_sld = new QSlider( Qt::Horizontal, this );
258   op_sld->setObjectName( "op_sld" );
259   op_sld->setRange( 0, 10 );
260   op_sld->setValue( ( unsigned int )( op ) );
261   op_sld->connect(
262     op_sld, SIGNAL( valueChanged( int ) ),
263     this, SLOT( _sldOpacity( int ) )
264     );
265
266   QHBoxLayout* op_layout = new QHBoxLayout( );
267   QLabel* op_label = new QLabel( this );
268   op_label->setText( QString( "Opacity: " ) );
269   op_layout->addWidget( op_label );
270   op_layout->addWidget( op_sld );
271   this->m_ToolsLayout->addLayout( op_layout );
272
273   return( true );
274 }
275
276 // -------------------------------------------------------------------------
277 bool cpPlugins::ActorPropertiesQtDialog::
278 _configureForMesh( )
279 {
280   if( this->m_Actors.size( ) == 0 )
281     return( false );
282   auto actor =
283     dynamic_cast< vtkActor* >( this->m_Actors.begin( )->GetPointer( ) );
284   if( actor == NULL )
285     return( false );
286   auto prop = actor->GetProperty( );
287
288   // Set dialog title
289   std::stringstream title;
290   title << "Parameters for an object of class \"Mesh\"";
291   this->m_Title->setText( title.str( ).c_str( ) );
292
293   // Input boxes
294   QSpinBox* ps_box = new QSpinBox( this );
295   ps_box->setObjectName( "ps_box" );
296   ps_box->setMinimum( 1 );
297   ps_box->setMaximum( 100 );
298   ps_box->setValue( prop->GetPointSize( ) );
299   ps_box->connect(
300     ps_box, SIGNAL( valueChanged( int ) ),
301     this, SLOT( _boxPointSize( int ) )
302     );
303
304   QHBoxLayout* ps_layout = new QHBoxLayout( );
305   QLabel* ps_label = new QLabel( this );
306   ps_label->setText( QString( "Point size: " ) );
307   ps_layout->addWidget( ps_label );
308   ps_layout->addWidget( ps_box );
309   this->m_ToolsLayout->addLayout( ps_layout );
310
311   QSpinBox* lw_box = new QSpinBox( this );
312   lw_box->setObjectName( "lw_box" );
313   lw_box->setMinimum( 1 );
314   lw_box->setMaximum( 100 );
315   lw_box->setValue( prop->GetLineWidth( ) );
316   lw_box->connect(
317     lw_box, SIGNAL( valueChanged( int ) ),
318     this, SLOT( _boxLineWidth( int ) )
319     );
320
321   QHBoxLayout* lw_layout = new QHBoxLayout( );
322   QLabel* lw_label = new QLabel( this );
323   lw_label->setText( QString( "Line width: " ) );
324   lw_layout->addWidget( lw_label );
325   lw_layout->addWidget( lw_box );
326   this->m_ToolsLayout->addLayout( lw_layout );
327
328   QCheckBox* sv_box = new QCheckBox( this );
329   sv_box->setObjectName( "sv_box" );
330   sv_box->setText( "Scalar visibility: " );
331   sv_box->setChecked( ( actor->GetMapper( )->GetScalarVisibility( ) == 1 ) );
332   sv_box->connect(
333     sv_box, SIGNAL( stateChanged( int ) ),
334     this, SLOT( _scalarVisibility( int ) )
335     );
336
337   QHBoxLayout* sv_layout = new QHBoxLayout( );
338   sv_layout->addWidget( sv_box );
339   this->m_ToolsLayout->addLayout( sv_layout );
340
341   double cr, cg, cb;
342   prop->GetColor( cr, cg, cb );
343   cr *= double( 255 );
344   cg *= double( 255 );
345   cb *= double( 255 );
346
347   QPushButton* color_button = new QPushButton( "Color", this );
348   color_button->setObjectName( "color_button" );
349   QPalette color_palette = color_button->palette( );
350   color_palette.setColor( QPalette::Button, QColor( cr, cg, cb ) );
351   color_button->setAutoFillBackground( true );
352   color_button->setPalette( color_palette );
353   color_button->update( );
354   color_button->connect(
355     color_button, SIGNAL( clicked( ) ),
356     this, SLOT( _color( ) )
357     );
358
359   QHBoxLayout* color_layout = new QHBoxLayout( );
360   color_layout->addWidget( color_button );
361   this->m_ToolsLayout->addLayout( color_layout );
362
363   // Configure generic objects
364   QSlider* op_sld = new QSlider( Qt::Horizontal, this );
365   op_sld->setObjectName( "op_sld" );
366   op_sld->setRange( 0, 10 );
367   op_sld->setValue(
368     ( unsigned int )( prop->GetOpacity( ) * double( 10 ) )
369     );
370   op_sld->connect(
371     op_sld, SIGNAL( valueChanged( int ) ),
372     this, SLOT( _sldOpacity( int ) )
373     );
374
375   QHBoxLayout* op_layout = new QHBoxLayout( );
376   QLabel* op_label = new QLabel( this );
377   op_label->setText( QString( "Opacity: " ) );
378   op_layout->addWidget( op_label );
379   op_layout->addWidget( op_sld );
380   this->m_ToolsLayout->addLayout( op_layout );
381
382   return( true );
383 }
384
385 // -------------------------------------------------------------------------
386 void cpPlugins::ActorPropertiesQtDialog::
387 _setWindow( double w )
388 {
389   if( this->m_Actors.size( ) == 0 )
390     return;
391   auto aIt = this->m_Actors.begin( );
392   for( ; aIt != this->m_Actors.end( ); ++aIt )
393   {
394     auto actor = dynamic_cast< vtkImageActor* >( aIt->GetPointer( ) );
395     if( actor != NULL )
396     {
397       actor->GetProperty( )->SetColorWindow( w );
398       actor->Modified( );
399
400     } // fi
401
402   } // rof
403   this->_render( );
404 }
405
406 // -------------------------------------------------------------------------
407 void cpPlugins::ActorPropertiesQtDialog::
408 _setLevel( double l )
409 {
410   if( this->m_Actors.size( ) == 0 )
411     return;
412   auto aIt = this->m_Actors.begin( );
413   for( ; aIt != this->m_Actors.end( ); ++aIt )
414   {
415     auto actor = dynamic_cast< vtkImageActor* >( aIt->GetPointer( ) );
416     if( actor != NULL )
417     {
418       actor->GetProperty( )->SetColorLevel( l );
419       actor->Modified( );
420
421     } // fi
422
423   } // rof
424   this->_render( );
425 }
426
427 // -------------------------------------------------------------------------
428 void cpPlugins::ActorPropertiesQtDialog::
429 _render( )
430 {
431   for( auto i = this->m_Windows.begin( ); i != this->m_Windows.end( ); ++i )
432     ( *i )->Render( );
433 }
434
435 // -------------------------------------------------------------------------
436 template< class _TActor >
437 bool cpPlugins::ActorPropertiesQtDialog::
438 _addActor( vtkProp* obj )
439 {
440   auto new_obj = dynamic_cast< _TActor* >( obj );
441   auto pre_obj =
442     dynamic_cast< _TActor* >( this->m_Actors.begin( )->GetPointer( ) );
443   if( new_obj != NULL && pre_obj != NULL )
444   {
445     this->m_Actors.insert( obj );
446     this->m_WidgetsUpdated = false;
447     return( true );
448   }
449   else
450     return( false );
451 }
452
453 // -------------------------------------------------------------------------
454 void cpPlugins::ActorPropertiesQtDialog::
455 _boxWindow( double v )
456 {
457   auto* box = this->findChild< QDoubleSpinBox* >( "win_box" );
458   auto* sld = this->findChild< QSlider* >( "win_sld" );
459   if( box == NULL || sld == NULL )
460     return;
461
462   double min = double( sld->minimum( ) );
463   double max = double( sld->maximum( ) );
464   double vmin = box->minimum( );
465   double vmax = box->maximum( );
466   double s = ( v - vmin ) / ( vmax - vmin );
467   s = ( ( max - min ) * s ) + min;
468
469   bool o = sld->blockSignals( true );
470   sld->setValue( ( unsigned int )( s ) );
471   sld->blockSignals( o );
472   this->_setWindow( v );
473 }
474
475 // -------------------------------------------------------------------------
476 void cpPlugins::ActorPropertiesQtDialog::
477 _sldWindow( int v )
478 {
479   auto* box = this->findChild< QDoubleSpinBox* >( "win_box" );
480   auto* sld = this->findChild< QSlider* >( "win_sld" );
481   if( box == NULL || sld == NULL )
482     return;
483
484   double min = double( sld->minimum( ) );
485   double max = double( sld->maximum( ) );
486   double vmin = box->minimum( );
487   double vmax = box->maximum( );
488   double s = ( double( v ) - min ) / ( max - min );
489   s = ( ( vmax - vmin ) * s ) + vmin;
490
491   bool o = box->blockSignals( true );
492   box->setValue( s );
493   box->blockSignals( o );
494   this->_setWindow( s );
495 }
496
497 // -------------------------------------------------------------------------
498 void cpPlugins::ActorPropertiesQtDialog::
499 _boxLevel( double v )
500 {
501   auto* box = this->findChild< QDoubleSpinBox* >( "lev_box" );
502   auto* sld = this->findChild< QSlider* >( "lev_sld" );
503   if( box == NULL || sld == NULL )
504     return;
505
506   double min = double( sld->minimum( ) );
507   double max = double( sld->maximum( ) );
508   double vmin = box->minimum( );
509   double vmax = box->maximum( );
510   double s = ( v - vmin ) / ( vmax - vmin );
511   s = ( ( max - min ) * s ) + min;
512
513   bool o = sld->blockSignals( true );
514   sld->setValue( ( unsigned int )( s ) );
515   sld->blockSignals( o );
516   this->_setLevel( v );
517 }
518
519 // -------------------------------------------------------------------------
520 void cpPlugins::ActorPropertiesQtDialog::
521 _sldLevel( int v )
522 {
523   auto* box = this->findChild< QDoubleSpinBox* >( "lev_box" );
524   auto* sld = this->findChild< QSlider* >( "lev_sld" );
525   if( box == NULL || sld == NULL )
526     return;
527
528   double min = double( sld->minimum( ) );
529   double max = double( sld->maximum( ) );
530   double vmin = box->minimum( );
531   double vmax = box->maximum( );
532   double s = ( double( v ) - min ) / ( max - min );
533   s = ( ( vmax - vmin ) * s ) + vmin;
534
535   bool o = box->blockSignals( true );
536   box->setValue( s );
537   box->blockSignals( o );
538   this->_setLevel( s );
539 }
540
541 // -------------------------------------------------------------------------
542 void cpPlugins::ActorPropertiesQtDialog::
543 _sldOpacity( int v )
544 {
545   if( this->m_Actors.size( ) == 0 )
546     return;
547   auto* sld = this->findChild< QSlider* >( "op_sld" );
548   if( sld == NULL )
549     return;
550
551   double min = double( sld->minimum( ) );
552   double max = double( sld->maximum( ) );
553   double s = ( double( v ) - min ) / ( max - min );
554
555   auto aIt = this->m_Actors.begin( );
556   for( ; aIt != this->m_Actors.end( ); ++aIt )
557   {
558     auto ia = dynamic_cast< vtkImageActor* >( aIt->GetPointer( ) );
559     auto ma = dynamic_cast< vtkActor* >( aIt->GetPointer( ) );
560     if( ia != NULL )
561     {
562       ia->GetProperty( )->SetOpacity( s );
563       ia->Modified( );
564     }
565     else if( ma != NULL )
566     {
567       ma->GetProperty( )->SetOpacity( s );
568       ma->Modified( );
569
570     } // fi
571
572   } // rof
573   this->_render( );
574 }
575
576 // -------------------------------------------------------------------------
577 void cpPlugins::ActorPropertiesQtDialog::
578 _boxPointSize( int v )
579 {
580   if( this->m_Actors.size( ) == 0 )
581     return;
582   auto aIt = this->m_Actors.begin( );
583   for( ; aIt != this->m_Actors.end( ); ++aIt )
584   {
585     auto ma = dynamic_cast< vtkActor* >( aIt->GetPointer( ) );
586     if( ma != NULL )
587     {
588       ma->GetProperty( )->SetPointSize( v );
589       ma->Modified( );
590
591     } // fi
592
593   } // rof
594   this->_render( );
595 }
596
597 // -------------------------------------------------------------------------
598 void cpPlugins::ActorPropertiesQtDialog::
599 _boxLineWidth( int v )
600 {
601   if( this->m_Actors.size( ) == 0 )
602     return;
603   auto aIt = this->m_Actors.begin( );
604   for( ; aIt != this->m_Actors.end( ); ++aIt )
605   {
606     auto ma = dynamic_cast< vtkActor* >( aIt->GetPointer( ) );
607     if( ma != NULL )
608     {
609       ma->GetProperty( )->SetLineWidth( v );
610       ma->Modified( );
611
612     } // fi
613
614   } // rof
615   this->_render( );
616 }
617
618 // -------------------------------------------------------------------------
619 void cpPlugins::ActorPropertiesQtDialog::
620 _scalarVisibility( int v )
621 {
622   if( this->m_Actors.size( ) == 0 )
623     return;
624   auto* btn = this->findChild< QPushButton* >( "color_button" );
625   auto* chk = this->findChild< QCheckBox* >( "sv_box" );
626   if( btn == NULL || chk == NULL )
627     return;
628   QPalette pal = btn->palette( );
629   QColor color = pal.color( QPalette::Button );
630   double rgb[ 3 ];
631   rgb[ 0 ] = double( color.red( ) ) / double( 255 );
632   rgb[ 1 ] = double( color.green( ) ) / double( 255 );
633   rgb[ 2 ] = double( color.blue( ) ) / double( 255 );
634
635   auto aIt = this->m_Actors.begin( );
636   for( ; aIt != this->m_Actors.end( ); ++aIt )
637   {
638     auto ma = dynamic_cast< vtkActor* >( aIt->GetPointer( ) );
639     if( ma != NULL )
640     {
641       if( !( chk->isChecked( ) ) )
642       {
643         ma->GetMapper( )->ScalarVisibilityOff( );
644         ma->GetProperty( )->SetColor( rgb );
645       }
646       else
647         ma->GetMapper( )->ScalarVisibilityOn( );
648       ma->Modified( );
649
650     } // fi
651
652   } // rof
653   this->_render( );
654 }
655
656 // -------------------------------------------------------------------------
657 void cpPlugins::ActorPropertiesQtDialog::
658 _color( )
659 {
660   if( this->m_Actors.size( ) == 0 )
661     return;
662   auto* btn = this->findChild< QPushButton* >( "color_button" );
663   auto* chk = this->findChild< QCheckBox* >( "sv_box" );
664   if( btn == NULL || chk == NULL )
665     return;
666
667   QPalette pal = btn->palette( );
668   QColor color =
669     QColorDialog::getColor(
670       pal.color( QPalette::Button ),
671       this,
672       "Select Color",
673       QColorDialog::DontUseNativeDialog
674       );
675   if( color.isValid( ) )
676   {
677     pal.setColor( QPalette::Button, color );
678     btn->setAutoFillBackground( true );
679     btn->setPalette( pal );
680     btn->update( );
681     this->_scalarVisibility( 0 );
682
683   } // fi
684 }
685 */
686
687 #endif // cpPlugins_QT4
688
689 // eof - $RCSfile$