1
0
mirror of https://github.com/qgis/QGIS.git synced 2025-04-27 00:03:38 -04:00
QGIS/src/gui/editorwidgets/qgsrelationreferencewidgetwrapper.cpp
Matthias Kuhn b1a2bef1fc [relation widgets] General update
* Improve speed (lazy loading)
 * Loop detection for circular dependencies (Fix )
 * Some memory leaks fixed
 * More const-correctness
 * Fix the attribute editor context
2014-09-12 09:30:39 +02:00

118 lines
3.6 KiB
C++

/***************************************************************************
qgsrelationreferencewidget.cpp
--------------------------------------
Date : 20.4.2013
Copyright : (C) 2013 Matthias Kuhn
Email : matthias dot kuhn at gmx dot ch
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "qgsrelationreferencewidgetwrapper.h"
#include "qgsproject.h"
#include "qgsrelationmanager.h"
QgsRelationReferenceWidgetWrapper::QgsRelationReferenceWidgetWrapper( QgsVectorLayer* vl, int fieldIdx, QWidget* editor, QgsMapCanvas* canvas, QgsMessageBar* messageBar, QWidget* parent )
: QgsEditorWidgetWrapper( vl, fieldIdx, editor, parent )
, mCanvas( canvas )
, mMessageBar( messageBar )
{
}
QWidget* QgsRelationReferenceWidgetWrapper::createWidget( QWidget* parent )
{
QgsRelationReferenceWidget* w = new QgsRelationReferenceWidget( parent );
w->setSizePolicy( w->sizePolicy().horizontalPolicy(), QSizePolicy::Expanding );
return w;
}
void QgsRelationReferenceWidgetWrapper::initWidget( QWidget* editor )
{
QgsRelationReferenceWidget* w = dynamic_cast<QgsRelationReferenceWidget*>( editor );
if ( !w )
{
w = new QgsRelationReferenceWidget( editor );
}
mWidget = w;
mWidget->setEditorContext( context(), mCanvas, mMessageBar );
bool showForm = config( "ShowForm", true ).toBool();
bool mapIdent = config( "MapIdentification", false ).toBool();
bool readOnlyWidget = config( "ReadOnly", false ).toBool();
mWidget->setEmbedForm( showForm );
mWidget->setReadOnlySelector( readOnlyWidget );
mWidget->setAllowMapIdentification( mapIdent );
QgsRelation relation = QgsProject::instance()->relationManager()->relation( config( "Relation" ).toString() );
// If this widget is already embedded by the same relation, reduce functionality
const QgsAttributeEditorContext* ctx = &context();
do
{
if ( ctx->relation().name() == relation.name() )
{
mWidget->setEmbedForm( false );
mWidget->setReadOnlySelector( false );
mWidget->setAllowMapIdentification( false );
}
ctx = ctx->parentContext();
}
while ( ctx );
mWidget->setRelation( relation, config( "AllowNULL" ).toBool() );
connect( mWidget, SIGNAL( relatedFeatureChanged( QVariant ) ), this, SLOT( relatedFeatureChanged( QVariant ) ) );
}
QVariant QgsRelationReferenceWidgetWrapper::value()
{
if ( !mWidget )
return QVariant( field().type() );
QVariant v = mWidget->foreignKey();
if ( v.isNull() )
{
return QVariant( field().type() );
}
else
{
return v;
}
}
void QgsRelationReferenceWidgetWrapper::setValue( const QVariant& value )
{
if ( !mWidget )
return;
mWidget->setRelatedFeature( value );
}
void QgsRelationReferenceWidgetWrapper::setEnabled( bool enabled )
{
if ( !mWidget )
return;
mWidget->setRelationEditable( enabled );
}
void QgsRelationReferenceWidgetWrapper::relatedFeatureChanged( QVariant value )
{
if ( !value.isValid() || value.isNull() )
{
value = QVariant( field().type() );
}
emit valueChanged( value );
}