Reframe with Empty Inbetweens command (#1485)

* reframe with empty inbetweens
This commit is contained in:
shun-iwasawa 2017-09-25 17:15:29 +09:00 committed by masafumi-inoue
parent 1e17edb69a
commit aa65b89e92
16 changed files with 343 additions and 19 deletions

Binary file not shown.

View file

@ -418,7 +418,9 @@ frame duplication.
void timeStretch(int r0, int c0, int r1, int c1, int nr); void timeStretch(int r0, int c0, int r1, int c1, int nr);
// force cells order in n-steps. returns the row amount after process // force cells order in n-steps. returns the row amount after process
int reframeCells(int r0, int r1, int col, int type); // if withBlank is greater than -1, remove empty cell from its order and
// insert blank frames with type*withBlank length at each n-step.
int reframeCells(int r0, int r1, int col, int type, int withBlank = -1);
/*! Exposes level \b \e xl in xsheet starting from cell identified by \b \e /*! Exposes level \b \e xl in xsheet starting from cell identified by \b \e
row and \b \e col. row and \b \e col.

View file

@ -151,6 +151,7 @@ set(MOC_HEADERS
locatorpopup.h locatorpopup.h
styleshortcutswitchablepanel.h styleshortcutswitchablepanel.h
cameracapturelevelcontrol.h cameracapturelevelcontrol.h
reframepopup.h
autoinputcellnumberpopup.h autoinputcellnumberpopup.h
# Tracker file # Tracker file
dummyprocessor.h dummyprocessor.h
@ -318,6 +319,7 @@ set(SOURCES
locatorpopup.cpp locatorpopup.cpp
styleshortcutswitchablepanel.cpp styleshortcutswitchablepanel.cpp
cameracapturelevelcontrol.cpp cameracapturelevelcontrol.cpp
reframepopup.cpp
autoinputcellnumberpopup.cpp autoinputcellnumberpopup.cpp
# Tracker file # Tracker file
dummyprocessor.cpp dummyprocessor.cpp

View file

@ -1154,7 +1154,7 @@ int TCellSelection::Range::getColCount() const { return m_c1 - m_c0 + 1; }
// TCellSelection // TCellSelection
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
TCellSelection::TCellSelection() : m_timeStretchPopup(0) {} TCellSelection::TCellSelection() : m_timeStretchPopup(0), m_reframePopup(0) {}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -1204,21 +1204,47 @@ void TCellSelection::enableCommands() {
enableCommand(this, MI_Reframe2, &TCellSelection::reframe2Cells); enableCommand(this, MI_Reframe2, &TCellSelection::reframe2Cells);
enableCommand(this, MI_Reframe3, &TCellSelection::reframe3Cells); enableCommand(this, MI_Reframe3, &TCellSelection::reframe3Cells);
enableCommand(this, MI_Reframe4, &TCellSelection::reframe4Cells); enableCommand(this, MI_Reframe4, &TCellSelection::reframe4Cells);
enableCommand(this, MI_ReframeWithEmptyInbetweens,
&TCellSelection::reframeWithEmptyInbetweens);
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Used in RenameCellField::eventFilter() // Used in RenameCellField::eventFilter()
bool TCellSelection::isEnabledCommand( bool TCellSelection::isEnabledCommand(
std::string commandId) { // static function std::string commandId) { // static function
static QList<std::string> commands = { static QList<std::string> commands = {MI_Autorenumber,
MI_Autorenumber, MI_Reverse, MI_Swing, MI_Random, MI_Reverse,
MI_Increment, MI_ResetStep, MI_IncreaseStep, MI_DecreaseStep, MI_Swing,
MI_Step2, MI_Step3, MI_Step4, MI_Each2, MI_Random,
MI_Each3, MI_Each4, MI_Rollup, MI_Rolldown, MI_Increment,
MI_TimeStretch, MI_CloneLevel, MI_SetKeyframes, MI_Copy, MI_ResetStep,
MI_Paste, MI_PasteInto, MI_Cut, MI_Clear, MI_IncreaseStep,
MI_Insert, MI_PasteInto, MI_Reframe1, MI_Reframe2, MI_DecreaseStep,
MI_Reframe3, MI_Reframe4, MI_Undo, MI_Redo}; MI_Step2,
MI_Step3,
MI_Step4,
MI_Each2,
MI_Each3,
MI_Each4,
MI_Rollup,
MI_Rolldown,
MI_TimeStretch,
MI_CloneLevel,
MI_SetKeyframes,
MI_Copy,
MI_Paste,
MI_PasteInto,
MI_Cut,
MI_Clear,
MI_Insert,
MI_PasteInto,
MI_Reframe1,
MI_Reframe2,
MI_Reframe3,
MI_Reframe4,
MI_ReframeWithEmptyInbetweens,
MI_Undo,
MI_Redo};
return commands.contains(commandId); return commands.contains(commandId);
} }

View file

@ -8,6 +8,7 @@
#include <set> #include <set>
class TimeStretchPopup; class TimeStretchPopup;
class ReframePopup;
class TXshCell; class TXshCell;
//============================================================================= //=============================================================================
@ -16,6 +17,7 @@ class TXshCell;
class TCellSelection final : public TSelection { class TCellSelection final : public TSelection {
TimeStretchPopup *m_timeStretchPopup; TimeStretchPopup *m_timeStretchPopup;
ReframePopup *m_reframePopup;
public: public:
class Range { class Range {
@ -99,6 +101,8 @@ public:
void reframe3Cells() { reframeCells(3); } void reframe3Cells() { reframeCells(3); }
void reframe4Cells() { reframeCells(4); } void reframe4Cells() { reframeCells(4); }
void reframeWithEmptyInbetweens();
void renameCells(TXshCell &cell); void renameCells(TXshCell &cell);
// rename cells for each columns with correspondent item in the list // rename cells for each columns with correspondent item in the list
void renameMultiCells(QList<TXshCell> &cells); void renameMultiCells(QList<TXshCell> &cells);

View file

@ -8,6 +8,7 @@
#include "overwritepopup.h" #include "overwritepopup.h"
#include "selectionutils.h" #include "selectionutils.h"
#include "columnselection.h" #include "columnselection.h"
#include "reframepopup.h"
// TnzQt includes // TnzQt includes
#include "toonzqt/tselectionhandle.h" #include "toonzqt/tselectionhandle.h"
@ -553,6 +554,7 @@ class ReframeUndo final : public TUndo {
int m_r0, m_r1; int m_r0, m_r1;
int m_type; int m_type;
int m_nr; int m_nr;
int m_withBlank;
std::unique_ptr<TXshCell[]> m_cells; std::unique_ptr<TXshCell[]> m_cells;
public: public:
@ -560,7 +562,8 @@ public:
std::vector<int> m_columnIndeces; std::vector<int> m_columnIndeces;
ReframeUndo(int r0, int r1, std::vector<int> columnIndeces, int type); ReframeUndo(int r0, int r1, std::vector<int> columnIndeces, int type,
int withBlank = -1);
~ReframeUndo(); ~ReframeUndo();
void undo() const override; void undo() const override;
void redo() const override; void redo() const override;
@ -569,7 +572,12 @@ public:
int getSize() const override { return sizeof(*this); } int getSize() const override { return sizeof(*this); }
QString getHistoryString() override { QString getHistoryString() override {
if (m_withBlank == -1)
return QObject::tr("Reframe to %1's").arg(QString::number(m_type)); return QObject::tr("Reframe to %1's").arg(QString::number(m_type));
else
return QObject::tr("Reframe to %1's with %2 blanks")
.arg(QString::number(m_type))
.arg(QString::number(m_withBlank));
} }
int getHistoryType() override { return HistoryType::Xsheet; } int getHistoryType() override { return HistoryType::Xsheet; }
}; };
@ -577,12 +585,13 @@ public:
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
ReframeUndo::ReframeUndo(int r0, int r1, std::vector<int> columnIndeces, ReframeUndo::ReframeUndo(int r0, int r1, std::vector<int> columnIndeces,
int type) int type, int withBlank)
: m_r0(r0) : m_r0(r0)
, m_r1(r1) , m_r1(r1)
, m_type(type) , m_type(type)
, m_nr(0) , m_nr(0)
, m_columnIndeces(columnIndeces) { , m_columnIndeces(columnIndeces)
, m_withBlank(withBlank) {
m_nr = m_r1 - m_r0 + 1; m_nr = m_r1 - m_r0 + 1;
assert(m_nr > 0); assert(m_nr > 0);
m_cells.reset(new TXshCell[m_nr * (int)m_columnIndeces.size()]); m_cells.reset(new TXshCell[m_nr * (int)m_columnIndeces.size()]);
@ -641,7 +650,7 @@ void ReframeUndo::redo() const {
for (int c = 0; c < m_columnIndeces.size(); c++) for (int c = 0; c < m_columnIndeces.size(); c++)
app->getCurrentXsheet()->getXsheet()->reframeCells( app->getCurrentXsheet()->getXsheet()->reframeCells(
m_r0, m_r1, m_columnIndeces[c], m_type); m_r0, m_r1, m_columnIndeces[c], m_type, m_withBlank);
app->getCurrentXsheet()->notifyXsheetChanged(); app->getCurrentXsheet()->notifyXsheetChanged();
} }
@ -699,6 +708,86 @@ void TColumnSelection::reframeCells(int count) {
TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
} }
//=============================================================================
void TCellSelection::reframeWithEmptyInbetweens() {
if (isEmpty() || areAllColSelectedLocked()) return;
std::vector<int> colIndeces;
for (int c = m_range.m_c0; c <= m_range.m_c1; c++) colIndeces.push_back(c);
// destruction of m_reframePopup will be done along with the main window
if (!m_reframePopup) m_reframePopup = new ReframePopup();
int ret = m_reframePopup->exec();
if (ret == QDialog::Rejected) return;
int step, blank;
m_reframePopup->getValues(step, blank);
ReframeUndo *undo =
new ReframeUndo(m_range.m_r0, m_range.m_r1, colIndeces, step, blank);
int maximumRow = 0;
for (int c = m_range.m_c0; c <= m_range.m_c1; c++) {
int nrows = TApp::instance()->getCurrentXsheet()->getXsheet()->reframeCells(
m_range.m_r0, m_range.m_r1, c, step, blank);
undo->m_newRows.push_back(nrows);
if (maximumRow < nrows) maximumRow = nrows;
}
if (maximumRow == 0) {
delete undo;
return;
}
TUndoManager::manager()->add(undo);
// select reframed range
selectCells(m_range.m_r0, m_range.m_c0, m_range.m_r0 + maximumRow - 1,
m_range.m_c1);
TApp::instance()->getCurrentScene()->setDirtyFlag(true);
TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
}
void TColumnSelection::reframeWithEmptyInbetweens() {
if (isEmpty()) return;
int rowCount =
TApp::instance()->getCurrentXsheet()->getXsheet()->getFrameCount();
std::vector<int> colIndeces;
std::set<int>::const_iterator it;
for (it = m_indices.begin(); it != m_indices.end(); it++)
colIndeces.push_back(*it);
if (!m_reframePopup) m_reframePopup = new ReframePopup();
int ret = m_reframePopup->exec();
if (ret == QDialog::Rejected) return;
int step, blank;
m_reframePopup->getValues(step, blank);
ReframeUndo *undo = new ReframeUndo(0, rowCount - 1, colIndeces, step, blank);
bool commandExecuted = false;
for (int c = 0; c < (int)colIndeces.size(); c++) {
int nrows = TApp::instance()->getCurrentXsheet()->getXsheet()->reframeCells(
0, rowCount - 1, colIndeces[c], step, blank);
undo->m_newRows.push_back(nrows);
if (nrows > 0) commandExecuted = true;
}
if (!commandExecuted) {
delete undo;
return;
}
TUndoManager::manager()->add(undo);
TApp::instance()->getCurrentScene()->setDirtyFlag(true);
TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
}
//********************************************************************************* //*********************************************************************************
// Reset Step Cells command // Reset Step Cells command
//********************************************************************************* //*********************************************************************************

View file

@ -26,7 +26,7 @@
// TColumnSelection // TColumnSelection
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
TColumnSelection::TColumnSelection() {} TColumnSelection::TColumnSelection() : m_reframePopup(0) {}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -50,6 +50,8 @@ void TColumnSelection::enableCommands() {
enableCommand(this, MI_Reframe2, &TColumnSelection::reframe2Cells); enableCommand(this, MI_Reframe2, &TColumnSelection::reframe2Cells);
enableCommand(this, MI_Reframe3, &TColumnSelection::reframe3Cells); enableCommand(this, MI_Reframe3, &TColumnSelection::reframe3Cells);
enableCommand(this, MI_Reframe4, &TColumnSelection::reframe4Cells); enableCommand(this, MI_Reframe4, &TColumnSelection::reframe4Cells);
enableCommand(this, MI_ReframeWithEmptyInbetweens,
&TColumnSelection::reframeWithEmptyInbetweens);
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------

View file

@ -7,12 +7,15 @@
#include "tgeometry.h" #include "tgeometry.h"
#include <set> #include <set>
class ReframePopup;
//============================================================================= //=============================================================================
// TColumnSelection // TColumnSelection
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
class TColumnSelection final : public TSelection { class TColumnSelection final : public TSelection {
std::set<int> m_indices; std::set<int> m_indices;
ReframePopup *m_reframePopup;
public: public:
TColumnSelection(); TColumnSelection();
@ -46,6 +49,8 @@ public:
void reframe2Cells() { reframeCells(2); } void reframe2Cells() { reframeCells(2); }
void reframe3Cells() { reframeCells(3); } void reframe3Cells() { reframeCells(3); }
void reframe4Cells() { reframeCells(4); } void reframe4Cells() { reframeCells(4); }
void reframeWithEmptyInbetweens();
}; };
#endif // TCELLSELECTION_H #endif // TCELLSELECTION_H

View file

@ -1855,6 +1855,8 @@ void MainWindow::defineActions() {
createMenuCellsAction(MI_Reframe4, tr("4's"), ""); createMenuCellsAction(MI_Reframe4, tr("4's"), "");
createMenuCellsAction(MI_ReframeWithEmptyInbetweens,
tr("Reframe with Empty Inbetweens..."), "");
createMenuCellsAction(MI_AutoInputCellNumber, tr("Auto Input Cell Number..."), createMenuCellsAction(MI_AutoInputCellNumber, tr("Auto Input Cell Number..."),
""); "");

View file

@ -305,6 +305,7 @@
#define MI_Reframe2 "MI_Reframe2" #define MI_Reframe2 "MI_Reframe2"
#define MI_Reframe3 "MI_Reframe3" #define MI_Reframe3 "MI_Reframe3"
#define MI_Reframe4 "MI_Reframe4" #define MI_Reframe4 "MI_Reframe4"
#define MI_ReframeWithEmptyInbetweens "MI_ReframeWithEmptyInbetweens"
#define MI_FillAreas "MI_FillAreas" #define MI_FillAreas "MI_FillAreas"
#define MI_FillLines "MI_FillLines" #define MI_FillLines "MI_FillLines"

View file

@ -0,0 +1,83 @@
#include "reframepopup.h"
// Tnz includes
#include "tapp.h"
#include "menubarcommandids.h"
// TnzQt includes
#include "toonzqt/intfield.h"
#include "toonzqt/dvdialog.h"
#include "toonzqt/menubarcommand.h"
#include <QMainWindow>
#include <QLabel>
#include <QPushButton>
#include <QHBoxLayout>
#include <iostream>
//-----------------------------------------------------------------------------
ReframePopup::ReframePopup()
: Dialog(TApp::instance()->getMainWindow(), true, true, "ReframePopup") {
setWindowTitle(tr("Reframe with Empty Inbetweens"));
m_step = new DVGui::IntLineEdit(this, 1, 1);
m_blank = new DVGui::IntLineEdit(this, 0, 0);
m_blankCellCountLbl = new QLabel("0", this);
QPushButton* okBtn = new QPushButton(tr("OK"), this);
QPushButton* cancelBtn = new QPushButton(tr("Cancel"), this);
m_step->setObjectName("LargeSizedText");
m_blank->setObjectName("LargeSizedText");
// layout
QHBoxLayout* mainLay = new QHBoxLayout();
mainLay->setMargin(0);
mainLay->setSpacing(5);
{
mainLay->addWidget(m_step);
mainLay->addWidget(new QLabel(tr("steps"), this));
mainLay->addSpacing(10);
mainLay->addWidget(new QLabel(tr("with"), this));
mainLay->addWidget(m_blank);
mainLay->addWidget(new QLabel(tr("empty inbetweens"), this));
}
m_topLayout->addLayout(mainLay);
QHBoxLayout* textLay = new QHBoxLayout();
textLay->setMargin(0);
{
textLay->addStretch(1);
textLay->addWidget(new QLabel(tr("("), this));
textLay->addWidget(m_blankCellCountLbl);
textLay->addWidget(new QLabel(tr(" blank cells will be inserted.)"), this));
}
m_topLayout->addLayout(textLay);
// buttons
m_buttonLayout->addWidget(okBtn);
m_buttonLayout->addWidget(cancelBtn);
// signal-slot connections
bool ret = true;
ret = ret && connect(m_step, SIGNAL(editingFinished()), this,
SLOT(updateBlankCellCount()));
ret = ret && connect(m_blank, SIGNAL(editingFinished()), this,
SLOT(updateBlankCellCount()));
ret = ret && connect(okBtn, SIGNAL(clicked()), this, SLOT(accept()));
ret = ret && connect(cancelBtn, SIGNAL(clicked()), this, SLOT(reject()));
assert(ret);
}
//-----------------------------------------------------------------------------
void ReframePopup::updateBlankCellCount() {
int blankCellCount = m_step->getValue() * m_blank->getValue();
m_blankCellCountLbl->setText(QString::number(blankCellCount));
}
//-----------------------------------------------------------------------------
void ReframePopup::getValues(int& step, int& blank) {
step = m_step->getValue();
blank = m_blank->getValue();
}

View file

@ -0,0 +1,39 @@
#pragma once
#ifndef REFRAMEPOPUP_H
#define REFRAMEPOPUP_H
#include "toonzqt/dvdialog.h"
#include <QList>
class QLabel;
namespace DVGui {
class IntLineEdit;
}
//=============================================================================
// ReframePopup
// - Enables reframe cells with specified blank frames.
// - The amount of blank frames is specified by the quotient, divided by the
// reframe step, ( e.g. "3 steps - 2 blanks" will insert 6 blank cells.)
// considering that it is common usage in Japanese animation industry.
// - Can be used both to the cell and the column selections.
//-----------------------------------------------------------------------------
class ReframePopup final : public DVGui::Dialog {
Q_OBJECT
DVGui::IntLineEdit *m_step, *m_blank;
QLabel* m_blankCellCountLbl;
public:
ReframePopup();
void getValues(int& step, int& blank);
public slots:
void updateBlankCellCount();
};
#endif // REFRAMEPOPUP_H

View file

@ -2590,6 +2590,8 @@ void CellArea::createCellMenu(QMenu &menu, bool isCellSelected) {
reframeSubMenu->addAction(cmdManager->getAction(MI_Reframe2)); reframeSubMenu->addAction(cmdManager->getAction(MI_Reframe2));
reframeSubMenu->addAction(cmdManager->getAction(MI_Reframe3)); reframeSubMenu->addAction(cmdManager->getAction(MI_Reframe3));
reframeSubMenu->addAction(cmdManager->getAction(MI_Reframe4)); reframeSubMenu->addAction(cmdManager->getAction(MI_Reframe4));
reframeSubMenu->addAction(
cmdManager->getAction(MI_ReframeWithEmptyInbetweens));
} }
menu.addMenu(reframeSubMenu); menu.addMenu(reframeSubMenu);

View file

@ -2052,6 +2052,8 @@ void ColumnArea::contextMenuEvent(QContextMenuEvent *event) {
reframeSubMenu->addAction(cmdManager->getAction(MI_Reframe2)); reframeSubMenu->addAction(cmdManager->getAction(MI_Reframe2));
reframeSubMenu->addAction(cmdManager->getAction(MI_Reframe3)); reframeSubMenu->addAction(cmdManager->getAction(MI_Reframe3));
reframeSubMenu->addAction(cmdManager->getAction(MI_Reframe4)); reframeSubMenu->addAction(cmdManager->getAction(MI_Reframe4));
reframeSubMenu->addAction(
cmdManager->getAction(MI_ReframeWithEmptyInbetweens));
} }
menu.addMenu(reframeSubMenu); menu.addMenu(reframeSubMenu);
menu.addAction(cmdManager->getAction(MI_AutoInputCellNumber)); menu.addAction(cmdManager->getAction(MI_AutoInputCellNumber));

View file

@ -849,7 +849,7 @@ void TXsheet::eachCells(int r0, int c0, int r1, int c1, int type) {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
/*! force cells order in n-steps. returns the row amount after process /*! force cells order in n-steps. returns the row amount after process
*/ */
int TXsheet::reframeCells(int r0, int r1, int col, int type) { int TXsheet::reframeCells(int r0, int r1, int col, int type, int withBlank) {
// Row amount in the selection // Row amount in the selection
int nr = r1 - r0 + 1; int nr = r1 - r0 + 1;
@ -864,11 +864,26 @@ int TXsheet::reframeCells(int r0, int r1, int col, int type) {
cells.push_back(getCell(CellPosition(r, col))); cells.push_back(getCell(CellPosition(r, col)));
} }
// if withBlank is greater than -1, remove empty cells from cell order
if (withBlank >= 0) {
auto itr = cells.begin();
while (itr != cells.end()) {
if ((*itr).isEmpty())
itr = cells.erase(itr);
else
itr++;
}
}
if (cells.empty()) return 0; if (cells.empty()) return 0;
// row amount after n-step // row amount after n-step
int nrows = cells.size() * type; int nrows = cells.size() * type;
if (withBlank > 0) {
nrows += cells.size() * withBlank * type;
}
// if needed, insert cells // if needed, insert cells
if (nr < nrows) { if (nr < nrows) {
insertCells(r1 + 1, col, nrows - nr); insertCells(r1 + 1, col, nrows - nr);
@ -886,6 +901,13 @@ int TXsheet::reframeCells(int r0, int r1, int col, int type) {
setCell(i + i1, col, cells[k]); setCell(i + i1, col, cells[k]);
} }
i += type; // dipende dal tipo di step (2 o 3 per ora) i += type; // dipende dal tipo di step (2 o 3 per ora)
if (withBlank > 0) {
for (int i1 = 0; i1 < withBlank * type; i1++) {
clearCells(i + i1, col);
}
i += withBlank * type;
}
} }
return nrows; // return row amount after process return nrows; // return row amount after process

View file

@ -4722,6 +4722,10 @@ Do you want to create it?</source>
<source>&amp;Command Bar</source> <source>&amp;Command Bar</source>
<translation> (&amp;C)</translation> <translation> (&amp;C)</translation>
</message> </message>
<message>
<source>Reframe with Empty Inbetweens...</source>
<translation>...</translation>
</message>
</context> </context>
<context> <context>
<name>MatchlinesDialog</name> <name>MatchlinesDialog</name>
@ -8342,6 +8346,45 @@ Are you sure?</source>
<source>Command Bar</source> <source>Command Bar</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Reframe to %1&apos;s with %2 blanks</source>
<translation> %1 %2</translation>
</message>
</context>
<context>
<name>ReframePopup</name>
<message>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
<source>Cancel</source>
<translation></translation>
</message>
<message>
<source>steps</source>
<translation></translation>
</message>
<message>
<source>with</source>
<translation></translation>
</message>
<message>
<source>(</source>
<translation>(</translation>
</message>
<message>
<source> blank cells will be inserted.)</source>
<translation>)</translation>
</message>
<message>
<source>Reframe with Empty Inbetweens</source>
<translation></translation>
</message>
<message>
<source>empty inbetweens</source>
<translation> </translation>
</message>
</context> </context>
<context> <context>
<name>RenameAsToonzPopup</name> <name>RenameAsToonzPopup</name>