QGIS API Documentation  master-3f58142
src/gui/symbology-ng/qgsrendererv2propertiesdialog.cpp
Go to the documentation of this file.
00001 /***************************************************************************
00002     qgsrendererv2propertiesdialog.cpp
00003     ---------------------
00004     begin                : December 2009
00005     copyright            : (C) 2009 by Martin Dobias
00006     email                : wonder dot sk at gmail dot com
00007  ***************************************************************************
00008  *                                                                         *
00009  *   This program is free software; you can redistribute it and/or modify  *
00010  *   it under the terms of the GNU General Public License as published by  *
00011  *   the Free Software Foundation; either version 2 of the License, or     *
00012  *   (at your option) any later version.                                   *
00013  *                                                                         *
00014  ***************************************************************************/
00015 #include "qgsrendererv2propertiesdialog.h"
00016 
00017 #include "qgsrendererv2.h"
00018 #include "qgsrendererv2registry.h"
00019 
00020 #include "qgsrendererv2widget.h"
00021 #include "qgssinglesymbolrendererv2widget.h"
00022 #include "qgscategorizedsymbolrendererv2widget.h"
00023 #include "qgsgraduatedsymbolrendererv2widget.h"
00024 #include "qgsrulebasedrendererv2widget.h"
00025 #include "qgspointdisplacementrendererwidget.h"
00026 
00027 #include "qgsapplication.h"
00028 #include "qgslogger.h"
00029 #include "qgsvectorlayer.h"
00030 
00031 #include <QKeyEvent>
00032 #include <QMessageBox>
00033 
00034 static bool _initRenderer( QString name, QgsRendererV2WidgetFunc f, QString iconName = QString() )
00035 {
00036   QgsRendererV2Registry* reg = QgsRendererV2Registry::instance();
00037   QgsRendererV2AbstractMetadata* am = reg->rendererMetadata( name );
00038   if ( am == NULL )
00039     return false;
00040   QgsRendererV2Metadata* m = dynamic_cast<QgsRendererV2Metadata*>( am );
00041   if ( m == NULL )
00042     return false;
00043 
00044   m->setWidgetFunction( f );
00045 
00046   if ( !iconName.isEmpty() )
00047   {
00048     QString iconPath = QgsApplication::defaultThemePath() + iconName;
00049     QPixmap pix;
00050     if ( pix.load( iconPath, "png" ) )
00051       m->setIcon( pix );
00052   }
00053 
00054   QgsDebugMsg( "Set for " + name );
00055   return true;
00056 }
00057 
00058 static void _initRendererWidgetFunctions()
00059 {
00060   static bool initialized = false;
00061   if ( initialized )
00062     return;
00063 
00064   _initRenderer( "singleSymbol", QgsSingleSymbolRendererV2Widget::create, "rendererSingleSymbol.png" );
00065   _initRenderer( "categorizedSymbol", QgsCategorizedSymbolRendererV2Widget::create, "rendererCategorizedSymbol.png" );
00066   _initRenderer( "graduatedSymbol", QgsGraduatedSymbolRendererV2Widget::create, "rendererGraduatedSymbol.png" );
00067   _initRenderer( "RuleRenderer", QgsRuleBasedRendererV2Widget::create );
00068   _initRenderer( "pointDisplacement", QgsPointDisplacementRendererWidget::create );
00069   initialized = true;
00070 }
00071 
00072 QgsRendererV2PropertiesDialog::QgsRendererV2PropertiesDialog( QgsVectorLayer* layer, QgsStyleV2* style, bool embedded )
00073     : mLayer( layer ), mStyle( style ), mActiveWidget( NULL )
00074 {
00075   setupUi( this );
00076 
00077   // can be embedded in vector layer properties
00078   if ( embedded )
00079   {
00080     buttonBox->hide();
00081     layout()->setContentsMargins( 0, 0, 0, 0 );
00082   }
00083 
00084   connect( buttonBox, SIGNAL( accepted() ), this, SLOT( onOK() ) );
00085 
00086   // initialize registry's widget functions
00087   _initRendererWidgetFunctions();
00088 
00089   // Blend mode
00090   mBlendModeComboBox->setBlendMode( mLayer->blendMode() );
00091 
00092   // Feature blend mode
00093   mFeatureBlendComboBox->setBlendMode( mLayer->featureBlendMode() );
00094 
00095   // Layer transparency
00096   mLayerTransparencySlider->setValue( mLayer->layerTransparency() );
00097   mLayerTransparencySpnBx->setValue( mLayer->layerTransparency() );
00098 
00099   // connect layer transparency slider and spin box
00100   connect( mLayerTransparencySlider, SIGNAL( valueChanged( int ) ), mLayerTransparencySpnBx, SLOT( setValue( int ) ) );
00101   connect( mLayerTransparencySpnBx, SIGNAL( valueChanged( int ) ), mLayerTransparencySlider, SLOT( setValue( int ) ) );
00102 
00103   QPixmap pix;
00104   QgsRendererV2Registry* reg = QgsRendererV2Registry::instance();
00105   QStringList renderers = reg->renderersList();
00106   foreach ( QString name, renderers )
00107   {
00108     QgsRendererV2AbstractMetadata* m = reg->rendererMetadata( name );
00109     cboRenderers->addItem( m->icon(), m->visibleName(), name );
00110   }
00111 
00112   cboRenderers->setCurrentIndex( -1 ); // set no current renderer
00113 
00114   // setup slot rendererChanged()
00115   connect( cboRenderers, SIGNAL( currentIndexChanged( int ) ), this, SLOT( rendererChanged() ) );
00116 
00117   // set current renderer from layer
00118   QString rendererName = mLayer->rendererV2()->type();
00119   for ( int i = 0; i < cboRenderers->count(); i++ )
00120   {
00121     if ( cboRenderers->itemData( i ).toString() == rendererName )
00122     {
00123       cboRenderers->setCurrentIndex( i );
00124       return;
00125     }
00126   }
00127 
00128   // no renderer found... this mustn't happen
00129   Q_ASSERT( false && "there must be a renderer!" );
00130 
00131 }
00132 
00133 
00134 void QgsRendererV2PropertiesDialog::rendererChanged()
00135 {
00136 
00137   if ( cboRenderers->currentIndex() == -1 )
00138   {
00139     QgsDebugMsg( "No current item -- this should never happen!" );
00140     return;
00141   }
00142 
00143   QString rendererName = cboRenderers->itemData( cboRenderers->currentIndex() ).toString();
00144 
00145   // get rid of old active widget (if any)
00146   if ( mActiveWidget )
00147   {
00148     stackedWidget->removeWidget( mActiveWidget );
00149 
00150     delete mActiveWidget;
00151     mActiveWidget = NULL;
00152   }
00153 
00154   QgsRendererV2Widget* w = NULL;
00155   QgsRendererV2AbstractMetadata* m = QgsRendererV2Registry::instance()->rendererMetadata( rendererName );
00156   if ( m != NULL )
00157     w = m->createRendererWidget( mLayer, mStyle, mLayer->rendererV2()->clone() );
00158 
00159   if ( w != NULL )
00160   {
00161     // instantiate the widget and set as active
00162     mActiveWidget = w;
00163     stackedWidget->addWidget( mActiveWidget );
00164     stackedWidget->setCurrentWidget( mActiveWidget );
00165   }
00166   else
00167   {
00168     // set default "no edit widget available" page
00169     stackedWidget->setCurrentWidget( pageNoWidget );
00170   }
00171 
00172 }
00173 
00174 void QgsRendererV2PropertiesDialog::apply()
00175 {
00176   if ( !mActiveWidget || !mLayer )
00177   {
00178     return;
00179   }
00180 
00181   QgsFeatureRendererV2* renderer = mActiveWidget->renderer();
00182   if ( renderer )
00183   {
00184     mLayer->setRendererV2( renderer->clone() );
00185   }
00186 
00187   // set the blend modes for the layer
00188   mLayer->setBlendMode( mBlendModeComboBox->blendMode() );
00189   mLayer->setFeatureBlendMode( mFeatureBlendComboBox->blendMode() );
00190 
00191   // set transparency for the layer
00192   mLayer->setLayerTransparency( mLayerTransparencySlider->value() );
00193 }
00194 
00195 void QgsRendererV2PropertiesDialog::onOK()
00196 {
00197   apply();
00198   accept();
00199 }
00200 
00201 
00202 void QgsRendererV2PropertiesDialog::keyPressEvent( QKeyEvent * e )
00203 {
00204   // Ignore the ESC key to avoid close the dialog without the properties window
00205   if ( !isWindow() && e->key() == Qt::Key_Escape )
00206   {
00207     e->ignore();
00208   }
00209   else
00210   {
00211     QDialog::keyPressEvent( e );
00212   }
00213 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines