13#include <QInputDialog>
16#include <QStandardPaths>
19#include <QProgressDialog>
21#include <klocalizedstring.h>
57 : QDockWidget(i18n(
"Compositions"))
60 QWidget* widget =
new QWidget(
this);
63 compositionView->setModel(
m_model);
64 compositionView->installEventFilter(
this);
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"));
78 connect( compositionView, SIGNAL(doubleClicked(QModelIndex)),
81 compositionView->setContextMenuPolicy(Qt::CustomContextMenu);
85 connect( deleteButton, SIGNAL(clicked(
bool)),
this, SLOT(
deleteClicked()));
86 connect( saveButton, SIGNAL(clicked(
bool)),
this, SLOT(
saveClicked()));
90 QAction* imageAction =
new QAction(
KisIconUtils::loadIcon(
"document-export-16"), i18n(
"Export Images"),
this);
93 QAction* animationAction =
new QAction(
KisIconUtils::loadIcon(
"addblankframe-16"), i18n(
"Export Animations"),
this);
96 exportCompositions->setDefaultAction(imageAction);
98 QMenu* exportMenu =
new QMenu(
this);
99 exportMenu->addAction(imageAction);
100 exportMenu->addAction(animationAction);
102 exportCompositions->setMenu(exportMenu);
104 connect(exportMenu, &QMenu::triggered, [
this](QAction* triggered){
105 exportCompositions->setDefaultAction(triggered);
108 saveNameEdit->setPlaceholderText(i18n(
"Insert Name"));
126 m_canvas->viewManager()->actionManager()->takeAction(action);
131 setEnabled(canvas != 0);
136 KisAction *updateAction =
m_canvas->viewManager()->actionManager()->createAction(
"update_composition");
140 KisAction *renameAction =
m_canvas->viewManager()->actionManager()->createAction(
"rename_composition");
146 m_canvas->viewManager()->actionManager()->addAction(action->objectName(), action);
163 composition->apply();
168 QModelIndex index = compositionView->currentIndex();
171 m_canvas->viewManager()->image()->removeComposition(composition);
174 const int compositionCount = compositionView->model()->rowCount();
175 if (compositionCount > 0) {
176 if (index.row() == compositionCount) {
177 compositionView->setCurrentIndex(index.siblingAtRow(compositionCount-1));
179 compositionView->setCurrentIndex(index);
191 QString name = saveNameEdit->text();
192 if (name.isEmpty()) {
196 name = QString(
"%1").arg(i, 3, 10, QChar(
'0'));
199 if (composition->name() == name) {
205 }
while(found && i < 1000);
208 composition->store();
210 saveNameEdit->clear();
218 QModelIndex index = compositionView->currentIndex();
221 m_canvas->viewManager()->image()->moveCompositionUp(composition);
223 compositionView->setCurrentIndex(
m_model->index(
m_canvas->viewManager()->image()->compositions().indexOf(composition),0));
229 QModelIndex index = compositionView->currentIndex();
232 m_canvas->viewManager()->image()->moveCompositionDown(composition);
234 compositionView->setCurrentIndex(
m_model->index(
m_canvas->viewManager()->image()->compositions().indexOf(composition),0));
251 dialog.setCaption(i18n(
"Select a Directory"));
252 dialog.setDefaultDir(QStandardPaths::writableLocation(QStandardPaths::HomeLocation));
253 path = dialog.filename();
255 if (path.isNull())
return;
257 if (!path.endsWith(
'/')) {
262 QString filename =
m_canvas->viewManager()->document()->localFilePath();
263 if (!filename.isEmpty()) {
264 QFileInfo info(filename);
265 path += info.completeBaseName() +
'_';
269 currentComposition->store();
271 const QString exportWindowTitle = i18n(
"Exporting Compositions...");
273 const int compositionCount = image->
compositions().size();
274 m_progressBar->setCancelButton(0);
278 m_progressBar->setMaximum(compositionCount);
279 m_progressBar->setMinimum(0);
280 m_progressBar->setValue(0);
281 int compositionsExported = 0;
284 if (m_progressBar->wasCanceled()) {
288 if (!composition->isExportEnabled()) {
289 compositionsExported++;
293 if (m_progressBar->isHidden()) {
294 m_progressBar->show();
297 m_progressBar->setLabelText(i18n(
"Exporting composition: %1...", composition->name()));
303 composition->apply();
307 QRect r = image->
bounds();
313 d->setCurrentImage(dst);
322 d->setFileBatchMode(
true);
324 d->exportDocumentSync(path + composition->name() +
".png",
"image/png");
325 compositionsExported++;
326 m_progressBar->setValue(compositionsExported);
330 currentComposition->apply();
350 if (!supportedFormats.isEmpty()) {
351 format = supportedFormats.first();
363 m_canvas->viewManager()->image()->animationInterface() &&
364 m_canvas->viewManager()->document()) {
369 dialog.setCaption(i18n(
"Select a Directory"));
370 dialog.setDefaultDir(QStandardPaths::writableLocation(QStandardPaths::HomeLocation));
371 path = dialog.filename();
373 if (path.isNull())
return;
375 if (!path.endsWith(
'/')) {
380 QString filename =
m_canvas->viewManager()->document()->localFilePath();
381 if (!filename.isEmpty()) {
382 QFileInfo info(filename);
383 path += info.completeBaseName();
387 currentComposition->store();
390 const QString videoExtension = format->
extension();
396 if(!composition->isExportEnabled())
399 composition->apply();
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());
419 currentComposition->apply();
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) {
435 return QObject::eventFilter(obj, event);
441 QModelIndex index = compositionView->currentIndex();
442 if (index.isValid()) {
453 menu.addAction(action);
456 menu.exec(compositionView->mapToGlobal(pos));
461 QModelIndex index = compositionView->currentIndex();
464 composition->store();
465 m_canvas->image()->setModifiedWithoutUndo();
472 QModelIndex index = compositionView->currentIndex();
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();
const quint8 OPACITY_OPAQUE_U8
void activated(const QModelIndex &index)
void moveCompositionDown()
void unsetCanvas() override
void exportAnimationClicked()
void activateCurrentIndex()
~CompositionDockerDock() override
void setCanvas(KoCanvasBase *canvas) override
QPointer< KisCanvas2 > m_canvas
void customContextMenuRequested(QPoint pos)
void slotScrollerStateChanged(QScroller::State state)
void exportImageClicked()
bool eventFilter(QObject *obj, QEvent *event) override
CompositionModel * m_model
QVector< KisAction * > m_actions
void setCompositions(QList< KisLayerCompositionSP > compositions)
KisLayerCompositionSP compositionFromIndex(const QModelIndex &index)
void fromProperties(KisPropertiesConfigurationSP config)
bool wantsOnlyUniqueFrameSequence
KisPropertiesConfigurationSP exportConfiguration(const QString &filterId, bool defaultValue=false) const
const KisTimeSpan & documentPlaybackRange() const
documentPlaybackRange
void refreshGraphAsync(KisNodeSP root, const QVector< QRect > &rects, const QRect &cropRect, KisProjectionUpdateFlags flags=KisProjectionUpdateFlag::None) override
KisGroupLayerSP rootLayer() const
const KoColorSpace * colorSpace() const
KisImageAnimationInterface * animationInterface() const
void addComposition(KisLayerCompositionSP composition)
QList< KisLayerCompositionSP > compositions()
QRect bounds() const override
void setModifiedWithoutUndo()
void setResolution(double xres, double yres)
static QStringList suffixesForMimeType(const QString &mimeType)
void bitBlt(qint32 dstX, qint32 dstY, const KisPaintDeviceSP srcDev, qint32 srcX, qint32 srcY, qint32 srcWidth, qint32 srcHeight)
static KisPart * instance()
KisDocument * createDocument() const
KoCanvasObserverBasePrivate *const d
QSharedPointer< T > toQShared(T *ptr)
KRITAUI_EXPORT bool render(KisDocument *doc, KisViewManager *viewManager, KisAnimationRenderingOptions encoderOptions)
QIcon loadIcon(const QString &name)
KisPaintDeviceSP projection() const override
bool addNode(KisNodeSP node, KisNodeSP parent=KisNodeSP(), KisNodeAdditionFlags flags=KisNodeAdditionFlag::None)
KisPaintDeviceSP paintDevice