enable frame suffix in camera capture

This commit is contained in:
shun-iwasawa 2021-08-06 18:23:11 +09:00 committed by manongjohn
parent 866d31d07c
commit fe105a05cb
6 changed files with 145 additions and 39 deletions

View file

@ -0,0 +1,49 @@
#pragma once
#ifndef FILEPATHPROPERTIES_H
#define FILEPATHPROPERTIES_H
#include "tcommon.h"
#undef DVAPI
#undef DVVAR
#ifdef TOONZLIB_EXPORTS
#define DVAPI DV_EXPORT_API
#define DVVAR DV_EXPORT_VAR
#else
#define DVAPI DV_IMPORT_API
#define DVVAR DV_IMPORT_VAR
#endif
//=============================================================================
// forward declarations
class TIStream;
class TOStream;
//=============================================================================
// FilePathProperties
// This class defines file path condition for sequential image level
class DVAPI FilePathProperties {
bool m_useStandard;
bool m_acceptNonAlphabetSuffix;
int m_letterCountForSuffix;
public:
FilePathProperties();
bool useStandard() { return m_useStandard; }
void setUseStandard(bool on) { m_useStandard = on; }
bool acceptNonAlphabetSuffix() { return m_acceptNonAlphabetSuffix; }
void setAcceptNonAlphabetSuffix(bool on) { m_acceptNonAlphabetSuffix = on; }
int letterCountForSuffix() { return m_letterCountForSuffix; }
void setLetterCountForSuffix(int val) { m_letterCountForSuffix = val; }
void saveData(TOStream& os) const;
void loadData(TIStream& is);
bool isDefault();
};
#endif

View file

@ -160,19 +160,25 @@ QString fidsToString(const std::vector<TFrameId> &fids,
} else { } else {
bool beginBlock = true; bool beginBlock = true;
for (int f = 0; f < fids.size() - 1; f++) { for (int f = 0; f < fids.size() - 1; f++) {
int num = fids[f].getNumber(); int num = fids[f].getNumber();
int next_num = fids[f + 1].getNumber(); char letter = fids[f].getLetter();
if (num + 1 == next_num) { int next_num = fids[f + 1].getNumber();
char next_letter = fids[f + 1].getLetter();
if (num + 1 == next_num && letter == '\0' && next_letter == '\0') {
if (beginBlock) { if (beginBlock) {
retStr += QString::number(num) + " - "; retStr += QString::number(num) + " - ";
beginBlock = false; beginBlock = false;
} }
} else { } else {
retStr += QString::number(num) + ", "; retStr += QString::number(num);
if (letter != '\0') retStr += QString(letter);
retStr += ", ";
beginBlock = true; beginBlock = true;
} }
} }
retStr += QString::number(fids.back().getNumber()); if (fids.back().getLetter() != '\0')
retStr += QString(fids.back().getLetter());
} }
return retStr; return retStr;
} }

View file

