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 {
bool beginBlock = true;
for (int f = 0; f < fids.size() - 1; f++) {
int num = fids[f].getNumber();
int next_num = fids[f + 1].getNumber();
if (num + 1 == next_num) {
int num = fids[f].getNumber();
char letter = fids[f].getLetter();
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) {
retStr += QString::number(num) + " - ";
beginBlock = false;
}
} else {
retStr += QString::number(num) + ", ";
retStr += QString::number(num);
if (letter != '\0') retStr += QString(letter);
retStr += ", ";
beginBlock = true;
}
}
retStr += QString::number(fids.back().getNumber());
if (fids.back().getLetter() != '\0')
retStr += QString(fids.back().getLetter());
}
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) {
setFixedWidth(54);
m_intValidator = new QIntValidator(this);
setValue(value);
m_intValidator->setRange(1, 9999);
setFixedWidth(60);
if (acceptLetter)
m_regexpValidator =
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 = new QRegExpValidator(rx, this);
m_regexpValidator_alt =
new QRegExpValidator(QRegExp("^\\d{1,3}[A-Ia-i]?$"), this);
updateValidator();
setValue(fId);
}
//-----------------------------------------------------------------------------
void FrameNumberLineEdit::updateValidator() {
if (Preferences::instance()->isShowFrameNumberWithLettersEnabled())
setValidator(m_regexpValidator);
setValidator(m_regexpValidator_alt);
else
setValidator(m_intValidator);
setValidator(m_regexpValidator);
}
//-----------------------------------------------------------------------------
void FrameNumberLineEdit::setValue(int value) {
if (value <= 0)
value = 1;
else if (value > 9999)
value = 9999;
void FrameNumberLineEdit::setValue(TFrameId fId) {
QString str;
if (Preferences::instance()->isShowFrameNumberWithLettersEnabled()) {
str = convertToFrameWithLetter(value, 3);
if (fId.getLetter() != '\0') {
// need some warning?
}
str = convertToFrameWithLetter(fId.getNumber(), 3);
} else {
str.setNum(value);
while (str.length() < 4) str.push_front("0");
str = QString::fromStdString(fId.expand());
}
setText(str);
setCursorPosition(0);
@ -709,18 +711,27 @@ void FrameNumberLineEdit::setValue(int value) {
//-----------------------------------------------------------------------------
int FrameNumberLineEdit::getValue() {
TFrameId FrameNumberLineEdit::getValue() {
if (Preferences::instance()->isShowFrameNumberWithLettersEnabled()) {
QString str = text();
int f;
// if no letters added
if (str.at(str.size() - 1).isDigit())
return str.toInt() * 10;
f = str.toInt() * 10;
else {
return str.left(str.size() - 1).toInt() * 10 +
letterToNum(str.at(str.size() - 1));
f = str.left(str.size() - 1).toInt() * 10 +
letterToNum(str.at(str.size() - 1));
}
} else
return text().toInt();
return TFrameId(f);
} 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() {
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/lineedit.h"
#include "tfilepath.h"
// TnzQt includes
#include "toonzqt/tabbar.h"
#include "toonzqt/gutil.h"
@ -72,20 +74,20 @@ class IntLineEdit;
class FrameNumberLineEdit : public DVGui::LineEdit {
Q_OBJECT
/* having two validators and switch them according to the preferences*/
QIntValidator *m_intValidator;
QRegExpValidator *m_regexpValidator;
QRegExpValidator *m_regexpValidator, *m_regexpValidator_alt;
void updateValidator();
QString m_textOnFocusIn;
public:
FrameNumberLineEdit(QWidget *parent = 0, int value = 1);
FrameNumberLineEdit(QWidget* parent = 0, TFrameId fId = TFrameId(1),
bool acceptLetter = true);
~FrameNumberLineEdit() {}
/*! Set text in field to \b value. */
void setValue(int value);
void setValue(TFrameId fId);
/*! Return an integer with text field value. */
int getValue();
TFrameId getValue();
protected:
/*! If focus is lost and current text value is out of range emit signal

View file

@ -196,9 +196,9 @@ AutoInputCellNumberPopup::AutoInputCellNumberPopup()
"AutoInputCellNumberPopup") {
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_to = new FrameNumberLineEdit(this);
m_to = new FrameNumberLineEdit(this, TFrameId(1), false);
m_interval = new DVGui::IntLineEdit(this, 0, 0);
m_step = 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(
m_increment->getValue(), m_interval->getValue(), m_step->getValue(),
m_repeat->getValue(), m_from->getValue(), m_to->getValue(), r0, r1,
overwrite, columnIndices, levels);
m_repeat->getValue(), m_from->getValue().getNumber(),
m_to->getValue().getNumber(), r0, r1, overwrite, columnIndices, levels);
// if no cells will be arranged, then return
if (undo->rowsCount() == 0) {
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();
}
}