Krita Source Code Documentation
Loading...
Searching...
No Matches
CompositionDockerDock Class Reference

#include <compositiondocker_dock.h>

+ Inheritance diagram for CompositionDockerDock:

Public Slots

void slotScrollerStateChanged (QScroller::State state)
 

Public Member Functions

 CompositionDockerDock ()
 
QString observerName () override
 
void setCanvas (KoCanvasBase *canvas) override
 
void unsetCanvas () override
 
void updateModel ()
 
 ~CompositionDockerDock () override
 
- Public Member Functions inherited from KoCanvasObserverBase
 KoCanvasObserverBase ()
 
KoCanvasBaseobservedCanvas () const
 
void setObservedCanvas (KoCanvasBase *canvas)
 
void unsetObservedCanvas ()
 
virtual ~KoCanvasObserverBase ()
 

Protected Member Functions

bool eventFilter (QObject *obj, QEvent *event) override
 

Private Slots

void activateCurrentIndex ()
 
void activated (const QModelIndex &index)
 
void customContextMenuRequested (QPoint pos)
 
void deleteClicked ()
 
void exportAnimationClicked ()
 
void exportImageClicked ()
 
void moveCompositionDown ()
 
void moveCompositionUp ()
 
void renameComposition ()
 
void saveClicked ()
 
void updateComposition ()
 

Private Attributes

QVector< KisAction * > m_actions
 
QPointer< KisCanvas2m_canvas
 
CompositionModelm_model
 

Detailed Description

Definition at line 24 of file compositiondocker_dock.h.

Constructor & Destructor Documentation

◆ CompositionDockerDock()

CompositionDockerDock::CompositionDockerDock ( )

Definition at line 56 of file compositiondocker_dock.cpp.

57 : QDockWidget(i18n("Compositions"))
58 , m_canvas(0)
59{
60 QWidget* widget = new QWidget(this);
61 setupUi(widget);
62 m_model = new CompositionModel(this);
63 compositionView->setModel(m_model);
64 compositionView->installEventFilter(this);
65 deleteButton->setIcon(KisIconUtils::loadIcon("edit-delete"));
66 saveButton->setIcon(KisIconUtils::loadIcon("list-add"));
67 moveUpButton->setIcon(KisIconUtils::loadIcon("arrow-up"));
68 moveDownButton->setIcon(KisIconUtils::loadIcon("arrow-down"));
69
70 deleteButton->setToolTip(i18n("Delete Composition"));
71 saveButton->setToolTip(i18n("New Composition"));
72 exportCompositions->setToolTip(i18n("Export Composition"));
73 moveUpButton->setToolTip(i18n("Move Composition Up"));
74 moveDownButton->setToolTip(i18n("Move Composition Down"));
75
76 setWidget(widget);
77
78 connect( compositionView, SIGNAL(doubleClicked(QModelIndex)),
79 this, SLOT(activated(QModelIndex)) );
80
81 compositionView->setContextMenuPolicy(Qt::CustomContextMenu);
82 connect( compositionView, SIGNAL(customContextMenuRequested(QPoint)),
83 this, SLOT(customContextMenuRequested(QPoint)));
84
85 connect( deleteButton, SIGNAL(clicked(bool)), this, SLOT(deleteClicked()));
86 connect( saveButton, SIGNAL(clicked(bool)), this, SLOT(saveClicked()));
87 connect( moveUpButton, SIGNAL(clicked(bool)), this, SLOT(moveCompositionUp()));
88 connect( moveDownButton, SIGNAL(clicked(bool)), this, SLOT(moveCompositionDown()));
89
90 QAction* imageAction = new QAction(KisIconUtils::loadIcon("document-export-16"), i18n("Export Images"), this);
91 connect(imageAction, SIGNAL(triggered(bool)), this, SLOT(exportImageClicked()));
92
93 QAction* animationAction = new QAction(KisIconUtils::loadIcon("addblankframe-16"), i18n("Export Animations"), this);
94 connect(animationAction, SIGNAL(triggered(bool)), this, SLOT(exportAnimationClicked()));
95
96 exportCompositions->setDefaultAction(imageAction);
97
98 QMenu* exportMenu = new QMenu(this);
99 exportMenu->addAction(imageAction);
100 exportMenu->addAction(animationAction);
101
102 exportCompositions->setMenu(exportMenu);
103
104 connect(exportMenu, &QMenu::triggered, [this](QAction* triggered){
105 exportCompositions->setDefaultAction(triggered);
106 });
107
108 saveNameEdit->setPlaceholderText(i18n("Insert Name"));
109
110 QScroller *scroller = KisKineticScroller::createPreconfiguredScroller(compositionView);
111 if (scroller) {
112 connect(scroller, SIGNAL(stateChanged(QScroller::State)), this, SLOT(slotScrollerStateChanged(QScroller::State)));
113 }
114
115}
void activated(const QModelIndex &index)
QPointer< KisCanvas2 > m_canvas
void customContextMenuRequested(QPoint pos)
void slotScrollerStateChanged(QScroller::State state)
QIcon loadIcon(const QString &name)
KRITAWIDGETUTILS_EXPORT QScroller * createPreconfiguredScroller(QAbstractScrollArea *target)

References activated(), KisKineticScroller::createPreconfiguredScroller(), customContextMenuRequested(), deleteClicked(), exportAnimationClicked(), exportImageClicked(), KisIconUtils::loadIcon(), m_model, moveCompositionDown(), moveCompositionUp(), saveClicked(), and slotScrollerStateChanged().

◆ ~CompositionDockerDock()

CompositionDockerDock::~CompositionDockerDock ( )
override

Definition at line 117 of file compositiondocker_dock.cpp.

118{
119
120}

Member Function Documentation

◆ activateCurrentIndex

void CompositionDockerDock::activateCurrentIndex ( )
privateslot

Definition at line 439 of file compositiondocker_dock.cpp.

440{
441 QModelIndex index = compositionView->currentIndex();
442 if (index.isValid()) {
443 activated(index);
444 }
445}

References activated().

◆ activated

void CompositionDockerDock::activated ( const QModelIndex & index)
privateslot

Definition at line 160 of file compositiondocker_dock.cpp.

161{
163 composition->apply();
164}
KisLayerCompositionSP compositionFromIndex(const QModelIndex &index)

References CompositionModel::compositionFromIndex(), and m_model.

◆ customContextMenuRequested

void CompositionDockerDock::customContextMenuRequested ( QPoint pos)
privateslot

Definition at line 447 of file compositiondocker_dock.cpp.

448{
449 if (m_actions.isEmpty()) return;
450
451 QMenu menu;
452 Q_FOREACH (KisAction *action, m_actions) {
453 menu.addAction(action);
454
455 }
456 menu.exec(compositionView->mapToGlobal(pos));
457}
QVector< KisAction * > m_actions

References m_actions.

◆ deleteClicked

void CompositionDockerDock::deleteClicked ( )
privateslot

Definition at line 166 of file compositiondocker_dock.cpp.

167{
168 QModelIndex index = compositionView->currentIndex();
169 if (m_canvas && m_canvas->viewManager() && m_canvas->viewManager()->image() && index.isValid()) {
171 m_canvas->viewManager()->image()->removeComposition(composition);
172 updateModel();
173
174 const int compositionCount = compositionView->model()->rowCount();
175 if (compositionCount > 0) {
176 if (index.row() == compositionCount) {
177 compositionView->setCurrentIndex(index.siblingAtRow(compositionCount-1));
178 } else {
179 compositionView->setCurrentIndex(index);
180 }
181 }
182 }
183}

References CompositionModel::compositionFromIndex(), m_canvas, m_model, and updateModel().

◆ eventFilter()

bool CompositionDockerDock::eventFilter ( QObject * obj,
QEvent * event )
overrideprotected

Definition at line 425 of file compositiondocker_dock.cpp.

426{
427 if (event->type() == QEvent::KeyPress ) {
428 QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
429 if (keyEvent->key() == Qt::Key_Up || keyEvent->key() == Qt::Key_Down) {
430 // new index will be set after the method is called
431 QTimer::singleShot(0, this, SLOT(activateCurrentIndex()));
432 }
433 return false;
434 } else {
435 return QObject::eventFilter(obj, event);
436 }
437}

References activateCurrentIndex().

◆ exportAnimationClicked

void CompositionDockerDock::exportAnimationClicked ( )
privateslot

Definition at line 338 of file compositiondocker_dock.cpp.

