Salome HOME
Preferences improvements. Empty categories not shown.
[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 <qvbox.h>
8 #include <qlabel.h>
9 #include <qlayout.h>
10 #include <qlistbox.h>
11 #include <qcombobox.h>
12 #include <qlineedit.h>
13 #include <qcheckbox.h>
14 #include <qtabwidget.h>
15 #include <qvalidator.h>
16 #include <qobjectlist.h>
17 #include <qcolordialog.h>
18 #include <qwidgetstack.h>
19 #include <qtoolbutton.h>
20 #include <qfontdialog.h>
21
22 #include "QtxIntSpinBox.h"
23 #include "QtxDblSpinBox.h"
24
25 /*
26   Class: QtxListResourceEdit
27   Descr: GUI implementation of QtxResourceEdit - manager of resources
28 */
29
30 QtxListResourceEdit::QtxListResourceEdit( QtxResourceMgr* mgr, QWidget* parent )
31 : QFrame( parent ),
32 QtxResourceEdit( mgr )
33 {
34   QVBoxLayout* main = new QVBoxLayout( this, 0, 5 );
35   QGroupBox* base = new QGroupBox( 1, Qt::Vertical, "", this );
36   base->setFrameStyle( QFrame::NoFrame );
37   base->setInsideMargin( 0 );
38   main->addWidget( base );
39
40   myList  = new QListBox( base );
41   myStack = new QWidgetStack( base );
42
43   myList->setSizePolicy( QSizePolicy( QSizePolicy::Minimum, QSizePolicy::Expanding ) );
44   myStack->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );
45
46   myList->setSelectionMode( QListBox::Single );
47
48   connect( myList, SIGNAL( selectionChanged() ), this, SLOT( onSelectionChanged() ) );
49
50   setFocusProxy( myList );
51
52   updateState();
53 }
54
55 QtxListResourceEdit::~QtxListResourceEdit()
56 {
57 }
58
59 void QtxListResourceEdit::setItemProperty( const int id, const QString& prop, const QVariant& val )
60 {
61   Item* i = item( id );
62   if ( !i )
63     return;
64
65   bool prev = i->isEmpty();
66
67   QtxResourceEdit::setItemProperty( id, prop, val );
68
69   bool next = i->isEmpty();
70
71   if ( prev != next )
72     updateVisible();
73 }
74
75 void QtxListResourceEdit::onSelectionChanged()
76 {
77   QString title = myList->text( myList->index( myList->selectedItem() ) );
78   if ( title.isEmpty() )
79     return;
80
81   Item* i = 0;
82   QPtrList<Item> lst;
83   childItems( lst );
84   for ( QPtrListIterator<Item> it( lst ); it.current() && !i; ++it )
85   {
86     if ( it.current()->title() == title )
87       i = it.current();
88   }
89
90   if ( i )
91     myStack->raiseWidget( i->id() );
92 }
93
94 void QtxListResourceEdit::itemAdded( QtxResourceEdit::Item* i )
95 {
96   if ( !i )
97     return;
98
99   QPtrList<Item> items;
100   childItems( items );
101
102   if ( items.contains( i ) || items.contains( i->parentItem() ) )
103     updateVisible();
104 }
105
106 QtxResourceEdit::Item* QtxListResourceEdit::createItem( const QString& title, const int )
107 {
108   Item* i = item( title, -1 );
109   if ( i )
110     return i;
111
112   Category* category = new Category( this, myStack );
113   myStack->addWidget( category, category->id() );
114
115   updateVisible();
116
117   if ( !myList->selectedItem() )
118     myList->setSelected( 0, true );
119
120   updateState();
121
122   return category;
123 }
124
125 void QtxListResourceEdit::changedResources( const QMap<Item*, QString>& map )
126 {
127   QMap<int, QString> idMap;
128   for ( QMap<Item*, QString>::ConstIterator it = map.begin(); it != map.end(); ++it )
129   {
130     idMap.insert( it.key()->id(), it.data() );
131
132     emit resourceChanged( it.key()->id() );
133
134     QString sec, param;
135     it.key()->resource( sec, param );
136     emit resourceChanged( sec, param );
137   }
138
139   emit resourcesChanged( idMap );
140 }
141
142 void QtxListResourceEdit::updateState()
143 {
144   if ( myList->selectedItem() &&  myStack->visibleWidget() )
145     myStack->show();
146   else
147     myStack->hide();
148 }
149
150 void QtxListResourceEdit::updateVisible()
151 {
152   QPtrList<Item> items;
153   childItems( items );
154
155   QString name = myList->text( myList->index( myList->selectedItem() ) );
156
157   myList->clear();
158   for ( QPtrListIterator<Item> it( items ); it.current(); ++it )
159   {
160     if ( it.current()->isEmpty() )
161       continue;
162
163     myList->insertItem( it.current()->title() );
164   }
165
166   int idx = -1;
167   for ( int i = 0; i < (int)myList->count() && idx == -1; i++ )
168   {
169     if ( myList->text( i ) == name )
170       idx = i;
171   }
172
173   myList->setSelected( QMAX( idx, 0 ), true );
174
175   updateState();
176 }
177
178 /*
179   Class: QtxListResourceEdit::Category
180   Descr: GUI implementation of preferences category.
181 */
182
183 QtxListResourceEdit::Category::Category( QtxListResourceEdit* edit, QWidget* parent )
184 : QFrame( parent ),
185 Item( edit )
186 {
187   QVBoxLayout* main = new QVBoxLayout( this );
188   QGroupBox* base = new QGroupBox( 1, Qt::Horizontal, "", this );
189   base->setFrameStyle( QFrame::NoFrame );
190   base->setInsideMargin( 0 );
191   main->addWidget( base, 1 );
192
193   myTabs = new QTabWidget( base );
194   myInfo = new QLabel( base );
195
196   myInfo->setAlignment( Qt::AlignCenter );
197   myInfo->setFrameStyle( QFrame::WinPanel | QFrame::Raised );
198   myInfo->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );
199
200   updateState();
201 }
202
203 QtxListResourceEdit::Category::~Category()
204 {
205 }
206
207 bool QtxListResourceEdit::Category::isEmpty() const
208 {
209   return Item::isEmpty() && myInfo->text().isEmpty();
210 }
211
212 int QtxListResourceEdit::Category::type() const
213 {
214   return -1;
215 }
216
217 void QtxListResourceEdit::Category::store()
218 {
219 }
220
221 void QtxListResourceEdit::Category::retrieve()
222 {
223 }
224
225 QVariant QtxListResourceEdit::Category::property( const QString& prop ) const
226 {
227   QVariant var;
228   if ( prop == QString( "information" ) || prop == QString( "info" ) )
229     var = myInfo->text();
230   return var;
231 }
232
233 void QtxListResourceEdit::Category::setProperty( const QString& name, const QVariant& var )
234 {
235   QVariant prop = var;
236   if ( !prop.cast( QVariant::String ) )
237     return;
238
239   if ( name == QString( "information" ) || name == QString( "info" ) )
240     myInfo->setText( prop.toString() );
241
242   updateState();
243 }
244
245 QtxResourceEdit::Item* QtxListResourceEdit::Category::createItem( const QString& title, const int )
246 {
247   Item* i = item( title, id() );
248   if ( i )
249     return i;
250
251   Tab* tab = new Tab( resourceEdit(), this, this );
252   myTabs->addTab( tab, title );
253
254   updateState();
255
256   return tab;
257 }
258
259 void QtxListResourceEdit::Category::updateState()
260 {
261   if ( myTabs->count() )
262     myTabs->show();
263   else
264     myTabs->hide();
265
266   if ( !myTabs->count() && !myInfo->text().isEmpty() )
267     myInfo->show();
268   else
269     myInfo->hide();
270 }
271
272 /*
273   Class: QtxListResourceEdit::Tab
274   Descr: GUI implementation of resources tab.
275 */
276
277 QtxListResourceEdit::Tab::Tab( QtxResourceEdit* edit, Item* pItem, QWidget* parent )
278 : QFrame( parent ),
279 Item( edit, pItem )
280 {
281   QVBoxLayout* main = new QVBoxLayout( this );
282   QVBox* vbox = new QVBox( this );
283   vbox->setMargin( 5 );
284   myMainFrame = vbox;
285   main->addWidget( myMainFrame );
286   main->addStretch( 1 );
287 }
288
289 QtxListResourceEdit::Tab::~Tab()
290 {
291 }
292
293 int QtxListResourceEdit::Tab::type() const
294 {
295   return -1;
296 }
297
298 void QtxListResourceEdit::Tab::store()
299 {
300 }
301
302 void QtxListResourceEdit::Tab::retrieve()
303 {
304 }
305
306 void QtxListResourceEdit::Tab::polish()
307 {
308   QFrame::polish();
309
310   adjustLabels();
311 }
312
313 QtxResourceEdit::Item* QtxListResourceEdit::Tab::createItem( const QString& title, const int )
314 {
315   Item* i = item( title, id() );
316   if ( i )
317     return i;
318
319   Group* group = new Group( title, resourceEdit(), this, myMainFrame );
320
321   return group;
322 }
323
324 void QtxListResourceEdit::Tab::adjustLabels()
325 {
326   QObjectList* labels = queryList( "QLabel" );
327   if ( labels )
328   {
329     int w = 0;
330     for ( QObjectListIt it1( *labels ); it1.current(); ++it1 )
331     {
332       if ( it1.current()->isWidgetType() )
333       {
334         QWidget* wid = (QWidget*)it1.current();
335         w = QMAX( w, wid->sizeHint().width() );
336       }
337     }
338     for ( QObjectListIt it2( *labels ); it2.current(); ++it2 )
339     {
340       if ( it2.current()->isWidgetType() )
341       {
342         QWidget* wid = (QWidget*)it2.current();
343         wid->setMinimumWidth( w );
344       }
345     }
346     delete labels;
347   }
348 }
349
350 /*
351   Class: QtxListResourceEdit::Group
352   Descr: GUI implementation of resources group.
353 */
354
355 QtxListResourceEdit::Group::Group( const QString& title, QtxResourceEdit* edit, Item* pItem, QWidget* parent )
356 : QGroupBox( 2, Qt::Horizontal, title, parent ),
357 Item( edit, pItem )
358 {
359 }
360
361 QtxListResourceEdit::Group::~Group()
362 {
363 }
364
365 int QtxListResourceEdit::Group::type() const
366 {
367   return -1;
368 }
369
370 void QtxListResourceEdit::Group::store()
371 {
372 }
373
374 void QtxListResourceEdit::Group::retrieve()
375 {
376 }
377
378 QVariant QtxListResourceEdit::Group::property( const QString& prop ) const
379 {
380   QVariant var;
381   if ( prop == "columns" )
382     var = QVariant( columns() );
383   else if ( prop == "orientation" )
384     var = QVariant( orientation() );
385   else if ( prop == "frame" )
386     var = QVariant( frameStyle() != QFrame::NoFrame );
387   return var;
388 }
389
390 void QtxListResourceEdit::Group::setProperty( const QString& name, const QVariant& var )
391 {
392   QVariant prop = var;
393   if ( !prop.cast( QVariant::Int ) )
394     return;
395
396   if ( name == QString( "columns" ) && prop.cast( QVariant::Int ) && prop.toInt() > 0 )
397     setColumns( prop.toInt() );
398   else if ( name == QString( "orientation" ) && prop.cast( QVariant::Int ) )
399   {
400     int o = prop.toInt();
401     if ( o == Qt::Horizontal || o == Qt::Vertical )
402       setOrientation( (Orientation)o );
403   }
404   else if ( name == "frame" && prop.cast( QVariant::Bool ) )
405   {
406     setInsideMargin( prop.toBool() ? 5 : 0 );
407     QGroupBox::setTitle( prop.toBool() ? Item::title() : QString::null );
408     setFrameStyle( prop.toBool() ? QFrame::Box | QFrame::Sunken : QFrame::NoFrame );
409   }
410 }
411
412 void QtxListResourceEdit::Group::setTitle( const QString& title )
413 {
414   Item::setTitle( title );
415   QGroupBox::setTitle( title );
416 }
417
418 QtxResourceEdit::Item* QtxListResourceEdit::Group::createItem( const QString& title, const int type )
419 {
420   Item* item = 0;
421
422   switch ( type )
423   {
424   case Color:
425     item = new ColorItem( title, resourceEdit(), this, this );
426     break;
427   case Bool:
428     item = new StateItem( title, resourceEdit(), this, this );
429     break;
430   case String:
431     item = new StringItem( title, resourceEdit(), this, this );
432     break;
433   case Selector:
434     item = new SelectItem( title, resourceEdit(), this, this );
435     break;
436   case DblSpin:
437     item = new DoubleSpinItem( title, resourceEdit(), this, this );
438     break;
439   case IntSpin:
440     item = new IntegerSpinItem( title, resourceEdit(), this, this );
441     break;
442   case Double:
443     item = new DoubleEditItem( title, resourceEdit(), this, this );
444     break;
445   case Integer:
446     item = new IntegerEditItem( title, resourceEdit(), this, this );
447     break;
448   case Space:
449     item = new Spacer( resourceEdit(), this, this );
450     break;
451   case GroupBox:
452     item = new Group( title, resourceEdit(), this, this );
453     break;
454   case Font:
455     item = new FontItem( title, resourceEdit(), this, this );
456     break;
457   }
458
459   return item;
460 }
461
462 /*
463   Class: QtxListResourceEdit::PrefItem
464   Descr: Base class for preferences items.
465 */
466
467 QtxListResourceEdit::PrefItem::PrefItem( const int type, QtxResourceEdit* edit, Item* pi, QWidget* parent )
468 : QHBox( parent ),
469 Item( edit, pi ),
470 myType( type )
471 {
472   setSpacing( 5 );
473 }
474
475 QtxListResourceEdit::PrefItem::~PrefItem()
476 {
477 }
478
479 int QtxListResourceEdit::PrefItem::type() const
480 {
481   return myType;
482 }
483
484 QtxResourceEdit::Item* QtxListResourceEdit::PrefItem::createItem( const QString&, const int )
485 {
486   return 0;
487 }
488
489 /*
490   Class: QtxListResourceEdit::Spacer
491   Descr: GUI implementation of resources spacer.
492 */
493
494 QtxListResourceEdit::Spacer::Spacer( QtxResourceEdit* edit, Item* pItem, QWidget* parent )
495 : PrefItem( Space, edit, pItem, parent )
496 {
497   setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
498 }
499
500 QtxListResourceEdit::Spacer::~Spacer()
501 {
502 }
503
504 void QtxListResourceEdit::Spacer::store()
505 {
506 }
507
508 void QtxListResourceEdit::Spacer::retrieve()
509 {
510 }
511
512 /*
513   Class: QtxListResourceEdit::SelectItem
514   Descr: GUI implementation of resources list item.
515 */
516
517 QtxListResourceEdit::SelectItem::SelectItem( const QString& title, QtxResourceEdit* edit,
518                                              Item* pItem, QWidget* parent )
519 : PrefItem( Selector, edit, pItem, parent )
520 {
521   new QLabel( title, this );
522   myList = new QComboBox( false, this );
523   myList->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
524 }
525
526 QtxListResourceEdit::SelectItem::~SelectItem()
527 {
528 }
529
530 void QtxListResourceEdit::SelectItem::store()
531 {
532   int idx = myList->currentItem();
533   if ( myIndex.contains( idx ) )
534     setInteger( myIndex[idx] );
535 }
536
537 void QtxListResourceEdit::SelectItem::retrieve()
538 {
539   int id = getInteger( -1 );
540
541   int idx = -1;
542   for ( QMap<int, int>::ConstIterator it = myIndex.begin(); it != myIndex.end() && idx == -1; ++it )
543   {
544     if ( it.data() == id )
545       idx = it.key();
546   }
547
548   myList->setCurrentItem( idx );
549 }
550
551 QVariant QtxListResourceEdit::SelectItem::property( const QString& name ) const
552 {
553   QVariant val;
554   if ( name == QString( "strings" ) )
555   {
556     QStringList lst;
557     for ( int i = 0; i < (int)myList->count(); i++ )
558       lst.append( myList->text( i ) );
559     val = QVariant( lst );
560   }
561   else if ( name == QString( "indexes" ) )
562   {
563     QValueList<QVariant> lst;
564     for ( int i = 0; i < (int)myList->count(); i++ )
565       lst.append( myIndex.contains( i ) ? myIndex[i] : 0 );
566     val = QVariant( lst );
567   }
568   return val;
569 }
570
571 void QtxListResourceEdit::SelectItem::setProperty( const QString& name, const QVariant& val )
572 {
573   if ( name == QString( "strings" ) )
574     setStrings( val );
575   else if ( name == QString( "indexes" ) )
576     setIndexes( val );
577 }
578
579 void QtxListResourceEdit::SelectItem::setStrings( const QVariant& var )
580 {
581   if ( var.type() != QVariant::StringList )
582     return;
583
584   setStrings( var.toStringList() );
585 }
586
587 void QtxListResourceEdit::SelectItem::setIndexes( const QVariant& var )
588 {
589   if ( var.type() != QVariant::List )
590     return;
591
592   QValueList<QVariant> varList = var.toList();
593   QValueList<int> lst;
594   for ( QValueList<QVariant>::const_iterator it = varList.begin(); it != varList.end(); ++it )
595   {
596     if ( (*it).canCast( QVariant::Int ) )
597       lst.append( (*it).toInt() );
598   }
599   setIndexes( lst );
600 }
601
602 void QtxListResourceEdit::SelectItem::setStrings( const QStringList& lst )
603 {
604   myList->clear();
605   myList->insertStringList( lst );
606 }
607
608 void QtxListResourceEdit::SelectItem::setIndexes( const QValueList<int>& lst )
609 {
610   myIndex.clear();
611
612   int idx = 0;
613   for ( QValueList<int>::const_iterator it = lst.begin(); it != lst.end(); ++it, idx++ )
614     myIndex.insert( idx, *it );
615 }
616
617 /*
618   Class: QtxListResourceEdit::StateItem
619   Descr: GUI implementation of resources bool item.
620 */
621
622 QtxListResourceEdit::StateItem::StateItem( const QString& title, QtxResourceEdit* edit,
623                                            Item* pItem, QWidget* parent )
624 : PrefItem( Bool, edit, pItem, parent )
625 {
626   myState = new QCheckBox( title, this );
627   myState->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
628 }
629
630 QtxListResourceEdit::StateItem::~StateItem()
631 {
632 }
633
634 void QtxListResourceEdit::StateItem::store()
635 {
636   setBoolean( myState->isChecked() );
637 }
638
639 void QtxListResourceEdit::StateItem::retrieve()
640 {
641   myState->setChecked( getBoolean() );
642 }
643
644 /*
645   Class: QtxListResourceEdit::StringItem
646   Descr: GUI implementation of resources string item.
647 */
648
649 QtxListResourceEdit::StringItem::StringItem( const QString& title, QtxResourceEdit* edit,
650                                              Item* pItem, QWidget* parent )
651 : PrefItem( String, edit, pItem, parent )
652 {
653   new QLabel( title, this );
654   myString = new QLineEdit( this );
655   myString->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
656 }
657
658 QtxListResourceEdit::StringItem::~StringItem()
659 {
660 }
661
662 void QtxListResourceEdit::StringItem::store()
663 {
664   setString( myString->text() );
665 }
666
667 void QtxListResourceEdit::StringItem::retrieve()
668 {
669   myString->setText( getString() );
670 }
671
672 /*
673   Class: QtxListResourceEdit::IntegerEditItem
674   Descr: GUI implementation of resources integer item.
675 */
676
677 QtxListResourceEdit::IntegerEditItem::IntegerEditItem( const QString& title, QtxResourceEdit* edit, Item* pItem, QWidget* parent )
678 : PrefItem( Integer, edit, pItem, parent )
679 {
680   new QLabel( title, this );
681   myInteger = new QLineEdit( this );
682   myInteger->setValidator( new QIntValidator( myInteger ) );
683   myInteger->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
684 }
685
686 QtxListResourceEdit::IntegerEditItem::~IntegerEditItem()
687 {
688 }
689
690 void QtxListResourceEdit::IntegerEditItem::store()
691 {
692   setString( myInteger->text() );
693 }
694
695 void QtxListResourceEdit::IntegerEditItem::retrieve()
696 {
697   myInteger->setText( getString() );
698 }
699
700 /*
701   Class: QtxListResourceEdit::IntegerSpinItem
702   Descr: GUI implementation of resources integer item.
703 */
704
705 QtxListResourceEdit::IntegerSpinItem::IntegerSpinItem( const QString& title, QtxResourceEdit* edit, Item* pItem, QWidget* parent )
706 : PrefItem( IntSpin, edit, pItem, parent )
707 {
708   new QLabel( title, this );
709   myInteger = new QtxIntSpinBox( this );
710   myInteger->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
711 }
712
713 QtxListResourceEdit::IntegerSpinItem::~IntegerSpinItem()
714 {
715 }
716
717 void QtxListResourceEdit::IntegerSpinItem::store()
718 {
719   setInteger( myInteger->value() );
720 }
721
722 void QtxListResourceEdit::IntegerSpinItem::retrieve()
723 {
724   myInteger->setValue( getInteger() );
725 }
726
727 QVariant QtxListResourceEdit::IntegerSpinItem::property( const QString& name ) const
728 {
729   QVariant var;
730   if ( name == QString( "minimum" ) || name == QString( "min" ) )
731     var = QVariant( myInteger->minValue() );
732   else if ( name == QString( "maximum" ) || name == QString( "max" ) )
733     var = QVariant( myInteger->maxValue() );
734   else if ( name == QString( "step" ) )
735     var = QVariant( myInteger->lineStep() );
736   else if ( name == QString( "special" ) )
737     var = QVariant( myInteger->specialValueText() );
738   else if ( name == QString( "prefix" ) )
739     var = QVariant( myInteger->prefix() );
740   else if ( name == QString( "suffix" ) )
741     var = QVariant( myInteger->suffix() );
742   return var;
743 }
744
745 void QtxListResourceEdit::IntegerSpinItem::setProperty( const QString& name, const QVariant& var )
746 {
747   QVariant prop = var;
748
749   if ( ( name == QString( "minimum" ) || name == QString( "min" ) ) && prop.cast( QVariant::Int ) )
750     myInteger->setMinValue( prop.toInt() );
751   else if ( ( name == QString( "maximum" ) || name == QString( "max" ) ) && prop.cast( QVariant::Int ) )
752     myInteger->setMaxValue( prop.toInt() );
753   else if ( name == QString( "step" ) && prop.cast( QVariant::Int ) && prop.toInt() > 0 )
754     myInteger->setLineStep( prop.toInt() );
755   else if ( name == QString( "special" ) && prop.cast( QVariant::String ) )
756     myInteger->setSpecialValueText( prop.toString() );
757   else if ( name == QString( "prefix" ) && prop.cast( QVariant::String ) )
758     myInteger->setPrefix( prop.toString() );
759   else if ( name == QString( "suffix" ) && prop.cast( QVariant::String ) )
760     myInteger->setSuffix( prop.toString() );
761 }
762
763 /*
764   Class: QtxListResourceEdit::DoubleEditItem
765   Descr: GUI implementation of resources string item.
766 */
767
768 QtxListResourceEdit::DoubleEditItem::DoubleEditItem( const QString& title, QtxResourceEdit* edit,
769                                                      Item* pItem, QWidget* parent )
770 : PrefItem( Double, edit, pItem, parent )
771 {
772   new QLabel( title, this );
773   myDouble = new QLineEdit( this );
774   myDouble->setValidator( new QDoubleValidator( myDouble ) );
775   myDouble->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
776 }
777
778 QtxListResourceEdit::DoubleEditItem::~DoubleEditItem()
779 {
780 }
781
782 void QtxListResourceEdit::DoubleEditItem::store()
783 {
784   setString( myDouble->text() );
785 }
786
787 void QtxListResourceEdit::DoubleEditItem::retrieve()
788 {
789   myDouble->setText( getString() );
790 }
791
792 /*
793   Class: QtxListResourceEdit::DoubleSpinItem
794   Descr: GUI implementation of resources double item.
795 */
796
797 QtxListResourceEdit::DoubleSpinItem::DoubleSpinItem( const QString& title, QtxResourceEdit* edit,
798                                                      Item* pItem, QWidget* parent )
799 : PrefItem( DblSpin, edit, pItem, parent )
800 {
801   new QLabel( title, this );
802   myDouble = new QtxDblSpinBox( this );
803   myDouble->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
804 }
805
806 QtxListResourceEdit::DoubleSpinItem::~DoubleSpinItem()
807 {
808 }
809
810 void QtxListResourceEdit::DoubleSpinItem::store()
811 {
812   setDouble( myDouble->value() );
813 }
814
815 void QtxListResourceEdit::DoubleSpinItem::retrieve()
816 {
817   myDouble->setValue( getDouble() );
818 }
819
820 QVariant QtxListResourceEdit::DoubleSpinItem::property( const QString& name ) const
821 {
822   QVariant var;
823   if ( name == QString( "minimum" ) || name == QString( "min" ) )
824     var = QVariant( myDouble->minValue() );
825   else if ( name == QString( "maximum" ) || name == QString( "max" ) )
826     var = QVariant( myDouble->maxValue() );
827   else if ( name == QString( "precision" ) )
828     var = QVariant( myDouble->precision() );
829   else if ( name == QString( "step" ) )
830     var = QVariant( myDouble->lineStep() );
831   else if ( name == QString( "special" ) )
832     var = QVariant( myDouble->specialValueText() );
833   else if ( name == QString( "prefix" ) )
834     var = QVariant( myDouble->prefix() );
835   else if ( name == QString( "suffix" ) )
836     var = QVariant( myDouble->suffix() );
837   return var;
838 }
839
840 void QtxListResourceEdit::DoubleSpinItem::setProperty( const QString& name, const QVariant& var )
841 {
842   QVariant prop = var;
843
844   if ( ( name == QString( "minimum" ) || name == QString( "min" ) ) && prop.cast( QVariant::Double ) )
845     myDouble->setMinValue( prop.toDouble() );
846   else if ( ( name == QString( "maximum" ) || name == QString( "max" ) ) && prop.cast( QVariant::Double ) )
847     myDouble->setMaxValue( prop.toDouble() );
848   else if ( name == QString( "step" ) && prop.cast( QVariant::Double ) && prop.toDouble() > 0 )
849     myDouble->setLineStep( prop.toDouble() );
850   else if ( name == QString( "precision" ) && prop.cast( QVariant::Int ) && prop.toInt() > 0 )
851     myDouble->setPrecision( prop.toInt() );
852   else if ( name == QString( "special" ) && prop.cast( QVariant::String ) )
853     myDouble->setSpecialValueText( prop.toString() );
854   else if ( name == QString( "prefix" ) && prop.cast( QVariant::String ) )
855     myDouble->setPrefix( prop.toString() );
856   else if ( name == QString( "suffix" ) && prop.cast( QVariant::String ) )
857     myDouble->setSuffix( prop.toString() );
858 }
859
860 /*
861   Class: QtxListResourceEdit::ColorItem
862   Descr: GUI implementation of resources color item.
863 */
864
865 QtxListResourceEdit::ColorItem::ColorItem( const QString& title, QtxResourceEdit* edit,
866                                            Item* pItem, QWidget* parent )
867 : PrefItem( Color, edit, pItem, parent )
868 {
869   class ColorSelector : public QLabel
870   {
871   public:
872     ColorSelector( QWidget* parent = 0 ) : QLabel( parent )
873     {
874       setFrameStyle( WinPanel | Raised );
875     }
876     virtual ~ColorSelector() {}
877     virtual QSize minimumSizeHint() const
878     {
879       return QLabel::minimumSizeHint() + QSize( 0, 2 );
880     }
881
882   protected:
883     virtual void mousePressEvent( QMouseEvent* e )
884     {
885       if ( e->button() == LeftButton )
886       {
887         setFrameStyle( WinPanel | Sunken );
888         QColor c = QColorDialog::getColor( paletteBackgroundColor(), this );
889         if ( c.isValid() )
890           setPaletteBackgroundColor( c );
891
892         setFrameStyle( WinPanel | Raised );
893       }
894     }
895   };
896
897   new QLabel( title, this );
898   myColor = new ColorSelector( this );
899   myColor->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
900 }
901
902 QtxListResourceEdit::ColorItem::~ColorItem()
903 {
904 }
905
906 void QtxListResourceEdit::ColorItem::store()
907 {
908   setColor( myColor->paletteBackgroundColor() );
909 }
910
911 void QtxListResourceEdit::ColorItem::retrieve()
912 {
913   myColor->setPaletteBackgroundColor( getColor() );
914 }
915
916
917 /*
918   Class: QtxListResourceEdit::FontItem
919   Descr: GUI implementation of resources font item.
920 */
921 QtxListResourceEdit::FontItem::FontItem( const QString& title, QtxResourceEdit* edit, Item* pItem, QWidget* parent )
922 : PrefItem( Font, edit, pItem, parent )
923 {
924   new QLabel( title, this );
925   myFontPrs = new QLabel( "", this );
926   myFontPrs->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
927   myFontPrs->setAutoResize( true );
928   myFontPrs->setAlignment( Qt::AlignLeft );
929   
930   QToolButton* selFont = new QToolButton( this );
931   selFont->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) );
932   selFont->setText( "..." );
933   connect( selFont, SIGNAL( clicked() ), this, SLOT( onSelectFont() ) );
934 }
935
936 QtxListResourceEdit::FontItem::~FontItem()
937 {
938 }
939
940 void QtxListResourceEdit::FontItem::store()
941 {
942   Item::setFont( myFont );
943 }
944
945 void QtxListResourceEdit::FontItem::retrieve()
946 {
947   myFont = getFont();
948   buildFontPrs();
949 }
950
951 void QtxListResourceEdit::FontItem::buildFontPrs()
952 {
953   QStringList fval;
954   fval.append( myFont.family() );
955   if( myFont.bold() )
956     fval.append( "Bold" );
957   if( myFont.italic() )
958     fval.append( "Italic" );
959   fval.append( QString( "%1" ).arg( myFont.pointSize() ) );
960   
961   myFontPrs->setText( fval.join( ", " ) );
962 }
963
964 void QtxListResourceEdit::FontItem::onSelectFont()
965 {
966   bool ok;
967   QFont newFont = QFontDialog::getFont( &ok, myFont, this );
968   if( ok )
969   {
970     myFont = newFont;
971     buildFontPrs();
972   }
973 }