Added first iteration of the file path property manager / editor / factory.
This commit is contained in:
parent
3929b62e48
commit
2e9de8cef3
5 changed files with 422 additions and 3 deletions
|
@ -20,6 +20,7 @@ SET(OVQT_PLUG_GEORGES_EDITOR_HDR georges_editor_plugin.h
|
||||||
browser_ctrl_pvt.h
|
browser_ctrl_pvt.h
|
||||||
dfn_browser_ctrl.h
|
dfn_browser_ctrl.h
|
||||||
georges_dfn_dialog.h
|
georges_dfn_dialog.h
|
||||||
|
filepath_property_manager.h
|
||||||
)
|
)
|
||||||
|
|
||||||
SET(OVQT_PLUG_GEORGES_EDITOR_UIS georges_editor_form.ui
|
SET(OVQT_PLUG_GEORGES_EDITOR_UIS georges_editor_form.ui
|
||||||
|
|
|
@ -4,6 +4,8 @@
|
||||||
#include "3rdparty/qtpropertybrowser/qteditorfactory.h"
|
#include "3rdparty/qtpropertybrowser/qteditorfactory.h"
|
||||||
#include "3rdparty/qtpropertybrowser/qtpropertymanager.h"
|
#include "3rdparty/qtpropertybrowser/qtpropertymanager.h"
|
||||||
|
|
||||||
|
#include "filepath_property_manager.h"
|
||||||
|
|
||||||
#include "nel/georges/form_dfn.h"
|
#include "nel/georges/form_dfn.h"
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
|
@ -60,6 +62,8 @@ QObject( parent )
|
||||||
m_factory = new QtVariantEditorFactory();
|
m_factory = new QtVariantEditorFactory();
|
||||||
m_enumMgr = new QtEnumPropertyManager();
|
m_enumMgr = new QtEnumPropertyManager();
|
||||||
m_enumFactory = new QtEnumEditorFactory();
|
m_enumFactory = new QtEnumEditorFactory();
|
||||||
|
m_fileMgr = new FileManager();
|
||||||
|
m_fileFactory = new FileEditFactory();
|
||||||
}
|
}
|
||||||
|
|
||||||
DFNBrowserCtrl::~DFNBrowserCtrl()
|
DFNBrowserCtrl::~DFNBrowserCtrl()
|
||||||
|
@ -75,6 +79,10 @@ DFNBrowserCtrl::~DFNBrowserCtrl()
|
||||||
m_enumMgr = NULL;
|
m_enumMgr = NULL;
|
||||||
delete m_enumFactory;
|
delete m_enumFactory;
|
||||||
m_enumFactory = NULL;
|
m_enumFactory = NULL;
|
||||||
|
delete m_fileMgr;
|
||||||
|
m_fileMgr = NULL;
|
||||||
|
delete m_fileFactory;
|
||||||
|
m_fileFactory = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DFNBrowserCtrl::onElementSelected( int idx )
|
void DFNBrowserCtrl::onElementSelected( int idx )
|
||||||
|
@ -84,6 +92,7 @@ void DFNBrowserCtrl::onElementSelected( int idx )
|
||||||
m_browser->clear();
|
m_browser->clear();
|
||||||
m_browser->setFactoryForManager( m_manager, m_factory );
|
m_browser->setFactoryForManager( m_manager, m_factory );
|
||||||
m_browser->setFactoryForManager( m_enumMgr, m_enumFactory );
|
m_browser->setFactoryForManager( m_enumMgr, m_enumFactory );
|
||||||
|
m_browser->setFactoryForManager( m_fileMgr, m_fileFactory );
|
||||||
|
|
||||||
QtVariantProperty *p = NULL;
|
QtVariantProperty *p = NULL;
|
||||||
QtProperty *prop = NULL;
|
QtProperty *prop = NULL;
|
||||||
|
@ -111,9 +120,13 @@ void DFNBrowserCtrl::onElementSelected( int idx )
|
||||||
m_browser->addProperty( prop );
|
m_browser->addProperty( prop );
|
||||||
|
|
||||||
|
|
||||||
p = m_manager->addProperty( QVariant::String, "value" );
|
prop = m_fileMgr->addProperty( "value" );
|
||||||
p->setValue( entry.getFilename().c_str() );
|
m_fileMgr->setValue( prop, entry.getFilename().c_str() );
|
||||||
m_browser->addProperty( p );
|
m_browser->addProperty( prop );
|
||||||
|
|
||||||
|
//p = m_manager->addProperty( QVariant::String, "value" );
|
||||||
|
//p->setValue( entry.getFilename().c_str() );
|
||||||
|
//m_browser->addProperty( p );
|
||||||
|
|
||||||
p = m_manager->addProperty( QVariant::String, "default" );
|
p = m_manager->addProperty( QVariant::String, "default" );
|
||||||
p->setValue( entry.getDefault().c_str() );
|
p->setValue( entry.getDefault().c_str() );
|
||||||
|
|
|
@ -16,6 +16,8 @@ class QtProperty;
|
||||||
|
|
||||||
class QtEnumPropertyManager;
|
class QtEnumPropertyManager;
|
||||||
class QtEnumEditorFactory;
|
class QtEnumEditorFactory;
|
||||||
|
class FileManager;
|
||||||
|
class FileEditFactory;
|
||||||
|
|
||||||
class DFNBrowserCtrl : public QObject
|
class DFNBrowserCtrl : public QObject
|
||||||
{
|
{
|
||||||
|
@ -38,6 +40,9 @@ private:
|
||||||
|
|
||||||
QtEnumPropertyManager *m_enumMgr;
|
QtEnumPropertyManager *m_enumMgr;
|
||||||
QtEnumEditorFactory *m_enumFactory;
|
QtEnumEditorFactory *m_enumFactory;
|
||||||
|
|
||||||
|
FileManager *m_fileMgr;
|
||||||
|
FileEditFactory *m_fileFactory;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -0,0 +1,302 @@
|
||||||
|
#include "filepath_property_manager.h"
|
||||||
|
|
||||||
|
#include <QLineEdit>
|
||||||
|
#include <QToolButton>
|
||||||
|
#include <QHBoxLayout>
|
||||||
|
#include <QFileDialog>
|
||||||
|
#include <QMap>
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////// Manager ////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
class FileManagerPvt
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QMap< const QtProperty*, QString > values;
|
||||||
|
};
|
||||||
|
|
||||||
|
FileManager::FileManager( QObject *parent ) :
|
||||||
|
QtAbstractPropertyManager( parent )
|
||||||
|
{
|
||||||
|
m_pvt = new FileManagerPvt();
|
||||||
|
}
|
||||||
|
|
||||||
|
FileManager::~FileManager()
|
||||||
|
{
|
||||||
|
delete m_pvt;
|
||||||
|
m_pvt = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString FileManager::value( const QtProperty *p ) const
|
||||||
|
{
|
||||||
|
QMap< const QtProperty*, QString >::const_iterator itr = m_pvt->values.find( p );
|
||||||
|
if( itr == m_pvt->values.end() )
|
||||||
|
return "";
|
||||||
|
else
|
||||||
|
return itr.value();
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileManager::setValue( QtProperty *p, const QString &v )
|
||||||
|
{
|
||||||
|
if( !m_pvt->values.contains( p ) )
|
||||||
|
return;
|
||||||
|
|
||||||
|
if( m_pvt->values[ p ] == v )
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_pvt->values[ p ] = v;
|
||||||
|
|
||||||
|
Q_EMIT propertyChanged( p );
|
||||||
|
Q_EMIT valueChanged( p, v );
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FileManager::hasValue( const QtProperty *p ) const
|
||||||
|
{
|
||||||
|
if( m_pvt->values.contains( p ) )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString FileManager::valueText( const QtProperty *p ) const
|
||||||
|
{
|
||||||
|
return value( p );
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileManager::initializeProperty( QtProperty *p )
|
||||||
|
{
|
||||||
|
if( m_pvt->values.contains( p ) )
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_pvt->values[ p ] = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileManager::uninitializeProperty( QtProperty *p )
|
||||||
|
{
|
||||||
|
m_pvt->values.remove( p );
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////// Factory ///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
class FileEditFactoryPvt
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QMap< QtProperty*, QList< FileEdit* > > createdEditors;
|
||||||
|
QMap< FileEdit*, QtProperty* > editorToProperty;
|
||||||
|
|
||||||
|
void addEditor( QtProperty *p, FileEdit *editor )
|
||||||
|
{
|
||||||
|
editorToProperty[ editor ] = p;
|
||||||
|
|
||||||
|
QMap< QtProperty*, QList< FileEdit* > >::iterator itr = createdEditors.find( p );
|
||||||
|
if( itr == createdEditors.end() )
|
||||||
|
{
|
||||||
|
QList< FileEdit* > l;
|
||||||
|
l.push_back( editor );
|
||||||
|
createdEditors[ p ] = l;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
QList< FileEdit* > &l = itr.value();
|
||||||
|
l.push_back( editor );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void removeEditor( QObject *o )
|
||||||
|
{
|
||||||
|
// Find in editorToProperty
|
||||||
|
QMap< FileEdit*, QtProperty* >::iterator itr = editorToProperty.begin();
|
||||||
|
while( itr != editorToProperty.end() )
|
||||||
|
{
|
||||||
|
if( itr.key() == o )
|
||||||
|
break;
|
||||||
|
++itr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store the property, and remove the editor from editorToProperty
|
||||||
|
QtProperty *p = NULL;
|
||||||
|
if( itr != editorToProperty.end() )
|
||||||
|
{
|
||||||
|
p = itr.value();
|
||||||
|
editorToProperty.erase( itr );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find the property in createdEditors
|
||||||
|
QMap< QtProperty*, QList< FileEdit* > >::iterator mitr = createdEditors.find( p );
|
||||||
|
QList< FileEdit* > &l = mitr.value();
|
||||||
|
|
||||||
|
// Find the editor in the list
|
||||||
|
QList< FileEdit* >::iterator litr = l.begin();
|
||||||
|
while( litr != l.end() )
|
||||||
|
{
|
||||||
|
if( o == *litr )
|
||||||
|
break;
|
||||||
|
litr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove the editor and remove the list too if it's empty
|
||||||
|
if( litr != l.end() )
|
||||||
|
l.erase( litr );
|
||||||
|
|
||||||
|
if( l.isEmpty() )
|
||||||
|
createdEditors.erase( mitr );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
FileEditFactory::FileEditFactory( QObject *parent ) :
|
||||||
|
QtAbstractEditorFactory( parent )
|
||||||
|
{
|
||||||
|
m_pvt = new FileEditFactoryPvt();
|
||||||
|
}
|
||||||
|
|
||||||
|
FileEditFactory::~FileEditFactory()
|
||||||
|
{
|
||||||
|
delete m_pvt;
|
||||||
|
m_pvt = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileEditFactory::connectPropertyManager( FileManager *manager )
|
||||||
|
{
|
||||||
|
connect( manager, SIGNAL( valueChanged( QtProperty*, const QString& ) ),
|
||||||
|
this, SLOT( onPropertyChanged( QtProperty*, const QString& ) ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileEditFactory::disconnectPropertyManager( FileManager *manager )
|
||||||
|
{
|
||||||
|
disconnect( manager, SIGNAL( valueChanged( QtProperty*, const QString& ) ),
|
||||||
|
this, SLOT( onPropertyChanged( QtProperty*, const QString& ) ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
QWidget* FileEditFactory::createEditor( FileManager *manager, QtProperty *p, QWidget *parent )
|
||||||
|
{
|
||||||
|
FileEdit *editor = new FileEdit( parent );
|
||||||
|
editor->setValue( p->valueText() );
|
||||||
|
|
||||||
|
connect( editor, SIGNAL( valueChanged( const QString& ) ), this, SLOT( onSetValue( const QString& ) ) );
|
||||||
|
connect( editor, SIGNAL( destroyed( QObject* ) ), this, SLOT( onEditorDestroyed( QObject* ) ) );
|
||||||
|
|
||||||
|
m_pvt->addEditor( p, editor );
|
||||||
|
|
||||||
|
return editor;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileEditFactory::onPropertyChanged( QtProperty *p, const QString &v )
|
||||||
|
{
|
||||||
|
QMap< QtProperty*, QList< FileEdit* > >::iterator itr = m_pvt->createdEditors.find( p );
|
||||||
|
if( itr == m_pvt->createdEditors.end() )
|
||||||
|
return;
|
||||||
|
|
||||||
|
QList< FileEdit* > &l = itr.value();
|
||||||
|
QList< FileEdit* >::iterator litr = l.begin();
|
||||||
|
while( litr != l.end() )
|
||||||
|
{
|
||||||
|
FileEdit *editor = *litr;
|
||||||
|
editor->blockSignals( true );
|
||||||
|
editor->setValue( v );
|
||||||
|
editor->blockSignals( false );
|
||||||
|
|
||||||
|
++litr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileEditFactory::onSetValue( const QString& v )
|
||||||
|
{
|
||||||
|
QObject *s = sender();
|
||||||
|
FileEdit *editor = qobject_cast< FileEdit* >( s );
|
||||||
|
if( editor == NULL )
|
||||||
|
return;
|
||||||
|
|
||||||
|
QMap< FileEdit*, QtProperty* >::iterator itr = m_pvt->editorToProperty.find( editor );
|
||||||
|
if( itr == m_pvt->editorToProperty.end() )
|
||||||
|
return;
|
||||||
|
|
||||||
|
QtProperty *p = *itr;
|
||||||
|
FileManager *manager = qobject_cast< FileManager* >( p->propertyManager() );
|
||||||
|
if( manager == NULL )
|
||||||
|
return;
|
||||||
|
|
||||||
|
blockSignals( true );
|
||||||
|
manager->setValue( p, v );
|
||||||
|
blockSignals( false );
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileEditFactory::onEditorDestroyed( QObject *editor )
|
||||||
|
{
|
||||||
|
m_pvt->removeEditor( editor );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////// Editor /////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
class FileEditPvt
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QLineEdit *lineEdit;
|
||||||
|
QToolButton *toolButton;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
FileEdit::FileEdit( QWidget *parent ) :
|
||||||
|
QWidget( parent )
|
||||||
|
{
|
||||||
|
m_pvt = new FileEditPvt();
|
||||||
|
|
||||||
|
setupUI();
|
||||||
|
setupConnections();
|
||||||
|
}
|
||||||
|
|
||||||
|
FileEdit::~FileEdit()
|
||||||
|
{
|
||||||
|
delete m_pvt;
|
||||||
|
m_pvt = NULL;
|
||||||
|
|
||||||
|
Q_EMIT destroyed( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileEdit::setValue( const QString &value )
|
||||||
|
{
|
||||||
|
m_pvt->lineEdit->setText( value );
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileEdit::onButtonClicked()
|
||||||
|
{
|
||||||
|
QString file = QFileDialog::getOpenFileName( this,
|
||||||
|
tr( "" ),
|
||||||
|
tr( "" ) );
|
||||||
|
if( file.isEmpty() )
|
||||||
|
return;
|
||||||
|
|
||||||
|
if( m_pvt->lineEdit->text() == file )
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_pvt->lineEdit->setText( file );
|
||||||
|
|
||||||
|
Q_EMIT valueChanged( file );
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileEdit::setupUI()
|
||||||
|
{
|
||||||
|
m_pvt->lineEdit = new QLineEdit( this );
|
||||||
|
m_pvt->toolButton = new QToolButton( this );
|
||||||
|
m_pvt->toolButton->setText( "..." );
|
||||||
|
|
||||||
|
QHBoxLayout *layout = new QHBoxLayout( this );
|
||||||
|
layout->setContentsMargins( 0, 0, 0, 0 );
|
||||||
|
layout->setSpacing( 0 );
|
||||||
|
layout->addWidget( m_pvt->lineEdit );
|
||||||
|
layout->addWidget( m_pvt->toolButton );
|
||||||
|
setLayout( layout );
|
||||||
|
|
||||||
|
setFocusProxy( m_pvt->lineEdit );
|
||||||
|
setSizePolicy( QSizePolicy::Ignored, QSizePolicy::Fixed );
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileEdit::setupConnections()
|
||||||
|
{
|
||||||
|
connect( m_pvt->toolButton, SIGNAL( clicked( bool ) ), this, SLOT( onButtonClicked() ) );
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,98 @@
|
||||||
|
#ifndef FILEPATH_PROPERTY_MANAGER
|
||||||
|
#define FILEPATH_PROPERTY_MANAGER
|
||||||
|
|
||||||
|
#define QT_QTPROPERTYBROWSER_IMPORT
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
#include <3rdparty/qtpropertybrowser/qtpropertymanager.h>
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////// Manager /////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
class FileManagerPvt;
|
||||||
|
|
||||||
|
class FileManager : public QtAbstractPropertyManager
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
FileManager( QObject *parent = NULL );
|
||||||
|
~FileManager();
|
||||||
|
|
||||||
|
QString value( const QtProperty *p ) const;
|
||||||
|
|
||||||
|
public Q_SLOTS:
|
||||||
|
void setValue( QtProperty *p, const QString &v );
|
||||||
|
|
||||||
|
Q_SIGNALS:
|
||||||
|
void valueChanged( QtProperty *p, const QString &v );
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool hasValue( const QtProperty *p ) const;
|
||||||
|
QString valueText( const QtProperty *p ) const;
|
||||||
|
void initializeProperty( QtProperty *p );
|
||||||
|
void uninitializeProperty( QtProperty *p );
|
||||||
|
|
||||||
|
private:
|
||||||
|
FileManagerPvt *m_pvt;
|
||||||
|
|
||||||
|
Q_DISABLE_COPY( FileManager );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////// Factory ///////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
class FileEditFactoryPvt;
|
||||||
|
|
||||||
|
class FileEditFactory : public QtAbstractEditorFactory< FileManager >
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
FileEditFactory( QObject *parent = NULL );
|
||||||
|
~FileEditFactory();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void connectPropertyManager( FileManager *manager );
|
||||||
|
void disconnectPropertyManager( FileManager *manager );
|
||||||
|
QWidget* createEditor( FileManager *manager, QtProperty *p, QWidget *parent );
|
||||||
|
|
||||||
|
private Q_SLOTS:
|
||||||
|
void onPropertyChanged( QtProperty *p, const QString &value );
|
||||||
|
void onSetValue( const QString &value );
|
||||||
|
void onEditorDestroyed( QObject *editor );
|
||||||
|
|
||||||
|
private:
|
||||||
|
FileEditFactoryPvt *m_pvt;
|
||||||
|
|
||||||
|
Q_DISABLE_COPY( FileEditFactory );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////// Editor ////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
class FileEditPvt;
|
||||||
|
|
||||||
|
class FileEdit : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
FileEdit( QWidget *parent = NULL );
|
||||||
|
~FileEdit();
|
||||||
|
|
||||||
|
void setValue( const QString &value );
|
||||||
|
|
||||||
|
Q_SIGNALS:
|
||||||
|
void valueChanged( const QString &value );
|
||||||
|
void destroyed( QObject *editor );
|
||||||
|
|
||||||
|
private Q_SLOTS:
|
||||||
|
void onButtonClicked();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void setupUI();
|
||||||
|
void setupConnections();
|
||||||
|
FileEditPvt *m_pvt;
|
||||||
|
|
||||||
|
Q_DISABLE_COPY( FileEdit );
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in a new issue