| |
| |
| #include "toonz/txshlevelcolumn.h" |
| #include "toonz/txshsimplelevel.h" |
| #include "toonz/txshcell.h" |
| #include "toonz/tcolumnfxset.h" |
| #include "toonz/tcolumnfx.h" |
| #include "toonz/txshleveltypes.h" |
| |
| #include "tstream.h" |
| |
| |
| |
| namespace |
| { |
| TFrameId qstringToFrameId(QString str) |
| { |
| if (str.isEmpty() || str == "-1") |
| return TFrameId::EMPTY_FRAME; |
| else if (str == "-" || str == "-2") |
| return TFrameId::NO_FRAME; |
| TFrameId fid; |
| int s = 0; |
| QString number; |
| char letter(0); |
| for (s = 0; s < str.size(); s++) { |
| QChar c = str.at(s); |
| if (c.isNumber()) |
| number.append(c); |
| #if QT_VERSION >= 0x050500 |
| else |
| letter = c.toLatin1(); |
| #else |
| else |
| letter = c.toAscii(); |
| #endif |
| } |
| return TFrameId(number.toInt(), letter); |
| } |
| } |
| |
| |
| |
| |
| |
| |
| TXshLevelColumn::TXshLevelColumn() |
| : m_fx(new TLevelColumnFx()) |
| |
| , |
| m_iconVisible(false) |
| { |
| |
| m_fx->addRef(); |
| m_fx->setColumn(this); |
| } |
| |
| |
| |
| TXshLevelColumn::~TXshLevelColumn() |
| { |
| m_fx->setColumn(0); |
| m_fx->release(); |
| m_fx = 0; |
| } |
| |
| |
| |
| TXshColumn::ColumnType TXshLevelColumn::getColumnType() const |
| { |
| return eLevelType; |
| } |
| |
| |
| |
| bool TXshLevelColumn::canSetCell(const TXshCell &cell) const |
| { |
| if (cell.isEmpty()) |
| return true; |
| |
| TXshSimpleLevel *sl = cell.getSimpleLevel(); |
| if (sl) |
| return (sl->getType() & LEVELCOLUMN_XSHLEVEL); |
| |
| return cell.getChildLevel(); |
| } |
| |
| |
| |
| TLevelColumnFx *TXshLevelColumn::getLevelColumnFx() const |
| { |
| return m_fx; |
| } |
| |
| |
| |
| TFx *TXshLevelColumn::getFx() const |
| { |
| return m_fx; |
| } |
| |
| |
| |
| TXshColumn *TXshLevelColumn::clone() const |
| { |
| TXshLevelColumn *column = new TXshLevelColumn; |
| column->setStatusWord(getStatusWord()); |
| column->setOpacity(getOpacity()); |
| column->m_cells = m_cells; |
| column->m_first = m_first; |
| |
| |
| return column; |
| } |
| |
| |
| |
| void TXshLevelColumn::loadData(TIStream &is) |
| { |
| string tagName; |
| while (is.openChild(tagName)) { |
| if (tagName == "status") { |
| int status; |
| is >> status; |
| setStatusWord(status); |
| if (status & eCamstandTransparent43) { |
| setOpacity(128); |
| status = status & ~eCamstandTransparent43; |
| } |
| } else if (tagName == "camerastand_opacity") { |
| int opacity; |
| is >> opacity; |
| setOpacity((UCHAR)opacity); |
| } else if (tagName == "cells") { |
| while (is.openChild(tagName)) { |
| if (tagName == "cell") { |
| TPersist *p = 0; |
| QString str; |
| int row = 1, rowCount = 1, increment = 0; |
| TFilePath path; |
| is >> row >> rowCount >> p >> str >> increment; |
| TFrameId fid = qstringToFrameId(str); |
| assert((fid.getLetter() == 0 && rowCount >= 0) || (fid.getLetter() != 0 && rowCount == 1)); |
| TXshLevel *xshLevel = dynamic_cast<TXshLevel *>(p); |
| if (xshLevel) { |
| int fidNumber = fid.getNumber(); |
| for (int i = 0; i < rowCount; i++) { |
| TXshCell cell(xshLevel, fid); |
| setCell(row++, cell); |
| |
| fidNumber += increment; |
| fid = TFrameId(fidNumber); |
| } |
| } |
| } else |
| throw TException("TXshLevelColumn, unknown tag(2): " + tagName); |
| is.closeChild(); |
| } |
| } else if (tagName == "fx") { |
| TPersist *p = 0; |
| is >> p; |
| if (TLevelColumnFx *lcf = dynamic_cast<TLevelColumnFx *>(p)) { |
| lcf->addRef(); |
| if (m_fx) |
| m_fx->release(); |
| m_fx = lcf; |
| lcf->setColumn(this); |
| } |
| } else if (tagName == "fxnodes") |
| { |
| TFxSet fxSet; |
| fxSet.loadData(is); |
| } else { |
| throw TException("TXshLevelColumn, unknown tag: " + tagName); |
| } |
| is.closeChild(); |
| } |
| } |
| |
| |
| |
| void TXshLevelColumn::saveData(TOStream &os) |
| { |
| os.child("status") << getStatusWord(); |
| if (getOpacity() < 255) |
| os.child("camerastand_opacity") << (int)getOpacity(); |
| int r0, r1; |
| if (getRange(r0, r1)) { |
| os.openChild("cells"); |
| for (int r = r0; r <= r1; r++) { |
| TXshCell cell = getCell(r); |
| if (cell.isEmpty()) |
| continue; |
| TFrameId fid = cell.m_frameId; |
| int n = 1, inc = 0, dr = fid.getNumber(); |
| |
| if (r < r1 && fid.getLetter() == 0) { |
| TXshCell cell2 = getCell(r + 1); |
| TFrameId fid2 = cell2.m_frameId; |
| if (cell2.m_level.getPointer() == cell.m_level.getPointer() && fid2.getLetter() == 0) { |
| inc = cell2.m_frameId.getNumber() - dr; |
| n++; |
| for (;;) { |
| if (r + n > r1) |
| break; |
| cell2 = getCell(r + n); |
| TFrameId fid2 = cell2.m_frameId; |
| if (cell2.m_level.getPointer() != cell.m_level.getPointer() || fid2.getLetter() != 0) |
| break; |
| if (fid2.getNumber() != dr + n * inc) |
| break; |
| n++; |
| } |
| } |
| } |
| os.child("cell") << r << n << cell.m_level.getPointer() << fid.expand() << inc; |
| r += n - 1; |
| } |
| os.closeChild(); |
| } |
| os.child("fx") << m_fx; |
| } |
| |
| |
| |
| PERSIST_IDENTIFIER(TXshLevelColumn, "levelColumn") |
| |