339{
340 KisConfig cfg(true);
341 KisPropertiesConfigurationSP settings = cfg.exportConfiguration("ANIMATION_EXPORT");
342 KisAnimationRenderingOptions exportOptions;
343 exportOptions.fromProperties(settings);
344
345#ifdef Q_OS_ANDROID
346 KisMediaEncoderFormat *format = KisMediaEncoderWrapper::getFormatByKey(exportOptions.videoFormatKey);
347 // If there's no format configured, try to grab the first available one.
348 if (!format) {
350 if (!supportedFormats.isEmpty()) {
351 format = supportedFormats.first();
352 }
353 }
354 // If there's still none, bail out.
355 if (!format) {
356 return;
357 }
358#endif
359
360 if (m_canvas &&
361 m_canvas->viewManager() &&
362 m_canvas->viewManager()->image() &&
363 m_canvas->viewManager()->image()->animationInterface() &&
364 m_canvas->viewManager()->document()) {
365
366 QString path;
367
368 KoFileDialog dialog(0, KoFileDialog::OpenDirectory, "compositiondockerdock");
369 dialog.setCaption(i18n("Select a Directory"));
370 dialog.setDefaultDir(QStandardPaths::writableLocation(QStandardPaths::HomeLocation));
371 path = dialog.filename();
372
373 if (path.isNull()) return;
374
375 if (!path.endsWith('/')) {
376 path.append('/');
377 }
378
379 KisImageSP image = m_canvas->viewManager()->image();
380 QString filename = m_canvas->viewManager()->document()->localFilePath();
381 if (!filename.isEmpty()) {
382 QFileInfo info(filename);
383 path += info.completeBaseName();
384 }
385
386 KisLayerCompositionSP currentComposition = toQShared(new KisLayerComposition(image, "temp"));
387 currentComposition->store();
388
389#ifdef Q_OS_ANDROID
390 const QString videoExtension = format->extension();
391#else
392 const QString videoExtension = KisMimeDatabase::suffixesForMimeType(exportOptions.videoMimeType).first();
393#endif
394
395 Q_FOREACH (KisLayerCompositionSP composition, image->compositions()) {
396 if(!composition->isExportEnabled())
397 continue;
398
399 composition->apply();
400 image->refreshGraphAsync();
401 image->waitForDone();
402
404
405 exportOptions.firstFrame = range.start();
406 exportOptions.lastFrame = range.end();
407 exportOptions.width = image->width();
408 exportOptions.height = image->height();
409 exportOptions.basename = QString("frame");
410 exportOptions.videoFileName = QString("%1/%2/video.%3").arg(path, composition->name(), videoExtension);
411 exportOptions.directory = QString("%1/%2").arg(path, composition->name());
412 exportOptions.wantsOnlyUniqueFrameSequence = true;
413
414 bool success = KisAnimationRender::render(m_canvas->viewManager()->document(), m_canvas->viewManager(), exportOptions);
415
416 if (!success) break;
417 }
418
419 currentComposition->apply();
420 image->refreshGraphAsync();
421 image->waitForDone();
422 }
423}
void fromProperties(KisPropertiesConfigurationSP config)
const KisTimeSpan & documentPlaybackRange() const
documentPlaybackRange
void waitForDone()
void refreshGraphAsync(KisNodeSP root, const QVector< QRect > &rects, const QRect &cropRect, KisProjectionUpdateFlags flags=KisProjectionUpdateFlag::None) override
KisImageAnimationInterface * animationInterface() const
qint32 width() const
qint32 height() const
QList< KisLayerCompositionSP > compositions()
virtual QString extension() const =0
static KisMediaEncoderFormat * getFormatByKey(const QString &key)
static const QVector< KisMediaEncoderFormat * > & getSupportedFormats()
static QStringList suffixesForMimeType(const QString &mimeType)
int start() const
int end() const
QSharedPointer< T > toQShared(T *ptr)
KRITAUI_EXPORT bool render(KisDocument *doc, KisViewManager *viewManager, KisAnimationRenderingOptions encoderOptions)

References KisImage::animationInterface(), KisAnimationRenderingOptions::basename, KisImage::compositions(), KisAnimationRenderingOptions::directory, KisImageAnimationInterface::documentPlaybackRange(), KisTimeSpan::end(), KisConfig::exportConfiguration(), KisMediaEncoderFormat::extension(), KisAnimationRenderingOptions::firstFrame, KisAnimationRenderingOptions::fromProperties(), KisMediaEncoderWrapper::getFormatByKey(), KisMediaEncoderWrapper::getSupportedFormats(), KisImage::height(), KisAnimationRenderingOptions::height, KisAnimationRenderingOptions::lastFrame, m_canvas, KoFileDialog::OpenDirectory, KisImage::refreshGraphAsync(), KisAnimationRender::render(), KisTimeSpan::start(), KisMimeDatabase::suffixesForMimeType(), toQShared(), KisAnimationRenderingOptions::videoFileName, KisAnimationRenderingOptions::videoMimeType, KisImage::waitForDone(), KisAnimationRenderingOptions::wantsOnlyUniqueFrameSequence, KisImage::width(), and KisAnimationRenderingOptions::width.

