Salome HOME
Base class for resource editor and one completed implementation.
[modules/gui.git] / src / Qtx / QtxListResourceEdit.cxx
1 // File:      QtxListResourceEdit.cxx
2 // Author:    Sergey TELKOV
3
4 #include "QtxListResourceEdit.h"
5
6 #include <qhbox.h>
7 #include <qlabel.h>
8 #include <qlayout.h>
9 #include <qlistbox.h>
10 #include <qcombobox.h>
11 #include <qlineedit.h>
12 #include <qcheckbox.h>
13 #include <qtabwidget.h>
14 #include <qvalidator.h>
15 #include <qobjectlist.h>
16 #include <qcolordialog.h>
17 #include <qwidgetstack.h>
18
19 #include "QtxIntSpinBox.h"
20 #include "QtxDblSpinBox.h"
21
22 /*
23   Class: QtxListResourceEdit
24   Descr: GUI implementation of QtxResourceEdit - manager of resources
25 */
26
27 QtxListResourceEdit::QtxListResourceEdit( QtxResourceMgr* mgr, QWidget* parent )
28 : QFrame( parent ),
29 QtxResourceEdit( mgr )
30 {
31   QHBoxLayout* main = new QHBoxLayout( this, 0, 5 );
32
33   myList  = new QListBox( this );
34   myStack = new QWidgetStack( this );
35
36   myList->setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred ) );
37   myStack->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
38
39   main->addWidget( myList );
40   main->addWidget( myStack );
41
42   myList->setSelectionMode( QListBox::Single );
43
44   connect( myList, SIGNAL( selectionChanged() ), this, SLOT( onSelectionChanged() ) );
45
46   setFocusProxy( myList );
47
48   updateState();
49 }
50
51 QtxListResourceEdit::~QtxListResourceEdit()
52 {
53 }
54
55 void QtxListResourceEdit::onSelectionChanged()
56 {
57   int idx = myList->index( myList->selectedItem() );
58   if ( idx < 0 )
59     return;
60
61   myStack->raiseWidget( idx );
62 }
63
64 QtxResourceEdit::Item* QtxListResourceEdit::createItem( const QString& title, const int )
65 {
66   Item* i = item( title, -1 );
67   if ( i )
68     return i;
69
70   Category* category = new Category( this, myStack );
71   myList->insertItem( title );
72   int id = myList->count() - 1;
73   myStack->addWidget( category, id );
74
75   if ( !myList->selectedItem() )
76     myList->setSelected( 0, true );
77
78   updateState();
79
80   return category;
81 }
82
83 void QtxListResourceEdit::updateState()
84 {
85   if ( myStack->visibleWidget() )
86     myStack->show();
87   else
88     myStack->hide();
89 }
90
91 /*
92   Class: QtxListResourceEdit::Category
93   Descr: GUI implementation of preferences category.
94 */
95
96 QtxListResourceEdit::Category::Category( QtxListResourceEdit* edit, QWidget* parent )
97 : QFrame( parent ),
98 Item( edit )
99 {
100   QVBoxLayout* main = new QVBoxLayout( this );
101   QGroupBox* base = new QGroupBox( 1, Qt::Horizontal, "", this );
102   base->setFrameStyle( QFrame::NoFrame );
103   base->setInsideMargin( 0 );
104   main->addWidget( base, 1 );
105
106   myTabs = new QTabWidget( base );
107   myInfo = new QLabel( base );
108
109   myInfo->setAlignment( Qt::AlignCenter );
110   myInfo->setFrameStyle( QFrame::WinPanel | QFrame::Raised );
111   myInfo->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );
112
113   updateState();
114 }
115
116 QtxListResourceEdit::Category::~Category()
117 {
118 }
119
120 int QtxListResourceEdit::Category::type() const
121 {
122   return -1;
123 }
124
125 void QtxListResourceEdit::Category::store()
126 {
127 }
128
129 void QtxListResourceEdit::Category::retrieve()
130 {
131 }
132
133 QVariant QtxListResourceEdit::Category::property( const QString& prop ) const
134 {
135   QVariant var;
136   if ( prop == QString( "information" ) || prop == QString( "info" ) )
137     var = myInfo->text();
138   return var;
139 }
140
141 void QtxListResourceEdit::Category::setProperty( const QString& name, const QVariant& var )
142 {
143   QVariant prop = var;
144   if ( !prop.cast( QVariant::String ) )
145     return;
146
147   if ( name == QString( "information" ) || name == QString( "info" ) )
148     myInfo->setText( prop.toString() );
149
150   updateState();
151 }
152
153 QtxResourceEdit::Item* QtxListResourceEdit::Category::createItem( const QString& title, const int )
154 {
155   Item* i = item( title, id() );
156   if ( i )
157     return i;
158
159   Tab* tab = new Tab( resourceEdit(), this, this );
160   myTabs->addTab( tab, title );
161
162   updateState();
163
164   return tab;
165 }
166
167 void QtxListResourceEdit::Category::updateState()
168 {
169   if ( myTabs->count() )
170     myTabs->show();
171   else
172     myTabs->hide();
173
174   if ( !myTabs->count() && !myInfo->text().isEmpty() )
175     myInfo->show();
176   else
177     myInfo->hide();
178 }
179
180 /*
181   Class: QtxListResourceEdit::Tab
182   Descr: GUI implementation of resources tab.
183 */
184
185 QtxListResourceEdit::Tab::Tab( QtxResourceEdit* edit, Item* pItem, QWidget* parent )
186 : QFrame( parent ),
187 Item( edit, pItem )
188 {
189   QVBoxLayout* main = new QVBoxLayout( this );
190   myMainFrame = new QGroupBox( 1, Qt::Horizontal, "", this );
191   myMainFrame->setFrameStyle( QFrame::NoFrame );
192   myMainFrame->setInsideMargin( 5 );
193   main->addWidget( myMainFrame );
194 }
195
196 QtxListResourceEdit::Tab::~Tab()
197 {
198 }
199
200 int QtxListResourceEdit::Tab::type() const
201 {
202   return -1;
203 }
204
205 void QtxListResourceEdit::Tab::store()
206 {
207 }
208
209 void QtxListResourceEdit::Tab::retrieve()
210 {
211 }
212
213 void QtxListResourceEdit::Tab::polish()
214 {
215   QFrame::polish();
216
217   adjustLabels();
218 }
219
220 QtxResourceEdit::Item* QtxListResourceEdit::Tab::createItem( const QString& title, const int )
221 {
222   Item* i = item( title, id() );
223   if ( i )
224     return i;
225
226   Group* group = new Group( title, resourceEdit(), this, myMainFrame );
227
228   return group;
229 }
230
231 void QtxListResourceEdit::Tab::adjustLabels()
232 {
233   QObjectList* labels = queryList( "QLabel" );
234   if ( labels )
235   {
236     int w = 0;
237     for ( QObjectListIt it1( *labels ); it1.current(); ++it1 )
238     {
239       if ( it1.current()->isWidgetType() )
240       {
241         QWidget* wid = (QWidget*)it1.current();
242         w = QMAX( w, wid->sizeHint().width() );
243       }
244     }
245     for ( QObjectListIt it2( *labels ); it2.current(); ++it2 )
246     {
247       if ( it2.current()->isWidgetType() )
248       {
249         QWidget* wid = (QWidget*)it2.current();
250         wid->setMinimumWidth( w );
251       }
252     }
253     delete labels;
254   }
255 }
256
257 /*
258   Class: QtxListResourceEdit::Group
259   Descr: GUI implementation of resources group.
260 */
261
262 QtxListResourceEdit::Group::Group( const QString& title, QtxResourceEdit* edit, Item* pItem, QWidget* parent )
263 : QGroupBox( 2, Qt::Horizontal, title, parent ),
264 Item( edit, pItem )
265 {
266 }
267
268 QtxListResourceEdit::Group::~Group()
269 {
270 }
271
272 int QtxListResourceEdit::Group::type() const
273 {
274   return -1;
275 }
276
277 void QtxListResourceEdit::Group::store()
278 {
279 }
280
281 void QtxListResourceEdit::Group::retrieve()
282 {
283 }
284
285 QVariant QtxListResourceEdit::Group::property( const QString& prop ) const
286 {
287   QVariant var;
288   if ( prop == "columns" )
289     var = QVariant( columns() );
290   return var;
291 }
292
293 void QtxListResourceEdit::Group::setProperty( const QString& name, const QVariant& var )
294 {
295   QVariant prop = var;
296   if ( !prop.cast( QVariant::Int ) )
297     return;
298
299   if ( name == QString( "columns" ) && prop.toInt() > 0 )
300     setColumns( prop.toInt() );
301 }
302
303 void QtxListResourceEdit::Group::setTitle( const QString& title )
304 {
305   Item::setTitle( title );
306   QGroupBox::setTitle( title );
307 }
308
309 QtxResourceEdit::Item* QtxListResourceEdit::Group::createItem( const QString& title, const int type )
310 {
311   Item* item = 0;
312
313   switch ( type )
314   {
315   case Color:
316     item = new ColorItem( title, resourceEdit(), this, this );
317     break;
318   case Bool:
319     item = new StateItem( title, resourceEdit(), this, this );
320     break;
321   case String:
322     item = new StringItem( title, resourceEdit(), this, this );
323     break;
324   case List:
325     item = new ListItem( title, resourceEdit(), this, this );
326     break;
327   case RealSpin:
328     item = new DoubleSpinItem( title, resourceEdit(), this, this );
329     break;
330   case IntegerSpin:
331     item = new IntegerSpinItem( title, resourceEdit(), this, this );
332     break;
333   case RealEdit:
334     item = new DoubleEditItem( title, resourceEdit(), this, this );
335     break;
336   case IntegerEdit:
337     item = new IntegerEditItem( title, resourceEdit(), this, this );
338     break;
339   case Space:
340     item = new Spacer( resourceEdit(), this, this );
341     break;
342   }
343
344   return item;
345 }
346
347 /*
348   Class: QtxListResourceEdit::PrefItem
349   Descr: Base class for preferences items.
350 */
351
352 QtxListResourceEdit::PrefItem::PrefItem( const int type, QtxResourceEdit* edit, Item* pi, QWidget* parent )
353 : QHBox( parent ),
354 Item( edit, pi ),
355 myType( type )
356 {
357   setSpacing( 5 );
358 }
359
360 QtxListResourceEdit::PrefItem::~PrefItem()
361 {
362 }
363
364 int QtxListResourceEdit::PrefItem::type() const
365 {
366   return myType;
367 }
368
369 QtxResourceEdit::Item* QtxListResourceEdit::PrefItem::createItem( const QString&, const int )
370 {
371   return 0;
372 }
373
374 /*
375   Class: QtxListResourceEdit::Spacer
376   Descr: GUI implementation of resources spacer.
377 */
378
379 QtxListResourceEdit::Spacer::Spacer( QtxResourceEdit* edit, Item* pItem, QWidget* parent )
380 : PrefItem( Space, edit, pItem, parent )
381 {
382   setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
383 }
384
385 QtxListResourceEdit::Spacer::~Spacer()
386 {
387 }
388
389 void QtxListResourceEdit::Spacer::store()
390 {
391 }
392
393 void QtxListResourceEdit::Spacer::retrieve()
394 {
395 }
396
397 /*
398   Class: QtxListResourceEdit::ListItem
399   Descr: GUI implementation of resources list item.
400 */
401
402 QtxListResourceEdit::ListItem::ListItem( const QString& title, QtxResourceEdit* edit,
403                                          Item* pItem, QWidget* parent )
404 : PrefItem( List, edit, pItem, parent )
405 {
406   new QLabel( title, this );
407   myList = new QComboBox( false, this );
408   myList->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
409 }
410
411 QtxListResourceEdit::ListItem::~ListItem()
412 {
413 }
414
415 void QtxListResourceEdit::ListItem::store()
416 {
417   int idx = myList->currentItem();
418   if ( myIndex.contains( idx ) )
419     setInteger( myIndex[idx] );
420 }
421
422 void QtxListResourceEdit::ListItem::retrieve()
423 {
424   int id = getInteger( -1 );
425
426   int idx = -1;
427   for ( QMap<int, int>::ConstIterator it = myIndex.begin(); it != myIndex.end() && idx == -1; ++it )
428   {
429     if ( it.data() == id )
430       idx = it.key();
431   }
432
433   myList->setCurrentItem( idx );
434 }
435
436 QVariant QtxListResourceEdit::ListItem::property( const QString& name ) const
437 {
438   QVariant val;
439   if ( name == QString( "strings" ) )
440   {
441     QStringList lst;
442     for ( int i = 0; i < (int)myList->count(); i++ )
443       lst.append( myList->text( i ) );
444     val = QVariant( lst );
445   }
446   else if ( name == QString( "indexes" ) )
447   {
448     QValueList<QVariant> lst;
449     for ( int i = 0; i < (int)myList->count(); i++ )
450       lst.append( myIndex.contains( i ) ? myIndex[i] : 0 );
451     val = QVariant( lst );
452   }
453   return val;
454 }
455
456 void QtxListResourceEdit::ListItem::setProperty( const QString& name, const QVariant& val )
457 {
458   if ( name == QString( "strings" ) )
459     setStrings( val );
460   else if ( name == QString( "indexes" ) )
461     setIndexes( val );
462 }
463
464 void QtxListResourceEdit::ListItem::setStrings( const QVariant& var )
465 {
466   if ( var.type() != QVariant::StringList )
467     return;
468
469   setStrings( var.toStringList() );
470 }
471
472 void QtxListResourceEdit::ListItem::setIndexes( const QVariant& var )
473 {
474   if ( var.type() != QVariant::List )
475     return;
476
477   QValueList<QVariant> varList = var.toList();
478   QValueList<int> lst;
479   for ( QValueList<QVariant>::const_iterator it = varList.begin(); it != varList.end(); ++it )
480   {
481     if ( (*it).canCast( QVariant::Int ) )
482       lst.append( (*it).toInt() );
483   }
484   setIndexes( lst );
485 }
486
487 void QtxListResourceEdit::ListItem::setStrings( const QStringList& lst )
488 {
489   myList->clear();
490   myList->insertStringList( lst );
491 }
492
493 void QtxListResourceEdit::ListItem::setIndexes( const QValueList<int>& lst )
494 {
495   myIndex.clear();
496
497   int idx = 0;
498   for ( QValueList<int>::const_iterator it = lst.begin(); it != lst.end(); ++it, idx++ )
499     myIndex.insert( idx, *it );
500 }
501
502 /*
503   Class: QtxListResourceEdit::StateItem
504   Descr: GUI implementation of resources bool item.
505 */
506
507 QtxListResourceEdit::StateItem::StateItem( const QString& title, QtxResourceEdit* edit,
508                                            Item* pItem, QWidget* parent )
509 : PrefItem( Bool, edit, pItem, parent )
510 {
511   myState = new QCheckBox( title, this );
512   myState->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
513 }
514
515 QtxListResourceEdit::StateItem::~StateItem()
516 {
517 }
518
519 void QtxListResourceEdit::StateItem::store()
520 {
521   setBoolean( myState->isChecked() );
522 }
523
524 void QtxListResourceEdit::StateItem::retrieve()
525 {
526   myState->setChecked( getBoolean() );
527 }
528
529 /*
530   Class: QtxListResourceEdit::StringItem
531   Descr: GUI implementation of resources string item.
532 */
533
534 QtxListResourceEdit::StringItem::StringItem( const QString& title, QtxResourceEdit* edit,
535                                              Item* pItem, QWidget* parent )
536 : PrefItem( String, edit, pItem, parent )
537 {
538   new QLabel( title, this );
539   myString = new QLineEdit( this );
540   myString->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
541 }
542
543 QtxListResourceEdit::StringItem::~StringItem()
544 {
545 }
546
547 void QtxListResourceEdit::StringItem::store()
548 {
549   setString( myString->text() );
550 }
551
552 void QtxListResourceEdit::StringItem::retrieve()
553 {
554   myString->setText( getString() );
555 }
556
557 /*
558   Class: QtxListResourceEdit::IntegerEditItem
559   Descr: GUI implementation of resources integer item.
560 */
561
562 QtxListResourceEdit::IntegerEditItem::IntegerEditItem( const QString& title, QtxResourceEdit* edit, Item* pItem, QWidget* parent )
563 : PrefItem( IntegerEdit, edit, pItem, parent )
564 {
565   new QLabel( title, this );
566   myInteger = new QLineEdit( this );
567   myInteger->setValidator( new QIntValidator( myInteger ) );
568   myInteger->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
569 }
570
571 QtxListResourceEdit::IntegerEditItem::~IntegerEditItem()
572 {
573 }
574
575 void QtxListResourceEdit::IntegerEditItem::store()
576 {
577   setString( myInteger->text() );
578 }
579
580 void QtxListResourceEdit::IntegerEditItem::retrieve()
581 {
582   myInteger->setText( getString() );
583 }
584
585 /*
586   Class: QtxListResourceEdit::IntegerSpinItem
587   Descr: GUI implementation of resources integer item.
588 */
589
590 QtxListResourceEdit::IntegerSpinItem::IntegerSpinItem( const QString& title, QtxResourceEdit* edit, Item* pItem, QWidget* parent )
591 : PrefItem( IntegerSpin, edit, pItem, parent )
592 {
593   new QLabel( title, this );
594   myInteger = new QtxIntSpinBox( this );
595   myInteger->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
596 }
597
598 QtxListResourceEdit::IntegerSpinItem::~IntegerSpinItem()
599 {
600 }
601
602 void QtxListResourceEdit::IntegerSpinItem::store()
603 {
604   setInteger( myInteger->value() );
605 }
606
607 void QtxListResourceEdit::IntegerSpinItem::retrieve()
608 {
609   myInteger->setValue( getInteger() );
610 }
611
612 QVariant QtxListResourceEdit::IntegerSpinItem::property( const QString& name ) const
613 {
614   QVariant var;
615   if ( name == QString( "minimum" ) || name == QString( "min" ) )
616     var = QVariant( myInteger->minValue() );
617   else if ( name == QString( "maximum" ) || name == QString( "max" ) )
618     var = QVariant( myInteger->maxValue() );
619   else if ( name == QString( "step" ) )
620     var = QVariant( myInteger->lineStep() );
621   return var;
622 }
623
624 void QtxListResourceEdit::IntegerSpinItem::setProperty( const QString& name, const QVariant& var )
625 {
626   QVariant prop = var;
627   if ( !prop.cast( QVariant::Int ) )
628     return;
629
630   int val = prop.toInt();
631   if ( name == QString( "minimum" ) || name == QString( "min" ) )
632     myInteger->setMinValue( val );
633   else if ( name == QString( "maximum" ) || name == QString( "max" ) )
634     myInteger->setMaxValue( val );
635   else if ( name == QString( "step" ) && val > 0 )
636     myInteger->setLineStep( val );
637 }
638
639 /*
640   Class: QtxListResourceEdit::DoubleEditItem
641   Descr: GUI implementation of resources string item.
642 */
643
644 QtxListResourceEdit::DoubleEditItem::DoubleEditItem( const QString& title, QtxResourceEdit* edit,
645                                                      Item* pItem, QWidget* parent )
646 : PrefItem( RealEdit, edit, pItem, parent )
647 {
648   new QLabel( title, this );
649   myDouble = new QLineEdit( this );
650   myDouble->setValidator( new QDoubleValidator( myDouble ) );
651   myDouble->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
652 }
653
654 QtxListResourceEdit::DoubleEditItem::~DoubleEditItem()
655 {
656 }
657
658 void QtxListResourceEdit::DoubleEditItem::store()
659 {
660   setString( myDouble->text() );
661 }
662
663 void QtxListResourceEdit::DoubleEditItem::retrieve()
664 {
665   myDouble->setText( getString() );
666 }
667
668 /*
669   Class: QtxListResourceEdit::DoubleSpinItem
670   Descr: GUI implementation of resources double item.
671 */
672
673 QtxListResourceEdit::DoubleSpinItem::DoubleSpinItem( const QString& title, QtxResourceEdit* edit,
674                                                      Item* pItem, QWidget* parent )
675 : PrefItem( RealSpin, edit, pItem, parent )
676 {
677   new QLabel( title, this );
678   myDouble = new QtxDblSpinBox( this );
679   myDouble->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
680 }
681
682 QtxListResourceEdit::DoubleSpinItem::~DoubleSpinItem()
683 {
684 }
685
686 void QtxListResourceEdit::DoubleSpinItem::store()
687 {
688   setDouble( myDouble->value() );
689 }
690
691 void QtxListResourceEdit::DoubleSpinItem::retrieve()
692 {
693   myDouble->setValue( getDouble() );
694 }
695
696 QVariant QtxListResourceEdit::DoubleSpinItem::property( const QString& name ) const
697 {
698   QVariant var;
699   if ( name == QString( "minimum" ) || name == QString( "min" ) )
700     var = QVariant( myDouble->minValue() );
701   else if ( name == QString( "maximum" ) || name == QString( "max" ) )
702     var = QVariant( myDouble->maxValue() );
703   else if ( name == QString( "precision" ) )
704     var = QVariant( myDouble->precision() );
705   else if ( name == QString( "step" ) )
706     var = QVariant( myDouble->lineStep() );
707   return var;
708 }
709
710 void QtxListResourceEdit::DoubleSpinItem::setProperty( const QString& name, const QVariant& var )
711 {
712   QVariant prop = var;
713   if ( prop.cast( QVariant::Double ) )
714   {
715     double val = prop.toDouble();
716     if ( name == QString( "minimum" ) || name == QString( "min" ) )
717       myDouble->setMinValue( val );
718     else if ( name == QString( "maximum" ) || name == QString( "max" ) )
719       myDouble->setMaxValue( val );
720     else if ( name == QString( "step" ) && val > 0 )
721       myDouble->setLineStep( val );
722   }
723   else
724   {
725     QVariant prop = var;
726     if ( prop.cast( QVariant::Int ) && name == QString( "precision" ) && prop.toInt() > 0 )
727       myDouble->setPrecision( prop.toInt() );
728   }
729 }
730
731 /*
732   Class: QtxListResourceEdit::ColorItem
733   Descr: GUI implementation of resources color item.
734 */
735
736 QtxListResourceEdit::ColorItem::ColorItem( const QString& title, QtxResourceEdit* edit,
737                                            Item* pItem, QWidget* parent )
738 : PrefItem( Color, edit, pItem, parent )
739 {
740   class ColorSelector : public QLabel
741   {
742   public:
743     ColorSelector( QWidget* parent = 0 ) : QLabel( parent )
744     {
745       setFrameStyle( WinPanel | Raised );
746     }
747     virtual ~ColorSelector() {}
748     virtual QSize minimumSizeHint() const
749     {
750       return QLabel::minimumSizeHint() + QSize( 0, 2 );
751     }
752
753   protected:
754     virtual void mousePressEvent( QMouseEvent* e )
755     {
756       if ( e->button() == LeftButton )
757       {
758         setFrameStyle( WinPanel | Sunken );
759         QColor c = QColorDialog::getColor( paletteBackgroundColor(), this );
760         if ( c.isValid() )
761           setPaletteBackgroundColor( c );
762
763         setFrameStyle( WinPanel | Raised );
764       }
765     }
766   };
767
768   new QLabel( title, this );
769   myColor = new ColorSelector( this );
770   myColor->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
771 }
772
773 QtxListResourceEdit::ColorItem::~ColorItem()
774 {
775 }
776
777 void QtxListResourceEdit::ColorItem::store()
778 {
779   setColor( myColor->paletteBackgroundColor() );
780 }
781
782 void QtxListResourceEdit::ColorItem::retrieve()
783 {
784   myColor->setPaletteBackgroundColor( getColor() );
785 }