From 60f70e0d3ef084e37be361b1d9385e95dbedae8e Mon Sep 17 00:00:00 2001 From: "Ying Ruei Liang (KK)" Date: Mon, 14 Dec 2015 12:31:44 +0800 Subject: [PATCH 1/4] Invalidate editor after background setting changed --- src/app/ui/editor/editor.cpp | 1 + src/app/ui/editor/editor.h | 1 + 2 files changed, 2 insertions(+) diff --git a/src/app/ui/editor/editor.cpp b/src/app/ui/editor/editor.cpp index 2bfffed9e..5399a9c6d 100644 --- a/src/app/ui/editor/editor.cpp +++ b/src/app/ui/editor/editor.cpp @@ -195,6 +195,7 @@ Editor::Editor(Document* document, EditorFlags flags) m_tiledConn = docPref.tiled.AfterChange.connect(base::Bind(&Editor::invalidate, this)); m_gridConn = docPref.grid.AfterChange.connect(base::Bind(&Editor::invalidate, this)); m_pixelGridConn = docPref.pixelGrid.AfterChange.connect(base::Bind(&Editor::invalidate, this)); + m_bgConn = docPref.bg.AfterChange.connect(base::Bind(&Editor::invalidate, this)); m_onionskinConn = docPref.onionskin.AfterChange.connect(base::Bind(&Editor::invalidate, this)); m_document->addObserver(this); diff --git a/src/app/ui/editor/editor.h b/src/app/ui/editor/editor.h index 5087c6e8a..90b7a9f06 100644 --- a/src/app/ui/editor/editor.h +++ b/src/app/ui/editor/editor.h @@ -296,6 +296,7 @@ namespace app { base::ScopedConnection m_tiledConn; base::ScopedConnection m_gridConn; base::ScopedConnection m_pixelGridConn; + base::ScopedConnection m_bgConn; base::ScopedConnection m_onionskinConn; EditorObservers m_observers; From 6d3623ec26db2da78e85f31c1de6da3b1928b61e Mon Sep 17 00:00:00 2001 From: David Capello Date: Mon, 14 Dec 2015 16:49:02 -0300 Subject: [PATCH 2/4] Add {tagframe} to filename format (fix #894) --- src/app/file/file.cpp | 4 ++- src/app/filename_formatter.cpp | 49 ++++++++++++++++++---------- src/app/filename_formatter.h | 9 ++++- src/app/filename_formatter_tests.cpp | 21 ++++++++++++ 4 files changed, 64 insertions(+), 19 deletions(-) diff --git a/src/app/file/file.cpp b/src/app/file/file.cpp index 1ca306744..92308af5c 100644 --- a/src/app/file/file.cpp +++ b/src/app/file/file.cpp @@ -435,7 +435,9 @@ FileOp* FileOp::createSaveDocumentOperation(const Context* context, .filename(fn) .innerTagName(innerTag ? innerTag->name(): "") .outerTagName(outerTag ? outerTag->name(): "") - .frame(start_from+frame); + .frame(start_from+frame) + .tagFrame(innerTag ? frame-innerTag->fromFrame(): + start_from+frame); std::string frame_fn = filename_formatter(fn_format, fnInfo); diff --git a/src/app/filename_formatter.cpp b/src/app/filename_formatter.cpp index c82c0ebd4..c518f7396 100644 --- a/src/app/filename_formatter.cpp +++ b/src/app/filename_formatter.cpp @@ -20,6 +20,33 @@ namespace app { +static bool replace_frame(const char* frameKey, // E.g. = "{frame" + int frameBase, + std::string& str) +{ + size_t i = str.find(frameKey); + if (i != std::string::npos) { + int keyLen = std::strlen(frameKey); + + size_t j = str.find("}", i+keyLen); + if (j != std::string::npos) { + std::string from = str.substr(i, j - i + 1); + if (frameBase >= 0) { + std::vector to(32); + int offset = std::strtol(from.c_str()+keyLen, NULL, 10); + + std::sprintf(&to[0], "%0*d", (int(j)-int(i+keyLen)), frameBase + offset); + base::replace_string(str, from, &to[0]); + } + else + base::replace_string(str, from, ""); + } + return true; + } + else + return false; +} + std::string filename_formatter( const std::string& format, FilenameInfo& info, @@ -42,22 +69,8 @@ std::string filename_formatter( base::replace_string(output, "{outertag}", info.outerTagName()); if (replaceFrame) { - size_t i = output.find("{frame"); - if (i != std::string::npos) { - size_t j = output.find("}", i+6); - if (j != std::string::npos) { - std::string from = output.substr(i, j - i + 1); - if (info.frame() >= 0) { - std::vector to(32); - int offset = std::strtol(from.c_str()+6, NULL, 10); - - std::sprintf(&to[0], "%0*d", (int(j)-int(i+6)), info.frame() + offset); - base::replace_string(output, from, &to[0]); - } - else - base::replace_string(output, from, ""); - } - } + replace_frame("{frame", info.frame(), output); + replace_frame("{tagframe", info.tagFrame(), output); } return output; @@ -87,7 +100,9 @@ std::string add_frame_format( std::string output = format; size_t i = output.find("{frame"); - if (i == std::string::npos) { + size_t j = output.find("{tagframe"); + if (i == std::string::npos && + j == std::string::npos) { output = base::join_path( base::get_file_path(format), diff --git a/src/app/filename_formatter.h b/src/app/filename_formatter.h index 903aff83e..41565089e 100644 --- a/src/app/filename_formatter.h +++ b/src/app/filename_formatter.h @@ -15,13 +15,14 @@ namespace app { class FilenameInfo { public: - FilenameInfo() : m_frame(-1) { } + FilenameInfo() : m_frame(-1), m_tagFrame(-1) { } const std::string& filename() const { return m_filename; } const std::string& layerName() const { return m_layerName; } const std::string& innerTagName() const { return m_innerTagName; } const std::string& outerTagName() const { return m_outerTagName; } int frame() const { return m_frame; } + int tagFrame() const { return m_tagFrame; } FilenameInfo& filename(const std::string& value) { m_filename = value; @@ -48,12 +49,18 @@ namespace app { return *this; } + FilenameInfo& tagFrame(int value) { + m_tagFrame = value; + return *this; + } + private: std::string m_filename; std::string m_layerName; std::string m_innerTagName; std::string m_outerTagName; int m_frame; + int m_tagFrame; }; std::string filename_formatter( diff --git a/src/app/filename_formatter_tests.cpp b/src/app/filename_formatter_tests.cpp index d82d0e8b9..1a73c922f 100644 --- a/src/app/filename_formatter_tests.cpp +++ b/src/app/filename_formatter_tests.cpp @@ -165,3 +165,24 @@ TEST(AddFrameFormat, Tests) "{path}/{title}{frame1}.{extension}", "{frame001}")); } + +TEST(FilenameFormatter, WithTagFrame) +{ + EXPECT_EQ( + "./file_2_0.png", + filename_formatter( + "{path}/{title}_{frame}_{tagframe}.{extension}", + FilenameInfo().filename("./file.png").frame(2).tagFrame(0))); + + EXPECT_EQ( + "./file_2_1.png", + filename_formatter( + "{path}/{title}_{frame}_{tagframe1}.{extension}", + FilenameInfo().filename("./file.png").frame(2).tagFrame(0))); + + EXPECT_EQ( + "./file_2_25.png", + filename_formatter( + "{path}/{title}_{frame}_{tagframe24}.{extension}", + FilenameInfo().filename("./file.png").frame(2).tagFrame(1))); +} From 5ca927d307f6a63e894eb63b49a04bac418bcd86 Mon Sep 17 00:00:00 2001 From: David Capello Date: Mon, 14 Dec 2015 17:04:16 -0300 Subject: [PATCH 3/4] Keep all frame-related information in filename_formatter() when replaceFrame is false This bug was found in a comment in #897 --- src/app/filename_formatter.cpp | 6 +++--- src/app/filename_formatter.h | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/app/filename_formatter.cpp b/src/app/filename_formatter.cpp index c518f7396..fb340095a 100644 --- a/src/app/filename_formatter.cpp +++ b/src/app/filename_formatter.cpp @@ -64,11 +64,11 @@ std::string filename_formatter( base::replace_string(output, "{title}", base::get_file_title(filename)); base::replace_string(output, "{extension}", base::get_file_extension(filename)); base::replace_string(output, "{layer}", info.layerName()); - base::replace_string(output, "{tag}", info.innerTagName()); - base::replace_string(output, "{innertag}", info.innerTagName()); - base::replace_string(output, "{outertag}", info.outerTagName()); if (replaceFrame) { + base::replace_string(output, "{tag}", info.innerTagName()); + base::replace_string(output, "{innertag}", info.innerTagName()); + base::replace_string(output, "{outertag}", info.outerTagName()); replace_frame("{frame", info.frame(), output); replace_frame("{tagframe", info.tagFrame(), output); } diff --git a/src/app/filename_formatter.h b/src/app/filename_formatter.h index 41565089e..dcda28ef2 100644 --- a/src/app/filename_formatter.h +++ b/src/app/filename_formatter.h @@ -63,6 +63,9 @@ namespace app { int m_tagFrame; }; + // If "replaceFrame" is false, this function doesn't replace all the + // information that depends on the current frame ({frame}, + // {tagframe}, {tag}, etc.) std::string filename_formatter( const std::string& format, FilenameInfo& info, From 503c3c4bb544c6e23ae892ec94f958c1a681aa64 Mon Sep 17 00:00:00 2001 From: David Capello Date: Mon, 14 Dec 2015 17:13:16 -0300 Subject: [PATCH 4/4] Add missing #include to use std::strlen() --- src/app/filename_formatter.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/filename_formatter.cpp b/src/app/filename_formatter.cpp index fb340095a..f741e1ad5 100644 --- a/src/app/filename_formatter.cpp +++ b/src/app/filename_formatter.cpp @@ -16,6 +16,7 @@ #include "base/replace_string.h" #include +#include #include namespace app {