96 changes: 65 additions & 31 deletions src/gui/symbology-ng/qgsrendererv2widget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -173,35 +173,56 @@ void QgsRendererV2Widget::showSymbolLevelsDialog( QgsFeatureRendererV2* r )
#include "qgsfield.h"
#include <QMenu>

QgsRendererV2DataDefinedMenus::QgsRendererV2DataDefinedMenus( QMenu* menu, const QgsFieldMap& flds, QString rotationField, QString sizeScaleField )
QgsRendererV2DataDefinedMenus::QgsRendererV2DataDefinedMenus( QMenu* menu, const QgsFieldMap& flds, QString rotationField, QString sizeScaleField, QgsSymbolV2::ScaleMethod scaleMethod )
: QObject( menu ), mFlds( flds )
{
mRotationMenu = new QMenu( tr( "Rotation field" ) );
mSizeScaleMenu = new QMenu( tr( "Size scale field" ) );

mRotationAttributeActionGroup = new QActionGroup( mRotationMenu );
mSizeAttributeActionGroup = new QActionGroup( mSizeScaleMenu );
mSizeMethodActionGroup = new QActionGroup( mSizeScaleMenu );

populateMenu( mRotationMenu, SLOT( rotationFieldSelected() ), rotationField );
populateMenu( mSizeScaleMenu, SLOT( sizeScaleFieldSelected() ), sizeScaleField );
populateMenu( mRotationMenu, SLOT( rotationFieldSelected( QAction* a ) ), rotationField, mRotationAttributeActionGroup );
populateMenu( mSizeScaleMenu, SLOT( sizeScaleFieldSelected( QAction* a ) ), sizeScaleField, mSizeAttributeActionGroup );

mSizeScaleMenu->addSeparator();
QAction* aScaleByArea = mSizeScaleMenu->addAction( tr( "Scale area" ), this, SLOT( sizeScaleFieldSelected() ) );
QAction* aScaleByDiameter = mSizeScaleMenu->addAction( tr( "Scale diameter" ), this, SLOT( sizeScaleFieldSelected() ) );

QAction* aScaleByArea = new QAction( tr( "Scale area" ), mSizeMethodActionGroup ) ;
QAction* aScaleByDiameter = new QAction( tr( "Scale diameter" ), mSizeMethodActionGroup );

aScaleByArea->setCheckable( true );
aScaleByDiameter->setCheckable( true );

QActionGroup *myGroup = new QActionGroup( mSizeScaleMenu );
if ( scaleMethod == QgsSymbolV2::ScaleDiameter )
{
aScaleByDiameter->setChecked( true );
}
else
{
aScaleByArea->setChecked( true );
}

myGroup->addAction( aScaleByArea );
myGroup->addAction( aScaleByDiameter );
mSizeScaleMenu->addActions( mSizeMethodActionGroup->actions() );

menu->addMenu( mRotationMenu );
menu->addMenu( mSizeScaleMenu );
}

void QgsRendererV2DataDefinedMenus::populateMenu( QMenu* menu, const char* slot, QString fieldName )
QgsRendererV2DataDefinedMenus::~QgsRendererV2DataDefinedMenus()
{
delete mSizeMethodActionGroup;
delete mSizeAttributeActionGroup;
delete mRotationAttributeActionGroup;
delete mRotationMenu;
delete mSizeScaleMenu;
}

void QgsRendererV2DataDefinedMenus::populateMenu( QMenu* menu, const char* slot, QString fieldName, QActionGroup *actionGroup )
{
QAction* aNo = menu->addAction( tr( "- no field -" ), this, slot );
QAction* aNo = new QAction( tr( "- no field -" ), actionGroup);
aNo->setCheckable( true );
menu->addAction( aNo );
menu->addSeparator();

bool hasField = false;
Expand All @@ -211,64 +232,77 @@ void QgsRendererV2DataDefinedMenus::populateMenu( QMenu* menu, const char* slot,
const QgsField& fld = it.value();
if ( fld.type() == QVariant::Int || fld.type() == QVariant::Double )
{
QAction* a = menu->addAction( fld.name(), this, slot );
QAction* a = new QAction( fld.name(), actionGroup );
a->setCheckable( true );
if ( fieldName == fld.name() )
{
a->setChecked( true );
hasField = true;
}
menu->addAction( a );
}
}

if ( !hasField )
{
aNo->setChecked( true );
}

connect( mSizeMethodActionGroup, SIGNAL( triggered( QAction* ) ), this, SLOT( scaleMethodSelected( QAction* ) ) );
connect( mRotationAttributeActionGroup, SIGNAL( triggered( QAction* ) ), this, SLOT( rotationFieldSelected( QAction* ) ) );
connect( mSizeAttributeActionGroup, SIGNAL( triggered( QAction* ) ), this, SLOT( sizeScaleFieldSelected( QAction* ) ) );
}

void QgsRendererV2DataDefinedMenus::rotationFieldSelected()
void QgsRendererV2DataDefinedMenus::rotationFieldSelected( QAction* a )
{
QObject* s = sender();
if ( s == NULL )
return;

QAction* a = qobject_cast<QAction*>( s );
if ( a == NULL )
return;

QString fldName = a->text();

updateMenu( mRotationMenu, fldName );

#if 0
updateMenu( mRotationAttributeActionGroup, fldName );
#endif
if ( fldName == tr( "- no field -" ) )
fldName = QString();

emit rotationFieldChanged( fldName );
}

void QgsRendererV2DataDefinedMenus::sizeScaleFieldSelected()
void QgsRendererV2DataDefinedMenus::sizeScaleFieldSelected( QAction* a )
{
QObject* s = sender();
if ( s == NULL )
return;

QAction* a = qobject_cast<QAction*>( s );
if ( a == NULL )
return;

QString fldName = a->text();

updateMenu( mSizeScaleMenu, fldName );

#if 0
updateMenu( mSizeAttributeActionGroup, fldName );
#endif
if ( fldName == tr( "- no field -" ) )
fldName = QString();

emit sizeScaleFieldChanged( fldName );
}

void QgsRendererV2DataDefinedMenus::updateMenu( QMenu* menu, QString fieldName )
void QgsRendererV2DataDefinedMenus::scaleMethodSelected( QAction* a )
{
if ( a == NULL )
return;

if ( a->text() == tr( "Scale area" ) )
{
emit scaleMethodChanged( QgsSymbolV2::ScaleArea );
}
else if ( a->text() == tr( "Scale diameter" ) )
{
emit scaleMethodChanged( QgsSymbolV2::ScaleDiameter );
}
}
#if 0 // MK: is there any reason for this?
void QgsRendererV2DataDefinedMenus::updateMenu( QActionGroup* actionGroup, QString fieldName )
{
foreach ( QAction* a, menu->actions() )
foreach ( QAction* a, actionGroup->actions() )
{
a->setChecked( a->text() == fieldName );
}
}
#endif
21 changes: 14 additions & 7 deletions src/gui/symbology-ng/qgsrendererv2widget.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@

#include <QWidget>
#include <QMenu>
#include "QgsSymbolV2.h"

class QgsVectorLayer;
class QgsStyleV2;
class QgsSymbolV2;
class QgsFeatureRendererV2;
class QgsSymbolV2SelectorDialog;

Expand Down Expand Up @@ -92,24 +92,31 @@ class QgsRendererV2DataDefinedMenus : public QObject

public:

QgsRendererV2DataDefinedMenus( QMenu* menu, const QgsFieldMap& flds, QString rotationField, QString sizeScaleField );

void populateMenu( QMenu* menu, const char* slot, QString fieldName );
void updateMenu( QMenu* menu, QString fieldName );
QgsRendererV2DataDefinedMenus( QMenu* menu, const QgsFieldMap& flds, QString rotationField, QString sizeScaleField, QgsSymbolV2::ScaleMethod scaleMethod );
~QgsRendererV2DataDefinedMenus();

void populateMenu( QMenu* menu, const char* slot, QString fieldName, QActionGroup *actionGroup );
#if 0
void updateMenu( QActionGroup* actionGroup, QString fieldName );
#endif
public slots:

void rotationFieldSelected();
void sizeScaleFieldSelected();
void rotationFieldSelected( QAction *a );
void sizeScaleFieldSelected( QAction *a );
void scaleMethodSelected( QAction *a );

signals:

void rotationFieldChanged( QString fldName );
void sizeScaleFieldChanged( QString fldName );
void scaleMethodChanged( QgsSymbolV2::ScaleMethod scaleMethod );

protected:
QMenu* mRotationMenu;
QMenu* mSizeScaleMenu;
QActionGroup *mSizeMethodActionGroup;
QActionGroup *mRotationAttributeActionGroup;
QActionGroup *mSizeAttributeActionGroup;
const QgsFieldMap& mFlds;
};

Expand Down
8 changes: 7 additions & 1 deletion src/gui/symbology-ng/qgssinglesymbolrendererv2widget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,10 @@ QgsSingleSymbolRendererV2Widget::QgsSingleSymbolRendererV2Widget( QgsVectorLayer
advMenu->addAction( tr( "Symbol levels..." ), this, SLOT( showSymbolLevels() ) );

mDataDefinedMenus = new QgsRendererV2DataDefinedMenus( advMenu, mLayer->pendingFields(),
mRenderer->rotationField(), mRenderer->sizeScaleField() );
mRenderer->rotationField(), mRenderer->sizeScaleField(), mRenderer->scaleMethod() );
connect( mDataDefinedMenus, SIGNAL( rotationFieldChanged( QString ) ), this, SLOT( rotationFieldChanged( QString ) ) );
connect( mDataDefinedMenus, SIGNAL( sizeScaleFieldChanged( QString ) ), this, SLOT( sizeScaleFieldChanged( QString ) ) );
connect( mDataDefinedMenus, SIGNAL( scaleMethodChanged( QgsSymbolV2::ScaleMethod ) ), this, SLOT( scaleMethodChanged( QgsSymbolV2::ScaleMethod ) ) );
}

QgsSingleSymbolRendererV2Widget::~QgsSingleSymbolRendererV2Widget()
Expand Down Expand Up @@ -102,6 +103,11 @@ void QgsSingleSymbolRendererV2Widget::sizeScaleFieldChanged( QString fldName )
mRenderer->setSizeScaleField( fldName );
}

void QgsSingleSymbolRendererV2Widget::scaleMethodChanged( QgsSymbolV2::ScaleMethod scaleMethod )
{
mRenderer->setScaleMethod( scaleMethod );
}

void QgsSingleSymbolRendererV2Widget::showSymbolLevels()
{
showSymbolLevelsDialog( mRenderer );
Expand Down
1 change: 1 addition & 0 deletions src/gui/symbology-ng/qgssinglesymbolrendererv2widget.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ class GUI_EXPORT QgsSingleSymbolRendererV2Widget : public QgsRendererV2Widget

void rotationFieldChanged( QString fldName );
void sizeScaleFieldChanged( QString fldName );
void scaleMethodChanged( QgsSymbolV2::ScaleMethod scaleMethod );

void showSymbolLevels();

Expand Down