1 // File: QtxListResourceEdit.cxx
2 // Author: Sergey TELKOV
4 #include "QtxListResourceEdit.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>
19 #include "QtxIntSpinBox.h"
20 #include "QtxDblSpinBox.h"
23 Class: QtxListResourceEdit
24 Descr: GUI implementation of QtxResourceEdit - manager of resources
27 QtxListResourceEdit::QtxListResourceEdit( QtxResourceMgr* mgr, QWidget* parent )
29 QtxResourceEdit( mgr )
31 QHBoxLayout* main = new QHBoxLayout( this, 0, 5 );
33 myList = new QListBox( this );
34 myStack = new QWidgetStack( this );
36 myList->setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred ) );
37 myStack->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
39 main->addWidget( myList );
40 main->addWidget( myStack );
42 myList->setSelectionMode( QListBox::Single );
44 connect( myList, SIGNAL( selectionChanged() ), this, SLOT( onSelectionChanged() ) );
46 setFocusProxy( myList );
51 QtxListResourceEdit::~QtxListResourceEdit()
55 void QtxListResourceEdit::onSelectionChanged()
57 int idx = myList->index( myList->selectedItem() );
61 myStack->raiseWidget( idx );
64 QtxResourceEdit::Item* QtxListResourceEdit::createItem( const QString& title, const int )
66 Item* i = item( title, -1 );
70 Category* category = new Category( this, myStack );
71 myList->insertItem( title );
72 int id = myList->count() - 1;
73 myStack->addWidget( category, id );
75 if ( !myList->selectedItem() )
76 myList->setSelected( 0, true );
83 void QtxListResourceEdit::changedResources( const QMap<Item*, QString>& map )
85 QMap<int, QString> idMap;
86 for ( QMap<Item*, QString>::ConstIterator it = map.begin(); it != map.end(); ++it )
88 idMap.insert( it.key()->id(), it.data() );
90 emit resourceChanged( it.key()->id() );
93 it.key()->resource( sec, param );
94 emit resourceChanged( sec, param );
97 emit resourcesChanged( idMap );
100 void QtxListResourceEdit::updateState()
102 if ( myStack->visibleWidget() )
109 Class: QtxListResourceEdit::Category
110 Descr: GUI implementation of preferences category.
113 QtxListResourceEdit::Category::Category( QtxListResourceEdit* edit, QWidget* parent )
117 QVBoxLayout* main = new QVBoxLayout( this );
118 QGroupBox* base = new QGroupBox( 1, Qt::Horizontal, "", this );
119 base->setFrameStyle( QFrame::NoFrame );
120 base->setInsideMargin( 0 );
121 main->addWidget( base, 1 );
123 myTabs = new QTabWidget( base );
124 myInfo = new QLabel( base );
126 myInfo->setAlignment( Qt::AlignCenter );
127 myInfo->setFrameStyle( QFrame::WinPanel | QFrame::Raised );
128 myInfo->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );
133 QtxListResourceEdit::Category::~Category()
137 int QtxListResourceEdit::Category::type() const
142 void QtxListResourceEdit::Category::store()
146 void QtxListResourceEdit::Category::retrieve()
150 QVariant QtxListResourceEdit::Category::property( const QString& prop ) const
153 if ( prop == QString( "information" ) || prop == QString( "info" ) )
154 var = myInfo->text();
158 void QtxListResourceEdit::Category::setProperty( const QString& name, const QVariant& var )
161 if ( !prop.cast( QVariant::String ) )
164 if ( name == QString( "information" ) || name == QString( "info" ) )
165 myInfo->setText( prop.toString() );
170 QtxResourceEdit::Item* QtxListResourceEdit::Category::createItem( const QString& title, const int )
172 Item* i = item( title, id() );
176 Tab* tab = new Tab( resourceEdit(), this, this );
177 myTabs->addTab( tab, title );
184 void QtxListResourceEdit::Category::updateState()
186 if ( myTabs->count() )
191 if ( !myTabs->count() && !myInfo->text().isEmpty() )
198 Class: QtxListResourceEdit::Tab
199 Descr: GUI implementation of resources tab.
202 QtxListResourceEdit::Tab::Tab( QtxResourceEdit* edit, Item* pItem, QWidget* parent )
206 QVBoxLayout* main = new QVBoxLayout( this );
207 myMainFrame = new QGroupBox( 1, Qt::Horizontal, "", this );
208 myMainFrame->setFrameStyle( QFrame::NoFrame );
209 myMainFrame->setInsideMargin( 5 );
210 main->addWidget( myMainFrame );
213 QtxListResourceEdit::Tab::~Tab()
217 int QtxListResourceEdit::Tab::type() const
222 void QtxListResourceEdit::Tab::store()
226 void QtxListResourceEdit::Tab::retrieve()
230 void QtxListResourceEdit::Tab::polish()
237 QtxResourceEdit::Item* QtxListResourceEdit::Tab::createItem( const QString& title, const int )
239 Item* i = item( title, id() );
243 Group* group = new Group( title, resourceEdit(), this, myMainFrame );
248 void QtxListResourceEdit::Tab::adjustLabels()
250 QObjectList* labels = queryList( "QLabel" );
254 for ( QObjectListIt it1( *labels ); it1.current(); ++it1 )
256 if ( it1.current()->isWidgetType() )
258 QWidget* wid = (QWidget*)it1.current();
259 w = QMAX( w, wid->sizeHint().width() );
262 for ( QObjectListIt it2( *labels ); it2.current(); ++it2 )
264 if ( it2.current()->isWidgetType() )
266 QWidget* wid = (QWidget*)it2.current();
267 wid->setMinimumWidth( w );
275 Class: QtxListResourceEdit::Group
276 Descr: GUI implementation of resources group.
279 QtxListResourceEdit::Group::Group( const QString& title, QtxResourceEdit* edit, Item* pItem, QWidget* parent )
280 : QGroupBox( 2, Qt::Horizontal, title, parent ),
285 QtxListResourceEdit::Group::~Group()
289 int QtxListResourceEdit::Group::type() const
294 void QtxListResourceEdit::Group::store()
298 void QtxListResourceEdit::Group::retrieve()
302 QVariant QtxListResourceEdit::Group::property( const QString& prop ) const
305 if ( prop == "columns" )
306 var = QVariant( columns() );
310 void QtxListResourceEdit::Group::setProperty( const QString& name, const QVariant& var )
313 if ( !prop.cast( QVariant::Int ) )
316 if ( name == QString( "columns" ) && prop.toInt() > 0 )
317 setColumns( prop.toInt() );
320 void QtxListResourceEdit::Group::setTitle( const QString& title )
322 Item::setTitle( title );
323 QGroupBox::setTitle( title );
326 QtxResourceEdit::Item* QtxListResourceEdit::Group::createItem( const QString& title, const int type )
333 item = new ColorItem( title, resourceEdit(), this, this );
336 item = new StateItem( title, resourceEdit(), this, this );
339 item = new StringItem( title, resourceEdit(), this, this );
342 item = new ListItem( title, resourceEdit(), this, this );
345 item = new DoubleSpinItem( title, resourceEdit(), this, this );
348 item = new IntegerSpinItem( title, resourceEdit(), this, this );
351 item = new DoubleEditItem( title, resourceEdit(), this, this );
354 item = new IntegerEditItem( title, resourceEdit(), this, this );
357 item = new Spacer( resourceEdit(), this, this );
365 Class: QtxListResourceEdit::PrefItem
366 Descr: Base class for preferences items.
369 QtxListResourceEdit::PrefItem::PrefItem( const int type, QtxResourceEdit* edit, Item* pi, QWidget* parent )
377 QtxListResourceEdit::PrefItem::~PrefItem()
381 int QtxListResourceEdit::PrefItem::type() const
386 QtxResourceEdit::Item* QtxListResourceEdit::PrefItem::createItem( const QString&, const int )
392 Class: QtxListResourceEdit::Spacer
393 Descr: GUI implementation of resources spacer.
396 QtxListResourceEdit::Spacer::Spacer( QtxResourceEdit* edit, Item* pItem, QWidget* parent )
397 : PrefItem( Space, edit, pItem, parent )
399 setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
402 QtxListResourceEdit::Spacer::~Spacer()
406 void QtxListResourceEdit::Spacer::store()
410 void QtxListResourceEdit::Spacer::retrieve()
415 Class: QtxListResourceEdit::ListItem
416 Descr: GUI implementation of resources list item.
419 QtxListResourceEdit::ListItem::ListItem( const QString& title, QtxResourceEdit* edit,
420 Item* pItem, QWidget* parent )
421 : PrefItem( List, edit, pItem, parent )
423 new QLabel( title, this );
424 myList = new QComboBox( false, this );
425 myList->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
428 QtxListResourceEdit::ListItem::~ListItem()
432 void QtxListResourceEdit::ListItem::store()
434 int idx = myList->currentItem();
435 if ( myIndex.contains( idx ) )
436 setInteger( myIndex[idx] );
439 void QtxListResourceEdit::ListItem::retrieve()
441 int id = getInteger( -1 );
444 for ( QMap<int, int>::ConstIterator it = myIndex.begin(); it != myIndex.end() && idx == -1; ++it )
446 if ( it.data() == id )
450 myList->setCurrentItem( idx );
453 QVariant QtxListResourceEdit::ListItem::property( const QString& name ) const
456 if ( name == QString( "strings" ) )
459 for ( int i = 0; i < (int)myList->count(); i++ )
460 lst.append( myList->text( i ) );
461 val = QVariant( lst );
463 else if ( name == QString( "indexes" ) )
465 QValueList<QVariant> lst;
466 for ( int i = 0; i < (int)myList->count(); i++ )
467 lst.append( myIndex.contains( i ) ? myIndex[i] : 0 );
468 val = QVariant( lst );
473 void QtxListResourceEdit::ListItem::setProperty( const QString& name, const QVariant& val )
475 if ( name == QString( "strings" ) )
477 else if ( name == QString( "indexes" ) )
481 void QtxListResourceEdit::ListItem::setStrings( const QVariant& var )
483 if ( var.type() != QVariant::StringList )
486 setStrings( var.toStringList() );
489 void QtxListResourceEdit::ListItem::setIndexes( const QVariant& var )
491 if ( var.type() != QVariant::List )
494 QValueList<QVariant> varList = var.toList();
496 for ( QValueList<QVariant>::const_iterator it = varList.begin(); it != varList.end(); ++it )
498 if ( (*it).canCast( QVariant::Int ) )
499 lst.append( (*it).toInt() );
504 void QtxListResourceEdit::ListItem::setStrings( const QStringList& lst )
507 myList->insertStringList( lst );
510 void QtxListResourceEdit::ListItem::setIndexes( const QValueList<int>& lst )
515 for ( QValueList<int>::const_iterator it = lst.begin(); it != lst.end(); ++it, idx++ )
516 myIndex.insert( idx, *it );
520 Class: QtxListResourceEdit::StateItem
521 Descr: GUI implementation of resources bool item.
524 QtxListResourceEdit::StateItem::StateItem( const QString& title, QtxResourceEdit* edit,
525 Item* pItem, QWidget* parent )
526 : PrefItem( Bool, edit, pItem, parent )
528 myState = new QCheckBox( title, this );
529 myState->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
532 QtxListResourceEdit::StateItem::~StateItem()
536 void QtxListResourceEdit::StateItem::store()
538 setBoolean( myState->isChecked() );
541 void QtxListResourceEdit::StateItem::retrieve()
543 myState->setChecked( getBoolean() );
547 Class: QtxListResourceEdit::StringItem
548 Descr: GUI implementation of resources string item.
551 QtxListResourceEdit::StringItem::StringItem( const QString& title, QtxResourceEdit* edit,
552 Item* pItem, QWidget* parent )
553 : PrefItem( String, edit, pItem, parent )
555 new QLabel( title, this );
556 myString = new QLineEdit( this );
557 myString->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
560 QtxListResourceEdit::StringItem::~StringItem()
564 void QtxListResourceEdit::StringItem::store()
566 setString( myString->text() );
569 void QtxListResourceEdit::StringItem::retrieve()
571 myString->setText( getString() );
575 Class: QtxListResourceEdit::IntegerEditItem
576 Descr: GUI implementation of resources integer item.
579 QtxListResourceEdit::IntegerEditItem::IntegerEditItem( const QString& title, QtxResourceEdit* edit, Item* pItem, QWidget* parent )
580 : PrefItem( IntegerEdit, edit, pItem, parent )
582 new QLabel( title, this );
583 myInteger = new QLineEdit( this );
584 myInteger->setValidator( new QIntValidator( myInteger ) );
585 myInteger->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
588 QtxListResourceEdit::IntegerEditItem::~IntegerEditItem()
592 void QtxListResourceEdit::IntegerEditItem::store()
594 setString( myInteger->text() );
597 void QtxListResourceEdit::IntegerEditItem::retrieve()
599 myInteger->setText( getString() );
603 Class: QtxListResourceEdit::IntegerSpinItem
604 Descr: GUI implementation of resources integer item.
607 QtxListResourceEdit::IntegerSpinItem::IntegerSpinItem( const QString& title, QtxResourceEdit* edit, Item* pItem, QWidget* parent )
608 : PrefItem( IntegerSpin, edit, pItem, parent )
610 new QLabel( title, this );
611 myInteger = new QtxIntSpinBox( this );
612 myInteger->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
615 QtxListResourceEdit::IntegerSpinItem::~IntegerSpinItem()
619 void QtxListResourceEdit::IntegerSpinItem::store()
621 setInteger( myInteger->value() );
624 void QtxListResourceEdit::IntegerSpinItem::retrieve()
626 myInteger->setValue( getInteger() );
629 QVariant QtxListResourceEdit::IntegerSpinItem::property( const QString& name ) const
632 if ( name == QString( "minimum" ) || name == QString( "min" ) )
633 var = QVariant( myInteger->minValue() );
634 else if ( name == QString( "maximum" ) || name == QString( "max" ) )
635 var = QVariant( myInteger->maxValue() );
636 else if ( name == QString( "step" ) )
637 var = QVariant( myInteger->lineStep() );
641 void QtxListResourceEdit::IntegerSpinItem::setProperty( const QString& name, const QVariant& var )
644 if ( !prop.cast( QVariant::Int ) )
647 int val = prop.toInt();
648 if ( name == QString( "minimum" ) || name == QString( "min" ) )
649 myInteger->setMinValue( val );
650 else if ( name == QString( "maximum" ) || name == QString( "max" ) )
651 myInteger->setMaxValue( val );
652 else if ( name == QString( "step" ) && val > 0 )
653 myInteger->setLineStep( val );
657 Class: QtxListResourceEdit::DoubleEditItem
658 Descr: GUI implementation of resources string item.
661 QtxListResourceEdit::DoubleEditItem::DoubleEditItem( const QString& title, QtxResourceEdit* edit,
662 Item* pItem, QWidget* parent )
663 : PrefItem( RealEdit, edit, pItem, parent )
665 new QLabel( title, this );
666 myDouble = new QLineEdit( this );
667 myDouble->setValidator( new QDoubleValidator( myDouble ) );
668 myDouble->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
671 QtxListResourceEdit::DoubleEditItem::~DoubleEditItem()
675 void QtxListResourceEdit::DoubleEditItem::store()
677 setString( myDouble->text() );
680 void QtxListResourceEdit::DoubleEditItem::retrieve()
682 myDouble->setText( getString() );
686 Class: QtxListResourceEdit::DoubleSpinItem
687 Descr: GUI implementation of resources double item.
690 QtxListResourceEdit::DoubleSpinItem::DoubleSpinItem( const QString& title, QtxResourceEdit* edit,
691 Item* pItem, QWidget* parent )
692 : PrefItem( RealSpin, edit, pItem, parent )
694 new QLabel( title, this );
695 myDouble = new QtxDblSpinBox( this );
696 myDouble->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
699 QtxListResourceEdit::DoubleSpinItem::~DoubleSpinItem()
703 void QtxListResourceEdit::DoubleSpinItem::store()
705 setDouble( myDouble->value() );
708 void QtxListResourceEdit::DoubleSpinItem::retrieve()
710 myDouble->setValue( getDouble() );
713 QVariant QtxListResourceEdit::DoubleSpinItem::property( const QString& name ) const
716 if ( name == QString( "minimum" ) || name == QString( "min" ) )
717 var = QVariant( myDouble->minValue() );
718 else if ( name == QString( "maximum" ) || name == QString( "max" ) )
719 var = QVariant( myDouble->maxValue() );
720 else if ( name == QString( "precision" ) )
721 var = QVariant( myDouble->precision() );
722 else if ( name == QString( "step" ) )
723 var = QVariant( myDouble->lineStep() );
727 void QtxListResourceEdit::DoubleSpinItem::setProperty( const QString& name, const QVariant& var )
730 if ( prop.cast( QVariant::Double ) )
732 double val = prop.toDouble();
733 if ( name == QString( "minimum" ) || name == QString( "min" ) )
734 myDouble->setMinValue( val );
735 else if ( name == QString( "maximum" ) || name == QString( "max" ) )
736 myDouble->setMaxValue( val );
737 else if ( name == QString( "step" ) && val > 0 )
738 myDouble->setLineStep( val );
743 if ( prop.cast( QVariant::Int ) && name == QString( "precision" ) && prop.toInt() > 0 )
744 myDouble->setPrecision( prop.toInt() );
749 Class: QtxListResourceEdit::ColorItem
750 Descr: GUI implementation of resources color item.
753 QtxListResourceEdit::ColorItem::ColorItem( const QString& title, QtxResourceEdit* edit,
754 Item* pItem, QWidget* parent )
755 : PrefItem( Color, edit, pItem, parent )
757 class ColorSelector : public QLabel
760 ColorSelector( QWidget* parent = 0 ) : QLabel( parent )
762 setFrameStyle( WinPanel | Raised );
764 virtual ~ColorSelector() {}
765 virtual QSize minimumSizeHint() const
767 return QLabel::minimumSizeHint() + QSize( 0, 2 );
771 virtual void mousePressEvent( QMouseEvent* e )
773 if ( e->button() == LeftButton )
775 setFrameStyle( WinPanel | Sunken );
776 QColor c = QColorDialog::getColor( paletteBackgroundColor(), this );
778 setPaletteBackgroundColor( c );
780 setFrameStyle( WinPanel | Raised );
785 new QLabel( title, this );
786 myColor = new ColorSelector( this );
787 myColor->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
790 QtxListResourceEdit::ColorItem::~ColorItem()
794 void QtxListResourceEdit::ColorItem::store()
796 setColor( myColor->paletteBackgroundColor() );
799 void QtxListResourceEdit::ColorItem::retrieve()
801 myColor->setPaletteBackgroundColor( getColor() );