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.