17#include "moc_qgseffectstackpropertieswidget.cpp" 
   30#include <QStandardItemModel> 
   31#include <QStandardItem> 
   37static const int EFFECT_ITEM_TYPE = QStandardItem::UserType + 1;
 
   39class EffectItem : 
public QStandardItem
 
   46      mWidget = propertiesWidget;
 
   55    int type()
 const override { 
return EFFECT_ITEM_TYPE; }
 
   62    QVariant data( 
int role )
 const override 
   64      if ( role == Qt::DisplayRole || role == Qt::EditRole )
 
   68      if ( role == Qt::CheckStateRole )
 
   70        return mEffect->enabled() ? Qt::Checked : Qt::Unchecked;
 
   72      return QStandardItem::data( role );
 
   75    void setData( 
const QVariant &value, 
int role )
 override 
   77      if ( role == Qt::CheckStateRole )
 
   79        mEffect->setEnabled( value.toBool() );
 
   80        mWidget->updatePreview();
 
   84        QStandardItem::setData( value, role );
 
  111  this->layout()->setContentsMargins( 0, 0, 0, 0 );
 
  113  mEffectsList->setMaximumHeight( 
static_cast<int>( 
Qgis::UI_SCALE_FACTOR * fontMetrics().height() * 7 ) );
 
  114  mEffectsList->setMinimumHeight( mEffectsList->maximumHeight() );
 
  115  lblPreview->setMaximumWidth( mEffectsList->maximumHeight() );
 
  122  mModel = 
new QStandardItemModel();
 
  124  mEffectsList->setModel( 
mModel );
 
  126  QItemSelectionModel *selModel = mEffectsList->selectionModel();
 
  150  const QModelIndex newIndex = mEffectsList->model()->index( initialRow, 0 );
 
  151  mEffectsList->setCurrentIndex( newIndex );
 
 
  171  EffectItem *parent = 
static_cast<EffectItem *
>( 
mModel->invisibleRootItem() );
 
  174  for ( 
int i = count - 1; i >= 0; i-- )
 
  176    EffectItem *effectItem = 
new EffectItem( 
stack->
effect( i ), 
this );
 
  177    effectItem->setEditable( 
false );
 
  178    parent->appendRow( effectItem );
 
 
  191  const QModelIndex currentIdx = mEffectsList->currentIndex();
 
  192  if ( !currentIdx.isValid() )
 
  195  EffectItem *item = 
static_cast<EffectItem *
>( 
mModel->itemFromIndex( currentIdx ) );
 
  197  QStandardItem *root = 
mModel->invisibleRootItem();
 
  198  const int rowCount = root->rowCount();
 
  199  const int currentRow = item ? item->row() : 0;
 
  201  mUpButton->setEnabled( currentRow > 0 );
 
  202  mDownButton->setEnabled( currentRow < rowCount - 1 );
 
  203  mRemoveButton->setEnabled( rowCount > 1 );
 
 
  209  QImage previewImage( 100, 100, QImage::Format_ARGB32 );
 
  210  previewImage.fill( Qt::transparent );
 
  211  painter.begin( &previewImage );
 
  212  painter.setRenderHint( QPainter::Antialiasing );
 
  218    QPainter previewPicPainter;
 
  219    previewPicPainter.begin( &previewPic );
 
  220    previewPicPainter.setPen( Qt::red );
 
  221    previewPicPainter.setBrush( QColor( 255, 100, 100, 255 ) );
 
  222    previewPicPainter.drawEllipse( QPoint( 50, 50 ), 20, 20 );
 
  223    previewPicPainter.end();
 
  228    context.
painter()->translate( 20, 20 );
 
  233  lblPreview->setPixmap( QPixmap::fromImage( previewImage ) );
 
 
  239  const QModelIndex idx = mEffectsList->currentIndex();
 
  240  if ( !idx.isValid() )
 
  243  EffectItem *item = 
static_cast<EffectItem *
>( 
mModel->itemFromIndex( idx ) );
 
 
  264  const int index = stackedWidget->addWidget( widget );
 
  265  stackedWidget->setCurrentIndex( index );
 
 
  280  EffectItem *newEffectItem = 
new EffectItem( newEffect, 
this );
 
  283  mEffectsList->setCurrentIndex( 
mModel->indexFromItem( newEffectItem ) );
 
 
  291  const int row = item->row();
 
  292  QStandardItem *root = 
mModel->invisibleRootItem();
 
  294  const int layerIdx = root->rowCount() - row - 1;
 
  297  mModel->invisibleRootItem()->removeRow( row );
 
  299  const int newSelection = std::min( row, root->rowCount() - 1 );
 
  300  const QModelIndex newIdx = root->child( newSelection )->index();
 
  301  mEffectsList->setCurrentIndex( newIdx );
 
 
  325  const int row = item->row();
 
  327  QStandardItem *root = 
mModel->invisibleRootItem();
 
  329  const int layerIdx = root->rowCount() - row - 1;
 
  334  QList<QStandardItem *> toMove = root->takeRow( row );
 
  335  root->insertRows( row + offset, toMove );
 
  337  const QModelIndex newIdx = toMove[0]->index();
 
  338  mEffectsList->setCurrentIndex( newIdx );
 
 
  347  item->setEffect( newEffect );
 
  349  QStandardItem *root = 
mModel->invisibleRootItem();
 
  350  const int effectIdx = root->rowCount() - item->row() - 1;
 
 
  364  : 
