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>
19 #include <qtoolbutton.h>
20 #include <qfontdialog.h>
22 #include "QtxIntSpinBox.h"
23 #include "QtxDblSpinBox.h"
26 Class: QtxListResourceEdit
27 Descr: GUI implementation of QtxResourceEdit - manager of resources
30 QtxListResourceEdit::QtxListResourceEdit( QtxResourceMgr* mgr, QWidget* parent )
32 QtxResourceEdit( mgr )
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 );
40 myList = new QListBox( base );
41 myStack = new QWidgetStack( base );
43 myList->setSizePolicy( QSizePolicy( QSizePolicy::Minimum, QSizePolicy::Expanding ) );
44 myStack->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );
46 myList->setSelectionMode( QListBox::Single );
48 connect( myList, SIGNAL( selectionChanged() ), this, SLOT( onSelectionChanged() ) );
50 setFocusProxy( myList );
55 QtxListResourceEdit::~QtxListResourceEdit()
59 void QtxListResourceEdit::onSelectionChanged()
61 int idx = myList->index( myList->selectedItem() );
65 myStack->raiseWidget( idx );
68 QtxResourceEdit::Item* QtxListResourceEdit::createItem( const QString& title, const int )
70 Item* i = item( title, -1 );
74 Category* category = new Category( this, myStack );
75 myList->insertItem( title );
76 int id = myList->count() - 1;
77 myStack->addWidget( category, id );
79 if ( !myList->selectedItem() )
80 myList->setSelected( 0, true );
87 void QtxListResourceEdit::changedResources( const QMap<Item*, QString>& map )
89 QMap<int, QString> idMap;
90 for ( QMap<Item*, QString>::ConstIterator it = map.begin(); it != map.end(); ++it )
92 idMap.insert( it.key()->id(), it.data() );
94 emit resourceChanged( it.key()->id() );
97 it.key()->resource( sec, param );
98 emit resourceChanged( sec, param );
101 emit resourcesChanged( idMap );
104 void QtxListResourceEdit::updateState()
106 if ( myStack->visibleWidget() )
113 Class: QtxListResourceEdit::Category
114 Descr: GUI implementation of preferences category.
117 QtxListResourceEdit::Category::Category( QtxListResourceEdit* edit, QWidget* parent )
121 QVBoxLayout* main = new QVBoxLayout( this );
122 QGroupBox* base = new QGroupBox( 1, Qt::Horizontal, "", this );
123 base->setFrameStyle( QFrame::NoFrame );
124 base->setInsideMargin( 0 );
125 main->addWidget( base, 1 );
127 myTabs = new QTabWidget( base );
128 myInfo = new QLabel( base );
130 myInfo->setAlignment( Qt::AlignCenter );
131 myInfo->setFrameStyle( QFrame::WinPanel | QFrame::Raised );
132 myInfo->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );
137 QtxListResourceEdit::Category::~Category()
141 int QtxListResourceEdit::Category::type() const
146 void QtxListResourceEdit::Category::store()
150 void QtxListResourceEdit::Category::retrieve()
154 QVariant QtxListResourceEdit::Category::property( const QString& prop ) const
157 if ( prop == QString( "information" ) || prop == QString( "info" ) )
158 var = myInfo->text();
162 void QtxListResourceEdit::Category::setProperty( const QString& name, const QVariant& var )
165 if ( !prop.cast( QVariant::String ) )
168 if ( name == QString( "information" ) || name == QString( "info" ) )
169 myInfo->setText( prop.toString() );
174 QtxResourceEdit::Item* QtxListResourceEdit::Category::createItem( const QString& title, const int )
176 Item* i = item( title, id() );
180 Tab* tab = new Tab( resourceEdit(), this, this );
181 myTabs->addTab( tab, title );
188 void QtxListResourceEdit::Category::updateState()
190 if ( myTabs->count() )
195 if ( !myTabs->count() && !myInfo->text().isEmpty() )
202 Class: QtxListResourceEdit::Tab
203 Descr: GUI implementation of resources tab.
206 QtxListResourceEdit::Tab::Tab( QtxResourceEdit* edit, Item* pItem, QWidget* parent )
210 QVBoxLayout* main = new QVBoxLayout( this );
211 QVBox* vbox = new QVBox( this );
212 vbox->setMargin( 5 );
214 main->addWidget( myMainFrame );
215 main->addStretch( 1 );
218 QtxListResourceEdit::Tab::~Tab()
222 int QtxListResourceEdit::Tab::type() const
227 void QtxListResourceEdit::Tab::store()
231 void QtxListResourceEdit::Tab::retrieve()
235 void QtxListResourceEdit::Tab::polish()
242 QtxResourceEdit::Item* QtxListResourceEdit::Tab::createItem( const QString& title, const int )
244 Item* i = item( title, id() );
248 Group* group = new Group( title, resourceEdit(), this, myMainFrame );
253 void QtxListResourceEdit::Tab::adjustLabels()
255 QObjectList* labels = queryList( "QLabel" );
259 for ( QObjectListIt it1( *labels ); it1.current(); ++it1 )
261 if ( it1.current()->isWidgetType() )
263 QWidget* wid = (QWidget*)it1.current();
264 w = QMAX( w, wid->sizeHint().width() );
267 for ( QObjectListIt it2( *labels ); it2.current(); ++it2 )
269 if ( it2.current()->isWidgetType() )
271 QWidget* wid = (QWidget*)it2.current();
272 wid->setMinimumWidth( w );
280 Class: QtxListResourceEdit::Group
281 Descr: GUI implementation of resources group.
284 QtxListResourceEdit::Group::Group( const QString& title, QtxResourceEdit* edit, Item* pItem, QWidget* parent )
285 : QGroupBox( 2, Qt::Horizontal, title, parent ),
290 QtxListResourceEdit::Group::~Group()
294 int QtxListResourceEdit::Group::type() const
299 void QtxListResourceEdit::Group::store()
303 void QtxListResourceEdit::Group::retrieve()
307 QVariant QtxListResourceEdit::Group::property( const QString& prop ) const
310 if ( prop == "columns" )
311 var = QVariant( columns() );
315 void QtxListResourceEdit::Group::setProperty( const QString& name, const QVariant& var )
318 if ( !prop.cast( QVariant::Int ) )
321 if ( name == QString( "columns" ) && prop.toInt() > 0 )
322 setColumns( prop.toInt() );
325 void QtxListResourceEdit::Group::setTitle( const QString& title )
327 Item::setTitle( title );
328 QGroupBox::setTitle( title );
331 QtxResourceEdit::Item* QtxListResourceEdit::Group::createItem( const QString& title, const int type )
338 item = new ColorItem( title, resourceEdit(), this, this );
341 item = new StateItem( title, resourceEdit(), this, this );
344 item = new StringItem( title, resourceEdit(), this, this );
347 item = new ListItem( title, resourceEdit(), this, this );
350 item = new DoubleSpinItem( title, resourceEdit(), this, this );
353 item = new IntegerSpinItem( title, resourceEdit(), this, this );
356 item = new DoubleEditItem( title, resourceEdit(), this, this );
359 item = new IntegerEditItem( title, resourceEdit(), this, this );
362 item = new Spacer( resourceEdit(), this, this );
365 item = new FontItem( title, resourceEdit(), this, this );
373 Class: QtxListResourceEdit::PrefItem
374 Descr: Base class for preferences items.
377 QtxListResourceEdit::PrefItem::PrefItem( const int type, QtxResourceEdit* edit, Item* pi, QWidget* parent )
385 QtxListResourceEdit::PrefItem::~PrefItem()
389 int QtxListResourceEdit::PrefItem::type() const
394 QtxResourceEdit::Item* QtxListResourceEdit::PrefItem::createItem( const QString&, const int )
400 Class: QtxListResourceEdit::Spacer
401 Descr: GUI implementation of resources spacer.
404 QtxListResourceEdit::Spacer::Spacer( QtxResourceEdit* edit, Item* pItem, QWidget* parent )
405 : PrefItem( Space, edit, pItem, parent )
407 setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
410 QtxListResourceEdit::Spacer::~Spacer()
414 void QtxListResourceEdit::Spacer::store()
418 void QtxListResourceEdit::Spacer::retrieve()
423 Class: QtxListResourceEdit::ListItem
424 Descr: GUI implementation of resources list item.
427 QtxListResourceEdit::ListItem::ListItem( const QString& title, QtxResourceEdit* edit,
428 Item* pItem, QWidget* parent )
429 : PrefItem( Selector, edit, pItem, parent )
431 new QLabel( title, this );
432 myList = new QComboBox( false, this );
433 myList->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
436 QtxListResourceEdit::ListItem::~ListItem()
440 void QtxListResourceEdit::ListItem::store()
442 int idx = myList->currentItem();
443 if ( myIndex.contains( idx ) )
444 setInteger( myIndex[idx] );
447 void QtxListResourceEdit::ListItem::retrieve()
449 int id = getInteger( -1 );
452 for ( QMap<int, int>::ConstIterator it = myIndex.begin(); it != myIndex.end() && idx == -1; ++it )
454 if ( it.data() == id )
458 myList->setCurrentItem( idx );
461 QVariant QtxListResourceEdit::ListItem::property( const QString& name ) const
464 if ( name == QString( "strings" ) )
467 for ( int i = 0; i < (int)myList->count(); i++ )
468 lst.append( myList->text( i ) );
469 val = QVariant( lst );
471 else if ( name == QString( "indexes" ) )
473 QValueList<QVariant> lst;
474 for ( int i = 0; i < (int)myList->count(); i++ )
475 lst.append( myIndex.contains( i ) ? myIndex[i] : 0 );
476 val = QVariant( lst );
481 void QtxListResourceEdit::ListItem::setProperty( const QString& name, const QVariant& val )
483 if ( name == QString( "strings" ) )
485 else if ( name == QString( "indexes" ) )
489 void QtxListResourceEdit::ListItem::setStrings( const QVariant& var )
491 if ( var.type() != QVariant::StringList )
494 setStrings( var.toStringList() );
497 void QtxListResourceEdit::ListItem::setIndexes( const QVariant& var )
499 if ( var.type() != QVariant::List )
502 QValueList<QVariant> varList = var.toList();
504 for ( QValueList<QVariant>::const_iterator it = varList.begin(); it != varList.end(); ++it )
506 if ( (*it).canCast( QVariant::Int ) )
507 lst.append( (*it).toInt() );
512 void QtxListResourceEdit::ListItem::setStrings( const QStringList& lst )
515 myList->insertStringList( lst );
518 void QtxListResourceEdit::ListItem::setIndexes( const QValueList<int>& lst )
523 for ( QValueList<int>::const_iterator it = lst.begin(); it != lst.end(); ++it, idx++ )
524 myIndex.insert( idx, *it );
528 Class: QtxListResourceEdit::StateItem
529 Descr: GUI implementation of resources bool item.
532 QtxListResourceEdit::StateItem::StateItem( const QString& title, QtxResourceEdit* edit,
533 Item* pItem, QWidget* parent )
534 : PrefItem( Bool, edit, pItem, parent )
536 myState = new QCheckBox( title, this );
537 myState->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
540 QtxListResourceEdit::StateItem::~StateItem()
544 void QtxListResourceEdit::StateItem::store()
546 setBoolean( myState->isChecked() );
549 void QtxListResourceEdit::StateItem::retrieve()
551 myState->setChecked( getBoolean() );
555 Class: QtxListResourceEdit::StringItem
556 Descr: GUI implementation of resources string item.
559 QtxListResourceEdit::StringItem::StringItem( const QString& title, QtxResourceEdit* edit,
560 Item* pItem, QWidget* parent )
561 : PrefItem( String, edit, pItem, parent )
563 new QLabel( title, this );
564 myString = new QLineEdit( this );
565 myString->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
568 QtxListResourceEdit::StringItem::~StringItem()
572 void QtxListResourceEdit::StringItem::store()
574 setString( myString->text() );
577 void QtxListResourceEdit::StringItem::retrieve()
579 myString->setText( getString() );
583 Class: QtxListResourceEdit::IntegerEditItem
584 Descr: GUI implementation of resources integer item.
587 QtxListResourceEdit::IntegerEditItem::IntegerEditItem( const QString& title, QtxResourceEdit* edit, Item* pItem, QWidget* parent )
588 : PrefItem( Integer, edit, pItem, parent )
590 new QLabel( title, this );
591 myInteger = new QLineEdit( this );
592 myInteger->setValidator( new QIntValidator( myInteger ) );
593 myInteger->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
596 QtxListResourceEdit::IntegerEditItem::~IntegerEditItem()
600 void QtxListResourceEdit::IntegerEditItem::store()
602 setString( myInteger->text() );
605 void QtxListResourceEdit::IntegerEditItem::retrieve()
607 myInteger->setText( getString() );
611 Class: QtxListResourceEdit::IntegerSpinItem
612 Descr: GUI implementation of resources integer item.
615 QtxListResourceEdit::IntegerSpinItem::IntegerSpinItem( const QString& title, QtxResourceEdit* edit, Item* pItem, QWidget* parent )
616 : PrefItem( IntSpin, edit, pItem, parent )
618 new QLabel( title, this );
619 myInteger = new QtxIntSpinBox( this );
620 myInteger->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
623 QtxListResourceEdit::IntegerSpinItem::~IntegerSpinItem()
627 void QtxListResourceEdit::IntegerSpinItem::store()
629 setInteger( myInteger->value() );
632 void QtxListResourceEdit::IntegerSpinItem::retrieve()
634 myInteger->setValue( getInteger() );
637 QVariant QtxListResourceEdit::IntegerSpinItem::property( const QString& name ) const
640 if ( name == QString( "minimum" ) || name == QString( "min" ) )
641 var = QVariant( myInteger->minValue() );
642 else if ( name == QString( "maximum" ) || name == QString( "max" ) )
643 var = QVariant( myInteger->maxValue() );
644 else if ( name == QString( "step" ) )
645 var = QVariant( myInteger->lineStep() );
649 void QtxListResourceEdit::IntegerSpinItem::setProperty( const QString& name, const QVariant& var )
652 if ( !prop.cast( QVariant::Int ) )
655 int val = prop.toInt();
656 if ( name == QString( "minimum" ) || name == QString( "min" ) )
657 myInteger->setMinValue( val );
658 else if ( name == QString( "maximum" ) || name == QString( "max" ) )
659 myInteger->setMaxValue( val );
660 else if ( name == QString( "step" ) && val > 0 )
661 myInteger->setLineStep( val );
665 Class: QtxListResourceEdit::DoubleEditItem
666 Descr: GUI implementation of resources string item.
669 QtxListResourceEdit::DoubleEditItem::DoubleEditItem( const QString& title, QtxResourceEdit* edit,
670 Item* pItem, QWidget* parent )
671 : PrefItem( Double, edit, pItem, parent )
673 new QLabel( title, this );
674 myDouble = new QLineEdit( this );
675 myDouble->setValidator( new QDoubleValidator( myDouble ) );
676 myDouble->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
679 QtxListResourceEdit::DoubleEditItem::~DoubleEditItem()
683 void QtxListResourceEdit::DoubleEditItem::store()
685 setString( myDouble->text() );
688 void QtxListResourceEdit::DoubleEditItem::retrieve()
690 myDouble->setText( getString() );
694 Class: QtxListResourceEdit::DoubleSpinItem
695 Descr: GUI implementation of resources double item.
698 QtxListResourceEdit::DoubleSpinItem::DoubleSpinItem( const QString& title, QtxResourceEdit* edit,
699 Item* pItem, QWidget* parent )
700 : PrefItem( DblSpin, edit, pItem, parent )
702 new QLabel( title, this );
703 myDouble = new QtxDblSpinBox( this );
704 myDouble->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
707 QtxListResourceEdit::DoubleSpinItem::~DoubleSpinItem()
711 void QtxListResourceEdit::DoubleSpinItem::store()
713 setDouble( myDouble->value() );
716 void QtxListResourceEdit::DoubleSpinItem::retrieve()
718 myDouble->setValue( getDouble() );
721 QVariant QtxListResourceEdit::DoubleSpinItem::property( const QString& name ) const
724 if ( name == QString( "minimum" ) || name == QString( "min" ) )
725 var = QVariant( myDouble->minValue() );
726 else if ( name == QString( "maximum" ) || name == QString( "max" ) )
727 var = QVariant( myDouble->maxValue() );
728 else if ( name == QString( "precision" ) )
729 var = QVariant( myDouble->precision() );
730 else if ( name == QString( "step" ) )
731 var = QVariant( myDouble->lineStep() );
735 void QtxListResourceEdit::DoubleSpinItem::setProperty( const QString& name, const QVariant& var )
738 if ( prop.cast( QVariant::Double ) )
740 double val = prop.toDouble();
741 if ( name == QString( "minimum" ) || name == QString( "min" ) )
742 myDouble->setMinValue( val );
743 else if ( name == QString( "maximum" ) || name == QString( "max" ) )
744 myDouble->setMaxValue( val );
745 else if ( name == QString( "step" ) && val > 0 )
746 myDouble->setLineStep( val );
751 if ( prop.cast( QVariant::Int ) && name == QString( "precision" ) && prop.toInt() > 0 )
752 myDouble->setPrecision( prop.toInt() );
757 Class: QtxListResourceEdit::ColorItem
758 Descr: GUI implementation of resources color item.
761 QtxListResourceEdit::ColorItem::ColorItem( const QString& title, QtxResourceEdit* edit,
762 Item* pItem, QWidget* parent )
763 : PrefItem( Color, edit, pItem, parent )
765 class ColorSelector : public QLabel
768 ColorSelector( QWidget* parent = 0 ) : QLabel( parent )
770 setFrameStyle( WinPanel | Raised );
772 virtual ~ColorSelector() {}
773 virtual QSize minimumSizeHint() const
775 return QLabel::minimumSizeHint() + QSize( 0, 2 );
779 virtual void mousePressEvent( QMouseEvent* e )
781 if ( e->button() == LeftButton )
783 setFrameStyle( WinPanel | Sunken );
784 QColor c = QColorDialog::getColor( paletteBackgroundColor(), this );
786 setPaletteBackgroundColor( c );
788 setFrameStyle( WinPanel | Raised );
793 new QLabel( title, this );
794 myColor = new ColorSelector( this );
795 myColor->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
798 QtxListResourceEdit::ColorItem::~ColorItem()
802 void QtxListResourceEdit::ColorItem::store()
804 setColor( myColor->paletteBackgroundColor() );
807 void QtxListResourceEdit::ColorItem::retrieve()
809 myColor->setPaletteBackgroundColor( getColor() );
814 Class: QtxListResourceEdit::FontItem
815 Descr: GUI implementation of resources font item.
817 QtxListResourceEdit::FontItem::FontItem( const QString& title, QtxResourceEdit* edit, Item* pItem, QWidget* parent )
818 : PrefItem( Font, edit, pItem, parent )
820 new QLabel( title, this );
821 myFontPrs = new QLabel( "", this );
822 myFontPrs->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
823 myFontPrs->setAutoResize( true );
824 myFontPrs->setAlignment( Qt::AlignLeft );
826 QToolButton* selFont = new QToolButton( this );
827 selFont->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) );
828 selFont->setText( "..." );
829 connect( selFont, SIGNAL( clicked() ), this, SLOT( onSelectFont() ) );
832 QtxListResourceEdit::FontItem::~FontItem()
836 void QtxListResourceEdit::FontItem::store()
838 Item::setFont( myFont );
841 void QtxListResourceEdit::FontItem::retrieve()
847 void QtxListResourceEdit::FontItem::buildFontPrs()
850 fval.append( myFont.family() );
852 fval.append( "Bold" );
853 if( myFont.italic() )
854 fval.append( "Italic" );
855 fval.append( QString( "%1" ).arg( myFont.pointSize() ) );
857 myFontPrs->setText( fval.join( ", " ) );
860 void QtxListResourceEdit::FontItem::onSelectFont()
863 QFont newFont = QFontDialog::getFont( &ok, myFont, this );