--- /dev/null
+// File: QtxListResourceEdit.cxx
+// Author: Sergey TELKOV
+
+#include "QtxListResourceEdit.h"
+
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qlistbox.h>
+#include <qcombobox.h>
+#include <qlineedit.h>
+#include <qcheckbox.h>
+#include <qtabwidget.h>
+#include <qvalidator.h>
+#include <qobjectlist.h>
+#include <qcolordialog.h>
+#include <qwidgetstack.h>
+
+#include "QtxIntSpinBox.h"
+#include "QtxDblSpinBox.h"
+
+/*
+ Class: QtxListResourceEdit
+ Descr: GUI implementation of QtxResourceEdit - manager of resources
+*/
+
+QtxListResourceEdit::QtxListResourceEdit( QtxResourceMgr* mgr, QWidget* parent )
+: QFrame( parent ),
+QtxResourceEdit( mgr )
+{
+ QHBoxLayout* main = new QHBoxLayout( this, 0, 5 );
+
+ myList = new QListBox( this );
+ myStack = new QWidgetStack( this );
+
+ myList->setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred ) );
+ myStack->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
+
+ main->addWidget( myList );
+ main->addWidget( myStack );
+
+ myList->setSelectionMode( QListBox::Single );
+
+ connect( myList, SIGNAL( selectionChanged() ), this, SLOT( onSelectionChanged() ) );
+
+ setFocusProxy( myList );
+
+ updateState();
+}
+
+QtxListResourceEdit::~QtxListResourceEdit()
+{
+}
+
+void QtxListResourceEdit::onSelectionChanged()
+{
+ int idx = myList->index( myList->selectedItem() );
+ if ( idx < 0 )
+ return;
+
+ myStack->raiseWidget( idx );
+}
+
+QtxResourceEdit::Item* QtxListResourceEdit::createItem( const QString& title, const int )
+{
+ Item* i = item( title, -1 );
+ if ( i )
+ return i;
+
+ Category* category = new Category( this, myStack );
+ myList->insertItem( title );
+ int id = myList->count() - 1;
+ myStack->addWidget( category, id );
+
+ if ( !myList->selectedItem() )
+ myList->setSelected( 0, true );
+
+ updateState();
+
+ return category;
+}
+
+void QtxListResourceEdit::updateState()
+{
+ if ( myStack->visibleWidget() )
+ myStack->show();
+ else
+ myStack->hide();
+}
+
+/*
+ Class: QtxListResourceEdit::Category
+ Descr: GUI implementation of preferences category.
+*/
+
+QtxListResourceEdit::Category::Category( QtxListResourceEdit* edit, QWidget* parent )
+: QFrame( parent ),
+Item( edit )
+{
+ QVBoxLayout* main = new QVBoxLayout( this );
+ QGroupBox* base = new QGroupBox( 1, Qt::Horizontal, "", this );
+ base->setFrameStyle( QFrame::NoFrame );
+ base->setInsideMargin( 0 );
+ main->addWidget( base, 1 );
+
+ myTabs = new QTabWidget( base );
+ myInfo = new QLabel( base );
+
+ myInfo->setAlignment( Qt::AlignCenter );
+ myInfo->setFrameStyle( QFrame::WinPanel | QFrame::Raised );
+ myInfo->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );
+
+ updateState();
+}
+
+QtxListResourceEdit::Category::~Category()
+{
+}
+
+int QtxListResourceEdit::Category::type() const
+{
+ return -1;
+}
+
+void QtxListResourceEdit::Category::store()
+{
+}
+
+void QtxListResourceEdit::Category::retrieve()
+{
+}
+
+QVariant QtxListResourceEdit::Category::property( const QString& prop ) const
+{
+ QVariant var;
+ if ( prop == QString( "information" ) || prop == QString( "info" ) )
+ var = myInfo->text();
+ return var;
+}
+
+void QtxListResourceEdit::Category::setProperty( const QString& name, const QVariant& var )
+{
+ QVariant prop = var;
+ if ( !prop.cast( QVariant::String ) )
+ return;
+
+ if ( name == QString( "information" ) || name == QString( "info" ) )
+ myInfo->setText( prop.toString() );
+
+ updateState();
+}
+
+QtxResourceEdit::Item* QtxListResourceEdit::Category::createItem( const QString& title, const int )
+{
+ Item* i = item( title, id() );
+ if ( i )
+ return i;
+
+ Tab* tab = new Tab( resourceEdit(), this, this );
+ myTabs->addTab( tab, title );
+
+ updateState();
+
+ return tab;
+}
+
+void QtxListResourceEdit::Category::updateState()
+{
+ if ( myTabs->count() )
+ myTabs->show();
+ else
+ myTabs->hide();
+
+ if ( !myTabs->count() && !myInfo->text().isEmpty() )
+ myInfo->show();
+ else
+ myInfo->hide();
+}
+
+/*
+ Class: QtxListResourceEdit::Tab
+ Descr: GUI implementation of resources tab.
+*/
+
+QtxListResourceEdit::Tab::Tab( QtxResourceEdit* edit, Item* pItem, QWidget* parent )
+: QFrame( parent ),
+Item( edit, pItem )
+{
+ QVBoxLayout* main = new QVBoxLayout( this );
+ myMainFrame = new QGroupBox( 1, Qt::Horizontal, "", this );
+ myMainFrame->setFrameStyle( QFrame::NoFrame );
+ myMainFrame->setInsideMargin( 5 );
+ main->addWidget( myMainFrame );
+}
+
+QtxListResourceEdit::Tab::~Tab()
+{
+}
+
+int QtxListResourceEdit::Tab::type() const
+{
+ return -1;
+}
+
+void QtxListResourceEdit::Tab::store()
+{
+}
+
+void QtxListResourceEdit::Tab::retrieve()
+{
+}
+
+void QtxListResourceEdit::Tab::polish()
+{
+ QFrame::polish();
+
+ adjustLabels();
+}
+
+QtxResourceEdit::Item* QtxListResourceEdit::Tab::createItem( const QString& title, const int )
+{
+ Item* i = item( title, id() );
+ if ( i )
+ return i;
+
+ Group* group = new Group( title, resourceEdit(), this, myMainFrame );
+
+ return group;
+}
+
+void QtxListResourceEdit::Tab::adjustLabels()
+{
+ QObjectList* labels = queryList( "QLabel" );
+ if ( labels )
+ {
+ int w = 0;
+ for ( QObjectListIt it1( *labels ); it1.current(); ++it1 )
+ {
+ if ( it1.current()->isWidgetType() )
+ {
+ QWidget* wid = (QWidget*)it1.current();
+ w = QMAX( w, wid->sizeHint().width() );
+ }
+ }
+ for ( QObjectListIt it2( *labels ); it2.current(); ++it2 )
+ {
+ if ( it2.current()->isWidgetType() )
+ {
+ QWidget* wid = (QWidget*)it2.current();
+ wid->setMinimumWidth( w );
+ }
+ }
+ delete labels;
+ }
+}
+
+/*
+ Class: QtxListResourceEdit::Group
+ Descr: GUI implementation of resources group.
+*/
+
+QtxListResourceEdit::Group::Group( const QString& title, QtxResourceEdit* edit, Item* pItem, QWidget* parent )
+: QGroupBox( 2, Qt::Horizontal, title, parent ),
+Item( edit, pItem )
+{
+}
+
+QtxListResourceEdit::Group::~Group()
+{
+}
+
+int QtxListResourceEdit::Group::type() const
+{
+ return -1;
+}
+
+void QtxListResourceEdit::Group::store()
+{
+}
+
+void QtxListResourceEdit::Group::retrieve()
+{
+}
+
+QVariant QtxListResourceEdit::Group::property( const QString& prop ) const
+{
+ QVariant var;
+ if ( prop == "columns" )
+ var = QVariant( columns() );
+ return var;
+}
+
+void QtxListResourceEdit::Group::setProperty( const QString& name, const QVariant& var )
+{
+ QVariant prop = var;
+ if ( !prop.cast( QVariant::Int ) )
+ return;
+
+ if ( name == QString( "columns" ) && prop.toInt() > 0 )
+ setColumns( prop.toInt() );
+}
+
+void QtxListResourceEdit::Group::setTitle( const QString& title )
+{
+ Item::setTitle( title );
+ QGroupBox::setTitle( title );
+}
+
+QtxResourceEdit::Item* QtxListResourceEdit::Group::createItem( const QString& title, const int type )
+{
+ Item* item = 0;
+
+ switch ( type )
+ {
+ case Color:
+ item = new ColorItem( title, resourceEdit(), this, this );
+ break;
+ case Bool:
+ item = new StateItem( title, resourceEdit(), this, this );
+ break;
+ case String:
+ item = new StringItem( title, resourceEdit(), this, this );
+ break;
+ case List:
+ item = new ListItem( title, resourceEdit(), this, this );
+ break;
+ case RealSpin:
+ item = new DoubleSpinItem( title, resourceEdit(), this, this );
+ break;
+ case IntegerSpin:
+ item = new IntegerSpinItem( title, resourceEdit(), this, this );
+ break;
+ case RealEdit:
+ item = new DoubleEditItem( title, resourceEdit(), this, this );
+ break;
+ case IntegerEdit:
+ item = new IntegerEditItem( title, resourceEdit(), this, this );
+ break;
+ case Space:
+ item = new Spacer( resourceEdit(), this, this );
+ break;
+ }
+
+ return item;
+}
+
+/*
+ Class: QtxListResourceEdit::PrefItem
+ Descr: Base class for preferences items.
+*/
+
+QtxListResourceEdit::PrefItem::PrefItem( const int type, QtxResourceEdit* edit, Item* pi, QWidget* parent )
+: QHBox( parent ),
+Item( edit, pi ),
+myType( type )
+{
+ setSpacing( 5 );
+}
+
+QtxListResourceEdit::PrefItem::~PrefItem()
+{
+}
+
+int QtxListResourceEdit::PrefItem::type() const
+{
+ return myType;
+}
+
+QtxResourceEdit::Item* QtxListResourceEdit::PrefItem::createItem( const QString&, const int )
+{
+ return 0;
+}
+
+/*
+ Class: QtxListResourceEdit::Spacer
+ Descr: GUI implementation of resources spacer.
+*/
+
+QtxListResourceEdit::Spacer::Spacer( QtxResourceEdit* edit, Item* pItem, QWidget* parent )
+: PrefItem( Space, edit, pItem, parent )
+{
+ setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
+}
+
+QtxListResourceEdit::Spacer::~Spacer()
+{
+}
+
+void QtxListResourceEdit::Spacer::store()
+{
+}
+
+void QtxListResourceEdit::Spacer::retrieve()
+{
+}
+
+/*
+ Class: QtxListResourceEdit::ListItem
+ Descr: GUI implementation of resources list item.
+*/
+
+QtxListResourceEdit::ListItem::ListItem( const QString& title, QtxResourceEdit* edit,
+ Item* pItem, QWidget* parent )
+: PrefItem( List, edit, pItem, parent )
+{
+ new QLabel( title, this );
+ myList = new QComboBox( false, this );
+ myList->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
+}
+
+QtxListResourceEdit::ListItem::~ListItem()
+{
+}
+
+void QtxListResourceEdit::ListItem::store()
+{
+ int idx = myList->currentItem();
+ if ( myIndex.contains( idx ) )
+ setInteger( myIndex[idx] );
+}
+
+void QtxListResourceEdit::ListItem::retrieve()
+{
+ int id = getInteger( -1 );
+
+ int idx = -1;
+ for ( QMap<int, int>::ConstIterator it = myIndex.begin(); it != myIndex.end() && idx == -1; ++it )
+ {
+ if ( it.data() == id )
+ idx = it.key();
+ }
+
+ myList->setCurrentItem( idx );
+}
+
+QVariant QtxListResourceEdit::ListItem::property( const QString& name ) const
+{
+ QVariant val;
+ if ( name == QString( "strings" ) )
+ {
+ QStringList lst;
+ for ( int i = 0; i < (int)myList->count(); i++ )
+ lst.append( myList->text( i ) );
+ val = QVariant( lst );
+ }
+ else if ( name == QString( "indexes" ) )
+ {
+ QValueList<QVariant> lst;
+ for ( int i = 0; i < (int)myList->count(); i++ )
+ lst.append( myIndex.contains( i ) ? myIndex[i] : 0 );
+ val = QVariant( lst );
+ }
+ return val;
+}
+
+void QtxListResourceEdit::ListItem::setProperty( const QString& name, const QVariant& val )
+{
+ if ( name == QString( "strings" ) )
+ setStrings( val );
+ else if ( name == QString( "indexes" ) )
+ setIndexes( val );
+}
+
+void QtxListResourceEdit::ListItem::setStrings( const QVariant& var )
+{
+ if ( var.type() != QVariant::StringList )
+ return;
+
+ setStrings( var.toStringList() );
+}
+
+void QtxListResourceEdit::ListItem::setIndexes( const QVariant& var )
+{
+ if ( var.type() != QVariant::List )
+ return;
+
+ QValueList<QVariant> varList = var.toList();
+ QValueList<int> lst;
+ for ( QValueList<QVariant>::const_iterator it = varList.begin(); it != varList.end(); ++it )
+ {
+ if ( (*it).canCast( QVariant::Int ) )
+ lst.append( (*it).toInt() );
+ }
+ setIndexes( lst );
+}
+
+void QtxListResourceEdit::ListItem::setStrings( const QStringList& lst )
+{
+ myList->clear();
+ myList->insertStringList( lst );
+}
+
+void QtxListResourceEdit::ListItem::setIndexes( const QValueList<int>& lst )
+{
+ myIndex.clear();
+
+ int idx = 0;
+ for ( QValueList<int>::const_iterator it = lst.begin(); it != lst.end(); ++it, idx++ )
+ myIndex.insert( idx, *it );
+}
+
+/*
+ Class: QtxListResourceEdit::StateItem
+ Descr: GUI implementation of resources bool item.
+*/
+
+QtxListResourceEdit::StateItem::StateItem( const QString& title, QtxResourceEdit* edit,
+ Item* pItem, QWidget* parent )
+: PrefItem( Bool, edit, pItem, parent )
+{
+ myState = new QCheckBox( title, this );
+ myState->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
+}
+
+QtxListResourceEdit::StateItem::~StateItem()
+{
+}
+
+void QtxListResourceEdit::StateItem::store()
+{
+ setBoolean( myState->isChecked() );
+}
+
+void QtxListResourceEdit::StateItem::retrieve()
+{
+ myState->setChecked( getBoolean() );
+}
+
+/*
+ Class: QtxListResourceEdit::StringItem
+ Descr: GUI implementation of resources string item.
+*/
+
+QtxListResourceEdit::StringItem::StringItem( const QString& title, QtxResourceEdit* edit,
+ Item* pItem, QWidget* parent )
+: PrefItem( String, edit, pItem, parent )
+{
+ new QLabel( title, this );
+ myString = new QLineEdit( this );
+ myString->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
+}
+
+QtxListResourceEdit::StringItem::~StringItem()
+{
+}
+
+void QtxListResourceEdit::StringItem::store()
+{
+ setString( myString->text() );
+}
+
+void QtxListResourceEdit::StringItem::retrieve()
+{
+ myString->setText( getString() );
+}
+
+/*
+ Class: QtxListResourceEdit::IntegerEditItem
+ Descr: GUI implementation of resources integer item.
+*/
+
+QtxListResourceEdit::IntegerEditItem::IntegerEditItem( const QString& title, QtxResourceEdit* edit, Item* pItem, QWidget* parent )
+: PrefItem( IntegerEdit, edit, pItem, parent )
+{
+ new QLabel( title, this );
+ myInteger = new QLineEdit( this );
+ myInteger->setValidator( new QIntValidator( myInteger ) );
+ myInteger->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
+}
+
+QtxListResourceEdit::IntegerEditItem::~IntegerEditItem()
+{
+}
+
+void QtxListResourceEdit::IntegerEditItem::store()
+{
+ setString( myInteger->text() );
+}
+
+void QtxListResourceEdit::IntegerEditItem::retrieve()
+{
+ myInteger->setText( getString() );
+}
+
+/*
+ Class: QtxListResourceEdit::IntegerSpinItem
+ Descr: GUI implementation of resources integer item.
+*/
+
+QtxListResourceEdit::IntegerSpinItem::IntegerSpinItem( const QString& title, QtxResourceEdit* edit, Item* pItem, QWidget* parent )
+: PrefItem( IntegerSpin, edit, pItem, parent )
+{
+ new QLabel( title, this );
+ myInteger = new QtxIntSpinBox( this );
+ myInteger->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
+}
+
+QtxListResourceEdit::IntegerSpinItem::~IntegerSpinItem()
+{
+}
+
+void QtxListResourceEdit::IntegerSpinItem::store()
+{
+ setInteger( myInteger->value() );
+}
+
+void QtxListResourceEdit::IntegerSpinItem::retrieve()
+{
+ myInteger->setValue( getInteger() );
+}
+
+QVariant QtxListResourceEdit::IntegerSpinItem::property( const QString& name ) const
+{
+ QVariant var;
+ if ( name == QString( "minimum" ) || name == QString( "min" ) )
+ var = QVariant( myInteger->minValue() );
+ else if ( name == QString( "maximum" ) || name == QString( "max" ) )
+ var = QVariant( myInteger->maxValue() );
+ else if ( name == QString( "step" ) )
+ var = QVariant( myInteger->lineStep() );
+ return var;
+}
+
+void QtxListResourceEdit::IntegerSpinItem::setProperty( const QString& name, const QVariant& var )
+{
+ QVariant prop = var;
+ if ( !prop.cast( QVariant::Int ) )
+ return;
+
+ int val = prop.toInt();
+ if ( name == QString( "minimum" ) || name == QString( "min" ) )
+ myInteger->setMinValue( val );
+ else if ( name == QString( "maximum" ) || name == QString( "max" ) )
+ myInteger->setMaxValue( val );
+ else if ( name == QString( "step" ) && val > 0 )
+ myInteger->setLineStep( val );
+}
+
+/*
+ Class: QtxListResourceEdit::DoubleEditItem
+ Descr: GUI implementation of resources string item.
+*/
+
+QtxListResourceEdit::DoubleEditItem::DoubleEditItem( const QString& title, QtxResourceEdit* edit,
+ Item* pItem, QWidget* parent )
+: PrefItem( RealEdit, edit, pItem, parent )
+{
+ new QLabel( title, this );
+ myDouble = new QLineEdit( this );
+ myDouble->setValidator( new QDoubleValidator( myDouble ) );
+ myDouble->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
+}
+
+QtxListResourceEdit::DoubleEditItem::~DoubleEditItem()
+{
+}
+
+void QtxListResourceEdit::DoubleEditItem::store()
+{
+ setString( myDouble->text() );
+}
+
+void QtxListResourceEdit::DoubleEditItem::retrieve()
+{
+ myDouble->setText( getString() );
+}
+
+/*
+ Class: QtxListResourceEdit::DoubleSpinItem
+ Descr: GUI implementation of resources double item.
+*/
+
+QtxListResourceEdit::DoubleSpinItem::DoubleSpinItem( const QString& title, QtxResourceEdit* edit,
+ Item* pItem, QWidget* parent )
+: PrefItem( RealSpin, edit, pItem, parent )
+{
+ new QLabel( title, this );
+ myDouble = new QtxDblSpinBox( this );
+ myDouble->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
+}
+
+QtxListResourceEdit::DoubleSpinItem::~DoubleSpinItem()
+{
+}
+
+void QtxListResourceEdit::DoubleSpinItem::store()
+{
+ setDouble( myDouble->value() );
+}
+
+void QtxListResourceEdit::DoubleSpinItem::retrieve()
+{
+ myDouble->setValue( getDouble() );
+}
+
+QVariant QtxListResourceEdit::DoubleSpinItem::property( const QString& name ) const
+{
+ QVariant var;
+ if ( name == QString( "minimum" ) || name == QString( "min" ) )
+ var = QVariant( myDouble->minValue() );
+ else if ( name == QString( "maximum" ) || name == QString( "max" ) )
+ var = QVariant( myDouble->maxValue() );
+ else if ( name == QString( "precision" ) )
+ var = QVariant( myDouble->precision() );
+ else if ( name == QString( "step" ) )
+ var = QVariant( myDouble->lineStep() );
+ return var;
+}
+
+void QtxListResourceEdit::DoubleSpinItem::setProperty( const QString& name, const QVariant& var )
+{
+ QVariant prop = var;
+ if ( prop.cast( QVariant::Double ) )
+ {
+ double val = prop.toDouble();
+ if ( name == QString( "minimum" ) || name == QString( "min" ) )
+ myDouble->setMinValue( val );
+ else if ( name == QString( "maximum" ) || name == QString( "max" ) )
+ myDouble->setMaxValue( val );
+ else if ( name == QString( "step" ) && val > 0 )
+ myDouble->setLineStep( val );
+ }
+ else
+ {
+ QVariant prop = var;
+ if ( prop.cast( QVariant::Int ) && name == QString( "precision" ) && prop.toInt() > 0 )
+ myDouble->setPrecision( prop.toInt() );
+ }
+}
+
+/*
+ Class: QtxListResourceEdit::ColorItem
+ Descr: GUI implementation of resources color item.
+*/
+
+QtxListResourceEdit::ColorItem::ColorItem( const QString& title, QtxResourceEdit* edit,
+ Item* pItem, QWidget* parent )
+: PrefItem( Color, edit, pItem, parent )
+{
+ class ColorSelector : public QLabel
+ {
+ public:
+ ColorSelector( QWidget* parent = 0 ) : QLabel( parent )
+ {
+ setFrameStyle( WinPanel | Raised );
+ }
+ virtual ~ColorSelector() {}
+ virtual QSize minimumSizeHint() const
+ {
+ return QLabel::minimumSizeHint() + QSize( 0, 2 );
+ }
+
+ protected:
+ virtual void mousePressEvent( QMouseEvent* e )
+ {
+ if ( e->button() == LeftButton )
+ {
+ setFrameStyle( WinPanel | Sunken );
+ QColor c = QColorDialog::getColor( paletteBackgroundColor(), this );
+ if ( c.isValid() )
+ setPaletteBackgroundColor( c );
+
+ setFrameStyle( WinPanel | Raised );
+ }
+ }
+ };
+
+ new QLabel( title, this );
+ myColor = new ColorSelector( this );
+ myColor->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
+}
+
+QtxListResourceEdit::ColorItem::~ColorItem()
+{
+}
+
+void QtxListResourceEdit::ColorItem::store()
+{
+ setColor( myColor->paletteBackgroundColor() );
+}
+
+void QtxListResourceEdit::ColorItem::retrieve()
+{
+ myColor->setPaletteBackgroundColor( getColor() );
+}
--- /dev/null
+// File: QtxListResourceEdit.h
+// Author: Sergey TELKOV
+
+#ifndef QTXLISTRESOURCEEDIT_H
+#define QTXLISTRESOURCEEDIT_H
+
+#include "QtxResourceEdit.h"
+
+#include <qmap.h>
+#include <qhbox.h>
+#include <qframe.h>
+#include <qgroupbox.h>
+
+class QLabel;
+class QListBox;
+class QLineEdit;
+class QCheckBox;
+class QComboBox;
+class QTabWidget;
+class QWidgetStack;
+
+class QtxIntSpinBox;
+class QtxDblSpinBox;
+
+/*
+ Class: QtxListResourceEdit
+ Descr: GUI implementation of QtxResourceEdit - manager of resources
+*/
+
+class QTX_EXPORT QtxListResourceEdit : public QFrame, public QtxResourceEdit
+{
+ Q_OBJECT
+
+public:
+ class Tab;
+ class Group;
+ class Category;
+ class PrefItem;
+
+ class Spacer;
+ class ListItem;
+ class ColorItem;
+ class StateItem;
+ class StringItem;
+ class DoubleSpinItem;
+ class DoubleEditItem;
+ class IntegerSpinItem;
+ class IntegerEditItem;
+
+public:
+ QtxListResourceEdit( QtxResourceMgr*, QWidget* = 0 );
+ virtual ~QtxListResourceEdit();
+
+private slots:
+ void onSelectionChanged();
+
+protected:
+ virtual Item* createItem( const QString&, const int );
+
+private:
+ void updateState();
+
+private:
+ QListBox* myList;
+ QWidgetStack* myStack;
+};
+
+/*
+ Class: QtxListResourceEdit::Category
+ Descr: GUI implementation of 'Category' frame
+*/
+
+class QtxListResourceEdit::Category : public QFrame, public Item
+{
+public:
+ Category( QtxListResourceEdit*, QWidget* = 0 );
+ virtual ~Category();
+
+ virtual int type() const;
+ virtual void store();
+ virtual void retrieve();
+
+ virtual QVariant property( const QString& ) const;
+ virtual void setProperty( const QString&, const QVariant& );
+
+protected:
+ virtual Item* createItem( const QString&, const int );
+
+private:
+ void updateState();
+
+private:
+ QLabel* myInfo;
+ QTabWidget* myTabs;
+};
+
+/*
+ Class: QtxListResourceEdit::Tab
+ Descr: GUI implementation of resources tab.
+*/
+
+class QtxListResourceEdit::Tab : public QFrame, public Item
+{
+public:
+ Tab( QtxResourceEdit*, Item*, QWidget* = 0 );
+ virtual ~Tab();
+
+ virtual int type() const;
+ virtual void store();
+ virtual void retrieve();
+
+public:
+ virtual void polish();
+
+protected:
+ virtual Item* createItem( const QString&, const int );
+
+private:
+ void adjustLabels();
+
+private:
+ QGroupBox* myMainFrame;
+};
+
+/*
+ Class: QtxListResourceEdit::Group
+ Descr: GUI implementation of resources group.
+*/
+
+class QtxListResourceEdit::Group : public QGroupBox, public Item
+{
+public:
+ Group( const QString&, QtxResourceEdit*, Item*, QWidget* = 0 );
+ virtual ~Group();
+
+ virtual int type() const;
+ virtual void store();
+ virtual void retrieve();
+
+ virtual QVariant property( const QString& ) const;
+ virtual void setProperty( const QString&, const QVariant& );
+
+ virtual void setTitle( const QString& );
+
+protected:
+ virtual Item* createItem( const QString&, const int );
+};
+
+/*
+ Class: QtxListResourceEdit::PrefItem
+ Descr: Base class for preferences items.
+*/
+
+class QtxListResourceEdit::PrefItem : public QHBox, public Item
+{
+public:
+ PrefItem( const int, QtxResourceEdit*, Item* = 0, QWidget* = 0 );
+ virtual ~PrefItem();
+
+ virtual int type() const;
+
+protected:
+ virtual Item* createItem( const QString&, const int );
+
+private:
+ int myType;
+};
+
+/*
+ Class: QtxListResourceEdit::Spacer
+ Descr: GUI implementation of resources spacer.
+*/
+
+class QtxListResourceEdit::Spacer : public PrefItem
+{
+public:
+ Spacer( QtxResourceEdit*, Item*, QWidget* = 0 );
+ virtual ~Spacer();
+
+ virtual void store();
+ virtual void retrieve();
+};
+
+/*
+ Class: QtxListResourceEdit::ListItem
+ Descr: GUI implementation of resources list item.
+*/
+
+class QtxListResourceEdit::ListItem : public PrefItem
+{
+public:
+ ListItem( const QString&, QtxResourceEdit*, Item*, QWidget* = 0 );
+ virtual ~ListItem();
+
+ virtual void store();
+ virtual void retrieve();
+
+ virtual QVariant property( const QString& ) const;
+ virtual void setProperty( const QString&, const QVariant& );
+
+private:
+ void setStrings( const QVariant& );
+ void setIndexes( const QVariant& );
+
+ void setStrings( const QStringList& );
+ void setIndexes( const QValueList<int>& );
+
+private:
+ QComboBox* myList;
+ QMap<int, int> myIndex;
+};
+
+/*
+ Class: QtxListResourceEdit::StateItem
+ Descr: GUI implementation of resources bool item.
+*/
+
+class QtxListResourceEdit::StateItem : public PrefItem
+{
+public:
+ StateItem( const QString&, QtxResourceEdit*, Item*, QWidget* = 0 );
+ virtual ~StateItem();
+
+ virtual void store();
+ virtual void retrieve();
+
+private:
+ QCheckBox* myState;
+};
+
+/*
+ Class: QtxListResourceEdit::StringItem
+ Descr: GUI implementation of resources string item.
+*/
+
+class QtxListResourceEdit::StringItem : public PrefItem
+{
+public:
+ StringItem( const QString&, QtxResourceEdit*, Item*, QWidget* = 0 );
+ virtual ~StringItem();
+
+ virtual void store();
+ virtual void retrieve();
+
+private:
+ QLineEdit* myString;
+};
+
+/*
+ Class: QtxListResourceEdit::IntegerEditItem
+ Descr: GUI implementation of resources integer item.
+*/
+
+class QtxListResourceEdit::IntegerEditItem : public PrefItem
+{
+public:
+ IntegerEditItem( const QString&, QtxResourceEdit*, Item*, QWidget* = 0 );
+ virtual ~IntegerEditItem();
+
+ virtual void store();
+ virtual void retrieve();
+
+private:
+ QLineEdit* myInteger;
+};
+
+/*
+ Class: QtxListResourceEdit::IntegerSpinItem
+ Descr: GUI implementation of resources integer item.
+*/
+
+class QtxListResourceEdit::IntegerSpinItem : public PrefItem
+{
+public:
+ IntegerSpinItem( const QString&, QtxResourceEdit*, Item*, QWidget* = 0 );
+ virtual ~IntegerSpinItem();
+
+ virtual void store();
+ virtual void retrieve();
+
+ virtual QVariant property( const QString& ) const;
+ virtual void setProperty( const QString&, const QVariant& );
+
+private:
+ QtxIntSpinBox* myInteger;
+};
+
+/*
+ Class: QtxListResourceEdit::DoubleEditItem
+ Descr: GUI implementation of resources double item.
+*/
+
+class QtxListResourceEdit::DoubleEditItem : public PrefItem
+{
+public:
+ DoubleEditItem( const QString&, QtxResourceEdit*, Item*, QWidget* = 0 );
+ virtual ~DoubleEditItem();
+
+ virtual void store();
+ virtual void retrieve();
+
+private:
+ QLineEdit* myDouble;
+};
+
+/*
+ Class: QtxListResourceEdit::DoubleSpinItem
+ Descr: GUI implementation of resources double item.
+*/
+
+class QtxListResourceEdit::DoubleSpinItem : public PrefItem
+{
+public:
+ DoubleSpinItem( const QString&, QtxResourceEdit*, Item*, QWidget* = 0 );
+ virtual ~DoubleSpinItem();
+
+ virtual void store();
+ virtual void retrieve();
+
+ virtual QVariant property( const QString& ) const;
+ virtual void setProperty( const QString&, const QVariant& );
+
+private:
+ QtxDblSpinBox* myDouble;
+};
+
+/*
+ Class: QtxListResourceEdit::ColorItem
+ Descr: GUI implementation of resources color item.
+*/
+
+class QtxListResourceEdit::ColorItem : public PrefItem
+{
+public:
+ ColorItem( const QString&, QtxResourceEdit*, Item*, QWidget* = 0 );
+ virtual ~ColorItem();
+
+ virtual void store();
+ virtual void retrieve();
+
+private:
+ QWidget* myColor;
+};
+
+#endif
--- /dev/null
+// File: QtxResourceEdit.cxx
+// Author: Sergey TELKOV
+
+#include "QtxResourceEdit.h"
+
+#include "QtxResourceMgr.h"
+
+/*
+ Class: QtxResourceEdit
+ Descr: Class for managing preferences items
+*/
+
+QtxResourceEdit::QtxResourceEdit( QtxResourceMgr* mgr )
+: myResMgr( mgr )
+{
+}
+
+QtxResourceEdit::~QtxResourceEdit()
+{
+ for ( ItemMap::ConstIterator it = myItems.begin(); it != myItems.end(); ++it )
+ delete it.data();
+}
+
+QtxResourceMgr* QtxResourceEdit::resourceMgr() const
+{
+ return myResMgr;
+}
+
+int QtxResourceEdit::addItem( const QString& label, const int pId, const int type,
+ const QString& section, const QString& param )
+{
+ Item* i = createItem( label, type, pId );
+ if ( !i )
+ return -1;
+
+ myItems.insert( i->id(), i );
+
+ i->setTitle( label );
+ i->setResource( section, param );
+
+ return i->id();
+}
+
+QVariant QtxResourceEdit::property( const int id, const QString& propName ) const
+{
+ QVariant propValue;
+ Item* i = item( id );
+ if ( i )
+ propValue = i->property( propName );
+ return propValue;
+}
+
+void QtxResourceEdit::setProperty( const int id, const QString& propName, const QVariant& propValue )
+{
+ Item* i = item( id );
+ if ( i )
+ i->setProperty( propName, propValue );
+}
+
+void QtxResourceEdit::store()
+{
+ QMap<Item*, QString> before;
+ resourceValues( before );
+
+ for ( ItemMap::ConstIterator it = myItems.begin(); it != myItems.end(); ++it )
+ it.data()->store();
+
+ QMap<Item*, QString> after;
+ resourceValues( after );
+
+ QMap<Item*, QString> changed;
+ differentValues( before, after, changed );
+
+ changedResources( changed );
+}
+
+void QtxResourceEdit::retrieve()
+{
+ for ( ItemMap::ConstIterator it = myItems.begin(); it != myItems.end(); ++it )
+ it.data()->retrieve();
+}
+
+void QtxResourceEdit::toBackup()
+{
+ myBackup.clear();
+ resourceValues( myBackup );
+}
+
+void QtxResourceEdit::fromBackup()
+{
+ setResourceValues( myBackup );
+}
+
+void QtxResourceEdit::update()
+{
+}
+
+QtxResourceEdit::Item* QtxResourceEdit::item( const int id ) const
+{
+ Item* i = 0;
+ if ( myItems.contains( id ) )
+ i = myItems[id];
+ return i;
+}
+
+QtxResourceEdit::Item* QtxResourceEdit::item( const QString& title ) const
+{
+ Item* i = 0;
+ for ( ItemMap::ConstIterator it = myItems.begin(); it != myItems.end() && !i; ++it )
+ {
+ if ( it.data()->title() == title )
+ i = it.data();
+ }
+ return i;
+}
+
+QtxResourceEdit::Item* QtxResourceEdit::item( const QString& title, const int pId ) const
+{
+ Item* i = 0;
+ Item* pItem = item( pId );
+ for ( ItemMap::ConstIterator it = myItems.begin(); it != myItems.end() && !i; ++it )
+ {
+ if ( it.data()->parentItem() == pItem && it.data()->title() == title )
+ i = it.data();
+ }
+ return i;
+}
+
+QtxResourceEdit::Item* QtxResourceEdit::createItem( const QString& label, const int type, const int pId )
+{
+ Item* i = 0;
+ if ( pId < 0 )
+ i = createItem( label, type );
+ else
+ {
+ Item* pItem = item( pId );
+ if ( pItem )
+ i = pItem->createItem( label, type );
+ }
+
+ return i;
+}
+
+void QtxResourceEdit::removeItem( Item* item )
+{
+ if ( !item )
+ return;
+
+ myItems.remove( item->id() );
+}
+
+void QtxResourceEdit::resourceValues( QMap<int, QString>& map ) const
+{
+ for ( ItemMap::ConstIterator it = myItems.begin(); it != myItems.end(); ++it )
+ map.insert( it.key(), it.data()->resourceValue() );
+}
+
+void QtxResourceEdit::resourceValues( QMap<Item*, QString>& map ) const
+{
+ for ( ItemMap::ConstIterator it = myItems.begin(); it != myItems.end(); ++it )
+ map.insert( it.data(), it.data()->resourceValue() );
+}
+
+void QtxResourceEdit::setResourceValues( QMap<int, QString>& map ) const
+{
+ for ( QMap<int, QString>::ConstIterator it = map.begin(); it != map.end(); ++it )
+ {
+ Item* i = item( it.key() );
+ if ( i )
+ i->setResourceValue( it.data() );
+ }
+}
+
+void QtxResourceEdit::setResourceValues( QMap<Item*, QString>& map ) const
+{
+ for ( QMap<Item*, QString>::ConstIterator it = map.begin(); it != map.end(); ++it )
+ it.key()->setResourceValue( it.data() );
+}
+
+
+void QtxResourceEdit::differentValues( const QMap<int, QString>& map1, const QMap<int, QString>& map2,
+ QMap<int, QString>& resMap, const bool fromFirst ) const
+{
+ resMap.clear();
+ const QMap<int, QString>& later = fromFirst ? map1 : map2;
+ const QMap<int, QString>& early = fromFirst ? map2 : map1;
+
+ for ( QMap<int, QString>::ConstIterator it = later.begin(); it != later.end(); ++it )
+ {
+ if ( !early.contains( it.key() ) || early[it.key()] != it.data() )
+ resMap.insert( it.key(), it.data() );
+ }
+}
+
+void QtxResourceEdit::differentValues( const QMap<Item*, QString>& map1, const QMap<Item*, QString>& map2,
+ QMap<Item*, QString>& resMap, const bool fromFirst ) const
+{
+ resMap.clear();
+ const QMap<Item*, QString>& later = fromFirst ? map1 : map2;
+ const QMap<Item*, QString>& early = fromFirst ? map2 : map1;
+
+ for ( QMap<Item*, QString>::ConstIterator it = later.begin(); it != later.end(); ++it )
+ {
+ if ( !early.contains( it.key() ) || early[it.key()] != it.data() )
+ resMap.insert( it.key(), it.data() );
+ }
+}
+
+void QtxResourceEdit::changedResources( const QMap<Item*, QString>& )
+{
+}
+
+/*
+ Class: QtxResourceEdit::Item
+ Descr: Class for incapsulation of one preference item
+*/
+
+QtxResourceEdit::Item::Item( QtxResourceEdit* edit, Item* parent )
+: myEdit( edit ),
+myParent( parent )
+{
+ myId = generateId();
+}
+
+QtxResourceEdit::Item::~Item()
+{
+ if ( resourceEdit() )
+ resourceEdit()->removeItem( this );
+}
+
+int QtxResourceEdit::Item::id() const
+{
+ return myId;
+}
+
+QtxResourceEdit::Item* QtxResourceEdit::Item::parentItem() const
+{
+ return myParent;
+}
+
+void QtxResourceEdit::Item::childItems( QPtrList<Item>& lst ) const
+{
+ for ( ItemListIterator it( myChildren ); it.current(); ++it )
+ lst.append( it.current() );
+}
+
+QString QtxResourceEdit::Item::title() const
+{
+ return myTitle;
+}
+
+void QtxResourceEdit::Item::resource( QString& sec, QString& param ) const
+{
+ sec = myResSection;
+ param = myResParameter;
+}
+
+void QtxResourceEdit::Item::setTitle( const QString& title )
+{
+ myTitle = title;
+}
+
+void QtxResourceEdit::Item::setResource( const QString& sec, const QString& param )
+{
+ myResSection = sec;
+ myResParameter = param;
+}
+
+void QtxResourceEdit::Item::update()
+{
+}
+
+QVariant QtxResourceEdit::Item::property( const QString& ) const
+{
+ return QVariant();
+}
+
+void QtxResourceEdit::Item::setProperty( const QString&, const QVariant& )
+{
+}
+
+QString QtxResourceEdit::Item::resourceValue() const
+{
+ return getString();
+}
+
+void QtxResourceEdit::Item::setResourceValue( const QString& val )
+{
+ setString( val );
+}
+
+QtxResourceMgr* QtxResourceEdit::Item::resourceMgr() const
+{
+ QtxResourceMgr* resMgr = 0;
+ if ( resourceEdit() )
+ resMgr = resourceEdit()->resourceMgr();
+ return resMgr;
+}
+
+QtxResourceEdit* QtxResourceEdit::Item::resourceEdit() const
+{
+ return myEdit;
+}
+
+int QtxResourceEdit::Item::getInteger( const int val ) const
+{
+ QtxResourceMgr* resMgr = resourceMgr();
+ return resMgr ? resMgr->integerValue( myResSection, myResParameter, val ) : val;
+}
+
+double QtxResourceEdit::Item::getDouble( const double val ) const
+{
+ QtxResourceMgr* resMgr = resourceMgr();
+ return resMgr ? resMgr->doubleValue( myResSection, myResParameter, val ) : val;
+}
+
+bool QtxResourceEdit::Item::getBoolean( const bool val ) const
+{
+ QtxResourceMgr* resMgr = resourceMgr();
+ return resMgr ? resMgr->booleanValue( myResSection, myResParameter, val ) : val;
+}
+
+QString QtxResourceEdit::Item::getString( const QString& val ) const
+{
+ QtxResourceMgr* resMgr = resourceMgr();
+ return resMgr ? resMgr->stringValue( myResSection, myResParameter, val ) : val;
+}
+
+QColor QtxResourceEdit::Item::getColor( const QColor& val ) const
+{
+ QtxResourceMgr* resMgr = resourceMgr();
+ return resMgr ? resMgr->colorValue( myResSection, myResParameter, val ) : val;
+}
+
+void QtxResourceEdit::Item::setInteger( const int val )
+{
+ QtxResourceMgr* resMgr = resourceMgr();
+ if ( resMgr )
+ resMgr->setValue( myResSection, myResParameter, val );
+}
+
+void QtxResourceEdit::Item::setDouble( const double val )
+{
+ QtxResourceMgr* resMgr = resourceMgr();
+ if ( resMgr )
+ resMgr->setValue( myResSection, myResParameter, val );
+}
+
+void QtxResourceEdit::Item::setBoolean( const bool val )
+{
+ QtxResourceMgr* resMgr = resourceMgr();
+ if ( resMgr )
+ resMgr->setValue( myResSection, myResParameter, val );
+}
+
+void QtxResourceEdit::Item::setString( const QString& val )
+{
+ QtxResourceMgr* resMgr = resourceMgr();
+ if ( resMgr )
+ resMgr->setValue( myResSection, myResParameter, val );
+}
+
+void QtxResourceEdit::Item::setColor( const QColor& val )
+{
+ QtxResourceMgr* resMgr = resourceMgr();
+ if ( resMgr )
+ resMgr->setValue( myResSection, myResParameter, val );
+}
+
+QtxResourceEdit::Item* QtxResourceEdit::Item::item( const int id ) const
+{
+ return resourceEdit() ? resourceEdit()->item( id ) : 0;
+}
+
+QtxResourceEdit::Item* QtxResourceEdit::Item::item( const QString& title ) const
+{
+ return resourceEdit() ? resourceEdit()->item( title ) : 0;
+}
+
+QtxResourceEdit::Item* QtxResourceEdit::Item::item( const QString& title, const int id ) const
+{
+ return resourceEdit() ? resourceEdit()->item( title, id ) : 0;
+}
+
+int QtxResourceEdit::Item::generateId()
+{
+ static int _id = 0;
+ return _id++;
+}
--- /dev/null
+// File: QtxResourceEdit.h
+// Author: Sergey TELKOV
+
+#ifndef QTXRESOURCEEDIT_H
+#define QTXRESOURCEEDIT_H
+
+#ifdef WIN32
+#pragma warning( disable:4251 )
+#endif
+
+#include "Qtx.h"
+
+class QString;
+class QtxResourceMgr;
+
+#include <qcolor.h>
+#include <qvariant.h>
+
+class QTX_EXPORT QtxResourceEdit
+{
+public:
+ class Item;
+
+ enum { Space, Bool, Color, String, List, RealSpin, IntegerSpin, RealEdit, IntegerEdit };
+
+public:
+ QtxResourceEdit( QtxResourceMgr* );
+ virtual ~QtxResourceEdit();
+
+ QtxResourceMgr* resourceMgr() const;
+
+ int addItem( const QString& label, const int pId = -1, const int = -1,
+ const QString& section = QString::null,
+ const QString& param = QString::null );
+
+ QVariant property( const int, const QString& ) const;
+ void setProperty( const int, const QString&, const QVariant& );
+
+ virtual void store();
+ virtual void retrieve();
+
+ virtual void update();
+
+ virtual void toBackup();
+ virtual void fromBackup();
+
+protected:
+ Item* item( const int ) const;
+ Item* item( const QString& ) const;
+ Item* item( const QString&, const int ) const;
+
+ virtual Item* createItem( const QString&, const int ) = 0;
+
+ void resourceValues( QMap<int, QString>& ) const;
+ void resourceValues( QMap<Item*, QString>& ) const;
+
+ void setResourceValues( QMap<int, QString>& ) const;
+ void setResourceValues( QMap<Item*, QString>& ) const;
+
+ void differentValues( const QMap<int, QString>&, const QMap<int, QString>&,
+ QMap<int, QString>&, const bool fromFirst = false ) const;
+ void differentValues( const QMap<Item*, QString>&, const QMap<Item*, QString>&,
+ QMap<Item*, QString>&, const bool fromFirst = false ) const;
+
+ virtual void changedResources( const QMap<Item*, QString>& );
+
+private:
+ void removeItem( Item* );
+ Item* createItem( const QString&, const int, const int );
+
+private:
+ typedef QMap<int, Item*> ItemMap;
+
+private:
+ ItemMap myItems;
+ QtxResourceMgr* myResMgr;
+ QMap<Item*, QString> myBackup;
+
+ friend class QtxResourceEdit::Item;
+};
+
+/*
+ Class: QtxResourceEditor::Item
+ Descr: Class for incapsulation of one preference item
+*/
+
+class QtxResourceEdit::Item
+{
+public:
+ Item( QtxResourceEdit*, Item* = 0 );
+ virtual ~Item();
+
+ int id() const;
+ virtual int type() const = 0;
+
+ Item* parentItem() const;
+ void childItems( QPtrList<Item>& ) const;
+
+ QString title() const;
+ void resource( QString&, QString& ) const;
+
+ virtual void setTitle( const QString& );
+ virtual void setResource( const QString&, const QString& );
+
+ virtual void update();
+
+ QVariant property( const QString& ) const;
+ virtual void setProperty( const QString&, const QVariant& );
+
+ virtual void store() = 0;
+ virtual void retrieve() = 0;
+
+ virtual Item* createItem( const QString&, const int ) = 0;
+
+ QString resourceValue() const;
+ void setResourceValue( const QString& );
+
+protected:
+ QtxResourceMgr* resourceMgr() const;
+ QtxResourceEdit* resourceEdit() const;
+
+ int getInteger( const int = 0 ) const;
+ double getDouble( const double = 0.0 ) const;
+ bool getBoolean( const bool = false ) const;
+ QColor getColor( const QColor& = QColor() ) const;
+ QString getString( const QString& = QString::null ) const;
+
+ void setInteger( const int );
+ void setDouble( const double );
+ void setBoolean( const bool );
+ void setColor( const QColor& );
+ void setString( const QString& );
+
+ Item* item( const int ) const;
+ Item* item( const QString& ) const;
+ Item* item( const QString&, const int ) const;
+
+protected:
+ typedef QPtrList<Item> ItemList;
+ typedef QPtrListIterator<Item> ItemListIterator;
+
+private:
+ static int generateId();
+
+private:
+ int myId;
+ Item* myParent;
+ ItemList myChildren;
+
+ QString myTitle;
+ QString myResSection;
+ QString myResParameter;
+
+ QtxResourceEdit* myEdit;
+};
+
+#ifdef WIN32
+#pragma warning( default:4251 )
+#endif
+
+#endif