void Filmstrip::updateWindowTitle() { updateCurrentLevelComboItem(); TXshSimpleLevel *level = m_frames->getLevel(); QString levelName; if (!level) { parentWidget()->setWindowTitle(tr("Level Strip")); return; } else { levelName = QString::fromStdWString(level->getName()); if (level->getProperties()->getDirtyFlag()) levelName += " *"; } // parentWidget() is TPanel parentWidget()->setWindowTitle(tr("Level: ") + levelName); TFrameHandle *fh = TApp::instance()->getCurrentFrame(); if (fh->isEditingLevel() && fh->getFid().getNumber() >= 0) levelName += QString(" [#") + QString::number(fh->getFid().getNumber()) + QString("]"); m_chooseLevelCombo->setItemText(m_chooseLevelCombo->currentIndex(), levelName); }
void FilmstripFrames::onFrameSwitched() { // no. interferische con lo shift-click per la selezione. // m_selection->selectNone(); TApp *app = TApp::instance(); TFrameHandle *fh = app->getCurrentFrame(); TFrameId fid; if (fh->isEditingLevel()) fid = fh->getFid(); else { TXsheet *xsh = app->getCurrentXsheet()->getXsheet(); int col = app->getCurrentColumn()->getColumnIndex(); int row = fh->getFrame(); if (row < 0 || col < 0) return; TXshCell cell = xsh->getCell(row, col); if (cell.isEmpty()) return; fid = cell.getFrameId(); } int index = fid2index(fid); if (index >= 0) { exponeFrame(index); // clear selection and select only the destination frame select(index, ONLY_SELECT); } update(); }
TXshCell TTool::getImageCell() { assert(m_application); TXshCell result; TFrameHandle *currentFrame = m_application->getCurrentFrame(); TXshLevelHandle *currentLevel = m_application->getCurrentLevel(); if (currentFrame->isEditingLevel()) { if (TXshLevel *xl = currentLevel->getLevel()) { if (TXshSimpleLevel *sl = xl->getSimpleLevel()) { result.m_level = xl; result.m_frameId = currentFrame->getFid(); } } } else { if (TXsheet *xsh = m_application->getCurrentXsheet()->getXsheet()) { if (!m_application->getCurrentObject()->isSpline()) { int row = currentFrame->getFrame(); int col = m_application->getCurrentColumn()->getColumnIndex(); result = xsh->getCell(row, col); } } } return result; }
void Filmstrip::onFrameSwitched() { TFrameHandle *fh = TApp::instance()->getCurrentFrame(); if (!fh->isEditingLevel()) return; TXshSimpleLevel *level = m_frames->getLevel(); std::map<TXshSimpleLevel *, TFrameId>::iterator WFit; WFit = m_workingFrames.find(level); if (WFit == m_workingFrames.end()) return; WFit->second = fh->getFid(); QString levelName = QString::fromStdWString(level->getName()); if (level->getProperties()->getDirtyFlag()) levelName += " *"; if (fh->getFid().getNumber() >= 0) levelName += QString(" [#") + QString::number(fh->getFid().getNumber()) + QString("]"); m_chooseLevelCombo->setItemText(m_chooseLevelCombo->currentIndex(), levelName); }
void FilmstripFrames::keyPressEvent(QKeyEvent *event) { TFrameHandle *fh = TApp::instance()->getCurrentFrame(); TXshSimpleLevel *level = getLevel(); if (!level) return; std::vector<TFrameId> fids; level->getFids(fids); if (fids.empty()) return; fh->setFrameIds(fids); if (event->key() == Qt::Key_Up) fh->prevFrame(); else if (event->key() == Qt::Key_Down) fh->nextFrame(); else if (event->key() == Qt::Key_Home) fh->firstFrame(); else if (event->key() == Qt::Key_End) fh->lastFrame(); else if (event->key() == Qt::Key_PageDown) { int frameHeight = m_iconSize.height(); int visibleHeight = visibleRegion().rects()[0].height(); int visibleFrames = double(visibleHeight) / double(frameHeight); scroll(visibleFrames * frameHeight); return; } else if (event->key() == Qt::Key_PageUp) { int frameHeight = m_iconSize.height(); int visibleHeight = visibleRegion().rects()[0].height(); int visibleFrames = double(visibleHeight) / double(frameHeight); scroll(-visibleFrames * frameHeight); return; } else return; m_selection->selectNone(); if (getLevel()) m_selection->select(fh->getFid()); int index = fid2index(fh->getFid()); if (index >= 0) exponeFrame(index); }
TFrameId TTool::getCurrentFid() const { if (!m_application) return TFrameId(); TFrameHandle *fh = m_application->getCurrentFrame(); if (fh->isEditingLevel()) return fh->getFid(); int row = m_application->getCurrentFrame()->getFrame(); int col = m_application->getCurrentColumn()->getColumnIndex(); TXshCell cell = m_application->getCurrentXsheet()->getXsheet()->getCell(row, col); if (cell.isEmpty()) return TFrameId::NO_FRAME; return cell.getFrameId(); }
TImage *TTool::touchImage() { if (!m_application) return 0; m_cellsData.clear(); m_isLevelCreated = false; m_isFrameCreated = false; Preferences *pref = Preferences::instance(); bool isAutoCreateEnabled = pref->isAutoCreateEnabled(); bool animationSheetEnabled = pref->isAnimationSheetEnabled(); bool isAutoStretchEnabled = pref->isAutoStretchEnabled(); TFrameHandle *currentFrame = m_application->getCurrentFrame(); TXshLevelHandle *currentLevel = m_application->getCurrentLevel(); if (currentFrame->isEditingLevel()) { // Editing level // no level => return 0 TXshLevel *xl = currentLevel->getLevel(); if (!xl) return 0; TXshSimpleLevel *sl = xl->getSimpleLevel(); if (!sl || sl->isEmpty()) return 0; TFrameId fid = currentFrame->getFid(); TImageP img = sl->getFrame(fid, true); if (!img) { // no drawing found if (sl->isSubsequence() || sl->isReadOnly() || !isAutoCreateEnabled) return 0; // create a new drawing img = sl->createEmptyFrame(); sl->setFrame(fid, img); currentLevel->notifyLevelChange(); m_isFrameCreated = true; } return img.getPointer(); } else { // editing xsheet if (m_application->getCurrentObject()->isSpline()) return 0; TSceneHandle *currentScene = m_application->getCurrentScene(); ToonzScene *scene = currentScene->getScene(); int row = currentFrame->getFrame(); int col = m_application->getCurrentColumn()->getColumnIndex(); if (col < 0) return 0; TXsheetHandle *currentXsheet = m_application->getCurrentXsheet(); TXsheet *xsh = currentXsheet->getXsheet(); if (!xsh) return 0; TXshCell cell = xsh->getCell(row, col); TXshSimpleLevel *sl = cell.getSimpleLevel(); if (sl != 0) { // current cell is not empty if (isAutoCreateEnabled && animationSheetEnabled && row > 0 && xsh->getCell(row - 1, col) == xsh->getCell(row, col)) { // animationSheet is enabled and the current cell is a "hold". We must // create a new drawing. // measure the hold length (starting from the current row) : r0-r1 int r0 = row, r1 = row; if (isAutoStretchEnabled) while (xsh->getCell(r1 + 1, col) == cell) r1++; // find the proper frameid (possibly addisng suffix, in order to avoid a // fid already used) TFrameId fid = getNewFrameId(sl, row); // create the new drawing TImageP img = sl->createEmptyFrame(); m_isFrameCreated = true; // insert the drawing in the level sl->setFrame(fid, img); // update the cell cell = TXshCell(sl, fid); // update the xsheet (change the current cell and possibly all the // following "hold") for (int r = r0; r <= r1; r++) xsh->setCell(r, col, cell); // notify currentXsheet->notifyXsheetChanged(); currentScene->notifyCastChange(); currentLevel->notifyLevelChange(); m_cellsData.push_back(r0); m_cellsData.push_back(r1); m_cellsData.push_back(0); } // we've found the image. return it. return cell.getImage(true).getPointer(); } // current cell is empty. if (!isAutoCreateEnabled) return 0; // get the column range int r0, r1; xsh->getCellRange(col, r0, r1); if (animationSheetEnabled && r0 <= r1) { // animation sheet enabled and not empty column. We must create a new // drawing in the column level and possibly add "holds" // find the last not-empty cell before the current one (a) and the first // after (b) int a = row - 1, b = row + 1; while (a >= r0 && xsh->getCell(a, col).isEmpty()) a--; while (b <= r1 && xsh->getCell(b, col).isEmpty()) b++; // find the level we must attach to if (a >= r0) { // there is a not-emtpy cell before the current one sl = xsh->getCell(a, col).getSimpleLevel(); } else if (b <= r1) { sl = xsh->getCell(b, col).getSimpleLevel(); } if (sl) { // note: sl should be always !=0 (the column is not empty) // if - for some reason - it is ==0 then we skip to the standard (i.e. // !animationSheetEnabled) beahviour // create the drawing // find the proper frameid (possibly addisng suffix, in order to avoid a // fid already used) TFrameId fid = getNewFrameId(sl, row); // create the new drawing TImageP img = sl->createEmptyFrame(); m_isFrameCreated = true; // insert the drawing in the level sl->setFrame(fid, img); // update the cell cell = TXshCell(sl, fid); xsh->setCell(row, col, cell); // create holds if (!isAutoStretchEnabled) { m_cellsData.push_back(row); m_cellsData.push_back(row); m_cellsData.push_back(2); // vuoto => nuovo } else { if (a >= r0) { // create a hold before : [a+1, row-1] TXshCell aCell = xsh->getCell(a, col); for (int i = a + 1; i < row; i++) xsh->setCell(i, col, aCell); m_cellsData.push_back(a + 1); m_cellsData.push_back(row - 1); m_cellsData.push_back(1); // vuoto => vecchio if (b <= r1 && xsh->getCell(b, col).getSimpleLevel() == sl) { // create also a hold after for (int i = row + 1; i < b; i++) xsh->setCell(i, col, cell); m_cellsData.push_back(row); m_cellsData.push_back(b - 1); m_cellsData.push_back(2); // vuoto => nuovo } else { m_cellsData.push_back(row); m_cellsData.push_back(row); m_cellsData.push_back(2); // vuoto => nuovo } } else if (b <= r1) { // create a hold after for (int i = row + 1; i < b; i++) xsh->setCell(i, col, cell); m_cellsData.push_back(row); m_cellsData.push_back(b - 1); m_cellsData.push_back(2); // vuoto => nuovo } } } // notify & return currentXsheet->notifyXsheetChanged(); currentScene->notifyCastChange(); currentLevel->notifyLevelChange(); return cell.getImage(true).getPointer(); } if (row > 0 && xsh->getCell(row - 1, col).getSimpleLevel() != 0 && !animationSheetEnabled) { sl = xsh->getCell(row - 1, col).getSimpleLevel(); if (sl->getType() != OVL_XSHLEVEL || sl->getPath().getFrame() != TFrameId::NO_FRAME) { // la cella precedente contiene un drawing di un livello. animationSheet // e' disabilitato // creo un nuovo frame currentLevel->setLevel(sl); if (sl->isSubsequence() || sl->isReadOnly()) return 0; TFrameId fid = sl->index2fid(sl->getFrameCount()); TImageP img = sl->createEmptyFrame(); m_isFrameCreated = true; sl->setFrame(fid, img); cell = TXshCell(sl, fid); xsh->setCell(row, col, cell); currentXsheet->notifyXsheetChanged(); currentScene->notifyCastChange(); currentLevel->notifyLevelChange(); return img.getPointer(); } } // animation sheet disabled or empty column. autoCreate is enabled: we must // create a new level int levelType = pref->getDefLevelType(); TXshLevel *xl = scene->createNewLevel(levelType); sl = xl->getSimpleLevel(); m_isLevelCreated = true; // create the drawing TFrameId fid = animationSheetEnabled ? getNewFrameId(sl, row) : TFrameId(1); TImageP img = sl->createEmptyFrame(); m_isFrameCreated = true; sl->setFrame(fid, img); cell = TXshCell(sl, fid); xsh->setCell(row, col, cell); if (animationSheetEnabled) { m_cellsData.push_back(row); m_cellsData.push_back(row); m_cellsData.push_back(2); // vuoto => nuovo } currentXsheet->notifyXsheetChanged(); currentScene->notifyCastChange(); currentLevel->notifyLevelChange(); return img.getPointer(); } }