@ -666,42 +666,44 @@ void StopMotionSaveInFolderPopup::updateParentFolder() {
//============================================================================= //=============================================================================
FrameNumberLineEdit::FrameNumberLineEdit(QWidget *parent, int value) FrameNumberLineEdit::FrameNumberLineEdit(QWidget* parent, TFrameId fId,
bool acceptLetter)
: LineEdit(parent) { : LineEdit(parent) {
setFixedWidth(54); setFixedWidth(60);
m_intValidator = new QIntValidator(this); if (acceptLetter)
setValue(value); m_regexpValidator =
m_intValidator->setRange(1, 9999); new QRegExpValidator(QRegExp("^\\d{1,4}[A-Za-z]?$"), this);
else
m_regexpValidator = new QRegExpValidator(QRegExp("^\\d{1,4}$"), this);
QRegExp rx("^[0-9]{1,4}[A-Ia-i]?$"); m_regexpValidator_alt =
m_regexpValidator = new QRegExpValidator(rx, this); new QRegExpValidator(QRegExp("^\\d{1,3}[A-Ia-i]?$"), this);
updateValidator(); updateValidator();
setValue(fId);
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void FrameNumberLineEdit::updateValidator() { void FrameNumberLineEdit::updateValidator() {
if (Preferences::instance()->isShowFrameNumberWithLettersEnabled()) if (Preferences::instance()->isShowFrameNumberWithLettersEnabled())
setValidator(m_regexpValidator); setValidator(m_regexpValidator_alt);
else else
setValidator(m_intValidator); setValidator(m_regexpValidator);
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void FrameNumberLineEdit::setValue(int value) { void FrameNumberLineEdit::setValue(TFrameId fId) {
if (value <= 0)
value = 1;
else if (value > 9999)
value = 9999;
QString str; QString str;
if (Preferences::instance()->isShowFrameNumberWithLettersEnabled()) { if (Preferences::instance()->isShowFrameNumberWithLettersEnabled()) {
str = convertToFrameWithLetter(value, 3); if (fId.getLetter() != '\0') {
// need some warning?
}
str = convertToFrameWithLetter(fId.getNumber(), 3);
} else { } else {
str.setNum(value); str = QString::fromStdString(fId.expand());
while (str.length() < 4) str.push_front("0");
} }
setText(str); setText(str);
setCursorPosition(0); setCursorPosition(0);
@ -709,18 +711,27 @@ void FrameNumberLineEdit::setValue(int value) {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
int FrameNumberLineEdit::getValue() { TFrameId FrameNumberLineEdit::getValue() {
if (Preferences::instance()->isShowFrameNumberWithLettersEnabled()) { if (Preferences::instance()->isShowFrameNumberWithLettersEnabled()) {
QString str = text(); QString str = text();
int f;
// if no letters added // if no letters added
if (str.at(str.size() - 1).isDigit()) if (str.at(str.size() - 1).isDigit())
return str.toInt() * 10; f = str.toInt() * 10;
else { else {
return str.left(str.size() - 1).toInt() * 10 + f = str.left(str.size() - 1).toInt() * 10 +
letterToNum(str.at(str.size() - 1)); letterToNum(str.at(str.size() - 1));
} }
} else return TFrameId(f);
return text().toInt(); } else {
QRegExp rx("^(\\d{1,4})([A-Za-z]?)$");
int pos = rx.indexIn(text());
if (pos < 0) return TFrameId();
if (rx.cap(2).isEmpty())
return TFrameId(rx.cap(1).toInt());
else
return TFrameId(rx.cap(1).toInt(), rx.cap(2).at(0).toLatin1());
}
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -3578,7 +3589,7 @@ void StopMotionController::onFileTypeActivated() {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void StopMotionController::onFrameNumberChanged() { void StopMotionController::onFrameNumberChanged() {
m_stopMotion->setFrameNumber(m_frameNumberEdit->getValue()); m_stopMotion->setFrameNumber(m_frameNumberEdit->getValue().getNumber());
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------

View file

@ -8,6 +8,8 @@
#include "toonzqt/dvdialog.h" #include "toonzqt/dvdialog.h"
#include "toonzqt/lineedit.h" #include "toonzqt/lineedit.h"
#include "tfilepath.h"
// TnzQt includes // TnzQt includes
#include "toonzqt/tabbar.h" #include "toonzqt/tabbar.h"
#include "toonzqt/gutil.h" #include "toonzqt/gutil.h"
@ -72,20 +74,20 @@ class IntLineEdit;
class FrameNumberLineEdit : public DVGui::LineEdit { class FrameNumberLineEdit : public DVGui::LineEdit {
Q_OBJECT Q_OBJECT
/* having two validators and switch them according to the preferences*/ /* having two validators and switch them according to the preferences*/
QIntValidator *m_intValidator; QRegExpValidator *m_regexpValidator, *m_regexpValidator_alt;
QRegExpValidator *m_regexpValidator;
void updateValidator(); void updateValidator();
QString m_textOnFocusIn; QString m_textOnFocusIn;
public: public:
FrameNumberLineEdit(QWidget *parent = 0, int value = 1); FrameNumberLineEdit(QWidget* parent = 0, TFrameId fId = TFrameId(1),
bool acceptLetter = true);
~FrameNumberLineEdit() {} ~FrameNumberLineEdit() {}
/*! Set text in field to \b value. */ /*! Set text in field to \b value. */
void setValue(int value); void setValue(TFrameId fId);
/*! Return an integer with text field value. */ /*! Return an integer with text field value. */
int getValue(); TFrameId getValue();
protected: protected:
/*! If focus is lost and current text value is out of range emit signal /*! If focus is lost and current text value is out of range emit signal

View file

@ -196,9 +196,9 @@ AutoInputCellNumberPopup::AutoInputCellNumberPopup()
"AutoInputCellNumberPopup") { "AutoInputCellNumberPopup") {
setWindowTitle(tr("Auto Input Cell Number")); setWindowTitle(tr("Auto Input Cell Number"));
m_from = new FrameNumberLineEdit(this); m_from = new FrameNumberLineEdit(this, TFrameId(1), false);
m_increment = new DVGui::IntLineEdit(this, 0, 0); m_increment = new DVGui::IntLineEdit(this, 0, 0);
m_to = new FrameNumberLineEdit(this); m_to = new FrameNumberLineEdit(this, TFrameId(1), false);
m_interval = new DVGui::IntLineEdit(this, 0, 0); m_interval = new DVGui::IntLineEdit(this, 0, 0);
m_step = new DVGui::IntLineEdit(this, 1, 1); m_step = new DVGui::IntLineEdit(this, 1, 1);
m_repeat = new DVGui::IntLineEdit(this, 1, 1); m_repeat = new DVGui::IntLineEdit(this, 1, 1);
@ -301,8 +301,8 @@ void AutoInputCellNumberPopup::doExecute(bool overwrite) {
} }
AutoInputCellNumberUndo *undo = new AutoInputCellNumberUndo( AutoInputCellNumberUndo *undo = new AutoInputCellNumberUndo(
m_increment->getValue(), m_interval->getValue(), m_step->getValue(), m_increment->getValue(), m_interval->getValue(), m_step->getValue(),
m_repeat->getValue(), m_from->getValue(), m_to->getValue(), r0, r1, m_repeat->getValue(), m_from->getValue().getNumber(),
overwrite, columnIndices, levels); m_to->getValue().getNumber(), r0, r1, overwrite, columnIndices, levels);
// if no cells will be arranged, then return // if no cells will be arranged, then return
if (undo->rowsCount() == 0) { if (undo->rowsCount() == 0) {
DVGui::MsgBox(DVGui::WARNING, DVGui::MsgBox(DVGui::WARNING,

View file

@ -0,0 +1,38 @@
#include "toonz/filepathproperties.h"
// TnzCore includes
#include "tstream.h"
FilePathProperties::FilePathProperties()
: m_useStandard(true)
, m_acceptNonAlphabetSuffix(false)
, m_letterCountForSuffix(1) {}
bool FilePathProperties::isDefault() {
return (m_useStandard == true && m_acceptNonAlphabetSuffix == false &&
m_letterCountForSuffix == 1);
}
void FilePathProperties::saveData(TOStream& os) const {
os.child("useStandard") << ((m_useStandard) ? 1 : 0);
os.child("acceptNonAlphabetSuffix") << ((m_acceptNonAlphabetSuffix) ? 1 : 0);
os.child("letterCountForSuffix") << m_letterCountForSuffix;
}
// make sure to let TFilePath to know the new properties!
void FilePathProperties::loadData(TIStream& is) {
int val;
std::string tagName;
while (is.matchTag(tagName)) {
if (tagName == "useStandard") {
is >> val;
m_useStandard = (val == 1);
} else if (tagName == "acceptNonAlphabetSuffix") {
is >> val;
m_acceptNonAlphabetSuffix = (val == 1);
} else if (tagName == "letterCountForSuffix") {
is >> m_letterCountForSuffix;
}
is.closeChild();
}
}