From 68b03801a76f284df4c0ebd134092d266818f9ce Mon Sep 17 00:00:00 2001 From: shun-iwasawa Date: Mar 13 2023 02:39:27 +0000 Subject: modify reframe behavior by Contrail Co., Ltd. - improve consistency with QuickChecker --- diff --git "a/stuff/config/loc/\346\227\245\346\234\254\350\252\236/toonz.qm" "b/stuff/config/loc/\346\227\245\346\234\254\350\252\236/toonz.qm" index bf6f8db..4205309 100644 Binary files "a/stuff/config/loc/\346\227\245\346\234\254\350\252\236/toonz.qm" and "b/stuff/config/loc/\346\227\245\346\234\254\350\252\236/toonz.qm" differ diff --git a/toonz/sources/include/toonz/txsheet.h b/toonz/sources/include/toonz/txsheet.h index ae7dfbb..0df2b7f 100644 --- a/toonz/sources/include/toonz/txsheet.h +++ b/toonz/sources/include/toonz/txsheet.h @@ -429,8 +429,8 @@ frame duplication. // force cells order in n-steps. returns the row amount after process // 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); + // insert blank frames with step*withBlank length at each n-step. + int reframeCells(int r0, int r1, int col, int step, int withBlank = -1); /*! Exposes level \b \e xl in xsheet starting from cell identified by \b \e row and \b \e col. diff --git a/toonz/sources/toonz/cellselectioncommand.cpp b/toonz/sources/toonz/cellselectioncommand.cpp index 0d3a246..50e62c4 100644 --- a/toonz/sources/toonz/cellselectioncommand.cpp +++ b/toonz/sources/toonz/cellselectioncommand.cpp @@ -77,7 +77,7 @@ public: //----------------------------------------------------------------------------- void ReverseUndo::redo() const { - TCG_ASSERT(m_r1 >= m_r0 && m_c1 >= m_c0, return ); + TCG_ASSERT(m_r1 >= m_r0 && m_c1 >= m_c0, return); TApp::instance()->getCurrentXsheet()->getXsheet()->reverseCells(m_r0, m_c0, m_r1, m_c1); @@ -135,7 +135,7 @@ void SwingUndo::redo() const { //----------------------------------------------------------------------------- void SwingUndo::undo() const { - TCG_ASSERT(m_r1 >= m_r0 && m_c1 >= m_c0, return ); + TCG_ASSERT(m_r1 >= m_r0 && m_c1 >= m_c0, return); for (int c = m_c0; c <= m_c1; ++c) TApp::instance()->getCurrentXsheet()->getXsheet()->removeCells(m_r1 + 1, c, @@ -188,7 +188,7 @@ public: //----------------------------------------------------------------------------- void IncrementUndo::redo() const { - TCG_ASSERT(m_r1 >= m_r0 && m_c1 >= m_c0, return ); + TCG_ASSERT(m_r1 >= m_r0 && m_c1 >= m_c0, return); m_undoCells.clear(); m_ok = TApp::instance()->getCurrentXsheet()->getXsheet()->incrementCells( @@ -201,7 +201,7 @@ void IncrementUndo::redo() const { //----------------------------------------------------------------------------- void IncrementUndo::undo() const { - TCG_ASSERT(m_r1 >= m_r0 && m_c1 >= m_c0 && m_ok, return ); + TCG_ASSERT(m_r1 >= m_r0 && m_c1 >= m_c0 && m_ok, return); TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet(); @@ -276,7 +276,7 @@ public: RandomUndo::RandomUndo(int r0, int c0, int r1, int c1) : m_r0(r0), m_c0(c0), m_r1(r1), m_c1(c1) { - TCG_ASSERT(m_r1 >= m_r0 && m_c1 >= m_c0, return ); + TCG_ASSERT(m_r1 >= m_r0 && m_c1 >= m_c0, return); int r, rowCount = r1 - r0 + 1; std::vector> rndTable(rowCount); @@ -397,7 +397,7 @@ StepUndo::StepUndo(int r0, int c0, int r1, int c1, int step) //----------------------------------------------------------------------------- void StepUndo::redo() const { - TCG_ASSERT(m_rowsCount > 0 && m_colsCount > 0, return ); + TCG_ASSERT(m_rowsCount > 0 && m_colsCount > 0, return); TApp::instance()->getCurrentXsheet()->getXsheet()->stepCells(m_r0, m_c0, m_r1, m_c1, m_step); @@ -409,7 +409,7 @@ void StepUndo::redo() const { //----------------------------------------------------------------------------- void StepUndo::undo() const { - TCG_ASSERT(m_rowsCount > 0 && m_colsCount > 0 && m_cells, return ); + TCG_ASSERT(m_rowsCount > 0 && m_colsCount > 0 && m_cells, return); TApp *app = TApp::instance(); TXsheet *xsh = app->getCurrentXsheet()->getXsheet(); @@ -499,7 +499,7 @@ EachUndo::EachUndo(int r0, int c0, int r1, int c1, int each) //----------------------------------------------------------------------------- void EachUndo::redo() const { - TCG_ASSERT(m_rowsCount > 0 && m_colsCount > 0, return ); + TCG_ASSERT(m_rowsCount > 0 && m_colsCount > 0, return); TApp::instance()->getCurrentXsheet()->getXsheet()->eachCells(m_r0, m_c0, m_r1, m_c1, m_each); @@ -511,7 +511,7 @@ void EachUndo::redo() const { //----------------------------------------------------------------------------- void EachUndo::undo() const { - TCG_ASSERT(m_rowsCount > 0 && m_colsCount > 0 && m_cells, return ); + TCG_ASSERT(m_rowsCount > 0 && m_colsCount > 0 && m_cells, return); TApp *app = TApp::instance(); TXsheet *xsh = app->getCurrentXsheet()->getXsheet(); @@ -556,31 +556,35 @@ namespace { class ReframeUndo final : public TUndo { int m_r0, m_r1; - int m_type; - int m_nr; - int m_withBlank; - std::unique_ptr m_cells; + int m_step; -public: + std::vector m_orgRows; std::vector m_newRows; + int m_maximumRows; + int m_withBlank; + std::unique_ptr m_cells; std::vector m_columnIndeces; - ReframeUndo(int r0, int r1, std::vector columnIndeces, int type, +public: + ReframeUndo(int r0, int r1, std::vector columnIndeces, int step, int withBlank = -1); ~ReframeUndo(); void undo() const override; void redo() const override; + void onAdd() override; // run initial reframing + int maximumRows() { return m_maximumRows; } + bool isValid() { return !m_columnIndeces.empty(); } void repeat() const; int getSize() const override { return sizeof(*this); } 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_step)); else return QObject::tr("Reframe to %1's with %2 blanks") - .arg(QString::number(m_type)) + .arg(QString::number(m_step)) .arg(QString::number(m_withBlank)); } int getHistoryType() override { return HistoryType::Xsheet; } @@ -589,22 +593,48 @@ public: //----------------------------------------------------------------------------- ReframeUndo::ReframeUndo(int r0, int r1, std::vector columnIndeces, - int type, int withBlank) + int step, int withBlank) : m_r0(r0) , m_r1(r1) - , m_type(type) - , m_nr(0) + , m_step(step) , m_columnIndeces(columnIndeces) , m_withBlank(withBlank) { - m_nr = m_r1 - m_r0 + 1; - assert(m_nr > 0); - m_cells.reset(new TXshCell[m_nr * (int)m_columnIndeces.size()]); + TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet(); + + // check if columns are cell column and not empty + auto colItr = m_columnIndeces.begin(); + while (colItr != m_columnIndeces.end()) { + if (xsh->isColumnEmpty(*colItr) || + !xsh->getColumn(*colItr)->getCellColumn()) + colItr = m_columnIndeces.erase(colItr); + else + colItr++; + } + if (m_columnIndeces.empty()) return; + + int orgCellAmount = 0; + // if the bottom cells are followed by hold cells, include them as target rows + // for each column + for (auto colIndex : m_columnIndeces) { + int rTo = m_r1; + TXshCellColumn *column = xsh->getColumn(colIndex)->getCellColumn(); + int colLen0, colLen1; + column->getRange(colLen0, colLen1); + TXshCell tmpCell = column->getCell(m_r1); + while (rTo < colLen1) { + if (column->getCell(rTo + 1) != tmpCell) break; + rTo++; + } + int nr = rTo - m_r0 + 1; + m_orgRows.push_back(nr); + orgCellAmount += nr; + } + m_cells.reset(new TXshCell[orgCellAmount]); assert(m_cells); int k = 0; - for (int r = r0; r <= r1; r++) - for (int c = 0; c < (int)m_columnIndeces.size(); c++) - m_cells[k++] = TApp::instance()->getCurrentXsheet()->getXsheet()->getCell( - r, m_columnIndeces[c]); + for (int c = 0; c < (int)m_columnIndeces.size(); c++) + for (int r = r0; r < r0 + m_orgRows[c]; r++) + m_cells[k++] = xsh->getCell(r, m_columnIndeces[c]); m_newRows.clear(); } @@ -619,22 +649,23 @@ void ReframeUndo::undo() const { TApp *app = TApp::instance(); TXsheet *xsh = app->getCurrentXsheet()->getXsheet(); int rowCount = m_r1 - m_r0; - if (rowCount < 0 || m_columnIndeces.size() < 1) return; + if (rowCount < 0 || m_columnIndeces.empty()) return; for (int c = 0; c < m_columnIndeces.size(); c++) { /*-- コマンド後に縮んだカラムはその分引き伸ばす --*/ - if (m_newRows[c] < m_nr) + if (m_newRows[c] < m_orgRows[c]) xsh->insertCells(m_r0 + m_newRows[c], m_columnIndeces[c], - m_nr - m_newRows[c]); + m_orgRows[c] - m_newRows[c]); /*-- コマンド後に延びたカラムはその分縮める --*/ - else if (m_newRows[c] > m_nr) - xsh->removeCells(m_r1 + 1, m_columnIndeces[c], m_newRows[c] - m_nr); + else if (m_newRows[c] > m_orgRows[c]) + xsh->removeCells(m_r0 + m_orgRows[c], m_columnIndeces[c], + m_newRows[c] - m_orgRows[c]); } if (m_cells) { int k = 0; - for (int r = m_r0; r <= m_r1; r++) - for (int c = 0; c < m_columnIndeces.size(); c++) { + for (int c = 0; c < m_columnIndeces.size(); c++) + for (int r = m_r0; r < m_r0 + m_orgRows[c]; r++) { if (m_cells[k].isEmpty()) xsh->clearCells(r, m_columnIndeces[c]); else @@ -648,21 +679,89 @@ void ReframeUndo::undo() const { //----------------------------------------------------------------------------- void ReframeUndo::redo() const { - if (m_r1 - m_r0 < 0 || m_columnIndeces.size() < 1) return; + if (m_r1 - m_r0 < 0 || m_columnIndeces.empty()) return; TApp *app = TApp::instance(); for (int c = 0; c < m_columnIndeces.size(); c++) app->getCurrentXsheet()->getXsheet()->reframeCells( - m_r0, m_r1, m_columnIndeces[c], m_type, m_withBlank); + m_r0, m_r0 + m_orgRows[c] - 1, m_columnIndeces[c], m_step, m_withBlank); app->getCurrentXsheet()->notifyXsheetChanged(); } +//----------------------------------------------------------------------------- + +void ReframeUndo::onAdd() { + if (m_r1 - m_r0 < 0 || m_columnIndeces.empty()) return; + + TApp *app = TApp::instance(); + + m_maximumRows = 0; + + for (int c = 0; c < m_columnIndeces.size(); c++) { + int nrows = app->getCurrentXsheet()->getXsheet()->reframeCells( + m_r0, m_r0 + m_orgRows[c] - 1, m_columnIndeces[c], m_step, m_withBlank); + m_newRows.push_back(nrows); + m_maximumRows = std::max(m_maximumRows, nrows); + } + + app->getCurrentScene()->setDirtyFlag(true); + app->getCurrentXsheet()->notifyXsheetChanged(); +} //----------------------------------------------------------------------------- void ReframeUndo::repeat() const {} +//----------------------------------------------------------------------------- +// return true if +// 1) cells in the range contain at least one blank cell, OR +// 2) for each column in the col-range, all cells in the row-range are identical +bool hasBlankOrAllIdentical(const TXsheet *xsh, + const TCellSelection::Range &range) { + bool isIdentical = true; + for (int c = range.m_c0; c <= range.m_c1; c++) { + if (xsh->isColumnEmpty(c)) return true; + int colRange0, colRange1; + TXshCellColumn *column = xsh->getColumn(c)->getCellColumn(); + if (!column) return true; + column->getRange(colRange0, colRange1); + if (range.m_r0 > colRange1) return true; + + TXshCell cell = column->getCell(range.m_r0); + int rTo = std::min(range.m_r1, colRange1); + for (int r = range.m_r0; r <= rTo; r++) { + if (column->isCellEmpty(r)) return true; + if (isIdentical && cell != column->getCell(r)) isIdentical = false; + } + } + return isIdentical; +} + +//----------------------------------------------------------------------------- +// return true if +// 1) columns in the vector contain at least one blank cell, OR +// 2) for each column, all cells are identical +bool hasBlankOrAllIdentical(const TXsheet *xsh, + const std::vector &colIndices) { + bool isIdentical = true; + for (auto c : colIndices) { + if (xsh->isColumnEmpty(c)) return true; + int colRange0, colRange1; + TXshCellColumn *column = xsh->getColumn(c)->getCellColumn(); + if (!column) return true; + column->getRange(colRange0, colRange1); + // if the columns starts with blank cell, then return true + if (colRange0 != 0) return true; + TXshCell cell = column->getCell(colRange0); + for (int r = colRange0 + 1; r <= colRange1; r++) { + if (column->isCellEmpty(r)) return true; + if (isIdentical && cell != column->getCell(r)) isIdentical = false; + } + } + return isIdentical; +} + } // namespace //============================================================================= @@ -676,16 +775,13 @@ void TCellSelection::reframeCells(int count) { ReframeUndo *undo = new ReframeUndo(m_range.m_r0, m_range.m_r1, colIndeces, count); - 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, count); - undo->m_newRows.push_back(nrows); + if (!undo->isValid()) { + delete undo; + return; } + // reframing executed on adding undo TUndoManager::manager()->add(undo); - - TApp::instance()->getCurrentScene()->setDirtyFlag(true); - TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); } void TColumnSelection::reframeCells(int count) { @@ -700,16 +796,13 @@ void TColumnSelection::reframeCells(int count) { ReframeUndo *undo = new ReframeUndo(0, rowCount - 1, colIndeces, count); - for (int c = 0; c < (int)colIndeces.size(); c++) { - int nrows = TApp::instance()->getCurrentXsheet()->getXsheet()->reframeCells( - 0, rowCount - 1, colIndeces[c], count); - undo->m_newRows.push_back(nrows); + if (!undo->isValid()) { + delete undo; + return; } + // reframing executed on adding undo TUndoManager::manager()->add(undo); - - TApp::instance()->getCurrentScene()->setDirtyFlag(true); - TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); } //============================================================================= @@ -722,7 +815,17 @@ void TCellSelection::reframeWithEmptyInbetweens() { // destruction of m_reframePopup will be done along with the main window if (!m_reframePopup) m_reframePopup = new ReframePopup(); - int ret = m_reframePopup->exec(); + + // check if the reframe popup should show the "insert blank" field. + // The field will be hidden when; + // 1) selected cells contain blank cell, OR + // 2) for each column, all selected cells are identical + bool showInsertBlankField = !hasBlankOrAllIdentical( + TApp::instance()->getCurrentXsheet()->getXsheet(), m_range); + + m_reframePopup->showInsertBlankField(showInsertBlankField); + + int ret = m_reframePopup->exec(); if (ret == QDialog::Rejected) return; int step, blank; @@ -731,27 +834,17 @@ void TCellSelection::reframeWithEmptyInbetweens() { 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) { + if (!undo->isValid()) { delete undo; return; } + // reframing executed on adding undo 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(); + selectCells(m_range.m_r0, m_range.m_c0, + m_range.m_r0 + undo->maximumRows() - 1, m_range.m_c1); } void TColumnSelection::reframeWithEmptyInbetweens() { @@ -765,7 +858,17 @@ void TColumnSelection::reframeWithEmptyInbetweens() { colIndeces.push_back(*it); if (!m_reframePopup) m_reframePopup = new ReframePopup(); - int ret = m_reframePopup->exec(); + + // check if the reframe popup should show the "insert blank" field. + // The field will be hidden when; + // 1) selected columns contain blank cell, OR + // 2) for each column, all contained cells are identical + bool showInsertBlankField = !hasBlankOrAllIdentical( + TApp::instance()->getCurrentXsheet()->getXsheet(), colIndeces); + + m_reframePopup->showInsertBlankField(showInsertBlankField); + + int ret = m_reframePopup->exec(); if (ret == QDialog::Rejected) return; int step, blank; @@ -773,23 +876,13 @@ void TColumnSelection::reframeWithEmptyInbetweens() { 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) { + if (!undo->isValid()) { delete undo; return; } + // reframing executed on adding undo TUndoManager::manager()->add(undo); - - TApp::instance()->getCurrentScene()->setDirtyFlag(true); - TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); } //********************************************************************************* @@ -850,7 +943,7 @@ ResetStepUndo::ResetStepUndo(int r0, int c0, int r1, int c1) //----------------------------------------------------------------------------- void ResetStepUndo::redo() const { - TCG_ASSERT(m_rowsCount > 0 && m_colsCount > 0, return ); + TCG_ASSERT(m_rowsCount > 0 && m_colsCount > 0, return); TApp::instance()->getCurrentXsheet()->getXsheet()->resetStepCells(m_r0, m_c0, m_r1, m_c1); @@ -1299,9 +1392,8 @@ public: void undo() const override; int getSize() const override { - return sizeof *this + - (sizeof(TXshLevelP) + sizeof(TXshSimpleLevel *)) * - m_insertedLevels.size(); + return sizeof *this + (sizeof(TXshLevelP) + sizeof(TXshSimpleLevel *)) * + m_insertedLevels.size(); } QString getHistoryString() override { @@ -1531,8 +1623,7 @@ void CloneLevelUndo::cloneLevels() const { assert(lt->first && !lt->second.empty()); TXshSimpleLevel *srcSl = lt->first; - if (srcSl->getPath().isUneditable()) - continue; + if (srcSl->getPath().isUneditable()) continue; const TFilePath &srcPath = srcSl->getPath(); diff --git a/toonz/sources/toonz/reframepopup.cpp b/toonz/sources/toonz/reframepopup.cpp index 6b38f64..7a6e7be 100644 --- a/toonz/sources/toonz/reframepopup.cpp +++ b/toonz/sources/toonz/reframepopup.cpp @@ -22,10 +22,12 @@ ReframePopup::ReframePopup() m_step = new DVGui::IntLineEdit(this, 1, 1); m_blank = new DVGui::IntLineEdit(this, 0, 0); - m_blankCellCountLbl = new QLabel("0", this); + m_blankCellCountLbl = new QLabel("", this); - QPushButton* okBtn = new QPushButton(tr("OK"), this); - QPushButton* cancelBtn = new QPushButton(tr("Cancel"), this); + QPushButton* okBtn = new QPushButton(tr("OK"), this); + QPushButton* cancelBtn = new QPushButton(tr("Cancel"), this); + m_blankFieldContainer = new QWidget(this); + m_blankCellCountContainer = new QWidget(this); m_step->setObjectName("LargeSizedText"); m_blank->setObjectName("LargeSizedText"); @@ -34,12 +36,21 @@ ReframePopup::ReframePopup() mainLay->setMargin(0); mainLay->setSpacing(5); { + mainLay->addWidget(new QLabel(tr("Number of steps:"), this)); 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)); + mainLay->addWidget(new QLabel(tr("s"), this)); + + QHBoxLayout* blankLay = new QHBoxLayout(); + blankLay->setMargin(0); + blankLay->setSpacing(5); + { + blankLay->addSpacing(10); + blankLay->addWidget(new QLabel(tr("with"), this)); + blankLay->addWidget(m_blank); + blankLay->addWidget(new QLabel(tr("empty inbetweens"), this)); + } + m_blankFieldContainer->setLayout(blankLay); + mainLay->addWidget(m_blankFieldContainer, 0); } m_topLayout->addLayout(mainLay); @@ -47,11 +58,10 @@ ReframePopup::ReframePopup() 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); + m_blankCellCountContainer->setLayout(textLay); + m_topLayout->addWidget(m_blankCellCountContainer, 0); // buttons m_buttonLayout->addWidget(okBtn); @@ -60,9 +70,9 @@ ReframePopup::ReframePopup() // signal-slot connections bool ret = true; ret = ret && connect(m_step, SIGNAL(editingFinished()), this, - SLOT(updateBlankCellCount())); + SLOT(updateBlankCellCount())); ret = ret && connect(m_blank, SIGNAL(editingFinished()), this, - SLOT(updateBlankCellCount())); + SLOT(updateBlankCellCount())); ret = ret && connect(okBtn, SIGNAL(clicked()), this, SLOT(accept())); ret = ret && connect(cancelBtn, SIGNAL(clicked()), this, SLOT(reject())); assert(ret); @@ -72,16 +82,29 @@ ReframePopup::ReframePopup() void ReframePopup::updateBlankCellCount() { int blankCellCount = m_step->getValue() * m_blank->getValue(); - m_blankCellCountLbl->setText(QString::number(blankCellCount)); + m_blankCellCountLbl->setText(tr("(%1 blank cells will be inserted.)") + .arg(QString::number(blankCellCount))); + m_blankCellCountContainer->setVisible(m_blankFieldContainer->isVisible() && + blankCellCount != 0); } //----------------------------------------------------------------------------- void ReframePopup::getValues(int& step, int& blank) { step = m_step->getValue(); - blank = m_blank->getValue(); + blank = (m_blankFieldContainer->isVisibleTo(this)) ? m_blank->getValue() : -1; } //----------------------------------------------------------------------------- -void ReframePopup::showEvent(QShowEvent* event) { m_step->selectAll(); } \ No newline at end of file +void ReframePopup::showInsertBlankField(bool show) { + m_blankFieldContainer->setVisible(show); + m_blankCellCountContainer->setVisible(show); +} + +//----------------------------------------------------------------------------- + +void ReframePopup::showEvent(QShowEvent* event) { + updateBlankCellCount(); + m_step->selectAll(); +} \ No newline at end of file diff --git a/toonz/sources/toonz/reframepopup.h b/toonz/sources/toonz/reframepopup.h index 040541b..6fda4d4 100644 --- a/toonz/sources/toonz/reframepopup.h +++ b/toonz/sources/toonz/reframepopup.h @@ -26,11 +26,13 @@ class ReframePopup final : public DVGui::Dialog { Q_OBJECT DVGui::IntLineEdit *m_step, *m_blank; + QWidget *m_blankFieldContainer, *m_blankCellCountContainer; QLabel* m_blankCellCountLbl; public: ReframePopup(); void getValues(int& step, int& blank); + void showInsertBlankField(bool show); protected: void showEvent(QShowEvent* event) override; diff --git a/toonz/sources/toonzlib/txsheet.cpp b/toonz/sources/toonzlib/txsheet.cpp index 1103bc2..4484322 100644 --- a/toonz/sources/toonzlib/txsheet.cpp +++ b/toonz/sources/toonzlib/txsheet.cpp @@ -870,7 +870,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 */ -int TXsheet::reframeCells(int r0, int r1, int col, int type, int withBlank) { +int TXsheet::reframeCells(int r0, int r1, int col, int step, int withBlank) { // Row amount in the selection int nr = r1 - r0 + 1; @@ -899,10 +899,10 @@ int TXsheet::reframeCells(int r0, int r1, int col, int type, int withBlank) { if (cells.empty()) return 0; // row amount after n-step - int nrows = cells.size() * type; + int nrows = cells.size() * step; if (withBlank > 0) { - nrows += cells.size() * withBlank * type; + nrows += cells.size() * withBlank * step; } // if needed, insert cells @@ -915,19 +915,19 @@ int TXsheet::reframeCells(int r0, int r1, int col, int type, int withBlank) { } for (int i = r0, k = 0; i < r0 + nrows; k++) { - for (int i1 = 0; i1 < type; i1++) { + for (int i1 = 0; i1 < step; i1++) { if (cells[k].isEmpty()) clearCells(i + i1, col); else setCell(i + i1, col, cells[k]); } - i += type; // dipende dal tipo di step (2 o 3 per ora) + i += step; // dipende dal tipo di step (2 o 3 per ora) if (withBlank > 0) { - for (int i1 = 0; i1 < withBlank * type; i1++) { + for (int i1 = 0; i1 < withBlank * step; i1++) { clearCells(i + i1, col); } - i += withBlank * type; + i += withBlank * step; } } diff --git a/toonz/sources/translations/japanese/toonz.ts b/toonz/sources/translations/japanese/toonz.ts index 31d4ecd..b0af635 100644 --- a/toonz/sources/translations/japanese/toonz.ts +++ b/toonz/sources/translations/japanese/toonz.ts @@ -137,7 +137,7 @@ The microphone is not available: Please select a different device or check the microphone. - マイクが使用できません: + マイクが使用できません: 別のデバイスを選択するか、マイクを確認して下さい。 @@ -238,6 +238,26 @@ Nearest format will be internally used. 音声形式が非対応です: 最も近い形式が内部で使用されます。 + + 192000 Hz + 96kHz {192000 ?} + + + Mono 24-Bits + モノラル16ビット {24-?} + + + Stereo 24-Bits + ステレオ16ビット {24-?} + + + Mono 32-Bits + モノラル16ビット {32-?} + + + Stereo 32-Bits + ステレオ16ビット {32-?} + AutoInputCellNumberPopup @@ -473,6 +493,81 @@ Please choose a valid lip sync data file to continue. + BaseViewerPanel + + GUI Show / Hide + GUI 表示/非表示 + + + Playback Toolbar + 再生コントロール + + + Frame Slider + フレームスライダ + + + Safe Area (Right Click to Select) + セーフエリア (右クリックで選択) + + + Field Guide + フィールドガイド + + + Camera Stand View + カメラスタンド表示 + + + 3D View + 3D表示 + + + Camera View + カメラ表示 + + + Freeze + フリーズ + + + Preview + プレビュー + + + Sub-camera Preview + サブカメラプレビュー + + + Untitled + 名称未設定 + + + Scene: + シーン: + + + :: Frame: + ::フレーム: + + + :: Zoom : + ::ズーム: + + + (Flipped) + + + + :: Level: + ::レベル: + + + Level: + レベル: + + + BatchServersViewer Process with: @@ -777,6 +872,13 @@ Stop it or wait for its completion before removing it. + CameraTrackPreviewArea + + Fit To Window + ウィンドウに全体を表示 + + + Canon AC Power @@ -1422,27 +1524,27 @@ What do you want to do? ComboViewerPanel Safe Area (Right Click to Select) - セーフエリア (右クリックで選択) + セーフエリア (右クリックで選択) Field Guide - フィールドガイド + フィールドガイド Camera Stand View - カメラスタンド表示 + カメラスタンド表示 3D View - 3D表示 + 3D表示 Camera View - カメラ表示 + カメラ表示 Freeze - フリーズ + フリーズ GUI Show / Hide @@ -1458,39 +1560,39 @@ What do you want to do? Console - コンソール + コンソール Preview - プレビュー + プレビュー Sub-camera Preview - サブカメラプレビュー + サブカメラプレビュー Untitled - 名称未設定 + 名称未設定 Scene: - シーン: + シーン: :: Frame: - ::フレーム: + ::フレーム: :: Level: - ::レベル: + ::レベル: Level: - レベル: + レベル: (Flipped) - (反転表示) + (反転表示) :: Project: @@ -1504,6 +1606,14 @@ What do you want to do? [LEVEL]: [レベル]: + + Playback Toolbar + 再生コントロール + + + Frame Slider + フレームスライダ + CommandBar @@ -1580,6 +1690,131 @@ What do you want to do? + ConvertFolderPopup + + Level %1 already exists; skipped. + + + + + Failed to remove existing level %1; skipped. + + + + + Converting level %1 of %2: %3 + %1 / %2 レベルを変換中: %3 + + + Convert aborted. + + + + + Level %1 has no frame; skipped. + レベル %1 はフレームがありません。スキップしました。 + + + Convert TZP In Folder + + + + Convert + 変換 + + + Cancel + キャンセル + + + Skip Existing Files + 既存ファイルを飛ばす + + + Apply to Subfolder + + + + Convert TZP in Folder + + + + Folder to convert: + + + + [SKIP] + + + + [OVERWRITE] + + + + Target folder is not specified. + + + + No files will be converted. + + + + Cofirmation + + + + Converting %1 files. Are you sure? + + + + Convert TZP in folder + + + + + Target Folder: %1 + + + + + Skip Existing Files: %1 + + + + + Apply to Subfolder: %1 + + + + + Approx. levels to be converted: %1 + + + + + + Started: + + + + Convert aborted: + + + + Convert completed: + + + + %1 level(s) done, %2 level(s) skipped with %3 error(s). + + + + + Ended: + + + + ConvertPopup Convert @@ -1850,6 +2085,158 @@ contain the dpi information, then the current camera dpi will be used. + ConvertResultPopup + + Save log file.. + + + + Close + 閉じる + + + Do you want to save the log? + + + + + CrashHandler + + <b>OpenToonz crashed unexpectedly.</b> + + + + A crash report has been generated. + + + + To report, click 'Open Issue Webpage' to access OpenToonz's Issues page on GitHub. + + + + Click on the 'New issue' button and fill out the form. + + + + System Configuration and Problem Details: + + + + Copy to Clipboard + + + + Open Issue Webpage + + + + Open Reports Folder + + + + Close Application + + + + OpenToonz crashed! + + + + Application is in unstable state and must be restarted. + + + + Resuming is not recommended and may lead to an unrecoverable crash. + + + + Ignore advice and try to resume program? + + + + Ignore crash? + + + + + CustomPanelEditorPopup + + Template folder %1 not found. + + + + Template files not found. + + + + %1 (Edit) + + + + Button + + + + Scroller + + + + Please input the panel name. + + + + The custom panel %1 already exists. Do you want to overwrite? + + + + Overwrite + + + + Cancel + キャンセル + + + Failed to create folder. + + + + Failed to open the template. + + + + Failed to open the file for writing. + + + + Custom Panel Editor + + + + Command List + + + + Register + + + + Template: + テンプレート: + + + Panel name: + + + + + CustomPanelUIField + + Drag and set command + + + + DVGui::ProgressDialog Loading "%1"... @@ -2012,120 +2399,270 @@ contain the dpi information, then the current camera dpi will be used. 更新中... - There was an error copying %1 to %2 - %2 に %1 をコピーする時、エラーが発生しました + There was an error copying %1 to %2 + %2 に %1 をコピーする時、エラーが発生しました + + + The local path does not exist: + ローカルパスは存在しません: + + + + DvItemViewerButtonBar + + Up One Level + 上のフォルダに戻る + + + New Folder + 新規フォルダ + + + Thumbnails View + サムネイル表示 + + + List View + リスト表示 + + + Back + 戻る + + + Forward + 進む + + + Icons View + アイコン表示 + + + Export File List + ファイルリストをエクスポート + + + Up + 上へ + + + New + 新規フォルダ + + + Icon + アイコン表示 + + + List + リスト表示 + + + + DvItemViewerPanel + + Save File List + ファイルリストを保存 + + + File List (*.csv) + ファイルリスト (*.csv) + + + + DvTopBar + + File + ファイル + + + Edit + 編集 + + + Scan && Cleanup + スキャン&&トレース + + + Level + レベル + + + Xsheet + タイムシート + + + Cells + セル + + + View + 表示 + + + Windows + ウィンドウ + + + Scan + スキャン + + + + ExportCalibrationFilePopup + + Export Camera Calibration Settings + カメラキャリブレーション設定の書き出し + + + + ExportCameraTrackPopup + + Export Camera Track + + + + Draw On Keyframes + + + + Draw On Navigation Tags + + + + Top Left + + + + Top Right + + + + Center + + + + Bottom Left + + + + Bottom Right + + + + Draw Numbers On Track Line + + + + Export + 書き出し + + + Cancel + キャンセル - The local path does not exist: - ローカルパスは存在しません: + Specify frame numbers where the camera rectangles will be drawn. Separate numbers by comma "," . + - - - DvItemViewerButtonBar - Up One Level - 上のフォルダに戻る + None + - New Folder - 新規フォルダ + All frames + - Thumbnails View - サムネイル表示 + Every 2 frames + - List View - リスト表示 + Every 3 frames + - Back - 戻る + Every 4 frames + - Forward - 進む + Every 5 frames + - Icons View - アイコン表示 + Every 6 frames + - Export File List - ファイルリストをエクスポート + Every 8 frames + - Up - 上へ + Every 10 frames + - New - 新規フォルダ + Every 12 frames + - Icon - アイコン表示 + Target Column: + - List - リスト表示 + Background: + - - - DvItemViewerPanel - Save File List - ファイルリストを保存 + Line Color: + - File List (*.csv) - ファイルリスト (*.csv) + Camera Rectangles + - - - DvTopBar - File - ファイル + Specify Frames Manually: + - Edit - 編集 + Track Lines + - Scan && Cleanup - スキャン&&トレース + Graduation Marks Interval: + - Level - レベル + Frame Numbers + - Xsheet - タイムシート + Camera Rect Corner: + - Cells - セル + Font Family: + - View - 表示 + Font Size: + - Windows - ウィンドウ + Col %1 (%2) + - Scan - スキャン + Please specify one of the following file formats; jpg, jpeg, bmp, png, and tif + - ExportCalibrationFilePopup + ExportCurrentSceneCommandHandler - Export Camera Calibration Settings - カメラキャリブレーション設定の書き出し + You must save the current scene first. + @@ -2250,6 +2787,47 @@ contain the dpi information, then the current camera dpi will be used. + ExportOCACommand + + Save Images in EXR Format + + + + Rasterize Vectors + + + + Frame Offset: + + + + Checked: Images are saved as EXR +Unchecked: Images are saved as PNG + + + + Checked: Rasterize into EXR/PNG +Unchecked: Vectors are saved as SVG + + + + Starting Frame Offset + + + + Hide + + + + Exporting... + + + + Starting... + + + + ExportPanel Export @@ -2318,6 +2896,14 @@ contain the dpi information, then the current camera dpi will be used. The project name you specified is already used. 指定されたプロジェクト名はすでに使用中です:別の名前を指定してください。 + + Create In: + + + + Project '%1' already exists + プロジェクト '%1' は、既に存在します + ExportXDTSCommand @@ -2566,6 +3152,10 @@ Do you want to create it? Inbetween mark 2: 中割り記号 2: + + Frame length: + + ExpressionReferenceManager @@ -2997,6 +3587,10 @@ Do you want to overwrite it? ファイル %1 は、既に存在します。 上書きしてもよろしいですか? + + Gamma : %1 + + FlipbookPanel @@ -3617,6 +4211,10 @@ Do you want to create it? Another Level Type その他のレベル形式 + + Color Space Gamma: + + LineTestCapturePane @@ -3960,7 +4558,7 @@ Please use the frame numbers for reference. TLV Caching Behavior - TLV画像データのキャッシュ + TLV画像データのキャッシュ Load Subsequence Level @@ -4026,6 +4624,10 @@ Please use the frame numbers for reference. Subsampling: 離散サンプリング: + + Raster Level Caching Behavior + + LoadScenePopup @@ -5972,7 +6574,7 @@ Please use the frame numbers for reference. Reframe with Empty Inbetweens... - 空コマを入れてリフレーム... + コマ打ちの変更... &Toggle Edit In Place @@ -6792,6 +7394,130 @@ or you may delete necessary files for it. Set Cell Mark コママークをセット + + Reset rooms to their default? + + + + All user rooms will be lost! + + + + Reset Rooms + + + + You must restart OpenToonz, close it now? + + + + &Convert TZP Files In Folder... + + + + Export Open Cel Animation (OCA) + + + + &Export Current Scene + + + + &Export Camera Track + + + + Toggle Navigation Tag + + + + Next Tag + + + + Previous Tag + + + + Edit Tag + + + + Remove Tags + + + + Toggle Blank Frames + + + + Toggle Viewer Preview + + + + Toggle Viewer Sub-camera Preview + + + + &Preproduction Board + + + + Toggle Main Window's See Through Mode + + + + &Custom Panels + + + + &Custom Panel Editor... + + + + &Viewer Histogram + + + + Paint Brush - Next Mode + + + + Paint Brush - Areas + + + + Paint Brush - Lines + + + + Paint Brush - Lines & Areas + + + + Fill Tool - Pick+Freehand + + + + Type - Pick+Freehand + + + + Flip Selection/Object Horizontally + + + + Flip Selection/Object Vertically + + + + Rotate Selection/Object Left + + + + Rotate Selection/Object Right + + MatchlinesDialog @@ -7073,6 +7799,85 @@ What do you want to do? + NavTagEditorPopup + + Edit Tag + + + + Frame %1 Label: + + + + Magenta + + + + Red + + + + Green + + + + Blue + + + + Yellow + + + + Cyan + + + + White + + + + Dark Magenta + + + + Dark Red + + + + Dark Green + + + + Dark Blue + + + + Dark Yellow + + + + Dark Cyan + + + + Dark Gray + + + + Color: + + + + Ok + OK + + + Cancel + キャンセル + + + OutputSettingsPopup Save in: @@ -7399,7 +8204,7 @@ The parameters to be saved are: - File options - Resample Balance - Channel width - 現在の出力設定を保存します。 + 現在の出力設定を保存します。 プリセットには以下の値が保存されます: - カメラ設定 - 保存先となるプロジェクトフォルダ @@ -7432,6 +8237,57 @@ The parameters to be saved are: (linked to Scene Settings) (シーン設定) + + Save current output settings. +The parameters to be saved are: +- Camera settings +- Project folder to be saved in +- File format +- File options +- Resample Balance +- Channel width +- Linear Color Space +- Color Space Gamma + + + + Color + + + + Color Settings + + + + Sync with Output Settings + + + + 32 bit Floating point + + + + On rendering, color values will be temporarily converted to linear light from nonlinear RGB values by using color space gamma. + + + + Color Space Gamma value is used for conversion between the linear and nonlinear color spaces, +when the "Linear Color Space" option is enabled. + + + + +Input less than 1.0 to sync the value with the output settings. + + + + Linear Color Space: + + + + Color Space Gamma: + + OverwriteDialog @@ -7884,24 +8740,57 @@ WARNING : Image size mismatch. The saved image size is %1 x %2. カメラキャリブレーションについての説明(Readme.txt)を開く... - Failed to save calibration settings. - キャリブレーション設定の保存に失敗しました。 + Failed to save calibration settings. + キャリブレーション設定の保存に失敗しました。 + + + Do you want to restart camera calibration? + カメラキャリブレーションをやり直しますか? + + + Couldn't load %1 + %1 を読み込めませんでした + + + Overwriting the current calibration. Are you sure? + 現在のキャリブレーション設定が上書きされます。よろしいですか? + + + Couldn't save %1 + %1 を保存できませんでした + + + DPI:Auto + + + + Size + サイズ + + + Position + - Do you want to restart camera calibration? - カメラキャリブレーションをやり直しますか? + DPI:%1 + - Couldn't load %1 - %1 を読み込めませんでした + This option specifies DPI for newly created levels. +Adding frames to the existing level won't refer to this value. +Auto: If the subcamera is not active, apply the current camera dpi. + If the subcamera is active, compute the dpi so that + the image will fit to the camera frame. +Custom : Always use the custom dpi specified here. + - Overwriting the current calibration. Are you sure? - 現在のキャリブレーション設定が上書きされます。よろしいですか? + Auto + - Couldn't save %1 - %1 を保存できませんでした + Custom + カスタム @@ -8784,7 +9673,7 @@ Is it OK to release these shortcuts? Default TLV Caching Behavior: - TLV画像データのキャッシュ(既定値): + TLV画像データのキャッシュ(既定値): Column Icon: @@ -8856,7 +9745,7 @@ Is it OK to release these shortcuts? Show Current Time Indicator (Timeline Mode only) - フレームインジケータを表示する (タイムライン表示のみ) + フレームインジケータを表示する (タイムライン表示のみ) Project Folder Aliases (+drawings, +scenes, etc.) @@ -9281,6 +10170,50 @@ but a random crash might occur, use at your own risk. Show Column Parent's Color in the Xsheet 列の親オブジェクトの表示色を種類ごとに変える + + Raster Level Caching Behavior: + + + + Highlight Line Every Second + + + + Show Current Time Indicator + + + + Triangle Top Left + + + + Triangle Top Right + + + + Triangle Bottom Left + + + + Triangle Bottom Right + + + + Triangle Up + + + + Triangle Down + + + + Triangle Left + + + + Triangle Right + + PreferencesPopup::AdditionalStyleEdit @@ -10119,7 +11052,7 @@ What do you want to do? The rooms will be reset the next time you run Toonz. - Toonzを次回起動するとき、ワークスペースが初期化されます。 + Toonzを次回起動するとき、ワークスペースが初期化されます。 Saving previewed frames.... @@ -10131,7 +11064,7 @@ What do you want to do? Change project - プロジェクトを変更 + プロジェクトを変更 It is not possible to delete the selection. @@ -11972,6 +12905,61 @@ Do you wish to continue loading the last good save or stop and try to salvage th Target column 対象の列 + + Export Camera Track Image + + + + Save log text + + + + The log file already exists. + Do you want to overwrite it? + + + + [Drag&Drop] to set command to control in the custom panel + + + + Layer: + + + + Export Open Cel Animation (OCA) + + + + %1 has been exported successfully. + + + + Loading Raster Images To Cache... + + + + Can't paste full raster data on a non full raster level. + + + + Preproduction Board + + + + Pasting external image from clipboard. + +What do you want to do? + + + + New raster level + + + + The rooms will be reset the next time you run OpenToonz. + + ReframePopup @@ -11985,7 +12973,7 @@ Do you wish to continue loading the last good save or stop and try to salvage th steps - コマ + コマ with @@ -11993,19 +12981,31 @@ Do you wish to continue loading the last good save or stop and try to salvage th ( - ( + ( blank cells will be inserted.) - コマの空コマが挿入されます。) + コマの空コマが挿入されます。) Reframe with Empty Inbetweens - 空コマを入れてリフレーム + コマ打ちの変更 empty inbetweens - + + + + Number of steps: + コマ打ち数: + + + s + コマ + + + (%1 blank cells will be inserted.) + (%1コマの空コマが挿入されます。) @@ -13029,6 +14029,13 @@ Please commit or revert changes first. + SaveLogTxtPopup + + Failed to open the file %1 + + + + SavePaletteAsPopup Save Palette @@ -13169,6 +14176,172 @@ Please commit or revert changes first. + SceneBrowser + + Some files that you want to edit are currently opened. Close them first. + いくつかのファイルが開いています。編集を行う前にファイルを閉じて下さい。 + + + Some files that you want to unlock are currently opened. Close them first. + いくつかのファイルが開いています。ロック解除の前にファイルを閉じて下さい。 + + + Folder: + フォルダ: + + + Open folder failed + フォルダを開けませんでした + + + The input folder path was invalid. + 入力されたフォルダパスは無効です。 + + + Can't change file extension + ファイル拡張子を変更できません + + + Can't set a drawing number + 動画番号を設定できません + + + Can't rename. File already exists: + リネームできません。ファイルが既に存在します: + + + Couldn't rename + リネームできませんでした + + + Load As Sub-xsheet + サブシーンとして読み込み + + + Load + + + + Rename + リネーム + + + Convert to Painted TLV + 彩色済TLVファイルに変換 + + + Convert to Unpainted TLV + 線画TLVファイルに変換 + + + Version Control + バージョン管理 + + + Edit + 編集 + + + Edit Frame Range... + フレーム範囲を編集... + + + Put... + 置き換え... + + + Revert + 復帰 + + + Get + + + + Delete + 削除 + + + Get Revision... + 改訂版を受け取る... + + + Unlock + + + + Edit Info + 編集情報 + + + Revision History... + 改訂履歴... + + + Unlock Frame Range + フレーム範囲のロックを解除 + + + Save Scene + シーンを保存 + + + Scene name: + シーン名: + + + There was an error copying %1 to %2 + + + + Convert To Unpainted Tlv + 線画TLVファイルに変換 + + + Warning: level %1 already exists; overwrite? + 警告:レベル %1 は既に存在します。上書きしますか? + + + Yes + はい + + + No + + + + Done: All Levels converted to TLV Format + 完了:すべてのレベルがTLV形式に変換されました + + + Convert To Painted Tlv + 彩色済TLVファイルに変換 + + + Done: 2 Levels converted to TLV Format + 完了:2つのレベルがTLV形式に変換されました + + + New Folder + 新規フォルダ + + + It is not possible to create the %1 folder. + %1 フォルダを作成できません。 + + + + SceneBrowserButtonBar + + Create new scene + + + + Create scene + + + + SceneSettingsPopup Scene Settings @@ -13378,63 +14551,63 @@ Please commit or revert changes first. SceneViewerPanel Preview - プレビュー + プレビュー Sub-camera Preview - サブカメラプレビュー + サブカメラプレビュー Untitled - 名称未設定 + 名称未設定 Scene: - シーン: + シーン: :: Frame: - ::フレーム: + ::フレーム: :: Level: - ::レベル: + ::レベル: Level: - レベル: + レベル: Freeze - フリーズ + フリーズ Camera Stand View - カメラスタンド表示 + カメラスタンド表示 3D View - 3D表示 + 3D表示 Camera View - カメラ表示 + カメラ表示 :: Zoom : - ::ズーム: + ::ズーム: Safe Area (Right Click to Select) - セーフエリア (右クリックで選択) + セーフエリア (右クリックで選択) Field Guide - フィールドガイド + フィールドガイド (Flipped) - (反転表示) + (反転表示) :: Project: @@ -13450,15 +14623,15 @@ Please commit or revert changes first. GUI Show / Hide - GUI 表示/非表示 + GUI 表示/非表示 Playback Toolbar - 再生コントロール + 再生コントロール Frame Slider - フレームスライダ + フレームスライダ @@ -13852,6 +15025,10 @@ Please commit or revert changes first. Cell Mark コママーク + + SubMenu Commands + + ShortcutViewer @@ -14225,6 +15402,22 @@ Possibly the preset file has been corrupted Failed to create the folder. フォルダの作成に失敗しました。 + + Open Project... + + + + Explore Folder + + + + Open Existing Scene + + + + New Scene + 新規シーン + StopMotion @@ -14869,6 +16062,33 @@ BackSpace キー = フレーム削除 + SubCameraButton + + Save Current Subcamera + + + + Delete Preset + + + + Delete %1 + + + + Overwriting the existing subcamera preset. Are you sure? + + + + Question + + + + Deleting the subcamera preset %1. Are you sure? + + + + SubSheetBar Sub-scene controls: @@ -14927,6 +16147,21 @@ Click the arrow button to create a new sub-xsheet + TPanelTitleBarButtonForPreview + + Current frame + + + + All preview range frames + + + + Selected cells - Auto play + + + + TaskSheet Name: @@ -16118,6 +17353,18 @@ Hold F3 Key on the Viewer to Show This Frame Only Click to Move Shift & Trace Marker [クリック] ライトテーブルマーカーを移動 + + Tag: %1 + + + + Tags + + + + Frame %1 + + XsheetGUI::SoundColumnPopup