13#include <QInputDialog>
16#include <QStandardPaths>
19#include <QProgressDialog>
21#include <klocalizedstring.h>
53 : QDockWidget(i18n(
"Compositions"))
56 QWidget* widget =
new QWidget(
this);
59 compositionView->setModel(
m_model);
60 compositionView->installEventFilter(
this);
66 deleteButton->setToolTip(i18n(
"Delete Composition"));
67 saveButton->setToolTip(i18n(
"New Composition"));
68 exportCompositions->setToolTip(i18n(
"Export Composition"));
69 moveUpButton->setToolTip(i18n(
"Move Composition Up"));
70 moveDownButton->setToolTip(i18n(
"Move Composition Down"));
74 connect( compositionView, SIGNAL(doubleClicked(QModelIndex)),
77 compositionView->setContextMenuPolicy(Qt::CustomContextMenu);
86 QAction* imageAction =
new QAction(
KisIconUtils::loadIcon(
"document-export-16"), i18n(
"Export Images"),
this);
89 QAction* animationAction =
new QAction(
KisIconUtils::loadIcon(
"addblankframe-16"), i18n(
"Export Animations"),
this);
92 exportCompositions->setDefaultAction(imageAction);
94 QMenu* exportMenu =
new QMenu(
this);
95 exportMenu->addAction(imageAction);
96 exportMenu->addAction(animationAction);
98 exportCompositions->setMenu(exportMenu);
100 connect(exportMenu, &QMenu::triggered, [
this](QAction* triggered){
101 exportCompositions->setDefaultAction(triggered);
104 saveNameEdit->setPlaceholderText(i18n(
"Insert Name"));
122 m_canvas->viewManager()->actionManager()->takeAction(action);
127 setEnabled(canvas != 0);
132 KisAction *updateAction =
m_canvas->viewManager()->actionManager()->createAction(
"update_composition");
136 KisAction *renameAction =
m_canvas->viewManager()->actionManager()->createAction(
"rename_composition");
142 m_canvas->viewManager()->actionManager()->addAction(action->objectName(), action);
159 composition->apply();
164 QModelIndex index = compositionView->currentIndex();
167 m_canvas->viewManager()->image()->removeComposition(composition);
170 const int compositionCount = compositionView->model()->rowCount();
171 if (compositionCount > 0) {
172 if (index.row() == compositionCount) {
173 compositionView->setCurrentIndex(index.siblingAtRow(compositionCount-1));
175 compositionView->setCurrentIndex(index);
187 QString name = saveNameEdit->text();
188 if (name.isEmpty()) {
192 name = QString(
"%1").arg(i, 3, 10, QChar(
'0'));
195 if (composition->name() == name) {
201 }
while(found && i < 1000);
204 composition->store();
206 saveNameEdit->clear();
214 QModelIndex index = compositionView->currentIndex();
217 m_canvas->viewManager()->image()->moveCompositionUp(composition);
219 compositionView->setCurrentIndex(
m_model->index(
m_canvas->viewManager()->image()->compositions().indexOf(composition),0));
225 QModelIndex index = compositionView->currentIndex();
228 m_canvas->viewManager()->image()->moveCompositionDown(composition);
230 compositionView->setCurrentIndex(
m_model->index(
m_canvas->viewManager()->image()->compositions().indexOf(composition),0));
247 dialog.setCaption(i18n(
"Select a Directory"));
248 dialog.setDefaultDir(QStandardPaths::writableLocation(QStandardPaths::HomeLocation));
249 path = dialog.filename();
251 if (path.isNull())
return;
253 if (!path.endsWith(
'/')) {
258 QString filename =
m_canvas->viewManager()->document()->localFilePath();
259 if (!filename.isEmpty()) {
260 QFileInfo info(filename);
261 path += info.completeBaseName() +
'_';
265 currentComposition->store();
267 const QString exportWindowTitle = i18n(
"Exporting Compositions...");
269 const int compositionCount = image->
compositions().size();
270 m_progressBar->setCancelButton(0);
274 m_progressBar->setMaximum(compositionCount);
275 m_progressBar->setMinimum(0);
276 m_progressBar->setValue(0);
277 int compositionsExported = 0;
280 if (m_progressBar->wasCanceled()) {
284 if (!composition->isExportEnabled()) {
285 compositionsExported++;
289 if (m_progressBar->isHidden()) {
290 m_progressBar->show();
293 m_progressBar->setLabelText(i18n(
"Exporting composition: %1...", composition->name()));
299 composition->apply();
303 QRect r = image->
bounds();
309 d->setCurrentImage(dst);
318 d->setFileBatchMode(
true);
320 d->exportDocumentSync(path + composition->name() +
".png",
"image/png");
321 compositionsExported++;
322 m_progressBar->setValue(compositionsExported);
326 currentComposition->apply();
344 m_canvas->viewManager()->image()->animationInterface() &&
345 m_canvas->viewManager()->document()) {
350 dialog.setCaption(i18n(
"Select a Directory"));
351 dialog.setDefaultDir(QStandardPaths::writableLocation(QStandardPaths::HomeLocation));
352 path = dialog.filename();
354 if (path.isNull())
return;
356 if (!path.endsWith(
'/')) {
361 QString filename =
m_canvas->viewManager()->document()->localFilePath();
362 if (!filename.isEmpty()) {
363 QFileInfo info(filename);
364 path += info.completeBaseName();
368 currentComposition->store();
373 if(!composition->isExportEnabled())
376 composition->apply();
386 exportOptions.
basename = QString(
"frame");
387 exportOptions.
videoFileName = QString(
"%1/%2/video.%3").arg(path, composition->name(), videoExtension);
388 exportOptions.
directory = QString(
"%1/%2").arg(path, composition->name());
396 currentComposition->apply();
404 if (event->type() == QEvent::KeyPress ) {
405 QKeyEvent *keyEvent =
static_cast<QKeyEvent *
>(event);
406 if (keyEvent->key() == Qt::Key_Up || keyEvent->key() == Qt::Key_Down) {
412 return QObject::eventFilter(obj, event);
418 QModelIndex index = compositionView->currentIndex();
419 if (index.isValid()) {
430 menu.addAction(action);
433 menu.exec(compositionView->mapToGlobal(pos));
438 QModelIndex index = compositionView->currentIndex();
441 composition->store();
442 m_canvas->image()->setModifiedWithoutUndo();
449 QModelIndex index = compositionView->currentIndex();
453 QString name = QInputDialog::getText(
this, i18n(
"Rename Composition"),
454 i18n(
"New Name:"), QLineEdit::Normal,
455 composition->name(), &ok);
456 if (ok && !name.isEmpty()) {
457 composition->setName(name);
458 m_canvas->image()->setModifiedWithoutUndo();
const quint8 OPACITY_OPAQUE_U8
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
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