void SceneViewer::enterEvent(QEvent *) { if (m_isMouseEntered) return; m_isMouseEntered = true; TApp *app = TApp::instance(); modifiers = 0; TTool *tool = app->getCurrentTool()->getTool(); TXshLevel *level = app->getCurrentLevel()->getLevel(); if (level && level->getSimpleLevel()) m_dpiScale = getCurrentDpiScale(level->getSimpleLevel(), tool->getCurrentFid()); else m_dpiScale = TPointD(1, 1); if (m_freezedStatus != NO_FREEZED) return; invalidateToolStatus(); if (tool && tool->isEnabled()) { tool->setViewer(this); tool->updateMatrix(); tool->onEnter(); } setFocus(); updateGL(); }
QScriptValue getLevel(QScriptContext *ctx, QScriptEngine *eng) { QString levelName = ctx->argument(0).toString(); ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene(); TXshLevel *level = scene->getLevelSet()->getLevel(levelName.toStdWString()); if (!level) { level = scene->createNewLevel(PLI_XSHLEVEL, levelName.toStdWString()); levelName = QString::fromStdWString(level->getName()); } if (level->getSimpleLevel()) return eng->newQObject(new ScriptWrapper::Level(level->getSimpleLevel()), QScriptEngine::ScriptOwnership); else return QScriptValue(); }
void TApp::updateXshLevel() { TXshLevel *xl = 0; if (m_currentFrame->isEditingScene()) { int frame = m_currentFrame->getFrame(); int column = m_currentColumn->getColumnIndex(); TXsheet *xsheet = m_currentXsheet->getXsheet(); if (xsheet && column >= 0 && frame >= 0 && !xsheet->isColumnEmpty(column)) { TXshCell cell = xsheet->getCell(frame, column); xl = cell.m_level.getPointer(); // Se sono su una cella vuota successiva a celle di un certo livello // prendo questo come livello corrente. if (!xl && frame > 0) { TXshCell cell = xsheet->getCell(frame - 1, column); xl = cell.m_level.getPointer(); } } m_currentLevel->setLevel(xl); // level could be the same, but palette could have changed if (xl && xl->getSimpleLevel()) { TPalette *currentPalette = m_paletteController->getCurrentPalette()->getPalette(); int styleIndex = m_paletteController->getCurrentLevelPalette()->getStyleIndex(); m_paletteController->getCurrentLevelPalette()->setPalette( xl->getSimpleLevel()->getPalette(), styleIndex); // Se il nuovo livello selezionato e' un ovl, // la paletta corrente e' una cleanup palette // => setto come handle corrente quello della paletta di cleanup. if (xl->getType() == OVL_XSHLEVEL && currentPalette && currentPalette->isCleanupPalette()) m_paletteController->editCleanupPalette(); } else if (xl && xl->getPaletteLevel()) { int styleIndex = m_paletteController->getCurrentLevelPalette()->getStyleIndex(); m_paletteController->getCurrentLevelPalette()->setPalette( xl->getPaletteLevel()->getPalette(), styleIndex); } else m_paletteController->getCurrentLevelPalette()->setPalette(0); } }
void TApp::onXshLevelSwitched(TXshLevel *) { TXshLevel *level = m_currentLevel->getLevel(); if (level) { TXshSimpleLevel *simpleLevel = level->getSimpleLevel(); // Devo aggiornare la paletta corrente if (simpleLevel) { m_paletteController->getCurrentLevelPalette()->setPalette( simpleLevel->getPalette()); // Se il nuovo livello selezionato e' un ovl, // la paletta corrente e' una cleanup palette // => setto come handle corrente quello della paletta di cleanup. TPalette *currentPalette = m_paletteController->getCurrentPalette()->getPalette(); if (simpleLevel->getType() == OVL_XSHLEVEL && currentPalette && currentPalette->isCleanupPalette()) m_paletteController->editCleanupPalette(); return; } TXshPaletteLevel *paletteLevel = level->getPaletteLevel(); if (paletteLevel) { m_paletteController->getCurrentLevelPalette()->setPalette( paletteLevel->getPalette()); return; } } m_paletteController->getCurrentLevelPalette()->setPalette(0); }
bool StylePickerTool::startOrganizePalette() { /* Check if the organizing operation is available */ TXshLevel *level = getApplication()->getCurrentLevel()->getLevel(); if (!level) { DVGui::error(tr("No current level.")); return false; } if (level->getType() != PLI_XSHLEVEL && level->getType() != TZP_XSHLEVEL && level->getType() != PLT_XSHLEVEL) { DVGui::error(tr("Current level has no available palette.")); return false; } /* palette should have more than one page to organize */ TPalette *pal = NULL; if (level->getType() == PLT_XSHLEVEL) pal = level->getPaletteLevel()->getPalette(); else pal = level->getSimpleLevel()->getPalette(); if (!pal || pal->getPageCount() < 2) { DVGui::error( tr("Palette must have more than one palette to be organized.")); return false; } m_paletteToBeOrganized = pal; std::cout << "Start Organize Palette" << std::endl; return true; }
/*! Notify change of image in \b fid: update icon and notify level change. */ void TTool::notifyImageChanged(const TFrameId &fid) { onImageChanged(); if (!m_application) return; m_application->getCurrentScene()->setDirtyFlag(true); if (m_application->getCurrentFrame()->isEditingLevel()) { TXshLevel *xl = m_application->getCurrentLevel()->getLevel(); if (!xl) return; TXshSimpleLevel *sl = xl->getSimpleLevel(); if (!sl) return; sl->setDirtyFlag(true); IconGenerator::instance()->invalidate(sl, fid); IconGenerator::instance()->invalidateSceneIcon(); } else { int row = m_application->getCurrentFrame()->getFrame(); int col = m_application->getCurrentColumn()->getColumnIndex(); if (col < 0) return; TXsheet *xsh = m_application->getCurrentXsheet()->getXsheet(); if (!xsh) return; TXshCell cell = xsh->getCell(row, col); TXshSimpleLevel *sl = cell.getSimpleLevel(); if (sl) { IconGenerator::instance()->invalidate(sl, fid); IconGenerator::instance()->invalidateSceneIcon(); sl->setDirtyFlag(true); } } m_application->getCurrentLevel()->notifyLevelChange(); }
void StudioPaletteCmd::updateAllLinkedStyles(TPaletteHandle *paletteHandle, TXsheetHandle *xsheetHandle) { if (!xsheetHandle) return; TXsheet *xsheet = xsheetHandle->getXsheet(); if (!xsheet) return; ToonzScene *scene = xsheet->getScene(); if (!scene) return; // emit signal only if something changed bool somethingChanged = false; StudioPalette *sp = StudioPalette::instance(); TLevelSet *levelSet = scene->getLevelSet(); for (int i = 0; i < levelSet->getLevelCount(); i++) { TXshLevel *xl = levelSet->getLevel(i); TXshSimpleLevel *sl = xl ? xl->getSimpleLevel() : 0; if (!sl) continue; TPalette *palette = sl->getPalette(); if (palette) { somethingChanged = somethingChanged | sp->updateLinkedColors(palette); if (sl->getType() == TZP_XSHLEVEL) { std::vector<TFrameId> fids; sl->getFids(fids); std::vector<TFrameId>::iterator it; for (it = fids.begin(); it != fids.end(); ++it) { TFrameId fid = *it; std::string id = sl->getImageId(fid); } } } } if (!paletteHandle || !paletteHandle->getPalette()) return; if (somethingChanged) paletteHandle->notifyColorStyleChanged(); }
void TLevelSet::clear() { for (std::vector<TXshLevel *>::iterator it = m_levels.begin(); it != m_levels.end(); ++it) { TXshLevel *level = *it; if (level->getSimpleLevel()) level->getSimpleLevel()->clearFrames(); (*it)->release(); } m_levelTable.clear(); m_levels.clear(); m_folderTable.clear(); m_folders.clear(); m_folders.push_back(defaultRootFolder); m_folders.push_back(defaultSoundRootFolder); m_defaultFolder = defaultRootFolder; }
void FullColorBrushTool::leftButtonUp(const TPointD &pos, const TMouseEvent &e) { m_brushPos = m_mousePos = pos; TRasterImageP ri = (TRasterImageP)getImage(true); if (!ri) return; if (m_points.size() != 1) { double maxThickness = m_thickness.getValue().second; double thickness = m_pressure.getValue() ? computeThickness(e.m_pressure, m_thickness) : maxThickness; double opacity = (m_pressure.getValue() ? computeThickness(e.m_pressure, m_opacity) : m_opacity.getValue().second) * 0.01; TPointD rasCenter = ri->getRaster()->getCenterD(); TThickPoint point(pos + rasCenter, thickness); m_points.push_back(point); int m = m_points.size(); vector<TThickPoint> points; points.push_back(m_points[m - 3]); points.push_back(m_points[m - 2]); points.push_back(m_points[m - 1]); TRect bbox = m_brush->getBoundFromPoints(points); updateWorkAndBackupRasters(bbox); m_tileSaver->save(bbox); m_brush->addArc(points[0], points[1], points[2], m_oldOpacity, opacity); m_brush->updateDrawing(ri->getRaster(), m_backUpRas, m_currentColor, bbox, m_opacity.getValue().second * 0.01); TRectD invalidateRect = ToolUtils::getBounds(points, maxThickness); invalidate(invalidateRect.enlarge(2) - rasCenter); m_strokeRect += bbox; m_lastRect.empty(); } if (m_brush) { delete m_brush; m_brush = 0; } m_workRaster->unlock(); if (m_tileSet->getTileCount() > 0) { delete m_tileSaver; TTool::Application *app = TTool::getApplication(); TXshLevel *level = app->getCurrentLevel()->getLevel(); TXshSimpleLevelP simLevel = level->getSimpleLevel(); TFrameId frameId = getCurrentFid(); TRasterP ras = ri->getRaster()->extract(m_strokeRect)->clone(); TUndoManager::manager()->add(new FullColorBrushUndo(m_tileSet, simLevel.getPointer(), frameId, m_isFrameCreated, ras, m_strokeRect.getP00())); } notifyImageChanged(); m_strokeRect.empty(); }
void BinarizePopup::fetchSample() { TApp *app = TApp::instance(); TImageP img; if (app->getCurrentFrame()->isEditingLevel()) { TXshLevel *xshLevel = app->getCurrentLevel()->getLevel(); if (xshLevel && xshLevel->getSimpleLevel()) { TXshSimpleLevel *sl = xshLevel->getSimpleLevel(); img = sl->getFrame(app->getCurrentFrame()->getFid(), false); } } else { TXsheet *xsh = app->getCurrentScene()->getScene()->getXsheet(); TXshCell cell = xsh->getCell(app->getCurrentFrame()->getFrame(), app->getCurrentColumn()->getColumnIndex()); img = cell.getImage(false); } TRasterImageP ri = img; if (ri) { setSample(ri->getRaster()); } else { setSample(TRasterP()); } }
/* If the working palette is changed, then deactivate the "organize palette" toggle. */ void StylePickerTool::onImageChanged() { std::cout << "StylePickerTool::onImageChanged" << std::endl; if (!m_organizePalette.getValue() || !m_paletteToBeOrganized) return; TXshLevel *level = getApplication()->getCurrentLevel()->getLevel(); if (!level) { m_organizePalette.setValue(false); getApplication()->getCurrentTool()->notifyToolChanged(); return; } TPalette *pal = NULL; if (level->getType() == PLT_XSHLEVEL) pal = level->getPaletteLevel()->getPalette(); else if (level->getSimpleLevel()) { pal = level->getSimpleLevel()->getPalette(); } if (!pal || pal != m_paletteToBeOrganized) { m_organizePalette.setValue(false); getApplication()->getCurrentTool()->notifyToolChanged(); return; } }
void TApp::onLevelColorStyleChanged() { onPaletteChanged(); TXshLevel *level = m_currentLevel->getLevel(); if (!level) return; TPalette *palette = getCurrentPalette()->getPalette(); TXshSimpleLevel *simpleLevel = level->getSimpleLevel(); if (simpleLevel && simpleLevel->getPalette() == palette) { notifyPaletteChanged(simpleLevel); } else { TLevelSet *levelSet = getCurrentScene()->getScene()->getLevelSet(); for (int i = 0; i < levelSet->getLevelCount(); i++) { if (levelSet->getLevel(i)) { simpleLevel = levelSet->getLevel(i)->getSimpleLevel(); if (simpleLevel && simpleLevel->getPalette() == palette) { notifyPaletteChanged(simpleLevel); } } } } }
/*! Notify change of current image: update icon and notify level change. If current object is a spline commit spline chenged. If current mode is EditingLevel touch current frame. */ void TTool::notifyImageChanged() { onImageChanged(); if (!m_application) return; m_application->getCurrentScene()->setDirtyFlag(true); if (m_application->getCurrentFrame()->isEditingLevel()) { TXshLevel *xl = m_application->getCurrentLevel()->getLevel(); if (!xl) return; TXshSimpleLevel *sl = xl->getSimpleLevel(); if (!sl) return; TFrameId fid = m_application->getCurrentFrame()->getFid(); sl->touchFrame(fid); // sl->setDirtyFlag(true); IconGenerator::instance()->invalidate(sl, fid); IconGenerator::instance()->invalidateSceneIcon(); } else { TXsheet *xsh = m_application->getCurrentXsheet()->getXsheet(); if (!xsh) return; TObjectHandle *currentObject = m_application->getCurrentObject(); if (currentObject->isSpline()) { m_application->getCurrentObject()->commitSplineChanges(); TStageObject *pegbar = xsh->getStageObject(currentObject->getObjectId()); IconGenerator::instance()->invalidate(pegbar->getSpline()); } else { int row = m_application->getCurrentFrame()->getFrame(); int col = m_application->getCurrentColumn()->getColumnIndex(); if (col < 0) return; TXshCell cell = xsh->getCell(row, col); TXshSimpleLevel *sl = cell.getSimpleLevel(); if (sl) { IconGenerator::instance()->invalidate(sl, cell.m_frameId); sl->touchFrame(cell.m_frameId); IconGenerator::instance()->invalidateSceneIcon(); } } } m_application->getCurrentLevel()->notifyLevelChange(); }
QScriptValue Level::load(const QScriptValue &fpArg) { if (m_sl) { m_scene->getLevelSet()->removeLevel(m_sl, true); m_sl->release(); m_sl = 0; } // get the path TFilePath fp; QScriptValue err = checkFilePath(context(), fpArg, fp); if (err.isError()) return err; QString fpStr = fpArg.toString(); try { if (!TSystem::doesExistFileOrLevel(fp)) { return context()->throwError(tr("File %1 doesn't exist").arg(fpStr)); } TFileType::Type fileType = TFileType::getInfo(fp); if (TFileType::isVector(fileType)) m_type = PLI_XSHLEVEL; else if (0 != (fileType & TFileType::CMAPPED_IMAGE)) m_type = TZP_XSHLEVEL; else if (0 != (fileType & TFileType::RASTER_IMAGE)) m_type = OVL_XSHLEVEL; else { return context()->throwError(tr("File %1 is unsupported").arg(fpStr)); } TXshLevel *xl = m_scene->loadLevel(fp); if (xl) { m_sl = xl->getSimpleLevel(); m_sl->addRef(); } return context()->thisObject(); } catch (...) { return context()->throwError(tr("Exception reading %1").arg(fpStr)); } }
void Vectorizer::setLevel(const TXshSimpleLevelP &level) { m_level = level; //Creo il livello pli TXshSimpleLevel *sl = m_level.getPointer(); if (!sl) return; int rowCount = sl->getFrameCount(); if (rowCount <= 0 || sl->isEmpty()) return; TXshLevel *xl; ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene(); // Build the new level name wstring levelName = sl->getName() + L"v"; { std::auto_ptr<NameBuilder> nameBuilder(NameBuilder::getBuilder(levelName)); for (;;) { levelName = nameBuilder->getNext(); if (scene->getLevelSet()->getLevel(levelName) == 0) break; } } TFilePath dstPath = sl->getPath().withName(levelName).withType("pli"); dstPath = scene->decodeFilePath(dstPath); bool overWrite = false; if (TSystem::doesExistFileOrLevel(dstPath)) { m_dialogShown = true; std::wstring name = m_dialog->execute(scene, dstPath, true); if (m_dialog->cancelPressed()) return; switch (m_dialog->getChoice()) { case OverwriteDialog::KEEP_OLD: { xl = scene->getLevelSet()->getLevel(levelName); if (!xl) xl = scene->loadLevel(dstPath); m_vLevel = xl->getSimpleLevel(); return; } CASE OverwriteDialog::OVERWRITE : overWrite = true; DEFAULT: levelName = name; } } xl = scene->createNewLevel(PLI_XSHLEVEL, levelName); TXshSimpleLevel *vl = xl->getSimpleLevel(); assert(vl); if (overWrite) { vl->setPath(scene->codeFilePath(dstPath)); vl->setName(levelName); } TPalette *palette = 0; if (sl->getType() == TZP_XSHLEVEL) palette = sl->getPalette(); palette = palette ? palette->clone() : new TPalette; palette->setPaletteName(vl->getName()); vl->setPalette(palette); m_vLevel = vl; }
TXshLevel *xl = cell.m_level.getPointer(); if (!xl) return; ZPlacement cameraPlacement; if (m_subXSheetStack.empty()) cameraPlacement = m_cameraPlacement; else cameraPlacement = m_subXSheetStack.back().m_camera; TAffine columnZaff; bool columnBehindCamera = TStageObject::perspective( columnZaff, cameraPlacement.m_aff, cameraPlacement.m_z, columnAff, columnZ, columnNoScaleZ); if (!columnBehindCamera) return; TXshSimpleLevel *sl = xl->getSimpleLevel(); bool storePlayer = sl || (xl->getChildLevel() && locals::applyPlasticDeform(column.getPointer(), m_vs) && locals::isMeshDeformed(xsh, pegbar, m_vs)); if (storePlayer) { // Build and store a player Player player; player.m_sl = sl; player.m_fid = cell.m_frameId; player.m_xsh = xsh; player.m_column = col; player.m_frame = row;
TPointD XshHandleManager::getHandlePos(const TStageObjectId &id, const std::string &handle, int row) const { static const double unit = 8.0; assert(m_xsh->getScene()); if (handle == "") return TPointD(); else if (handle[0] == 'H' && handle.length() > 1) { // Hook port case if (!id.isColumn()) return TPointD(); int hookIndex = 0; { int h, hLength = handle.length(); for (h = 1; h != hLength; ++h) hookIndex = hookIndex * 10 + (handle[h] - '0'); } TStageObject *obj = m_xsh->getStageObject(id); if (const PlasticSkeletonDeformationP &def = obj->getPlasticSkeletonDeformation()) { int skelId = def->skeletonId(row); PlasticSkeleton skel; def->storeDeformedSkeleton(skelId, row, skel); int v = def->vertexIndex(hookIndex, skelId); return (v >= 0) ? TScale(1.0 / Stage::inch) * skel.vertex(v).P() : TPointD(); } --hookIndex; int col = id.getIndex(); TXshCell cell(m_xsh->getCell(row, col)); TXshLevel *xl = cell.m_level.getPointer(); if (!xl) return TPointD(); TXshSimpleLevel *sl = xl->getSimpleLevel(); if (!sl) return TPointD(); Hook *hook = sl->getHookSet()->getHook(hookIndex); if (!hook) return TPointD(); TFrameId fid(cell.m_frameId); TPointD pos = hook->getAPos(fid) * (1.0 / Stage::inch); TPointD delta; for (int r = row - 1; r >= 0; --r) { cell = m_xsh->getCell(r, col); if (cell.m_level.getPointer() != xl) break; const TFrameId &precFid = cell.m_frameId; delta += computePassHook(fid, precFid, sl, hook); fid = precFid; } pos += delta * (1.0 / Stage::inch); pos = getDpiAffine(sl, cell.m_frameId, true) * pos; return pos; } else if ('A' <= handle[0] && handle[0] <= 'Z') return TPointD(unit * (handle[0] - 'B'), 0); else if ('a' <= handle[0] && handle[0] <= 'z') return TPointD(0.5 * unit * (handle[0] - 'b'), 0); else return TPointD(); }
void LevelSettingsPopup::onPathChanged() { QString text = m_pathFld->getPath(); TFilePath newPath(text.toStdWString()); newPath = TApp::instance()->getCurrentScene()->getScene()->codeFilePath(newPath); m_pathFld->setPath(QString::fromStdWString(newPath.getWideString())); if (!m_sl && !!m_sdl) { // old level is a sound level TFileType::Type levelType = TFileType::getInfo(newPath); if (levelType == TFileType::AUDIO_LEVEL) { TFilePath oldPath = m_sdl->getPath(); if (oldPath == newPath) return; m_sdl->setPath(newPath); m_sdl->loadSoundTrack(); TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); TApp::instance()->getCurrentXsheet()->notifyXsheetSoundChanged(); } else { error(tr("The file %1 is not a sound level.") .arg(QString::fromStdWString(newPath.getLevelNameW()))); updateLevelSettings(); } return; } if (!m_sl) return; TFilePath oldPath = m_sl->getPath(); if (oldPath == newPath) return; TLevelSet *levelSet = TApp::instance()->getCurrentScene()->getScene()->getLevelSet(); TXshSimpleLevel *sl = 0; for (int i = 0; i < levelSet->getLevelCount(); i++) { TXshLevel *xl = levelSet->getLevel(i); if (!xl) continue; sl = xl->getSimpleLevel(); if (!sl) continue; if (sl == m_sl.getPointer()) { sl = 0; continue; } if (sl->getPath() == newPath) break; sl = 0; } if (sl) { QString question; question = "The path you entered for the level " + QString(::to_string(sl->getName()).c_str()) + "is already used: this may generate some conflicts in the file " "management.\nAre you sure you want to assign the same path to " "two different levels?"; int ret = DVGui::MsgBox(question, QObject::tr("Yes"), QObject::tr("No")); if (ret == 0 || ret == 2) { m_pathFld->setPath(toQString(m_sl->getPath())); return; } } TFileType::Type oldType = TFileType::getInfo(oldPath); TFileType::Type newType = TFileType::getInfo(newPath); if (m_sl->getType() == TZP_XSHLEVEL && m_sl->getScannedPath() != TFilePath()) { if (newPath == TFilePath() || newPath == m_sl->getScannedPath()) { newPath = m_sl->getScannedPath(); m_sl->setType(OVL_XSHLEVEL); m_sl->setScannedPath(TFilePath()); m_sl->setPath(newPath); TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); TApp::instance()->getCurrentScene()->notifyCastChange(); updateLevelSettings(); m_sl->invalidateFrames(); std::vector<TFrameId> frames; m_sl->getFids(frames); for (auto const &fid : frames) { IconGenerator::instance()->invalidate(m_sl.getPointer(), fid); } return; } } if (oldType != newType || m_sl->getType() == TZP_XSHLEVEL && newPath.getType() != "tlv" || m_sl->getType() != TZP_XSHLEVEL && newPath.getType() == "tlv") { error("Wrong path"); m_pathFld->setPath(toQString(m_sl->getPath())); return; } /*-- ここでPathを更新 --*/ m_sl->setPath(newPath); TApp::instance() ->getPaletteController() ->getCurrentLevelPalette() ->setPalette(m_sl->getPalette()); TApp::instance()->getCurrentLevel()->notifyLevelChange(); TApp::instance()->getCurrentScene()->notifySceneChanged(); TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); m_sl->invalidateFrames(); std::vector<TFrameId> frames; m_sl->getFids(frames); for (auto const &fid : frames) { IconGenerator::instance()->invalidate(m_sl.getPointer(), fid); } updateLevelSettings(); }
void mergeCmapped(int column, int mColumn, const QString &fullpath, bool isRedo) { static int MergeCmappedSessionId = 0; MergeCmappedSessionId++; TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet(); int start, end; int mStart, mEnd; xsh->getCellRange(column, start, end); xsh->getCellRange(mColumn, mStart, mEnd); if (start > end) return; vector<TXshCell> cell(max(end, mEnd) - min(start, mStart) + 1); vector<TXshCell> mCell(cell.size()); xsh->getCells(min(start, mStart), column, cell.size(), &(cell[0])); if (mColumn != -1) xsh->getCells(min(start, mStart), mColumn, cell.size(), &(mCell[0])); TXshColumn *col = xsh->getColumn(column); TXshColumn *mcol = xsh->getColumn(mColumn); vector<MergeCmappedPair> matchingLevels; std::map<MergedPair, TFrameId> computedMergedMap; TXshSimpleLevel *level = 0, *mLevel = 0; TXshLevel *xl; std::map<TFrameId, QString> images; double dpix = 0, dpiy = 0; for (int i = 0; i < (int)cell.size(); i++) { if (!cell[i].isEmpty() && dpix == 0) ((TToonzImageP)(cell[i].getImage(false)))->getDpi(dpix, dpiy); if (!level) { level = cell[i].getSimpleLevel(); xl = cell[i].m_level.getPointer(); } if (!mLevel) mLevel = mCell[i].getSimpleLevel(); } if (!level || !mLevel) return; TFilePath fp(fullpath.toStdString()); TXshLevel *txl = level->getScene()->createNewLevel(level->getType(), fp.getWideName(), level->getResolution()); TXshSimpleLevel *newLevel = txl->getSimpleLevel(); newLevel->setPalette(level->getPalette()); newLevel->clonePropertiesFrom(level); newLevel->setPath(fp); TApp::instance()->getCurrentScene()->notifySceneChanged(); TApp::instance()->getCurrentScene()->notifyCastChange(); TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); int count = 0; for (int i = 0; i < (int)cell.size(); i++) { if (cell[i].isEmpty() && mCell[i].isEmpty()) continue; TAffine imgAff, matchAff; getColumnPlacement(imgAff, xsh, min(start, mStart) + i, column, false); getColumnPlacement(matchAff, xsh, min(start, mStart) + i, mColumn, false); //std::map<TFrameId, TFrameId>::iterator it; MergedPair mp(cell[i].isEmpty() ? TFrameId() : cell[i].getFrameId(), mCell[i].isEmpty() ? TFrameId() : mCell[i].getFrameId(), imgAff.inv() * matchAff); std::map<MergedPair, TFrameId>::iterator computedMergedIt = computedMergedMap.find(mp); if (computedMergedIt != computedMergedMap.end()) { TXshCell newCell(newLevel, computedMergedIt->second); xsh->setCell(i, column, newCell); cell[i] = newCell; continue; } TFrameId newFid(++count); //level->getLastFid().getNumber()+1); TDimension dim = level->getResolution(); TToonzImageP newImage; if (cell[i].isEmpty()) { newImage = TToonzImageP(TRasterCM32P(dim), TRect(0, 0, dim.lx - 1, dim.ly - 1)); newImage->setDpi(dpix, dpiy); } else newImage = (TToonzImageP)(cell[i].getImage(false)->cloneImage()); newImage->setPalette(level->getPalette()); newLevel->setFrame(newFid, newImage); TXshCell newCell(newLevel, newFid); xsh->setCell(i, column, newCell); computedMergedMap[mp] = newCell.getFrameId(); cell[i] = newCell; TImageP img = cell[i].getImage(true); TImageP match = mCell[i].getImage(true); TFrameId fid = cell[i].m_frameId; TFrameId mFid = mCell[i].m_frameId; if (!img || !match) continue; TToonzImageP timg = (TToonzImageP)img; TToonzImageP tmatch = (TToonzImageP)match; QString id = "MergeCmappedUndo" + QString::number(MergeCmappedSessionId) + "-" + QString::number(fid.getNumber()); TImageCache::instance()->add(id, timg->clone()); images[fid] = id; TAffine dpiAff = getDpiAffine(level, fid); TAffine mdpiAff = getDpiAffine(mLevel, mFid); matchingLevels.push_back(MergeCmappedPair(cell[i], imgAff * dpiAff, mCell[i], matchAff * mdpiAff)); } if (!isRedo) { TPalette *plt = level->getPalette(); TPaletteHandle *pltHandle = new TPaletteHandle(); pltHandle->setPalette(plt); int styleCount = plt->getStyleCount(); TUndoManager::manager()->add(new MergeCmappedUndo(txl, MergeCmappedSessionId, column, level, images, mColumn, plt)); } removeLevel(xl); QApplication::setOverrideCursor(Qt::WaitCursor); mergeCmapped(matchingLevels); QApplication::restoreOverrideCursor(); for (int i = 0; i < (int)cell.size(); i++) //the saveboxes must be updated { if (cell[i].isEmpty() || mCell[i].isEmpty()) continue; if (!cell[i].getImage(false) || !mCell[i].getImage(false)) continue; TXshSimpleLevel *sl = cell[i].getSimpleLevel(); const TFrameId &fid = cell[i].m_frameId; ToolUtils::updateSaveBox(sl, fid); IconGenerator::instance()->invalidate(sl, fid); sl->setDirtyFlag(true); } newLevel->setDirtyFlag(true); TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); }
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(); } }
TXshSimpleLevel *FilmstripFrames::getLevel() const { TXshLevel *xl = TApp::instance()->getCurrentLevel()->getLevel(); return xl ? xl->getSimpleLevel() : 0; }
QString TTool::updateEnabled() { // Disable every tool during playback if (m_application->getCurrentFrame()->isPlaying()) return (enable(false), QString()); // Release Generic tools at once int toolType = getToolType(); int targetType = getTargetType(); if (toolType == TTool::GenericTool) return (enable(true), QString()); // Retrieve vars and view modes TXsheet *xsh = m_application->getCurrentXsheet()->getXsheet(); int rowIndex = m_application->getCurrentFrame()->getFrame(); int columnIndex = m_application->getCurrentColumn()->getColumnIndex(); TXshColumn *column = (columnIndex >= 0) ? xsh->getColumn(columnIndex) : 0; TXshLevel *xl = m_application->getCurrentLevel()->getLevel(); TXshSimpleLevel *sl = xl ? xl->getSimpleLevel() : 0; int levelType = sl ? sl->getType() : NO_XSHLEVEL; TStageObject *obj = xsh->getStageObject(TStageObjectId::ColumnId(columnIndex)); bool spline = m_application->getCurrentObject()->isSpline(); bool filmstrip = m_application->getCurrentFrame()->isEditingLevel(); /*-- MultiLayerStylePickerONのときは、現状に関わらず使用可能 --*/ if (m_name == T_StylePicker && Preferences::instance()->isMultiLayerStylePickerEnabled()) return (enable(true), QString()); // Check against unplaced columns (not in filmstrip mode) if (column && !filmstrip) { if (column->isLocked()) return (enable(false), QObject::tr("The current column is locked.")); else if (!column->isCamstandVisible()) return (enable(false), QObject::tr("The current column is hidden.")); else if (column->getSoundColumn()) return (enable(false), QObject::tr("It is not possible to edit the audio column.")); else if (column->getSoundTextColumn()) return ( enable(false), QObject::tr( "Note columns can only be edited in the xsheet or timeline.")); if (toolType == TTool::ColumnTool) { // Check column target if (column->getLevelColumn() && !(targetType & LevelColumns)) return ( enable(false), QObject::tr("The current tool cannot be used on a Level column.")); if (column->getMeshColumn() && !(targetType & MeshColumns)) return ( enable(false), QObject::tr("The current tool cannot be used on a Mesh column.")); } } // Check column tools if (toolType == TTool::ColumnTool) { if (filmstrip) return ( enable(false), QObject::tr("The current tool cannot be used in Level Strip mode.")); if ((!column || column->isEmpty()) && !(targetType & TTool::EmptyTarget)) return (enable(false), QString()); } // Check LevelRead & LevelWrite tools if (toolType & TTool::LevelTool) { // Check against splines if (spline) { return (targetType & Splines) ? (enable(true), QString()) : (enable(false), QObject::tr("The current tool cannot be " "used to edit a motion path.")); } // Check against empty levels if (!xl) return (targetType & EmptyTarget) ? (enable(true), QString()) : (enable(false), QString()); // Check against simple-level-edness if (!sl) return (enable(false), QObject::tr("The current level is not editable.")); // Does it // happen at // all btw? // Check against level types { if ((levelType == PLI_XSHLEVEL) && !(targetType & VectorImage)) return ( enable(false), QObject::tr("The current tool cannot be used on a Vector Level.")); if ((levelType == TZP_XSHLEVEL) && !(targetType & ToonzImage)) return ( enable(false), QObject::tr("The current tool cannot be used on a Toonz Level.")); if ((levelType == OVL_XSHLEVEL) && !(targetType & RasterImage)) return ( enable(false), QObject::tr("The current tool cannot be used on a Raster Level.")); if ((levelType == MESH_XSHLEVEL) && !(targetType & MeshImage)) return ( enable(false), QObject::tr("The current tool cannot be used on a Mesh Level.")); } // Check against impossibly traceable movements on the column if ((levelType & LEVELCOLUMN_XSHLEVEL) && !filmstrip) { // Test for Mesh-deformed levels const TStageObjectId &parentId = obj->getParent(); if (parentId.isColumn() && obj->getParentHandle()[0] != 'H') { TXshSimpleLevel *parentSl = xsh->getCell(rowIndex, parentId.getIndex()).getSimpleLevel(); if (parentSl && parentSl->getType() == MESH_XSHLEVEL) return ( enable(false), QObject::tr( "The current tool cannot be used on a mesh-deformed level")); } } // Check TTool::ImageType tools if (toolType == TTool::LevelWriteTool) { // Check level against read-only status if (sl->isReadOnly()) { const std::set<TFrameId> &editableFrames = sl->getEditableRange(); TFrameId currentFid = getCurrentFid(); if (editableFrames.find(currentFid) == editableFrames.end()) return ( enable(false), QObject::tr( "The current frame is locked: any editing is forbidden.")); } // Check level type write support if (sl->getPath().getType() == "psd" || // We don't have the API to write psd files sl->is16BitChannelLevel() || // Inherited by previous implementation. // Could be fixed? sl->getProperties()->getBpp() == 1) // Black & White images. Again, could be fixed? return (enable(false), QObject::tr("The current level is not editable.")); } } return (enable(true), QString()); }
TXshSimpleLevel *getLevel() const { TXshLevel *xshLevel = TApp::instance()->getCurrentScene()->getScene()->getLevelSet()->getLevel(m_levelName); return xshLevel ? xshLevel->getSimpleLevel() : 0; }