QgsDialog( parent, f, QDialogButtonBox::Cancel | QDialogButtonBox::Help | QDialogButtonBox::Ok )
 
  367  setWindowTitle( tr( 
"Effect Properties" ) );
 
  370  QDialogButtonBox *
buttonBox = this->findChild<QDialogButtonBox *>( QString(), Qt::FindDirectChildrenOnly );
 
  371  connect( 
buttonBox, &QDialogButtonBox::helpRequested, 
this, &QgsEffectStackPropertiesDialog::showHelp );
 
 
  386void QgsEffectStackPropertiesDialog::showHelp()
 
  388  QgsHelp::openHelp( QStringLiteral( 
"working_with_vector/vector_properties.html#draw-effects" ) );
 
  400  QHBoxLayout *layout = 
new QHBoxLayout();
 
  401  layout->setContentsMargins( 0, 0, 0, 0 );
 
  402  layout->setSpacing( 6 );
 
  405  mEnabledCheckBox = 
new QCheckBox( 
this );
 
  406  mEnabledCheckBox->setText( tr( 
"Draw effects" ) );
 
  407  layout->addWidget( mEnabledCheckBox );
 
  409  mButton = 
new QToolButton( 
this );
 
  411  mButton->setToolTip( tr( 
"Customize effects" ) );
 
  412  layout->addWidget( mButton );
 
  414  setFocusPolicy( Qt::StrongFocus );
 
  415  setFocusProxy( mEnabledCheckBox );
 
  417  connect( mButton, &QAbstractButton::clicked, 
this, &QgsEffectStackCompactWidget::showDialog );
 
  418  connect( mEnabledCheckBox, &QAbstractButton::toggled, 
this, &QgsEffectStackCompactWidget::enableToggled );
 
 
  429    mEnabledCheckBox->setChecked( 
false );
 
  430    mEnabledCheckBox->setEnabled( 
false );
 
  431    mButton->setEnabled( 
false );
 
  445  mEnabledCheckBox->setChecked( mStack->
enabled() );
 
  446  mEnabledCheckBox->setEnabled( 
true );
 
  447  mButton->setEnabled( mStack->
enabled() );
 
 
  457  mPreviewPicture = picture;
 
 
  460void QgsEffectStackCompactWidget::showDialog()
 
  479    dlg.setPreviewPicture( mPreviewPicture );
 
  481    if ( dlg.exec() == QDialog::Accepted )
 
  489void QgsEffectStackCompactWidget::enableToggled( 
bool checked )
 
  497  mButton->setEnabled( checked );
 
  501void QgsEffectStackCompactWidget::updateAcceptWidget( 
QgsPanelWidget *panel )
 
  504  *mStack = *widget->
stack();
 
  509void QgsEffectStackCompactWidget::updateEffectLive()
 
  512  *mStack = *widget->
stack();
 
@ RenderSymbolPreview
The render is for a symbol preview only and map based properties may not be available,...
 
static const double UI_SCALE_FACTOR
UI scaling factor.
 
static QgsPaintEffectRegistry * paintEffectRegistry()
Returns the application's paint effect registry, used for managing paint effects.
 
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
 
static QString iconPath(const QString &iconFile)
Returns path to the desired icon file.
 
A generic dialog with layout and button box.
 
QDialogButtonBox * buttonBox()
Returns the button box.
 
QVBoxLayout * layout()
Returns the central layout. Widgets added to it must have this dialog as parent.
 
A paint effect which draws the source picture with minor or no alterations.
 
A dialog for modifying the properties of a QgsEffectStack, including adding and reordering effects wi...
 
void setPreviewPicture(const QPicture &picture)
Sets the picture to use for effect previews for the dialog.
 
QgsEffectStackPropertiesWidget * mPropertiesWidget
 
QgsEffectStackPropertiesDialog(QgsEffectStack *stack, QWidget *parent=nullptr, Qt::WindowFlags f=Qt::WindowFlags())
QgsEffectStackPropertiesDialog constructor.
 
QgsEffectStack * stack()
Returns effect stack attached to the dialog.
 
A paint effect which consists of a stack of other chained paint effects.
 
int count() const
Returns count of effects contained by the stack.
 
QgsEffectStack * clone() const override
Duplicates an effect by creating a deep copy of the effect.
 
bool insertEffect(int index, QgsPaintEffect *effect)
Inserts an effect at a specified index within the stack.
 
QgsPaintEffect * takeEffect(int index)
Removes an effect from the stack and returns a pointer to it.
 
bool changeEffect(int index, QgsPaintEffect *effect)
Replaces the effect at a specified position within the stack.
 
QgsPaintEffect * effect(int index) const
Returns a pointer to the effect at a specified index within the stack.
 
static void openHelp(const QString &key)
Opens help topic for the given help key using default system web browser.
 
QgsPaintEffectAbstractMetadata * effectMetadata(const QString &name) const
Returns the metadata for a specific effect.
 
Base class for visual effects which can be applied to QPicture drawings.
 
void setEnabled(bool enabled)
Sets whether the effect is enabled.
 
bool enabled() const
Returns whether the effect is enabled.
 
virtual void render(const QPicture &picture, QgsRenderContext &context)
Renders a picture using the effect.
 
Contains information about the context of a rendering operation.
 
QPainter * painter()
Returns the destination QPainter for the render operation.
 
void setFlag(Qgis::RenderContextFlag flag, bool on=true)
Enable or disable a particular flag (other flags are not affected)
 
static QgsRenderContext fromQPainter(QPainter *painter)
Creates a default render context given a pixel based QPainter destination.