1 // File: QtxListResourceEdit.cxx
2 // Author: Sergey TELKOV
4 #include "QtxListResourceEdit.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>
20 #include "QtxIntSpinBox.h"
21 #include "QtxDblSpinBox.h"
24 Class: QtxListResourceEdit
25 Descr: GUI implementation of QtxResourceEdit - manager of resources
28 QtxListResourceEdit::QtxListResourceEdit( QtxResourceMgr* mgr, QWidget* parent )
30 QtxResourceEdit( mgr )
32 QVBoxLayout* main = new QVBoxLayout( this, 0, 5 );
33 QGroupBox* base = new QGroupBox( 1, Qt::Vertical, "", this );
34 base->setFrameStyle( QFrame::NoFrame );
35 base->setInsideMargin( 0 );
36 main->addWidget( base );
38 myList = new QListBox( base );
39 myStack = new QWidgetStack( base );
41 myList->setSizePolicy( QSizePolicy( QSizePolicy::Minimum, QSizePolicy::Preferred ) );
42 myStack->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
44 myList->setSelectionMode( QListBox::Single );
46 connect( myList, SIGNAL( selectionChanged() ), this, SLOT( onSelectionChanged() ) );
48 setFocusProxy( myList );
53 QtxListResourceEdit::~QtxListResourceEdit()
57 void QtxListResourceEdit::onSelectionChanged()
59 int idx = myList->index( myList->selectedItem() );
63 myStack->raiseWidget( idx );
66 QtxResourceEdit::Item* QtxListResourceEdit::createItem( const QString& title, const int )
68 Item* i = item( title, -1 );
72 Category* category = new Category( this, myStack );
73 myList->insertItem( title );
74 int id = myList->count() - 1;
75 myStack->addWidget( category, id );
77 if ( !myList->selectedItem() )
78 myList->setSelected( 0, true );
85 void QtxListResourceEdit::changedResources( const QMap<Item*, QString>& map )
87 QMap<int, QString> idMap;
88 for ( QMap<Item*, QString>::ConstIterator it = map.begin(); it != map.end(); ++it )
90 idMap.insert( it.key()->id(), it.data() );
92 emit resourceChanged( it.key()->id() );
95 it.key()->resource( sec, param );
96 emit resourceChanged( sec, param );
99 emit resourcesChanged( idMap );
102 void QtxListResourceEdit::updateState()
104 if ( myStack->visibleWidget() )
111 Class: QtxListResourceEdit::Category
112 Descr: GUI implementation of preferences category.
115 QtxListResourceEdit::Category::Category( QtxListResourceEdit* edit, QWidget* parent )
119 QVBoxLayout* main = new QVBoxLayout( this );
120 QGroupBox* base = new QGroupBox( 1, Qt::Horizontal, "", this );
121 base->setFrameStyle( QFrame::NoFrame );
122 base->setInsideMargin( 0 );
123 main->addWidget( base, 1 );
125 myTabs = new QTabWidget( base );
126 myInfo = new QLabel( base );
128 myInfo->setAlignment( Qt::AlignCenter );
129 myInfo->setFrameStyle( QFrame::WinPanel | QFrame::Raised );
130 myInfo->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );
135 QtxListResourceEdit::Category::~Category()
139 int QtxListResourceEdit::Category::type() const
144 void QtxListResourceEdit::Category::store()
148 void QtxListResourceEdit::Category::retrieve()
152 QVariant QtxListResourceEdit::Category::property( const QString& prop ) const
155 if ( prop == QString( "information" ) || prop == QString( "info" ) )
156 var = myInfo->text();
160 void QtxListResourceEdit::Category::setProperty( const QString& name, const QVariant& var )
163 if ( !prop.cast( QVariant::String ) )
166 if ( name == QString( "information" ) || name == QString( "info" ) )
167 myInfo->setText( prop.toString() );
172 QtxResourceEdit::Item* QtxListResourceEdit::Category::createItem( const QString& title, const int )
174 Item* i = item( title, id() );
178 Tab* tab = new Tab( resourceEdit(), this, this );
179 myTabs->addTab( tab, title );
186 void QtxListResourceEdit::Category::updateState()
188 if ( myTabs->count() )
193 if ( !myTabs->count() && !myInfo->text().isEmpty() )
200 Class: QtxListResourceEdit::Tab
201 Descr: GUI implementation of resources tab.
204 QtxListResourceEdit::Tab::Tab( QtxResourceEdit* edit, Item* pItem, QWidget* parent )
208 QVBoxLayout* main = new QVBoxLayout( this );
209 QVBox* vbox = new QVBox( this );
210 vbox->setMargin( 5 );
212 main->addWidget( myMainFrame );
213 main->addStretch( 1 );
216 QtxListResourceEdit::Tab::~Tab()
220 int QtxListResourceEdit::Tab::type() const
225 void QtxListResourceEdit::Tab::store()
229 void QtxListResourceEdit::Tab::retrieve()
233 void QtxListResourceEdit::Tab::polish()
240 QtxResourceEdit::Item* QtxListResourceEdit::Tab::createItem( const QString& title, const int )
242 Item* i = item( title, id() );
246 Group* group = new Group( title, resourceEdit(), this, myMainFrame );
251 void QtxListResourceEdit::Tab::adjustLabels()
253 QObjectList* labels = queryList( "QLabel" );
257 for ( QObjectListIt it1( *labels ); it1.current(); ++it1 )
259 if ( it1.current()->isWidgetType() )
261 QWidget* wid = (QWidget*)it1.current();
262 w = QMAX( w, wid->sizeHint().width() );
265 for ( QObjectListIt it2( *labels ); it2.current(); ++it2 )
267 if ( it2.current()->isWidgetType() )
269 QWidget* wid = (QWidget*)it2.current();
270 wid->setMinimumWidth( w );
278 Class: QtxListResourceEdit::Group
279 Descr: GUI implementation of resources group.
282 QtxListResourceEdit::Group::Group( const QString& title, QtxResourceEdit* edit, Item* pItem, QWidget* parent )
283 : QGroupBox( 2, Qt::Horizontal, title, parent ),
288 QtxListResourceEdit::Group::~Group()
292 int QtxListResourceEdit::Group::type() const
297 void QtxListResourceEdit::Group::store()
301 void QtxListResourceEdit::Group::retrieve()
305 QVariant QtxListResourceEdit::Group::property( const QString& prop ) const
308 if ( prop == "columns" )
309 var = QVariant( columns() );
313 void QtxListResourceEdit::Group::setProperty( const QString& name, const QVariant& var )
316 if ( !prop.cast( QVariant::Int ) )
319 if ( name == QString( "columns" ) && prop.toInt() > 0 )
320 setColumns( prop.toInt() );
323 void QtxListResourceEdit::Group::setTitle( const QString& title )
325 Item::setTitle( title );
326 QGroupBox::setTitle( title );
329 QtxResourceEdit::Item* QtxListResourceEdit::Group::createItem( const QString& title, const int type )
336 item = new ColorItem( title, resourceEdit(), this, this );
339 item = new StateItem( title, resourceEdit(), this, this );
342 item = new StringItem( title, resourceEdit(), this, this );
345 item = new ListItem( title, resourceEdit(), this, this );
348 item = new DoubleSpinItem( title, resourceEdit(), this, this );
351 item = new IntegerSpinItem( title, resourceEdit(), this, this );
354 item = new DoubleEditItem( title, resourceEdit(), this, this );
357 item = new IntegerEditItem( title, resourceEdit(), this, this );
360 item = new Spacer( resourceEdit(), this, this );
368 Class: QtxListResourceEdit::PrefItem
369 Descr: Base class for preferences items.
372 QtxListResourceEdit::PrefItem::PrefItem( const int type, QtxResourceEdit* edit, Item* pi, QWidget* parent )
380 QtxListResourceEdit::PrefItem::~PrefItem()
384 int QtxListResourceEdit::PrefItem::type() const
389 QtxResourceEdit::Item* QtxListResourceEdit::PrefItem::createItem( const QString&, const int )
395 Class: QtxListResourceEdit::Spacer
396 Descr: GUI implementation of resources spacer.
399 QtxListResourceEdit::Spacer::Spacer( QtxResourceEdit* edit, Item* pItem, QWidget* parent )
400 : PrefItem( Space, edit, pItem, parent )
402 setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
405 QtxListResourceEdit::Spacer::~Spacer()
409 void QtxListResourceEdit::Spacer::store()
413 void QtxListResourceEdit::Spacer::retrieve()
418 Class: QtxListResourceEdit::ListItem
419 Descr: GUI implementation of resources list item.
422 QtxListResourceEdit::ListItem::ListItem( const QString& title, QtxResourceEdit* edit,
423 Item* pItem, QWidget* parent )
424 : PrefItem( Selector, edit, pItem, parent )
426 new QLabel( title, this );
427 myList = new QComboBox( false, this );
428 myList->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
431 QtxListResourceEdit::ListItem::~ListItem()
435 void QtxListResourceEdit::ListItem::store()
437 int idx = myList->currentItem();
438 if ( myIndex.contains( idx ) )
439 setInteger( myIndex[idx] );
442 void QtxListResourceEdit::ListItem::retrieve()
444 int id = getInteger( -1 );
447 for ( QMap<int, int>::ConstIterator it = myIndex.begin(); it != myIndex.end() && idx == -1; ++it )
449 if ( it.data() == id )
453 myList->setCurrentItem( idx );
456 QVariant QtxListResourceEdit::ListItem::property( const QString& name ) const
459 if ( name == QString( "strings" ) )
462 for ( int i = 0; i < (int)myList->count(); i++ )
463 lst.append( myList->text( i ) );
464 val = QVariant( lst );
466 else if ( name == QString( "indexes" ) )
468 QValueList<QVariant> lst;
469 for ( int i = 0; i < (int)myList->count(); i++ )
470 lst.append( myIndex.contains( i ) ? myIndex[i] : 0 );
471 val = QVariant( lst );
476 void QtxListResourceEdit::ListItem::setProperty( const QString& name, const QVariant& val )
478 if ( name == QString( "strings" ) )
480 else if ( name == QString( "indexes" ) )
484 void QtxListResourceEdit::ListItem::setStrings( const QVariant& var )
486 if ( var.type() != QVariant::StringList )
489 setStrings( var.toStringList() );
492 void QtxListResourceEdit::ListItem::setIndexes( const QVariant& var )
494 if ( var.type() != QVariant::List )
497 QValueList<QVariant> varList = var.toList();
499 for ( QValueList<QVariant>::const_iterator it = varList.begin(); it != varList.end(); ++it )
501 if ( (*it).canCast( QVariant::Int ) )
502 lst.append( (*it).toInt() );
507 void QtxListResourceEdit::ListItem::setStrings( const QStringList& lst )
510 myList->insertStringList( lst );
513 void QtxListResourceEdit::ListItem::setIndexes( const QValueList<int>& lst )
518 for ( QValueList<int>::const_iterator it = lst.begin(); it != lst.end(); ++it, idx++ )
519 myIndex.insert( idx, *it );
523 Class: QtxListResourceEdit::StateItem
524 Descr: GUI implementation of resources bool item.
527 QtxListResourceEdit::StateItem::StateItem( const QString& title, QtxResourceEdit* edit,
528 Item* pItem, QWidget* parent )
529 : PrefItem( Bool, edit, pItem, parent )
531 myState = new QCheckBox( title, this );
532 myState->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
535 QtxListResourceEdit::StateItem::~StateItem()
539 void QtxListResourceEdit::StateItem::store()
541 setBoolean( myState->isChecked() );
544 void QtxListResourceEdit::StateItem::retrieve()
546 myState->setChecked( getBoolean() );
550 Class: QtxListResourceEdit::StringItem
551 Descr: GUI implementation of resources string item.
554 QtxListResourceEdit::StringItem::StringItem( const QString& title, QtxResourceEdit* edit,
555 Item* pItem, QWidget* parent )
556 : PrefItem( String, edit, pItem, parent )
558 new QLabel( title, this );
559 myString = new QLineEdit( this );
560 myString->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
563 QtxListResourceEdit::StringItem::~StringItem()
567 void QtxListResourceEdit::StringItem::store()
569 setString( myString->text() );
572 void QtxListResourceEdit::StringItem::retrieve()
574 myString->setText( getString() );
578 Class: QtxListResourceEdit::IntegerEditItem
579 Descr: GUI implementation of resources integer item.
582 QtxListResourceEdit::IntegerEditItem::IntegerEditItem( const QString& title, QtxResourceEdit* edit, Item* pItem, QWidget* parent )
583 : PrefItem( Integer, edit, pItem, parent )
585 new QLabel( title, this );
586 myInteger = new QLineEdit( this );
587 myInteger->setValidator( new QIntValidator( myInteger ) );
588 myInteger->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
591 QtxListResourceEdit::IntegerEditItem::~IntegerEditItem()
595 void QtxListResourceEdit::IntegerEditItem::store()
597 setString( myInteger->text() );
600 void QtxListResourceEdit::IntegerEditItem::retrieve()
602 myInteger->setText( getString() );
606 Class: QtxListResourceEdit::IntegerSpinItem
607 Descr: GUI implementation of resources integer item.
610 QtxListResourceEdit::IntegerSpinItem::IntegerSpinItem( const QString& title, QtxResourceEdit* edit, Item* pItem, QWidget* parent )
611 : PrefItem( IntSpin, edit, pItem, parent )
613 new QLabel( title, this );
614 myInteger = new QtxIntSpinBox( this );
615 myInteger->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
618 QtxListResourceEdit::IntegerSpinItem::~IntegerSpinItem()
622 void QtxListResourceEdit::IntegerSpinItem::store()
624 setInteger( myInteger->value() );
627 void QtxListResourceEdit::IntegerSpinItem::retrieve()
629 myInteger->setValue( getInteger() );
632 QVariant QtxListResourceEdit::IntegerSpinItem::property( const QString& name ) const
635 if ( name == QString( "minimum" ) || name == QString( "min" ) )
636 var = QVariant( myInteger->minValue() );
637 else if ( name == QString( "maximum" ) || name == QString( "max" ) )
638 var = QVariant( myInteger->maxValue() );
639 else if ( name == QString( "step" ) )
640 var = QVariant( myInteger->lineStep() );
644 void QtxListResourceEdit::IntegerSpinItem::setProperty( const QString& name, const QVariant& var )
647 if ( !prop.cast( QVariant::Int ) )
650 int val = prop.toInt();
651 if ( name == QString( "minimum" ) || name == QString( "min" ) )
652 myInteger->setMinValue( val );
653 else if ( name == QString( "maximum" ) || name == QString( "max" ) )
654 myInteger->setMaxValue( val );
655 else if ( name == QString( "step" ) && val > 0 )
656 myInteger->setLineStep( val );
660 Class: QtxListResourceEdit::DoubleEditItem
661 Descr: GUI implementation of resources string item.
664 QtxListResourceEdit::DoubleEditItem::DoubleEditItem( const QString& title, QtxResourceEdit* edit,
665 Item* pItem, QWidget* parent )
666 : PrefItem( Double, edit, pItem, parent )
668 new QLabel( title, this );
669 myDouble = new QLineEdit( this );
670 myDouble->setValidator( new QDoubleValidator( myDouble ) );
671 myDouble->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
674 QtxListResourceEdit::DoubleEditItem::~DoubleEditItem()
678 void QtxListResourceEdit::DoubleEditItem::store()
680 setString( myDouble->text() );
683 void QtxListResourceEdit::DoubleEditItem::retrieve()
685 myDouble->setText( getString() );
689 Class: QtxListResourceEdit::DoubleSpinItem
690 Descr: GUI implementation of resources double item.
693 QtxListResourceEdit::DoubleSpinItem::DoubleSpinItem( const QString& title, QtxResourceEdit* edit,
694 Item* pItem, QWidget* parent )
695 : PrefItem( DblSpin, edit, pItem, parent )
697 new QLabel( title, this );
698 myDouble = new QtxDblSpinBox( this );
699 myDouble->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
702 QtxListResourceEdit::DoubleSpinItem::~DoubleSpinItem()
706 void QtxListResourceEdit::DoubleSpinItem::store()
708 setDouble( myDouble->value() );
711 void QtxListResourceEdit::DoubleSpinItem::retrieve()
713 myDouble->setValue( getDouble() );
716 QVariant QtxListResourceEdit::DoubleSpinItem::property( const QString& name ) const
719 if ( name == QString( "minimum" ) || name == QString( "min" ) )
720 var = QVariant( myDouble->minValue() );
721 else if ( name == QString( "maximum" ) || name == QString( "max" ) )
722 var = QVariant( myDouble->maxValue() );
723 else if ( name == QString( "precision" ) )
724 var = QVariant( myDouble->precision() );
725 else if ( name == QString( "step" ) )
726 var = QVariant( myDouble->lineStep() );
730 void QtxListResourceEdit::DoubleSpinItem::setProperty( const QString& name, const QVariant& var )
733 if ( prop.cast( QVariant::Double ) )
735 double val = prop.toDouble();
736 if ( name == QString( "minimum" ) || name == QString( "min" ) )
737 myDouble->setMinValue( val );
738 else if ( name == QString( "maximum" ) || name == QString( "max" ) )
739 myDouble->setMaxValue( val );
740 else if ( name == QString( "step" ) && val > 0 )
741 myDouble->setLineStep( val );
746 if ( prop.cast( QVariant::Int ) && name == QString( "precision" ) && prop.toInt() > 0 )
747 myDouble->setPrecision( prop.toInt() );
752 Class: QtxListResourceEdit::ColorItem
753 Descr: GUI implementation of resources color item.
756 QtxListResourceEdit::ColorItem::ColorItem( const QString& title, QtxResourceEdit* edit,
757 Item* pItem, QWidget* parent )
758 : PrefItem( Color, edit, pItem, parent )
760 class ColorSelector : public QLabel
763 ColorSelector( QWidget* parent = 0 ) : QLabel( parent )
765 setFrameStyle( WinPanel | Raised );
767 virtual ~ColorSelector() {}
768 virtual QSize minimumSizeHint() const
770 return QLabel::minimumSizeHint() + QSize( 0, 2 );
774 virtual void mousePressEvent( QMouseEvent* e )
776 if ( e->button() == LeftButton )
778 setFrameStyle( WinPanel | Sunken );
779 QColor c = QColorDialog::getColor( paletteBackgroundColor(), this );
781 setPaletteBackgroundColor( c );
783 setFrameStyle( WinPanel | Raised );
788 new QLabel( title, this );
789 myColor = new ColorSelector( this );
790 myColor->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
793 QtxListResourceEdit::ColorItem::~ColorItem()
797 void QtxListResourceEdit::ColorItem::store()
799 setColor( myColor->paletteBackgroundColor() );
802 void QtxListResourceEdit::ColorItem::retrieve()
804 myColor->setPaletteBackgroundColor( getColor() );