enable frame suffix in camera capture
This commit is contained in:
parent
866d31d07c
commit
fe105a05cb
6 changed files with 145 additions and 39 deletions
49
toonz/sources/include/toonz/filepathproperties.h
Normal file
49
toonz/sources/include/toonz/filepathproperties.h
Normal 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
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
|
|
38
toonz/sources/toonzlib/filepathproperties.cpp
Normal file
38
toonz/sources/toonzlib/filepathproperties.cpp
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue