tahoma2d/toonz/sources/toonz/magpiefileimportpopup.cpp
2019-10-27 12:09:44 -04:00

285 lines
10 KiB
C++

#include "magpiefileimportpopup.h"
#include "tapp.h"
#include "tfilepath_io.h"
#include "tsystem.h"
#include "iocommand.h"
#include "flipbook.h"
#include "toonz/tscenehandle.h"
#include "toonz/toonzscene.h"
#include "toonzqt/filefield.h"
#include "toonzqt/intfield.h"
#include "toonzqt/gutil.h"
#include <QLabel>
#include <QPushButton>
#include <QTextStream>
#include <QMainWindow>
//=============================================================================
// MagpieInfo
//-----------------------------------------------------------------------------
MagpieInfo::MagpieInfo(TFilePath path)
: m_fileName(QString::fromStdWString(path.getWideName())) {
QFile file(QString::fromStdWString(path.getWideString()));
if (!file.open(QFile::ReadOnly)) return;
QTextStream textStream(&file);
QString line;
do {
line = textStream.readLine();
// E' la prima riga
if (line == QString("Toonz")) continue;
if (!line.contains(L'|')) {
if (!line.isEmpty()) m_actsIdentifier.append(line);
continue;
}
QStringList list = line.split(QString("|"));
assert(list.size() == 3);
m_actorActs.append(list.at(1));
m_comments.append(list.at(2));
} while (!line.isNull());
}
//=============================================================================
// MagpieFileImportPopup
//-----------------------------------------------------------------------------
MagpieFileImportPopup::MagpieFileImportPopup()
: Dialog(TApp::instance()->getMainWindow(), true, true, "MagPieFileImport")
, m_levelField(0)
, m_fromField(0)
, m_toField(0)
, m_flipbook(0)
, m_levelPath() {
setWindowTitle(tr("Import Toonz Lip Sync File"));
beginVLayout();
setLabelWidth(60);
addSeparator(tr("Frame Range"));
QWidget *fromToWidget = new QWidget(this);
fromToWidget->setFixedHeight(DVGui::WidgetHeight);
fromToWidget->setFixedSize(210, DVGui::WidgetHeight);
QHBoxLayout *fromToLayout = new QHBoxLayout(fromToWidget);
fromToLayout->setMargin(0);
fromToLayout->setSpacing(0);
m_fromField = new DVGui::IntLineEdit(fromToWidget, 1, 1, 1);
fromToLayout->addWidget(m_fromField, 0, Qt::AlignLeft);
m_toField = new DVGui::IntLineEdit(fromToWidget, 1, 1, 1);
QLabel *toLabel = new QLabel(tr("To: "));
toLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
toLabel->setFixedSize(20, DVGui::WidgetHeight);
fromToLayout->addWidget(toLabel, 0, Qt::AlignRight);
fromToLayout->addWidget(m_toField, 0, Qt::AlignLeft);
fromToWidget->setLayout(fromToLayout);
addWidget(tr("From:"), fromToWidget);
addSeparator(tr("Animation Level"));
m_levelField = new DVGui::FileField(this);
m_levelField->setFileMode(QFileDialog::AnyFile);
m_levelField->setFixedWidth(200);
bool ret =
connect(m_levelField, SIGNAL(pathChanged()), SLOT(onLevelPathChanged()));
addWidget(tr("Level:"), m_levelField);
QLabel *frameLabel = new QLabel(" Frame", this);
frameLabel->setFixedHeight(DVGui::WidgetHeight);
frameLabel->setAlignment(Qt::AlignVCenter);
addWidget(tr("Phoneme"), frameLabel);
int i;
for (i = 0; i < 9; i++) {
DVGui::IntLineEdit *field = new DVGui::IntLineEdit(this, 1, 1);
field->setFixedSize(54, DVGui::WidgetHeight);
QLabel *label = new QLabel("", this);
label->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
label->setFixedSize(getLabelWidth(), DVGui::WidgetHeight);
m_actFields.append(QPair<QLabel *, DVGui::IntLineEdit *>(label, field));
addWidgets(label, field);
}
endVLayout();
QFrame *frame = new QFrame(this);
frame->setFrameStyle(QFrame::StyledPanel);
frame->setObjectName("LipSynkViewer");
frame->setStyleSheet(
"#LipSynkViewer { border: 1px solid rgb(150,150,150); }");
QVBoxLayout *frameLayout = new QVBoxLayout(frame);
frameLayout->setMargin(0);
frameLayout->setSpacing(0);
std::vector<int> buttonMask = {FlipConsole::eRate,
FlipConsole::eSound,
FlipConsole::eSaveImg,
FlipConsole::eHisto,
FlipConsole::eCompare,
FlipConsole::eCustomize,
FlipConsole::eSave,
FlipConsole::eBegin,
FlipConsole::eEnd,
FlipConsole::eFirst,
FlipConsole::eNext,
FlipConsole::ePause,
FlipConsole::ePlay,
FlipConsole::ePrev,
FlipConsole::eRate,
FlipConsole::eWhiteBg,
FlipConsole::eCheckBg,
FlipConsole::eBlackBg,
FlipConsole::eNext,
FlipConsole::eLast,
FlipConsole::eLoop,
FlipConsole::eGRed,
FlipConsole::eGGreen,
FlipConsole::eGBlue,
FlipConsole::eRed,
FlipConsole::eGreen,
FlipConsole::eBlue,
FlipConsole::eMatte,
FlipConsole::eDefineSubCamera,
FlipConsole::eDefineLoadBox,
FlipConsole::eUseLoadBox,
FlipConsole::eFilledRaster,
FlipConsole::eLocator,
FlipConsole::eZoomIn,
FlipConsole::eZoomOut,
FlipConsole::eFlipHorizontal,
FlipConsole::eFlipVertical,
FlipConsole::eResetView};
m_flipbook = new FlipBook(this, tr("Import Toonz Lip Sync File"), buttonMask);
m_flipbook->setFixedHeight(250);
frameLayout->addWidget(m_flipbook);
frame->setLayout(frameLayout);
addWidget(frame);
QPushButton *okBtn = new QPushButton(tr("Import"), this);
okBtn->setDefault(true);
QPushButton *cancelBtn = new QPushButton(tr("Cancel"), this);
ret = ret && connect(okBtn, SIGNAL(clicked()), this, SLOT(onOkPressed()));
ret = ret && connect(cancelBtn, SIGNAL(clicked()), this, SLOT(reject()));
assert(ret);
addButtonBarWidget(okBtn, cancelBtn);
}
//-----------------------------------------------------------------------------
void MagpieFileImportPopup::setFilePath(TFilePath path) {
m_info = new MagpieInfo(path);
}
//-----------------------------------------------------------------------------
void MagpieFileImportPopup::showEvent(QShowEvent *) {
if (m_info == 0) return;
int frameCount = m_info->getFrameCount();
m_fromField->setRange(1, frameCount);
m_fromField->setValue(1);
m_toField->setRange(1, frameCount);
m_toField->setValue(frameCount);
int i;
QList<QString> actsIdentifier = m_info->getActsIdentifier();
for (i = 0; i < m_actFields.size(); i++) {
DVGui::IntLineEdit *field = m_actFields.at(i).second;
QLabel *label = m_actFields.at(i).first;
if (i >= actsIdentifier.size()) {
field->hide();
label->hide();
continue;
}
QString act = actsIdentifier.at(i);
field->setProperty("act", QVariant(act));
field->show();
label->setText(act + ":");
label->show();
}
QString oldLevelPath = m_levelField->getPath();
TFilePath oldFilePath(oldLevelPath.toStdWString());
TFilePath perntDir = oldFilePath.getParentDir();
m_levelField->setPath(QString::fromStdWString(perntDir.getWideString()));
}
//-----------------------------------------------------------------------------
void MagpieFileImportPopup::hideEvent(QHideEvent *) {
// Devo svuotare il flibook
emit closeButtonPressed();
}
//-----------------------------------------------------------------------------
void MagpieFileImportPopup::onLevelPathChanged() {
ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene();
TFilePath levelPath(m_levelField->getPath().toStdWString());
levelPath = scene->decodeFilePath(levelPath);
if (levelPath.isEmpty() || levelPath.getUndottedType().empty() ||
!TSystem::doesExistFileOrLevel(levelPath)) {
DVGui::error(tr("The file path is missing."));
return;
}
m_levelPath = levelPath;
std::string format = m_levelPath.getType();
if (format == "tzp" || format == "tzu") {
std::wstring name = m_levelPath.getWideName();
IoCmd::ConvertingPopup *convertingPopup = new IoCmd::ConvertingPopup(
TApp::instance()->getMainWindow(),
QString::fromStdWString(name) +
QString::fromStdString(m_levelPath.getDottedType()));
convertingPopup->show();
bool ok = scene->convertLevelIfNeeded(m_levelPath);
convertingPopup->hide();
if (!ok) return;
}
m_flipbook->setLevel(m_levelPath);
}
//-----------------------------------------------------------------------------
void MagpieFileImportPopup::onOkPressed() {
if (m_levelPath.isEmpty() || m_levelPath.getUndottedType().empty() ||
!TSystem::doesExistFileOrLevel(m_levelPath)) {
DVGui::error(tr("The file path is missing."));
return;
}
QList<QString> actorActs = m_info->getActorActs();
QList<QString> comments = m_info->getComments();
int from = m_fromField->getValue() - 1;
int to = m_toField->getValue() - 1;
assert(to < m_info->getFrameCount());
QList<TFrameId> frameList;
QList<QString> commentList;
int commentCount = comments.size();
int actorActsCount = actorActs.size();
for (int i = from; i <= to; i++) {
if (commentCount <= i || actorActsCount <= i) continue;
commentList.append(comments.at(i));
QString actorAct = actorActs.at(i);
if (actorAct == QString("<none>")) {
frameList.push_back(TFrameId());
continue;
}
for (int j = 0; j < m_actFields.size(); j++) {
DVGui::IntLineEdit *field = m_actFields.at(j).second;
QString act = field->property("act").toString();
if (actorAct != act) continue;
frameList.push_back(TFrameId(field->getValue()));
break;
}
}
bool ret = IoCmd::importLipSync(m_levelPath, frameList, commentList,
m_info->getFileName());
if (!ret) return;
accept();
}