◆ exportImageClicked

void CompositionDockerDock::exportImageClicked ( )
privateslot

Definition at line 245 of file compositiondocker_dock.cpp.

246{
247 if (m_canvas && m_canvas->viewManager() && m_canvas->viewManager()->image()) {
248 QString path;
249
250 KoFileDialog dialog(0, KoFileDialog::OpenDirectory, "compositiondockerdock");
251 dialog.setCaption(i18n("Select a Directory"));
252 dialog.setDefaultDir(QStandardPaths::writableLocation(QStandardPaths::HomeLocation));
253 path = dialog.filename();
254
255 if (path.isNull()) return;
256
257 if (!path.endsWith('/')) {
258 path.append('/');
259 }
260
261 KisImageSP image = m_canvas->viewManager()->image();
262 QString filename = m_canvas->viewManager()->document()->localFilePath();
263 if (!filename.isEmpty()) {
264 QFileInfo info(filename);
265 path += info.completeBaseName() + '_';
266 }
267
268 KisLayerCompositionSP currentComposition = toQShared(new KisLayerComposition(image, "temp"));
269 currentComposition->store();
270
271 const QString exportWindowTitle = i18n("Exporting Compositions...");
272 QSharedPointer<QProgressDialog> m_progressBar(new QProgressDialog(exportWindowTitle, i18n("Cancel"), 0, 0, this));
273 const int compositionCount = image->compositions().size();
274 m_progressBar->setCancelButton(0); // TODO: This task should be threaded in the future so that canceling is possible,
275 // Additionally, we should also be copying the image and working off that copy to
276 // improve runtime performance and allow for the current krita instance to work
277 // without locking up. **For now, we will simply make this operation uncancelable.**
278 m_progressBar->setMaximum(compositionCount);
279 m_progressBar->setMinimum(0);
280 m_progressBar->setValue(0);
281 int compositionsExported = 0;
282
283 Q_FOREACH (KisLayerCompositionSP composition, image->compositions()) {
284 if (m_progressBar->wasCanceled()) {
285 break;
286 }
287
288 if (!composition->isExportEnabled()) {
289 compositionsExported++;
290 continue;
291 }
292
293 if (m_progressBar->isHidden()) {
294 m_progressBar->show();
295 }
296
297 m_progressBar->setLabelText(i18n("Exporting composition: %1...", composition->name()));
298
299 // TODO: Extension of above, but this algorithm is highly inefficient.
300 // We should simply a) Deep Copy Image, b) Apply Composition, c) RefreshImageGraph,
301 // d) Export Image.
302 // This task can then be threaded to work in parallel.
303 composition->apply();
304 image->refreshGraphAsync();
305 image->waitForDone();
306
307 QRect r = image->bounds();
308
310
311 KisImageSP dst = new KisImage(d->createUndoStore(), r.width(), r.height(), image->colorSpace(), composition->name());
312 dst->setResolution(image->xRes(), image->yRes());
313 d->setCurrentImage(dst);
314 KisPaintLayer* paintLayer = new KisPaintLayer(dst, "projection", OPACITY_OPAQUE_U8);
315 KisPainter gc(paintLayer->paintDevice());
316 gc.bitBlt(QPoint(0, 0), image->rootLayer()->projection(), r);
317 dst->addNode(paintLayer, dst->rootLayer(), KisLayerSP(0));
318
319 dst->refreshGraphAsync();
320 dst->waitForDone();
321
322 d->setFileBatchMode(true);
323
324 d->exportDocumentSync(path + composition->name() + ".png", "image/png");
325 compositionsExported++;
326 m_progressBar->setValue(compositionsExported);
327 d->deleteLater();
328 }
329
330 currentComposition->apply();
331
332 image->refreshGraphAsync();
333 image->waitForDone();
334 }
335
336}
const quint8 OPACITY_OPAQUE_U8
KisGroupLayerSP rootLayer() const
const KoColorSpace * colorSpace() const
double xRes() const
double yRes() const
QRect bounds() const override
void setResolution(double xres, double yres)
static KisPart * instance()
Definition KisPart.cpp:130
KisDocument * createDocument() const
Definition KisPart.cpp:228
KoCanvasObserverBasePrivate *const d
KisPaintDeviceSP projection() const override
Definition kis_layer.cc:826
bool addNode(KisNodeSP node, KisNodeSP parent=KisNodeSP(), KisNodeAdditionFlags flags=KisNodeAdditionFlag::None)
KisPaintDeviceSP paintDevice

References KisNodeFacade::addNode(), KisPainter::bitBlt(), KisImage::bounds(), KisImage::colorSpace(), KisImage::compositions(), KisPart::createDocument(), KoCanvasObserverBase::d, KisPart::instance(), m_canvas, OPACITY_OPAQUE_U8, KoFileDialog::OpenDirectory, KisPaintLayer::paintDevice, KisLayer::projection(), KisImage::refreshGraphAsync(), KisImage::rootLayer(), KisImage::setResolution(), toQShared(), KisImage::waitForDone(), KisImage::xRes(), and KisImage::yRes().

◆ moveCompositionDown

void CompositionDockerDock::moveCompositionDown ( )
privateslot

Definition at line 227 of file compositiondocker_dock.cpp.

228{
229 QModelIndex index = compositionView->currentIndex();
230 if (m_canvas && m_canvas->viewManager() && m_canvas->viewManager()->image() && index.isValid()) {
232 m_canvas->viewManager()->image()->moveCompositionDown(composition);
233 updateModel();
234 compositionView->setCurrentIndex(m_model->index(m_canvas->viewManager()->image()->compositions().indexOf(composition),0));
235 }
236}

References CompositionModel::compositionFromIndex(), m_canvas, m_model, and updateModel().

◆ moveCompositionUp

void CompositionDockerDock::moveCompositionUp ( )
privateslot

Definition at line 216 of file compositiondocker_dock.cpp.

217{
218 QModelIndex index = compositionView->currentIndex();
219 if (m_canvas && m_canvas->viewManager() && m_canvas->viewManager()->image() && index.isValid()) {
221 m_canvas->viewManager()->image()->moveCompositionUp(composition);
222 updateModel();
223 compositionView->setCurrentIndex(m_model->index(m_canvas->viewManager()->image()->compositions().indexOf(composition),0));
224 }
225}

References CompositionModel::compositionFromIndex(), m_canvas, m_model, and updateModel().

◆ observerName()

QString CompositionDockerDock::observerName ( )
inlineoverridevirtual

Reimplemented from KoCanvasObserverBase.

Definition at line 29 of file compositiondocker_dock.h.

29{ return "CompositionDockerDock"; }

◆ renameComposition

void CompositionDockerDock::renameComposition ( )
privateslot

Definition at line 469 of file compositiondocker_dock.cpp.

470{
471 dbgKrita << "rename";
472 QModelIndex index = compositionView->currentIndex();
473 if (m_canvas && m_canvas->viewManager() && m_canvas->viewManager()->image() && index.isValid()) {
475 bool ok;
476 QString name = QInputDialog::getText(this, i18n("Rename Composition"),
477 i18n("New Name:"), QLineEdit::Normal,
478 composition->name(), &ok);
479 if (ok && !name.isEmpty()) {
480 composition->setName(name);
481 m_canvas->image()->setModifiedWithoutUndo();
482 }
483 }
484}
#define dbgKrita
Definition kis_debug.h:48
const char * name(StandardAction id)

References CompositionModel::compositionFromIndex(), dbgKrita, m_canvas, and m_model.

◆ saveClicked

void CompositionDockerDock::saveClicked ( )
privateslot

Definition at line 185 of file compositiondocker_dock.cpp.

186{
187 KisImageWSP image = m_canvas->viewManager()->image();
188 if (!image) return;
189
190 // format as 001, 002 ...
191 QString name = saveNameEdit->text();
192 if (name.isEmpty()) {
193 bool found = false;
194 int i = 1;
195 do {
196 name = QString("%1").arg(i, 3, 10, QChar('0'));
197 found = false;
198 Q_FOREACH (KisLayerCompositionSP composition, m_canvas->viewManager()->image()->compositions()) {
199 if (composition->name() == name) {
200 found = true;
201 break;
202 }
203 }
204 i++;
205 } while(found && i < 1000);
206 }
207 KisLayerCompositionSP composition(new KisLayerComposition(image, name));
208 composition->store();
209 image->addComposition(composition);
210 saveNameEdit->clear();
211 updateModel();
212 compositionView->setCurrentIndex(m_model->index(image->compositions().count()-1, 0));
213 image->setModifiedWithoutUndo();
214}
void addComposition(KisLayerCompositionSP composition)
void setModifiedWithoutUndo()

References KisImage::addComposition(), KisImage::compositions(), m_canvas, m_model, KisImage::setModifiedWithoutUndo(), and updateModel().

◆ setCanvas()

void CompositionDockerDock::setCanvas ( KoCanvasBase * canvas)
overridevirtual

re-implement this method in your canvas observer. It will be called whenever a canvas becomes active. Note that you are responsible for not connecting more than one time to the signals of a canvas or any of the QObjects you can access through the canvas.

Implements KoCanvasObserverBase.

Definition at line 122 of file compositiondocker_dock.cpp.

123{
124 if (m_canvas && m_canvas->viewManager()) {
125 Q_FOREACH (KisAction *action, m_actions) {
126 m_canvas->viewManager()->actionManager()->takeAction(action);
127 }
128 }
129
130 unsetCanvas();
131 setEnabled(canvas != 0);
132
133 m_canvas = dynamic_cast<KisCanvas2*>(canvas);
134 if (m_canvas && m_canvas->viewManager()) {
135 if (m_actions.isEmpty()) {
136 KisAction *updateAction = m_canvas->viewManager()->actionManager()->createAction("update_composition");
137 connect(updateAction, SIGNAL(triggered()), this, SLOT(updateComposition()));
138 m_actions.append(updateAction);
139
140 KisAction *renameAction = m_canvas->viewManager()->actionManager()->createAction("rename_composition");
141 connect(renameAction, SIGNAL(triggered()), this, SLOT(renameComposition()));
142 m_actions.append(renameAction);
143
144 } else {
145 Q_FOREACH (KisAction *action, m_actions) {
146 m_canvas->viewManager()->actionManager()->addAction(action->objectName(), action);
147 }
148 }
149 updateModel();
150 }
151}

References m_actions, m_canvas, renameComposition(), unsetCanvas(), updateComposition(), and updateModel().

◆ slotScrollerStateChanged

void CompositionDockerDock::slotScrollerStateChanged ( QScroller::State state)
inlineslot

Definition at line 38 of file compositiondocker_dock.h.

KRITAWIDGETUTILS_EXPORT void updateCursor(QWidget *source, QScroller::State state)

References KisKineticScroller::updateCursor().

◆ unsetCanvas()

void CompositionDockerDock::unsetCanvas ( )
overridevirtual

Re-implement to notify the observer that its canvas is no longer among the living. The daisies, it is pushing up. This means you don't have to disconnect, it's dead.

The old canvas should be deleted already, so if you stored a pointer to it, don't touch!

Note that currently there is a bug where in certain specific circumstances unsetCanvas can be called when it shouldn't, see for example KWStatisticsDocker for a workaround for this problem.

Implements KoCanvasObserverBase.

Definition at line 153 of file compositiondocker_dock.cpp.

154{
155 setEnabled(false);
156 m_canvas = 0;
158}
void setCompositions(QList< KisLayerCompositionSP > compositions)

References m_canvas, m_model, and CompositionModel::setCompositions().

◆ updateComposition

void CompositionDockerDock::updateComposition ( )
privateslot

Definition at line 459 of file compositiondocker_dock.cpp.

460{
461 QModelIndex index = compositionView->currentIndex();
462 if (m_canvas && m_canvas->viewManager() && m_canvas->viewManager()->image() && index.isValid()) {
464 composition->store();
465 m_canvas->image()->setModifiedWithoutUndo();
466 }
467}

References CompositionModel::compositionFromIndex(), m_canvas, and m_model.

◆ updateModel()

void CompositionDockerDock::updateModel ( )

Definition at line 238 of file compositiondocker_dock.cpp.

239{
240 if (m_model && m_canvas && m_canvas->viewManager() && m_canvas->viewManager()->image()) {
241 m_model->setCompositions(m_canvas->viewManager()->image()->compositions());
242 }
243}

References m_canvas, m_model, and CompositionModel::setCompositions().

Member Data Documentation

◆ m_actions

QVector<KisAction*> CompositionDockerDock::m_actions
private

Definition at line 57 of file compositiondocker_dock.h.

◆ m_canvas

QPointer<KisCanvas2> CompositionDockerDock::m_canvas
private

Definition at line 54 of file compositiondocker_dock.h.

◆ m_model

CompositionModel* CompositionDockerDock::m_model
private

Definition at line 55 of file compositiondocker_dock.h.


The documentation for this class was generated from the following files: