Blob Blame Raw


#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 Magpie File"));

	beginVLayout();

	setLabelWidth(45);

	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, m_toField->height());
	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);
	addWidget(tr("Phoneme"), frameLabel);
	int i;
	for (i = 0; i < 9; i++) {
		DVGui::IntLineEdit *field = new DVGui::IntLineEdit(this, 1, 1);
		QLabel *label = new QLabel("", this);
		label->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
		label->setFixedSize(getLabelWidth(), field->height());
		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);
	UINT buttonMask = FlipConsole::cFullConsole & (~(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));
	m_flipbook = new FlipBook(this, tr("Import Magpie 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();
	int i = from;
	for (i; 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;
		}
		int j;
		for (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();
}