/*! Add a folder in StudioPalette TFilePath \b parentFolderPath. If there are any problems send an error message. */ TFilePath StudioPaletteCmd::addFolder(const TFilePath &parentFolderPath) { TFilePath folderPath; folderPath = StudioPalette::instance()->createFolder(parentFolderPath); if (!folderPath.isEmpty()) TUndoManager::manager()->add(new CreateFolderUndo(folderPath)); return folderPath; }
void StudioPaletteTreeViewer::startDragDrop() { TRepetitionGuard guard; if (!guard.hasLock()) return; QDrag *drag = new QDrag(this); QMimeData *mimeData = new QMimeData; QList<QUrl> urls; QList<QTreeWidgetItem *> items = selectedItems(); int i; for (i = 0; i < items.size(); i++) { // Sposto solo le palette. TFilePath path = getItemPath(items[i]); if (!path.isEmpty() && (path.getType() == "tpl" || path.getType() == "pli" || path.getType() == "tlv" || path.getType() == "tnz")) urls.append(pathToUrl(path)); } if (urls.isEmpty()) return; mimeData->setUrls(urls); drag->setMimeData(mimeData); Qt::DropAction dropAction = drag->exec(Qt::CopyAction | Qt::MoveAction); viewport()->update(); }
static void eraseUncompatibleExistingLevel(const TFilePath &fp, const TDimension &imageSize) // nothrow { assert(!fp.isEmpty()); if (TSystem::doesExistFileOrLevel(fp)) { bool remove = false; // In case the raster specifics are different from those of a currently // existing movie, erase it try { TLevelReaderP lr(fp); lr->loadInfo(); const TImageInfo *info = lr->getImageInfo(); if (!info || info->m_lx != imageSize.lx || info->m_ly != imageSize.ly) TSystem::removeFileOrLevel(fp); // nothrow } catch (...) { // Same if the level could not be read/opened TSystem::removeFileOrLevel(fp); // nothrow } // NOTE: The level removal procedure could still fail. // In this case, no signaling takes place. The level readers will throw // when the time to write on the file comes, leading to a render failure. } }
void RenderCommand::doRender(bool isPreview) { bool isWritable = true; bool isMultiFrame; /*-- 初期化処理。フレーム範囲の計算や、Renderの場合はOutputSettingsから保存先パスも作る --*/ if (!init(isPreview)) return; if (m_fp.getDots() == ".") { isMultiFrame = false; TFileStatus fs(m_fp); if (fs.doesExist()) isWritable = fs.isWritable(); } else { isMultiFrame = true; TFilePath dir = m_fp.getParentDir(); QDir qDir(QString::fromStdWString(dir.getWideString())); QString levelName = QRegExp::escape(QString::fromStdWString(m_fp.getWideName())); QString levelType = QString::fromStdString(m_fp.getType()); QString exp(levelName + ".[0-9]{1,4}." + levelType); QRegExp regExp(exp); QStringList list = qDir.entryList(QDir::Files); QStringList livelFrames = list.filter(regExp); int i; for (i = 0; i < livelFrames.size() && isWritable; i++) { TFilePath frame = dir + TFilePath(livelFrames[i].toStdWString()); if (frame.isEmpty() || !frame.isAbsolute()) continue; TFileStatus fs(frame); isWritable = fs.isWritable(); } } if (!isWritable) { string str = "It is not possible to write the output: the file"; str += isMultiFrame ? "s are read only." : " is read only."; MsgBox(WARNING, QString::fromStdString(str)); return; } ToonzScene *scene = 0; TCamera *camera = 0; try { /*-- Xsheetノードに繋がっている各ラインごとに計算するモード。 MultipleRender で Schematic Flows または Fx Schematic Terminal Nodes が選択されている場合 --*/ if (m_multimediaRender && m_fp.getType() != "swf") //swf is not currently supported on multimedia... multimediaRender(); else if (!isPreview && m_fp.getType() == "swf") flashRender(); else /*-- 通常のRendering --*/ rasterRender(isPreview); } catch (TException &e) { MsgBox(WARNING, QString::fromStdString(toString(e.getMessage()))); } catch (...) { MsgBox(WARNING, QObject::tr("It is not possible to complete the rendering.")); } }
void StudioPaletteTreeViewer::dropEvent(QDropEvent *event) { TFilePath newPath = getItemPath(m_dropItem); resetDropItem(); if (newPath.isEmpty()) return; const QMimeData *mimeData = event->mimeData(); const PaletteData *paletteData = dynamic_cast<const PaletteData *>(mimeData); if (paletteData) { if (paletteData->hasOnlyPalette()) { TPalette *palette = paletteData->getPalette(); if (!palette) return; try { StudioPaletteCmd::createPalette( newPath, ::to_string(palette->getPaletteName()), palette); } catch (TException &e) { error("Can't create palette: " + QString(::to_string(e.getMessage()).c_str())); } catch (...) { error("Can't create palette"); } } return; } if (!mimeData->hasUrls() || mimeData->urls().size() == 0) return; QList<QUrl> urls = mimeData->urls(); TUndoManager::manager()->beginBlock(); int i; for (i = 0; i < urls.size(); i++) { QUrl url = urls[i]; TFilePath path = TFilePath(url.toLocalFile().toStdWString()); StudioPalette *studioPalette = StudioPalette::instance(); if (path == newPath || path.getParentDir() == newPath) continue; if (isInStudioPalette(path)) { TFilePath newPalettePath = newPath + TFilePath(path.getWideName() + ::to_wstring(path.getDottedType())); try { StudioPaletteCmd::movePalette(newPalettePath, path); } catch (TException &e) { error("Can't rename palette: " + QString(::to_string(e.getMessage()).c_str())); } catch (...) { error("Can't rename palette"); } } } TUndoManager::manager()->endBlock(); event->setDropAction(Qt::CopyAction); event->accept(); }
TFilePath TFilePath::decode(const std::map<string, string> &dictionary) const { TFilePath parent = getParentDir(); TFilePath filename = withParentDir(""); std::map<string, string>::const_iterator it = dictionary.find(filename.getFullPath()); if (it != dictionary.end()) filename = TFilePath(it->second); if (parent.isEmpty()) return filename; else return parent.decode(dictionary) + filename; }
void StudioPaletteTreeViewer::refreshItem(QTreeWidgetItem *item) { TFilePath folderPath = getItemPath(item); assert(folderPath != TFilePath()); // correct only tpl files and folders std::vector<TFilePath> childrenPath; StudioPalette::instance()->getChildren(childrenPath, folderPath); int currentChildCount = item->childCount(); std::vector<QTreeWidgetItem *> currentChildren; int i; for (i = 0; i < currentChildCount; i++) currentChildren.push_back(item->child(i)); int childrenPathCount = childrenPath.size(); int itemIndex = 0; int pathIndex = 0; while (itemIndex < currentChildCount || pathIndex < childrenPathCount) { TFilePath path = (pathIndex < childrenPathCount) ? childrenPath[pathIndex] : TFilePath(); QTreeWidgetItem *currentItem = (itemIndex < currentChildCount) ? currentChildren[itemIndex] : 0; TFilePath currentItemPath = getItemPath(currentItem); if (path == currentItemPath) { itemIndex++; pathIndex++; } else if ((!path.isEmpty() && path < currentItemPath) || currentItemPath.isEmpty()) { currentItem = createItem(path); item->insertChild(itemIndex, currentItem); itemIndex++; pathIndex++; } else { assert(currentItemPath < path || path.isEmpty()); assert(currentItem); item->removeChild(currentItem); itemIndex++; } } m_openedItems.insert(item); }
MovieRenderer::Imp::Imp(ToonzScene *scene, const TFilePath &moviePath, int threadCount, bool cacheResults) : m_scene(scene), m_renderer(threadCount), m_fp(moviePath), m_frameSize(scene->getCurrentCamera()->getRes()), m_xDpi(72), m_yDpi(72), m_renderSessionId(RenderSessionId++), m_nextFrameIdxToSave(0), m_savingThreadsCount(0), m_whiteSample(0), m_firstCompletedRaster(true) //< I know, sounds weird - it's just set to false , m_failure(false) // AFTER the first completed raster gets processed , m_cacheResults(cacheResults), m_preview(moviePath.isEmpty()), m_movieType(isMovieType(moviePath)) { m_renderCacheId = m_fp.withName(m_fp.getName() + "#RENDERID" + QString::number(m_renderSessionId).toStdString()) .getLevelName(); m_renderer.addPort(this); }
void TCacheResource::save(const TFilePath &fp) { assert(!fp.isEmpty()); std::map<PointLess, CellData>::iterator it; for (it = m_cellDatas.begin(); it != m_cellDatas.end(); ++it) { TRasterP cellRas = getRaster(TImageCache::instance()->get( getCellCacheId(it->first.x, it->first.y), false)); assert(m_tileType != NONE); TFilePath cellFp(fp + TFilePath(getCellName(it->first.x, it->first.y))); if (m_tileType == CM32) ::saveCompressed(cellFp, cellRas); else TImageWriter::save(cellFp.withType(".tif"), cellRas); } }
void StudioPaletteTreeViewer::onItemChanged(QTreeWidgetItem *item, int column) { if (item != currentItem() || isRootItem(item)) return; wstring name = item->text(column).toStdWString(); TFilePath oldPath = getCurrentFolderPath(); if (oldPath.isEmpty() || name.empty() || oldPath.getWideName() == name) return; TFilePath newPath(oldPath.getParentDir() + TFilePath(name + ::to_wstring(oldPath.getDottedType()))); try { StudioPaletteCmd::movePalette(newPath, oldPath); } catch (TException &e) { error(QString(::to_string(e.getMessage()).c_str())); item->setText(column, QString::fromStdWString(oldPath.getWideName())); } catch (...) { error("Can't rename file"); item->setText(column, QString::fromStdWString(oldPath.getWideName())); } refreshItem(getItem(oldPath.getParentDir())); setCurrentItem(getItem(newPath)); }
void TFarmStuff::getControllerData(QString &hostName, QString &ipAddr, int &port) { ControllerData data; TFilePath groot = getGlobalRoot(); QString grootpath = QString::fromStdWString(groot.getWideString()); if (groot.isEmpty() || grootpath == " ") throw TFarmStuff::TMissingGRootEnvironmentVariable(); bool fileExists = false; TFileStatus fs(groot); fileExists = fs.doesExist(); if (!fileExists) throw TFarmStuff::TMissingGRootFolder(); TFilePath fp = groot + "config" + "controller.txt"; ::loadControllerData(fp, data); hostName = data.m_hostName; ipAddr = data.m_ipAddress; port = data.m_port; }
/* "Save In" フィールドのためのFileField。browseDirectoryを再実装して、フィールドが空欄のときは、 カレントレベル(Scan画像。TIF等)の入っているフォルダの1つ上をデフォルトフォルダにして開くようにしたい。 */ void CleanupSaveInField::browseDirectory() { if (!m_fileBrowseButton->hasFocus()) return; QString directory = QString(); if (!m_browserPopupController) return; /* ここで、m_lastSelectedPathが空のとき、カレントレベルがScan画像の場合、 そのファイルの入っているフォルダの1つ上のフォルダを初期フォルダにする */ QString initialFolder = m_lastSelectedPath; if (initialFolder.isEmpty()) { /*--- 親Widgetを取得する ---*/ CleanupSettingsPane *parentCSP = dynamic_cast<CleanupSettingsPane *>(parentWidget()); if (parentCSP) { TFilePath lastSelectedPath = parentCSP->getLastSelectedPath(); if (!lastSelectedPath.isEmpty()) { /*---- * 親Widgetのm_lastSelectedPathが、CLNファイルの見込み所在地なので、その1つ上のフォルダを初期フォルダにする。---*/ initialFolder = QString::fromStdWString( lastSelectedPath.getParentDir().getParentDir().getWideString()); } } } m_browserPopupController->openPopup(QStringList(), true, initialFolder); if (m_browserPopupController->isExecute()) directory = m_browserPopupController->getPath(); if (!directory.isEmpty()) { setPath(directory); m_lastSelectedPath = directory; emit pathChanged(); return; } }
QString CleanupTab::pathString(const TFilePath &path, bool lpNone) { return path.isEmpty() ? lpNone ? QString("+extras") : QString("+drawings") : toQString(path); }
/*! Saves the project in the specified path. The TfilePath fp must be an absolute path. The project is saved as a xml file.\n Uses TProjectManager and TOStream. \note Exceptions can be thrown. \see TProjectManager and TOStream. */ bool TProject::save(const TFilePath &projectPath) { assert(isAProjectPath(projectPath)); TProjectManager *pm = TProjectManager::instance(); m_name = pm->projectPathToProjectName(projectPath); m_path = getLatestVersionProjectPath(projectPath); TFilePath projectFolder = projectPath.getParentDir(); if (!TFileStatus(projectFolder).doesExist()) { try { TSystem::mkDir(projectFolder); } catch (...) { return false; } } TFilePath sceneFolder = decode(getFolder(TProject::Scenes)); TFilePath scenesDescPath = sceneFolder + "scenes.xml"; TFileStatus fs(projectPath); if (fs.doesExist() && !fs.isWritable()) { throw TSystemException( projectPath, "Cannot save the project settings. The file is read-only."); return false; } TFileStatus fs2(scenesDescPath); if (fs2.doesExist() && !fs2.isWritable()) { throw TSystemException( projectPath, "Cannot save the project settings. The scenes file is read-only."); return false; } TOStream os(m_path); os.openChild("project"); os.openChild("version"); os << 70 << 1; // Standard version signature: os.closeChild(); // <Major Toonz version number * 10>.<Major version // advancement> os.openChild("folders"); int i = 0; for (i = 0; i < getFolderCount(); i++) { TFilePath folderRelativePath = getFolder(i); if (folderRelativePath == TFilePath()) continue; std::map<std::string, string> attr; string folderName = getFolderName(i); attr["name"] = folderName; attr["path"] = ::to_string(folderRelativePath); // escape() if (getUseScenePath(folderName)) attr["useScenePath"] = "yes"; os.openCloseChild("folder", attr); } os.closeChild(); os.openChild("sceneProperties"); getSceneProperties().saveData(os); os.closeChild(); os.closeChild(); // crea (se necessario) le directory relative ai vari folder for (i = 0; i < getFolderCount(); i++) if (isConstantFolder(i)) { TFilePath fp = getFolder(i); if (fp == TFilePath()) continue; fp = decode(fp); // if(!fp.isAbsolute()) fp = projectFolder + fp; if (!TFileStatus(fp).doesExist()) { try { TSystem::mkDir(fp); } catch (...) { } } } /*-- +scenes だけでなく、全てのProject Folderにscenes.xmlを生成する --*/ std::vector<std::string> foldernames; pm->getFolderNames(foldernames); for (int f = 0; f < foldernames.size(); f++) { TFilePath folderpath = decode(getFolder(foldernames.at(f))); if (folderpath.isEmpty() || !isConstantFolder(f)) continue; TFilePath xmlPath = folderpath + "scenes.xml"; TFileStatus xmlfs(xmlPath); if (xmlfs.doesExist() && !xmlfs.isWritable()) continue; TFilePath relativeProjectFolder = makeRelative(folderpath, m_path.getParentDir()); TOStream os2(xmlPath); std::map<std::string, string> attr; attr["type"] = "projectFolder"; os2.openChild("parentProject", attr); os2 << relativeProjectFolder; os2.closeChild(); } // The project has been successfully saved. In case there are other // project files from older Toonz project versions, those files are // renamed so that older Toonz versions can no longer 'see' it. if (!isFolderUnderVersionControl(projectFolder)) hideOlderProjectFiles(projectFolder); return true; }
int main(int argc, char *argv[]) { #ifdef Q_OS_WIN // Enable standard input/output on Windows Platform for debug BOOL consoleAttached = ::AttachConsole(ATTACH_PARENT_PROCESS); if (consoleAttached) { freopen("CON", "r", stdin); freopen("CON", "w", stdout); freopen("CON", "w", stderr); } #endif /*-- "-layout [レイアウト設定ファイル名]" で、必要なモジュールのPageだけのレイアウトで起動することを可能にする --*/ QString argumentLayoutFileName = ""; TFilePath loadScenePath; if (argc > 1) { for (int a = 1; a < argc; a++) { if (QString(argv[a]) == "-layout") { argumentLayoutFileName = QString(argv[a + 1]); a++; } else loadScenePath = TFilePath(argv[a]); } } QApplication a(argc, argv); #ifdef Q_OS_WIN // Since currently OpenToonz does not work with OpenGL of software or angle, // force Qt to use desktop OpenGL a.setAttribute(Qt::AA_UseDesktopOpenGL, true); #endif // Some Qt objects are destroyed badly withouth a living qApp. So, we must enforce a way to either // postpone the application destruction until the very end, OR ensure that sensible objects are // destroyed before. // Using a static QApplication only worked on Windows, and in any case C++ respects the statics destruction // order ONLY within the same library. On MAC, it made the app crash on exit o_o. So, nope. std::auto_ptr<QObject> mainScope(new QObject(&a)); // A QObject destroyed before the qApp is therefore explicitly mainScope->setObjectName("mainScope"); // provided. It can be accessed by looking in the qApp's children. #ifdef _WIN32 #ifndef x64 //Store the floating point control word. It will be re-set before Toonz initialization //has ended. unsigned int fpWord = 0; _controlfp_s(&fpWord, 0, 0); #endif #endif #ifdef _WIN32 //At least on windows, Qt's 4.5.2 native windows feature tend to create //weird flickering effects when dragging panel separators. a.setAttribute(Qt::AA_DontCreateNativeWidgetSiblings); #endif //Set the app's locale for numeric stuff to standard C. This is important for atof() and similar //calls that are locale-dependant. setlocale(LC_NUMERIC, "C"); // Set current directory to the bundle/application path - this is needed to have correct relative paths #ifdef MACOSX { QDir appDir(QApplication::applicationDirPath()); appDir.cdUp(), appDir.cdUp(), appDir.cdUp(); bool ret = QDir::setCurrent(appDir.absolutePath()); assert(ret); } #endif // splash screen QPixmap splashPixmap(":Resources/splash.png"); #ifdef _WIN32 a.setFont(QFont("Arial", 10)); #else a.setFont(QFont("Helvetica", 10)); #endif QString offsetStr("\n\n\n\n\n\n\n\n"); TSystem::hasMainLoop(true); TMessageRepository::instance(); QSplashScreen splash(splashPixmap); splash.show(); a.processEvents(); splash.showMessage(offsetStr + "Initializing QGLFormat...", Qt::AlignCenter, Qt::white); a.processEvents(); // OpenGL QGLFormat fmt; fmt.setAlpha(true); fmt.setStencil(true); QGLFormat::setDefaultFormat(fmt); #ifdef LINUX glutInit(&argc, argv); #endif splash.showMessage(offsetStr + "Initializing Toonz environment ...", Qt::AlignCenter, Qt::white); a.processEvents(); //Install run out of contiguous memory callback TBigMemoryManager::instance()->setRunOutOfContiguousMemoryHandler(&toonzRunOutOfContMemHandler); // Toonz environment initToonzEnv(); // Initialize thread components TThread::init(); TProjectManager *projectManager = TProjectManager::instance(); if (Preferences::instance()->isSVNEnabled()) { // Read Version Control repositories and add it to project manager as "special" svn project root VersionControl::instance()->init(); QList<SVNRepository> repositories = VersionControl::instance()->getRepositories(); int count = repositories.size(); for (int i = 0; i < count; i++) { SVNRepository r = repositories.at(i); TFilePath localPath(r.m_localPath.toStdWString()); if (!TFileStatus(localPath).doesExist()) { try { TSystem::mkDir(localPath); } catch (TException &e) { fatalError(QString::fromStdWString(e.getMessage())); } } projectManager->addSVNProjectsRoot(localPath); } } #if defined(MACOSX) && defined(__LP64__) //Load the shared memory settings int shmmax = Preferences::instance()->getShmMax(); int shmseg = Preferences::instance()->getShmSeg(); int shmall = Preferences::instance()->getShmAll(); int shmmni = Preferences::instance()->getShmMni(); if (shmall < 0) //Make sure that at least 100 MB of shared memory are available shmall = (tipc::shm_maxSharedPages() < (100 << 8)) ? (100 << 8) : -1; tipc::shm_set(shmmax, shmseg, shmall, shmmni); #endif // DVDirModel must be instantiated after Version Control initialization... FolderListenerManager::instance()->addListener(DvDirModel::instance()); splash.showMessage(offsetStr + "Loading Translator ...", Qt::AlignCenter, Qt::white); a.processEvents(); // Carico la traduzione contenuta in toonz.qm (se � presente) QString languagePathString = QString::fromStdString(toString(TEnv::getConfigDir() + "loc")); #ifndef WIN32 //the merge of menu on osx can cause problems with different languages with the Preferences menu //qt_mac_set_menubar_merge(false); languagePathString += "/" + Preferences::instance()->getCurrentLanguage(); #else languagePathString += "\\" + Preferences::instance()->getCurrentLanguage(); #endif QTranslator translator; #ifdef LINETEST translator.load("linetest", languagePathString); #else translator.load("toonz", languagePathString); #endif // La installo a.installTranslator(&translator); // Carico la traduzione contenuta in toonzqt.qm (se e' presente) QTranslator translator2; translator2.load("toonzqt", languagePathString); a.installTranslator(&translator2); // Carico la traduzione contenuta in tnzcore.qm (se e' presente) QTranslator tnzcoreTranslator; tnzcoreTranslator.load("tnzcore", languagePathString); qApp->installTranslator(&tnzcoreTranslator); // Carico la traduzione contenuta in toonzlib.qm (se e' presente) QTranslator toonzlibTranslator; toonzlibTranslator.load("toonzlib", languagePathString); qApp->installTranslator(&toonzlibTranslator); // Carico la traduzione contenuta in colorfx.qm (se e' presente) QTranslator colorfxTranslator; colorfxTranslator.load("colorfx", languagePathString); qApp->installTranslator(&colorfxTranslator); // Carico la traduzione contenuta in tools.qm QTranslator toolTranslator; toolTranslator.load("tnztools", languagePathString); qApp->installTranslator(&toolTranslator); // Aggiorno la traduzione delle properties di tutti i tools TTool::updateToolsPropertiesTranslation(); splash.showMessage(offsetStr + "Loading styles ...", Qt::AlignCenter, Qt::white); a.processEvents(); // stile QApplication::setStyle("windows"); IconGenerator::setFilmstripIconSize(Preferences::instance()->getIconSize()); splash.showMessage(offsetStr + "Loading shaders ...", Qt::AlignCenter, Qt::white); a.processEvents(); loadShaderInterfaces(ToonzFolder::getLibraryFolder() + TFilePath("shaders")); splash.showMessage(offsetStr + "Initializing Toonz application ...", Qt::AlignCenter, Qt::white); a.processEvents(); TTool::setApplication(TApp::instance()); TApp::instance()->init(); //iwsw commented out temporarily #if 0 QStringList monitorNames; /*-- 接続モニタがPVM-2541の場合のみLUTを読み込む --*/ if (Preferences::instance()->isDoColorCorrectionByUsing3DLutEnabled()) { /*-- 接続モニタがPVM-2541の場合のみLUTを読み込む --*/ monitorNames = Ghibli3DLutUtil::getMonitorName(); if (monitorNames.contains(QString::fromStdWString(L"PVM-2541"))) /*-- 3DLUTファイルを読み込む --*/ Ghibli3DLutUtil::loadLutFile(Preferences::instance()->get3DLutPath()); } /*-- 接続モニタをスプラッシュ画面にも表示 --*/ if (!monitorNames.isEmpty()) { lastUpdateStr += QString("Monitor Name : "); for (int mn = 0; mn < monitorNames.size(); mn++) { if (mn != 0) lastUpdateStr += QString(", "); lastUpdateStr += monitorNames.at(mn); } lastUpdateStr += QString("\n"); } #endif splash.showMessage(offsetStr + "Loading Plugins...", Qt::AlignCenter, Qt::white); a.processEvents(); /* poll the thread ends: 絶対に必要なわけではないが PluginLoader は中で setup ハンドラが常に固有のスレッドで呼ばれるよう main thread queue の blocking をしているので processEvents を行う必要がある */ while (!PluginLoader::load_entries("")) { a.processEvents(); } splash.showMessage(offsetStr + "Creating main window ...", Qt::AlignCenter, Qt::white); a.processEvents(); /*-- Layoutファイル名をMainWindowのctorに渡す --*/ MainWindow w(argumentLayoutFileName); splash.showMessage(offsetStr + "Loading style sheet ...", Qt::AlignCenter, Qt::white); a.processEvents(); // Carico lo styleSheet QString currentStyle = Preferences::instance()->getCurrentStyleSheet(); a.setStyleSheet(currentStyle); TApp::instance()->setMainWindow(&w); w.setWindowTitle(applicationFullName); splash.showMessage(offsetStr + "Starting main window ...", Qt::AlignCenter, Qt::white); a.processEvents(); TFilePath fp = ToonzFolder::getModuleFile("mainwindow.ini"); QSettings settings(toQString(fp), QSettings::IniFormat); w.restoreGeometry(settings.value("MainWindowGeometry").toByteArray()); #ifndef MACOSX //Workaround for the maximized window case: Qt delivers two resize events, one in the normal geometry, before //maximizing (why!?), the second afterwards - all inside the following show() call. This makes troublesome for //the docking system to correctly restore the saved geometry. Fortunately, MainWindow::showEvent(..) gets called //just between the two, so we can disable the currentRoom layout right before showing and re-enable it after //the normal resize has happened. if (w.isMaximized()) w.getCurrentRoom()->layout()->setEnabled(false); #endif QRect splashGeometry = splash.geometry(); splash.finish(&w); a.setQuitOnLastWindowClosed(false); // a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit())); w.checkForUpdates(); w.show(); //Show floating panels only after the main window has been shown w.startupFloatingPanels(); CommandManager::instance()->execute(T_Hand); if (!loadScenePath.isEmpty()) { splash.showMessage(QString("Loading file '") + loadScenePath.getQString() + "'...", Qt::AlignCenter, Qt::white); loadScenePath = loadScenePath.withType("tnz"); if (TFileStatus(loadScenePath).doesExist()) IoCmd::loadScene(loadScenePath); } QFont *myFont; std::string family = EnvSoftwareCurrentFont; myFont = new QFont(QString(family.c_str())); myFont->setPixelSize(EnvSoftwareCurrentFontSize); /*-- フォントのBoldの指定 --*/ std::string weight = EnvSoftwareCurrentFontWeight; if (strcmp(weight.c_str(), "Yes") == 0) myFont->setBold(true); else myFont->setBold(false); a.setFont(*myFont); QAction *action = CommandManager::instance()->getAction("MI_OpenTMessage"); if (action) QObject::connect(TMessageRepository::instance(), SIGNAL(openMessageCenter()), action, SLOT(trigger())); QObject::connect( TUndoManager::manager(), SIGNAL(somethingChanged()), TApp::instance()->getCurrentScene(), SLOT(setDirtyFlag())); #ifdef _WIN32 #ifndef x64 //On 32-bit architecture, there could be cases in which initialization could alter the //FPU floating point control word. I've seen this happen when loading some AVI coded (VFAPI), //where 80-bit internal precision was used instead of the standard 64-bit (much faster and //sufficient - especially considering that x86 truncates to 64-bit representation anyway). //IN ANY CASE, revert to the original control word. //In the x64 case these precision changes simply should not take place up to _controlfp_s //documentation. _controlfp_s(0, fpWord, -1); #endif #endif a.installEventFilter(TApp::instance()); int ret = a.exec(); TUndoManager::manager()->reset(); PreviewFxManager::instance()->reset(); #ifdef _WIN32 if (consoleAttached) { ::FreeConsole(); } #endif return ret; }
/*! In particolare imposta la projectRoot e la stuffDir, controlla se la directory di outputs esiste (e provvede a crearla in caso contrario) verifica inoltre che stuffDir esista. */ void initToonzEnv() { StudioPalette::enable(true); TEnv::setApplication(applicationName, applicationVersion, applicationRevision); TEnv::setRootVarName(rootVarName); TEnv::setSystemVarPrefix(systemVarPrefix); TEnv::setDllRelativeDir(TFilePath(dllRelativePath)); QCoreApplication::setOrganizationName("OpenToonz"); QCoreApplication::setOrganizationDomain(""); QString fullApplicationNameQStr = QString(applicationName) + " " + applicationVersion; QCoreApplication::setApplicationName(fullApplicationNameQStr); /*-- TOONZROOTのPathの確認 --*/ // controllo se la xxxroot e' definita e corrisponde ad un folder esistente TFilePath stuffDir = TEnv::getStuffDir(); if (stuffDir == TFilePath() || !TFileStatus(stuffDir).isDirectory()) { if (stuffDir == TFilePath()) fatalError("Undefined or empty: \"" + toQString(TEnv::getRootVarPath()) + "\""); else fatalError("Folder \"" + toQString(stuffDir) + "\" not found or not readable"); } Tiio::defineStd(); initImageIo(); initSoundIo(); initStdFx(); initColorFx(); // TPluginManager::instance()->loadStandardPlugins(); TFilePath library = ToonzFolder::getLibraryFolder(); TRasterImagePatternStrokeStyle::setRootDir(library); TVectorImagePatternStrokeStyle::setRootDir(library); TVectorBrushStyle::setRootDir(library); CustomStyleManager::setRootPath(library); // sembra indispensabile nella lettura dei .tab 2.2: TPalette::setRootDir(library); TImageStyle::setLibraryDir(library); //TProjectManager::instance()->enableTabMode(true); TProjectManager *projectManager = TProjectManager::instance(); /*-- TOONZPROJECTSのパスセットを取得する。(TOONZPROJECTSはセミコロンで区切って複数設定可能) --*/ TFilePathSet projectsRoots = ToonzFolder::getProjectsFolders(); TFilePathSet::iterator it; for (it = projectsRoots.begin(); it != projectsRoots.end(); ++it) projectManager->addProjectsRoot(*it); /*-- もしまだ無ければ、TOONZROOT/sandboxにsandboxプロジェクトを作る --*/ projectManager->createSandboxIfNeeded(); /* TProjectP project = projectManager->getCurrentProject(); Non dovrebbe servire per Tab: project->setFolder(TProject::Drawings, TFilePath("$scenepath")); project->setFolder(TProject::Extras, TFilePath("$scenepath")); project->setUseScenePath(TProject::Drawings, false); project->setUseScenePath(TProject::Extras, false); */ // Imposto la rootDir per ImageCache /*-- TOONZCACHEROOTの設定 --*/ TFilePath cacheDir = ToonzFolder::getCacheRootFolder(); if (cacheDir.isEmpty()) cacheDir = TEnv::getStuffDir() + "cache"; TImageCache::instance()->setRootDir(cacheDir); }