diff --git a/data/pref.xml b/data/pref.xml
index 7c7d223a4..87f4d9133 100644
--- a/data/pref.xml
+++ b/data/pref.xml
@@ -546,6 +546,7 @@
+
diff --git a/data/strings/en.ini b/data/strings/en.ini
index c72d2dc29..a157d51af 100644
--- a/data/strings/en.ini
+++ b/data/strings/en.ini
@@ -657,6 +657,7 @@ area = Area:
layers = Layers:
frames = Frames:
anidir = Animation Direction:
+play_subtags = Play Subtags && Repetitions
pixel_ratio = Apply pixel ratio
for_twitter = Export for Twitter
for_twitter_tooltip = Adjust the duration of the last frame to 1/4 so\nTwitter reproduces the animation correctly
diff --git a/data/widgets/export_file.xml b/data/widgets/export_file.xml
index 0bc962403..fa93b2d1e 100644
--- a/data/widgets/export_file.xml
+++ b/data/widgets/export_file.xml
@@ -37,6 +37,8 @@
+
+
diff --git a/src/app/commands/cmd_save_file.cpp b/src/app/commands/cmd_save_file.cpp
index 1ecab4706..e5fa1cd94 100644
--- a/src/app/commands/cmd_save_file.cpp
+++ b/src/app/commands/cmd_save_file.cpp
@@ -385,6 +385,7 @@ void SaveFileCopyAsCommand::onExecute(Context* context)
double scale = params().scale();
gfx::Rect bounds = params().bounds();
doc::AniDir aniDirValue = params().aniDir();
+ bool isPlaySubtags = params().playSubtags();
bool isForTwitter = false;
#if ENABLE_UI
@@ -462,6 +463,7 @@ void SaveFileCopyAsCommand::onExecute(Context* context)
applyPixelRatio = win.applyPixelRatio();
aniDirValue = win.aniDirValue();
isForTwitter = win.isForTwitter();
+ isPlaySubtags = win.isPlaySubtags();
}
#endif
@@ -534,6 +536,7 @@ void SaveFileCopyAsCommand::onExecute(Context* context)
params().aniDir(aniDirValue);
if (!bounds.isEmpty())
params().bounds(bounds);
+ params().playSubtags(isPlaySubtags);
// TODO This should be set as options for the specific encoder
GifEncoderDurationFix fixGif(isForTwitter);
diff --git a/src/app/commands/cmd_save_file.h b/src/app/commands/cmd_save_file.h
index c2b19510b..1c9b6efe0 100644
--- a/src/app/commands/cmd_save_file.h
+++ b/src/app/commands/cmd_save_file.h
@@ -33,6 +33,7 @@ namespace app {
Param ignoreEmpty { this, false, "ignoreEmpty" };
Param scale { this, 1.0, "scale" };
Param bounds { this, gfx::Rect(), "bounds" };
+ Param playSubtags { this, false, "playSubtags" };
};
class SaveFileBaseCommand : public CommandWithNewParams {
diff --git a/src/app/ui/export_file_window.cpp b/src/app/ui/export_file_window.cpp
index b64840126..2fba8baae 100644
--- a/src/app/ui/export_file_window.cpp
+++ b/src/app/ui/export_file_window.cpp
@@ -59,12 +59,13 @@ ExportFileWindow::ExportFileWindow(const Doc* doc)
pixelRatio()->setSelected(m_docPref.saveCopy.applyPixelRatio());
forTwitter()->setSelected(m_docPref.saveCopy.forTwitter());
adjustResize()->setVisible(false);
-
+ playSubtags()->setSelected(m_docPref.saveCopy.playSubtags());
// Here we don't call updateAniDir() because it's already filled and
// set by the function fill_anidir_combobox(). So if the user
// exported a tag with a specific AniDir, we want to keep the option
// in the preference (instead of the tag's AniDir).
//updateAniDir();
+ updatePlaySubtags();
updateAdjustResizeButton();
@@ -82,7 +83,10 @@ ExportFileWindow::ExportFileWindow(const Doc* doc)
});
resize()->Change.connect([this]{ updateAdjustResizeButton(); });
- frames()->Change.connect([this]{ updateAniDir(); });
+ frames()->Change.connect([this]{
+ updateAniDir();
+ updatePlaySubtags();
+ });
forTwitter()->Click.connect([this]{ updateAdjustResizeButton(); });
adjustResize()->Click.connect([this]{ onAdjustResize(); });
ok()->Click.connect([this]{ onOK(); });
@@ -105,6 +109,7 @@ void ExportFileWindow::savePref()
m_docPref.saveCopy.frameTag(framesValue());
m_docPref.saveCopy.applyPixelRatio(applyPixelRatio());
m_docPref.saveCopy.forTwitter(isForTwitter());
+ m_docPref.saveCopy.playSubtags(isPlaySubtags());
}
std::string ExportFileWindow::outputFilenameValue() const
@@ -145,6 +150,11 @@ doc::AniDir ExportFileWindow::aniDirValue() const
return (doc::AniDir)anidir()->getSelectedItemIndex();
}
+bool ExportFileWindow::isPlaySubtags() const
+{
+ return playSubtags()->isSelected() && framesValue() != kSelectedFrames;
+}
+
bool ExportFileWindow::applyPixelRatio() const
{
return pixelRatio()->isSelected();
@@ -205,6 +215,13 @@ void ExportFileWindow::updateAniDir()
anidir()->setSelectedItemIndex(int(doc::AniDir::FORWARD));
}
+void ExportFileWindow::updatePlaySubtags()
+{
+ std::string framesValue = this->framesValue();
+ playSubtags()->setVisible(framesValue != kSelectedFrames);
+ layout();
+}
+
void ExportFileWindow::updateAdjustResizeButton()
{
// Calculate a better size for Twitter
diff --git a/src/app/ui/export_file_window.h b/src/app/ui/export_file_window.h
index de0330f7d..1f849c9c4 100644
--- a/src/app/ui/export_file_window.h
+++ b/src/app/ui/export_file_window.h
@@ -33,6 +33,7 @@ namespace app {
int layersIndex() const;
std::string framesValue() const;
doc::AniDir aniDirValue() const;
+ bool isPlaySubtags() const;
bool applyPixelRatio() const;
bool isForTwitter() const;
@@ -47,6 +48,7 @@ namespace app {
void updateOutputFilenameEntry();
void onOutputFilenameEntryChange();
void updateAniDir();
+ void updatePlaySubtags();
void updateAdjustResizeButton();
void onAdjustResize();
void onOK();