|
QGIS API Documentation
master-3f58142
|
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 }