Skip to content

Commit

Permalink
Forgot to add two files in last commit
Browse files Browse the repository at this point in the history
git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@14698 c8812cc2-4d05-0410-92ff-de0c093fc19c
  • Loading branch information
mhugent committed Nov 17, 2010
1 parent 1ae742e commit cffc257
Show file tree
Hide file tree
Showing 2 changed files with 393 additions and 0 deletions.
314 changes: 314 additions & 0 deletions src/app/qgslabelpropertydialog.cpp
@@ -0,0 +1,314 @@
/***************************************************************************
qgslabelpropertydialog.cpp
--------------------------
begin : 2010-11-12
copyright : (C) 2010 by Marco Hugentobler
email : marco dot hugentobler at sourcepole 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 "qgslabelpropertydialog.h"
#include "qgsmaplayerregistry.h"
#include "qgsmaprenderer.h"
#include <QColorDialog>
#include <QFontDialog>

QgsLabelPropertyDialog::QgsLabelPropertyDialog( const QString& layerId, int featureId, QgsMapRenderer* renderer, QWidget * parent, Qt::WindowFlags f ):
QDialog( parent, f ), mMapRenderer( renderer ), mCurrentLabelField( -1 )
{
setupUi( this );
fillHaliComboBox();
fillValiComboBox();
init( layerId, featureId );
}

QgsLabelPropertyDialog::~QgsLabelPropertyDialog()
{
}

void QgsLabelPropertyDialog::init( const QString& layerId, int featureId )
{
if( !mMapRenderer )
{
return;
}

//get feature attributes
QgsVectorLayer* vlayer = dynamic_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( layerId ) );
if( !vlayer )
{
return;
}

QgsFeature f;
if( !vlayer->featureAtId( featureId, f, false, true ) )
{
return;
}
const QgsAttributeMap& attributeValues = f.attributeMap();
QgsAttributeMap::const_iterator attIt = attributeValues.constBegin();

//get layerproperties. Problem: only for pallabeling...
QgsPalLabeling* lbl = dynamic_cast<QgsPalLabeling*>( mMapRenderer->labelingEngine() );
if( !lbl )
{
return;
}

blockElementSignals( true );

//get label field and fill line edit
QString labelFieldName = vlayer->customProperty( "labeling/fieldName" ).toString();
if( !labelFieldName.isEmpty() )
{
mCurrentLabelField = vlayer->fieldNameIndex( labelFieldName );
mLabelTextLineEdit->setText( attributeValues[mCurrentLabelField].toString() );
const QgsFieldMap& layerFields = vlayer->pendingFields();
switch( layerFields[mCurrentLabelField].type() )
{
case QVariant::Double:
mLabelTextLineEdit->setValidator( new QDoubleValidator( this ) );
break;
case QVariant::Int:
case QVariant::UInt:
case QVariant::LongLong:
mLabelTextLineEdit->setValidator( new QIntValidator( this ) );
break;
}
}

//get attributes of the feature and fill data defined values
QgsPalLayerSettings& layerSettings = lbl->layer( layerId );
mLabelFont = layerSettings.textFont;

//set all the gui elements to the default values
mFontSizeSpinBox->setValue( layerSettings.textFont.pointSizeF() );
mBufferColorButton->setColor( layerSettings.textColor );
mLabelDistanceSpinBox->setValue( layerSettings.dist );
mBufferSizeSpinBox->setValue( layerSettings.bufferSize );
mHaliComboBox->setCurrentIndex( mHaliComboBox->findText("Left") );
mValiComboBox->setCurrentIndex( mValiComboBox->findText("Bottom") );

disableGuiElements();

mDataDefinedProperties = layerSettings.dataDefinedProperties;
QMap< QgsPalLayerSettings::DataDefinedProperties, int >::const_iterator propIt = mDataDefinedProperties.constBegin();

for(; propIt != mDataDefinedProperties.constEnd(); ++propIt )
{
switch( propIt.key() )
{
case QgsPalLayerSettings::Size:
mFontSizeSpinBox->setEnabled( true );
mLabelFont.setPointSizeF( attributeValues[propIt.value()].toDouble() );
mFontSizeSpinBox->setValue( attributeValues[propIt.value()].toDouble() );
break;
case QgsPalLayerSettings::BufferSize:
mBufferSizeSpinBox->setEnabled( true );
mBufferSizeSpinBox->setValue( attributeValues[propIt.value()].toDouble() );
break;
case QgsPalLayerSettings::PositionX:
mXCoordSpinBox->setEnabled( true );
mXCoordSpinBox->setValue( attributeValues[propIt.value()].toDouble() );
break;
case QgsPalLayerSettings::PositionY:
mYCoordSpinBox->setEnabled( true );
mYCoordSpinBox->setValue( attributeValues[propIt.value()].toDouble() );
break;
case QgsPalLayerSettings::LabelDistance:
mLabelDistanceSpinBox->setEnabled( true );
mLabelDistanceSpinBox->setValue( attributeValues[propIt.value()].toDouble() );
break;
case QgsPalLayerSettings::Hali:
mHaliComboBox->setEnabled( true );
mHaliComboBox->setCurrentIndex( mHaliComboBox->findText( attributeValues[propIt.value()].toString() ) );
break;
case QgsPalLayerSettings::Vali:
mValiComboBox->setEnabled( true );
mValiComboBox->setCurrentIndex( mValiComboBox->findText( attributeValues[propIt.value()].toString() ) );
break;
case QgsPalLayerSettings::BufferColor:
mBufferColorButton->setEnabled( true );
mBufferColorButton->setColor( QColor( attributeValues[propIt.value()].toString() ) );
break;
case QgsPalLayerSettings::Color:
mFontColorButton->setEnabled( true );
mFontColorButton->setColor( QColor( attributeValues[propIt.value()].toString() ) );
break;
case QgsPalLayerSettings::Rotation:
mRotationSpinBox->setEnabled( true );
mRotationSpinBox->setValue( attributeValues[propIt.value()].toDouble() );
break;

//font related properties
case QgsPalLayerSettings::Bold:
mLabelFont.setBold( attributeValues[propIt.value()].toBool() );
break;
case QgsPalLayerSettings::Italic:
mLabelFont.setItalic( attributeValues[propIt.value()].toBool() );
break;
case QgsPalLayerSettings::Underline:
mLabelFont.setUnderline( attributeValues[propIt.value()].toBool() );
break;
case QgsPalLayerSettings::Strikeout:
mLabelFont.setStrikeOut( attributeValues[propIt.value()].toBool() );
break;
case QgsPalLayerSettings::Family:
mLabelFont.setFamily( attributeValues[propIt.value()].toString() );
break;
}
}
mFontPushButton->setEnabled( labelFontEditingPossible() );
blockElementSignals( false );
}

void QgsLabelPropertyDialog::disableGuiElements()
{
mFontSizeSpinBox->setEnabled( false );
mBufferSizeSpinBox->setEnabled( false );
mFontPushButton->setEnabled( false );
mFontColorButton->setEnabled( false );
mBufferColorButton->setEnabled( false );
mLabelDistanceSpinBox->setEnabled( false );
mXCoordSpinBox->setEnabled( false );
mYCoordSpinBox->setEnabled( false );
mHaliComboBox->setEnabled( false );
mValiComboBox->setEnabled( false );
mRotationSpinBox->setEnabled( false );
}

void QgsLabelPropertyDialog::blockElementSignals( bool block )
{
mFontSizeSpinBox->blockSignals( block );
mBufferSizeSpinBox->blockSignals( block );
mFontPushButton->blockSignals( block );
mBufferColorButton->blockSignals( block );
mLabelDistanceSpinBox->blockSignals( block );
mXCoordSpinBox->blockSignals( block );
mYCoordSpinBox->blockSignals( block );
mHaliComboBox->blockSignals( block );
mValiComboBox->blockSignals( block );
mRotationSpinBox->blockSignals( block );
}

void QgsLabelPropertyDialog::fillHaliComboBox()
{
mHaliComboBox->addItem( "Left" );
mHaliComboBox->addItem( "Center" );
mHaliComboBox->addItem( "Right" );
}

void QgsLabelPropertyDialog::fillValiComboBox()
{
mValiComboBox->addItem( "Bottom" );
mValiComboBox->addItem( "Base" );
mValiComboBox->addItem( "Half" );
mValiComboBox->addItem( "Top" );
}

void QgsLabelPropertyDialog::on_mLabelDistanceSpinBox_valueChanged( double d )
{

}

void QgsLabelPropertyDialog::on_mXCoordSpinBox_valueChanged( double d )
{
insertChangedValue( QgsPalLayerSettings::PositionX, d );
}

void QgsLabelPropertyDialog::on_mYCoordSpinBox_valueChanged( double d )
{
insertChangedValue( QgsPalLayerSettings::PositionY, d );
}

void QgsLabelPropertyDialog::on_mFontSizeSpinBox_valueChanged( double d )
{
insertChangedValue( QgsPalLayerSettings::Size, d );
}

void QgsLabelPropertyDialog::on_mBufferSizeSpinBox_valueChanged( double d )
{
insertChangedValue( QgsPalLayerSettings::PositionX, d );
}

void QgsLabelPropertyDialog::on_mRotationSpinBox_valueChanged( double d )
{
insertChangedValue( QgsPalLayerSettings::Rotation, d );
}

void QgsLabelPropertyDialog::on_mFontPushButton_clicked()
{
bool ok;
mLabelFont = QFontDialog::getFont( &ok, mLabelFont, 0, tr("Label font") );
if( ok )
{
insertChangedValue( QgsPalLayerSettings::Size, mLabelFont.pointSizeF() );
insertChangedValue( QgsPalLayerSettings::Bold, mLabelFont.bold() );
insertChangedValue( QgsPalLayerSettings::Italic, mLabelFont.italic() );
insertChangedValue( QgsPalLayerSettings::Underline, mLabelFont.underline() );
}
}

void QgsLabelPropertyDialog::on_mFontColorButton_clicked()
{
QColor c = QColorDialog::getColor ( mFontColorButton->color(), 0, tr("Font color"), QColorDialog::ShowAlphaChannel );
if( c.isValid() )
{
mFontColorButton->setColor( c );
insertChangedValue( QgsPalLayerSettings::Color, c.name() );
}
}

void QgsLabelPropertyDialog::on_mBufferColorButton_clicked()
{
QColor c = QColorDialog::getColor ( mBufferColorButton->color(), 0, tr("Buffer color"), QColorDialog::ShowAlphaChannel );
if( c.isValid() )
{
mFontColorButton->setColor( c );
insertChangedValue( QgsPalLayerSettings::BufferColor, c.name() );
}
}

void QgsLabelPropertyDialog::on_mHaliComboBox_currentIndexChanged( const QString& text )
{
insertChangedValue( QgsPalLayerSettings::Hali, text );
}

void QgsLabelPropertyDialog::on_mValiComboBox_currentIndexChanged( const QString& text )
{
insertChangedValue( QgsPalLayerSettings::Vali, text );
}

void QgsLabelPropertyDialog::on_mLabelTextLineEdit_textChanged ( const QString& text )
{
if( mCurrentLabelField != -1 )
{
mChangedProperties.insert( mCurrentLabelField, text );
}
}

void QgsLabelPropertyDialog::insertChangedValue( QgsPalLayerSettings::DataDefinedProperties p, QVariant value )
{
QMap< QgsPalLayerSettings::DataDefinedProperties, int >::const_iterator ddIt = mDataDefinedProperties.find( p );
if( ddIt != mDataDefinedProperties.constEnd() )
{
mChangedProperties.insert( ddIt.value(), value );
}
}

bool QgsLabelPropertyDialog::labelFontEditingPossible() const
{
return( mDataDefinedProperties.contains( QgsPalLayerSettings:: Size ) || mDataDefinedProperties.contains( QgsPalLayerSettings::Bold )
|| mDataDefinedProperties.contains( QgsPalLayerSettings::Italic ) || mDataDefinedProperties.contains( QgsPalLayerSettings::Underline )
|| mDataDefinedProperties.contains( QgsPalLayerSettings::Strikeout )
|| mDataDefinedProperties.contains( QgsPalLayerSettings::Family ) );
}

79 changes: 79 additions & 0 deletions src/app/qgslabelpropertydialog.h
@@ -0,0 +1,79 @@
/***************************************************************************
qgslabelpropertydialog.h
------------------------
begin : 2010-11-12
copyright : (C) 2010 by Marco Hugentobler
email : marco dot hugentobler at sourcepole 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. *
* *
***************************************************************************/

#ifndef QGSLABELPROPERTYDIALOG_H
#define QGSLABELPROPERTYDIALOG_H

#include "ui_qgslabelpropertydialogbase.h"
#include "qgsfeature.h"
#include "qgspallabeling.h"
#include <QDialog>

class QgsMapRenderer;

/**A dialog to enter data defined label attributes*/
class QgsLabelPropertyDialog: public QDialog, private Ui::QgsLabelPropertyDialogBase
{
Q_OBJECT
public:
QgsLabelPropertyDialog( const QString& layerId, int featureId, QgsMapRenderer* renderer, QWidget * parent = 0, Qt::WindowFlags f = 0 );
~QgsLabelPropertyDialog();

/**Returns properties changed by the user*/
const QgsAttributeMap& changedProperties() const { return mChangedProperties; }

private slots:
void on_mLabelDistanceSpinBox_valueChanged( double d );
void on_mXCoordSpinBox_valueChanged( double d );
void on_mYCoordSpinBox_valueChanged( double d );
void on_mFontSizeSpinBox_valueChanged( double d );
void on_mBufferSizeSpinBox_valueChanged( double d );
void on_mRotationSpinBox_valueChanged( double d );
void on_mFontPushButton_clicked();
void on_mFontColorButton_clicked();
void on_mBufferColorButton_clicked();
void on_mHaliComboBox_currentIndexChanged( const QString& text );
void on_mValiComboBox_currentIndexChanged( const QString& text );
void on_mLabelTextLineEdit_textChanged ( const QString& text );

private:
/**Sets activation / values to the gui elements depending on the label settings and feature values*/
void init( const QString& layerId, int featureId );
void disableGuiElements();
/**Block / unblock all input element signals*/
void blockElementSignals( bool block );

void fillHaliComboBox();
void fillValiComboBox();

/**Insert changed value into mChangedProperties*/
void insertChangedValue( QgsPalLayerSettings::DataDefinedProperties p, QVariant value );

/**Returns true if any font related setting is contained in mDataDefinedProperties*/
bool labelFontEditingPossible() const;

QgsMapRenderer* mMapRenderer;

QgsAttributeMap mChangedProperties;
QMap< QgsPalLayerSettings::DataDefinedProperties, int > mDataDefinedProperties;
QFont mLabelFont;

/**Label field for the current layer (or -1 if none)*/
int mCurrentLabelField;
};

#endif // QGSLAYERPROPERTYDIALOG_H

0 comments on commit cffc257

Please sign in to comment.