Exemplo n.º 1
0
void TestQgsPaintEffectRegistry::fetchEffects()
{
  QgsPaintEffectRegistry* registry = QgsApplication::paintEffectRegistry();
  QStringList effects = registry->effects();

  QVERIFY( effects.contains( "Dummy" ) );

  QgsPaintEffectAbstractMetadata* metadata = registry->effectMetadata( QStringLiteral( "Dummy" ) );
  QCOMPARE( metadata->name(), QString( "Dummy" ) );

  //metadata for bad effect
  metadata = registry->effectMetadata( QStringLiteral( "bad effect" ) );
  QVERIFY( !metadata );
}
void QgsPaintEffectPropertiesWidget::effectTypeChanged()
{
  QgsPaintEffect* effect = mEffect;
  if ( !effect )
    return;

  QString newEffectType = mEffectTypeCombo->currentData().toString();
  if ( effect->type() == newEffectType )
    return;

  // get creation function for new effect from registry
  QgsPaintEffectRegistry* registry = QgsApplication::paintEffectRegistry();
  QgsPaintEffectAbstractMetadata* am = registry->effectMetadata( newEffectType );
  if ( !am ) // check whether the metadata is assigned
    return;

  // change effect to a new (with different type)
  // base new effect on existing effect's properties
  QgsPaintEffect* newEffect = am->createPaintEffect( effect->properties() );
  if ( !newEffect )
    return;

  updateEffectWidget( newEffect );
  emit changeEffect( newEffect );

  mEffect = newEffect;
}
void QgsPaintEffectPropertiesWidget::updateEffectWidget( QgsPaintEffect* effect )
{
  if ( !effect )
  {
    stackedWidget->setCurrentWidget( pageDummy );
    return;
  }

  if ( stackedWidget->currentWidget() != pageDummy )
  {
    // stop updating from the original widget
    disconnect( stackedWidget->currentWidget(), SIGNAL( changed() ), this, SLOT( emitSignalChanged() ) );
    stackedWidget->removeWidget( stackedWidget->currentWidget() );
  }

  QgsPaintEffectRegistry* registry = QgsApplication::paintEffectRegistry();
  QgsPaintEffectAbstractMetadata* am = registry->effectMetadata( effect->type() );
  if ( am )
  {
    QgsPaintEffectWidget* w = am->createWidget();
    if ( w )
    {
      w->setPaintEffect( effect );
      stackedWidget->addWidget( w );
      stackedWidget->setCurrentWidget( w );
      // start receiving updates from widget
      connect( w, SIGNAL( changed() ), this, SLOT( emitSignalChanged() ) );
      return;
    }
  }
  // When anything is not right
  stackedWidget->setCurrentWidget( pageDummy );
}
void QgsPaintEffectPropertiesWidget::populateEffectTypes()
{
  QgsPaintEffectRegistry* registry = QgsApplication::paintEffectRegistry();
  QStringList types = registry->effects();

  Q_FOREACH ( const QString& type, types )
  {
    //don't show stack effect
    if ( type == QLatin1String( "effectStack" ) )
      continue;

    mEffectTypeCombo->addItem( registry->effectMetadata( type )->visibleName(), type );
  }
}
static bool _initWidgetFunction( const QString& name, QgsPaintEffectWidgetFunc f )
{
  QgsPaintEffectRegistry* registry = QgsApplication::paintEffectRegistry();

  QgsPaintEffectAbstractMetadata* abstractMetadata = registry->effectMetadata( name );
  if ( !abstractMetadata )
  {
    QgsDebugMsg( QString( "Failed to find paint effect entry in registry: %1" ).arg( name ) );
    return false;
  }
  QgsPaintEffectMetadata* metadata = dynamic_cast<QgsPaintEffectMetadata*>( abstractMetadata );
  if ( !metadata )
  {
    QgsDebugMsg( QString( "Failed to cast paint effect's metadata: " ) .arg( name ) );
    return false;
  }
  metadata->setWidgetFunction( f );
  return true;
}