diff --git a/toonz/sources/common/timage_io/tlevel_io.cpp b/toonz/sources/common/timage_io/tlevel_io.cpp index 3a6e379..0eab254 100644 --- a/toonz/sources/common/timage_io/tlevel_io.cpp +++ b/toonz/sources/common/timage_io/tlevel_io.cpp @@ -116,17 +116,8 @@ TLevelP TLevelReader::loadInfo() { TFilePath ln(it->getLevelName()); // cout << "try " << *it << " " << it->getLevelName() << endl; if (levelName == TFilePath(it->getLevelName())) { - try { - level->setFrame(it->getFrame(), TImageP()); - data.push_back(*it); - } catch (TMalformedFrameException tmfe) { - // skip frame named incorrectly warning to the user in the message - // center. - DVGui::warning(QString::fromStdWString( - tmfe.getMessage() + L": " + - QObject::tr("Skipping frame.").toStdWString())); - continue; - } + level->setFrame(it->getFrame(), TImageP()); + data.push_back(*it); } } if (!data.empty()) { diff --git a/toonz/sources/common/tsystem/tfilepath.cpp b/toonz/sources/common/tsystem/tfilepath.cpp index 4d99fed..f4a5beb 100644 --- a/toonz/sources/common/tsystem/tfilepath.cpp +++ b/toonz/sources/common/tsystem/tfilepath.cpp @@ -51,8 +51,8 @@ bool isNumbers(std::wstring str, int fromSeg, int toSeg) { // Let's check if it follows the format ####A (i.e 00001 or 00001a) int numDigits = 0, numLetters = 0; for (int pos = fromSeg + 1; pos < toSeg; pos++) { - if ((str[pos] >= 'A' && str[pos] <= 'Z') || - (str[pos] >= 'a' && str[pos] <= 'z')) { + if ((str[pos] >= L'A' && str[pos] <= L'Z') || + (str[pos] >= L'a' && str[pos] <= L'z')) { // Not the right format if we ran into a letter without first finding a // number if (!numDigits) return false; @@ -60,7 +60,7 @@ bool isNumbers(std::wstring str, int fromSeg, int toSeg) { // We'll keep track of the number of letters we find. // NOTE: From here on out we should only see letters numLetters++; - } else if (str[pos] >= '0' && str[pos] <= '9') { + } else if (str[pos] >= L'0' && str[pos] <= L'9') { // Not the right format if we ran into a number that followed a letter. // This format is not something we expect currently if (numLetters) return false; // not right format @@ -86,8 +86,46 @@ bool checkForSeqNum(QString type) { else return false; } + +bool parseFrame(const std::wstring &str, int &frame, QString &letter, int &padding) { + if (str.empty()) + return false; + + int i = 0, number = 0; + while(i < (int)str.size() && str[i] >= L'0' && str[i] <= L'9') + number = number * 10 + str[i++] - L'0'; + int digits = i; + wchar_t l = str[i] >= L'a' && str[i] <= L'z' ? str[i++] + : str[i] >= L'A' && str[i] <= L'Z' ? str[i++] + : L'\0'; + if (number == 0 || i < (int)str.size()) + return false; + + frame = number; + letter = l ? QString(1, QChar(l)) : QString(); + padding = str[0] == L'0' ? digits : 0; + return true; +} + }; // namespace + +TFrameId::TFrameId(const std::string &str, char s) + : m_frame(EMPTY_FRAME), m_letter(), m_zeroPadding(4), m_startSeqInd(s) +{ + if (str.empty()) return; + if (!parseFrame(to_wstring(str), m_frame, m_letter, m_zeroPadding)) + m_frame = NO_FRAME; +} + +TFrameId::TFrameId(const std::wstring &str, char s) + : m_frame(EMPTY_FRAME), m_letter(), m_zeroPadding(4), m_startSeqInd(s) +{ + if (str.empty()) return; + if (!parseFrame(str, m_frame, m_letter, m_zeroPadding)) + m_frame = NO_FRAME; +} + // TFrameId::operator string() const std::string TFrameId::expand(FrameFormat format) const { if (m_frame == EMPTY_FRAME) @@ -713,8 +751,8 @@ TFilePath TFilePath::getParentDir() const // noSlash! int i = getLastSlash(m_path); // cerco l'ultimo slash if (i < 0) { if (m_path.length() >= 2 && - (('a' <= m_path[0] && m_path[0] <= 'z') || - ('A' <= m_path[0] && m_path[0] <= 'Z')) && + ((L'a' <= m_path[0] && m_path[0] <= L'z') || + (L'A' <= m_path[0] && m_path[0] <= L'Z')) && m_path[1] == ':') return TFilePath(m_path.substr(0, 2)); else @@ -770,23 +808,7 @@ TFrameId TFilePath::getFrame() const { if (!checkForSeqNum(type) || !isNumbers(str, j, i)) return TFrameId(TFrameId::NO_FRAME); - int k, number = 0, digits = 0; - for (k = j + 1; k < i && iswdigit(str[k]); k++) { - digits++; - number = number * 10 + str[k] - L'0'; - } - char letter = '\0'; - if (iswalpha(str[k])) letter = str[k++] + ('a' - L'a'); - - // if (number == 0 || k < i) // || letter!='\0') - // throw TMalformedFrameException( - // *this, - // str + L": " + QObject::tr("Malformed frame name").toStdWString()); - int padding = 0; - - if (str[j + 1] == '0') padding = digits; - - return TFrameId(number, letter, padding, str[j]); + return TFrameId(str.substr(j+1, i-j-1), str[j]); } //----------------------------------------------------------------------------- @@ -1166,4 +1188,4 @@ TFilePath::TFilePathInfo TFilePath::analyzePath() const { info.fId = TFrameId(TFrameId::NO_FRAME, 0, 0); // initialize with NO_PAD info.extension = QString(); return info; -} \ No newline at end of file +} diff --git a/toonz/sources/include/tfilepath.h b/toonz/sources/include/tfilepath.h index 4581863..b31e36b 100644 --- a/toonz/sources/include/tfilepath.h +++ b/toonz/sources/include/tfilepath.h @@ -57,6 +57,8 @@ public: } TFrameId(int f, QString str, int p = 4, char s = '.') : m_frame(f), m_letter(str), m_zeroPadding(p), m_startSeqInd(s) {} + explicit TFrameId(const std::string &str, char s = '.'); + explicit TFrameId(const std::wstring &wstr, char s = '.'); inline bool operator==(const TFrameId &f) const { return f.m_frame == m_frame && f.m_letter == m_letter; @@ -318,18 +320,6 @@ type is a string that indicate the filename extension(ex:. bmp or .bmp)*/ //----------------------------------------------------------------------------- -class TMalformedFrameException final : public TException { -public: - TMalformedFrameException(const TFilePath &fp, - const std::wstring &msg = std::wstring()) - : TException(fp.getWideName() + L":" + msg) {} - -private: - TMalformedFrameException(); -}; - -//----------------------------------------------------------------------------- - DVAPI std::ostream &operator<<(std::ostream &out, const TFilePath &path); typedef std::list<TFilePath> TFilePathSet; diff --git a/toonz/sources/toonz/filebrowser.cpp b/toonz/sources/toonz/filebrowser.cpp index f8074e1..62491cc 100644 --- a/toonz/sources/toonz/filebrowser.cpp +++ b/toonz/sources/toonz/filebrowser.cpp @@ -601,17 +601,7 @@ void FileBrowser::refreshCurrentFolderItems() { for (it = all_files.begin(); it != all_files.end(); it++) { TFrameId tFrameId; - try { - tFrameId = it->getFrame(); - } catch (TMalformedFrameException tmfe) { - // Incorrect frame name sequence. Warning to the user in the message - // center. - DVGui::warning(QString::fromStdWString( - tmfe.getMessage() + L": " + - QObject::tr("Skipping frame.").toStdWString())); - continue; - } - + tFrameId = it->getFrame(); TFilePath levelName(it->getLevelName()); if (levelName.isLevelName()) { diff --git a/toonz/sources/toonzfarm/tnzcore_stuff/tfilepath.cpp b/toonz/sources/toonzfarm/tnzcore_stuff/tfilepath.cpp index 237c899..1b36f99 100644 --- a/toonz/sources/toonzfarm/tnzcore_stuff/tfilepath.cpp +++ b/toonz/sources/toonzfarm/tnzcore_stuff/tfilepath.cpp @@ -14,6 +14,40 @@ const char auxslash = '\\'; //============================================================================= +TFrameId::TFrameId(const std::string &str, char s) + : m_frame(EMPTY_FRAME), m_letter(), m_zeroPadding(4), m_startSeqInd(s) +{ + if (!str.empty()) { + int i; + m_frame = 0; + for(i = 0; i < (int)str.size() && isdigit(str[i]); ++i) + m_frame = m_frame*10 + str[i] - '0'; + if (i < (int)str.size() && isalpha(str[i])) + m_letter = str[i++]; + if (m_frame == 0 || i < (int)str.size()) + m_frame = NO_FRAME; + } +} + +//------------------------------------------------------------------- + +TFrameId::TFrameId(const std::wstring &str, char s) + : m_frame(EMPTY_FRAME), m_letter(), m_zeroPadding(4), m_startSeqInd(s) +{ + if (!str.empty()) { + int i; + m_frame = 0; + for(i = 0; i < (int)str.size() && iswdigit(str[i]); ++i) + m_frame = m_frame*10 + str[i] - L'0'; + if (i < (int)str.size() && iswalpha(str[i])) + m_letter = str[i++] + ('a' - L'a'); + if (m_frame == 0 || i < (int)str.size()) + m_frame = NO_FRAME; + } +} + +//------------------------------------------------------------------- + // TFrameId::operator string() const std::string TFrameId::expand(FrameFormat format) const { if (m_frame == EMPTY_FRAME) @@ -348,7 +382,7 @@ TFrameId TFilePath::getFrame() const { number = number * 10 + str[k] - '0'; char letter = '\0'; if (isalpha(str[k])) letter = str[k++]; - if (number == 0 || k < i) throw TMalformedFrameException(); + if (number == 0 || k < i) return TFrameId(TFrameId::NO_FRAME); return TFrameId(number, letter); }