From d4d155dccce6eea0bdd94e1e990b33c750dcb31d Mon Sep 17 00:00:00 2001 From: Jeremy Bullock Date: Sat, 11 Jul 2020 23:56:55 -0600 Subject: [PATCH] Switch Project Command (#83) --- .../rooms/Default/menubar_template.xml | 9 +- toonz/sources/toonz/mainwindow.cpp | 26 ++-- toonz/sources/toonz/menubar.cpp | 16 +- toonz/sources/toonz/menubarcommandids.h | 2 +- toonz/sources/toonz/projectpopup.cpp | 141 +++++++++++++++++- toonz/sources/toonz/projectpopup.h | 90 +---------- 6 files changed, 169 insertions(+), 115 deletions(-) diff --git a/stuff/profiles/layouts/rooms/Default/menubar_template.xml b/stuff/profiles/layouts/rooms/Default/menubar_template.xml index dae4e0e0..04db1581 100644 --- a/stuff/profiles/layouts/rooms/Default/menubar_template.xml +++ b/stuff/profiles/layouts/rooms/Default/menubar_template.xml @@ -17,9 +17,12 @@ MI_LoadColorModel - MI_NewProject - - MI_SaveDefaultSettings + + MI_NewProject + MI_ProjectSettings + + MI_SaveDefaultSettings + MI_ImportMagpieFile diff --git a/toonz/sources/toonz/mainwindow.cpp b/toonz/sources/toonz/mainwindow.cpp index 426215dc..edfc4be1 100644 --- a/toonz/sources/toonz/mainwindow.cpp +++ b/toonz/sources/toonz/mainwindow.cpp @@ -1258,7 +1258,7 @@ void MainWindow::onMenuCheckboxChanged() { FieldGuideToggleAction = isChecked; else if (cm->getAction(MI_RasterizePli) == action) { if (!QGLPixelBuffer::hasOpenGLPbuffers()) isChecked = 0; - RasterizePliToggleAction = isChecked; + RasterizePliToggleAction = isChecked; } else if (cm->getAction(MI_SafeArea) == action) SafeAreaToggleAction = isChecked; else if (cm->getAction(MI_ViewColorcard) == action) @@ -1303,7 +1303,7 @@ void MainWindow::showEvent(QShowEvent *event) { QTimer *nt = new QTimer(this); nt->setSingleShot(true); - nt->setInterval(10); + nt->setInterval(100); connect(nt, &QTimer::timeout, [=]() { #ifdef WIN32 @@ -1783,7 +1783,7 @@ void MainWindow::defineActions() { tr("Create a new project.") + separator + tr("A project is a container for a collection of " "related scenes and drawings.")); - // createMenuFileAction(MI_ProjectSettings, tr("&Project Settings..."), ""); + createMenuFileAction(MI_ProjectSettings, tr("&Switch Project"), ""); createMenuFileAction(MI_SaveDefaultSettings, tr("&Save Project Default Settings"), "", tr("Use the current scene's settings as a template for " @@ -3318,7 +3318,7 @@ void MainWindow::clearCacheFolder() { // 1. $CACHE/[Current ProcessID] // 2. $CACHE/temp/[Current scene folder] if the current scene is untitled - TFilePath cacheRoot = ToonzFolder::getCacheRootFolder(); + TFilePath cacheRoot = ToonzFolder::getCacheRootFolder(); if (cacheRoot.isEmpty()) cacheRoot = TEnv::getStuffDir() + "cache"; TFilePathSet filesToBeRemoved; @@ -3452,9 +3452,9 @@ RecentFiles::~RecentFiles() {} void RecentFiles::addFilePath(QString path, FileType fileType, QString projectName) { QList files = - (fileType == Scene) - ? m_recentScenes - : (fileType == Level) ? m_recentLevels : m_recentFlipbookImages; + (fileType == Scene) ? m_recentScenes : (fileType == Level) + ? m_recentLevels + : m_recentFlipbookImages; int i; for (i = 0; i < files.size(); i++) if (files.at(i) == path) { @@ -3621,9 +3621,9 @@ void RecentFiles::saveRecentFiles() { QList RecentFiles::getFilesNameList(FileType fileType) { QList files = - (fileType == Scene) - ? m_recentScenes - : (fileType == Level) ? m_recentLevels : m_recentFlipbookImages; + (fileType == Scene) ? m_recentScenes : (fileType == Level) + ? m_recentLevels + : m_recentFlipbookImages; QList names; int i; for (i = 0; i < files.size(); i++) { @@ -3650,9 +3650,9 @@ void RecentFiles::refreshRecentFilesMenu(FileType fileType) { menu->setEnabled(false); else { CommandId clearActionId = - (fileType == Scene) - ? MI_ClearRecentScene - : (fileType == Level) ? MI_ClearRecentLevel : MI_ClearRecentImage; + (fileType == Scene) ? MI_ClearRecentScene : (fileType == Level) + ? MI_ClearRecentLevel + : MI_ClearRecentImage; menu->setActions(names); menu->addSeparator(); QAction *clearAction = CommandManager::instance()->getAction(clearActionId); diff --git a/toonz/sources/toonz/menubar.cpp b/toonz/sources/toonz/menubar.cpp index b368e72e..86593ed1 100644 --- a/toonz/sources/toonz/menubar.cpp +++ b/toonz/sources/toonz/menubar.cpp @@ -384,13 +384,13 @@ QMenuBar *StackedMenuBar::createFullMenuBar() { fileMenu->addSeparator(); addMenuItem(fileMenu, MI_LoadColorModel); fileMenu->addSeparator(); - addMenuItem(fileMenu, MI_NewProject); - fileMenu->addSeparator(); - addMenuItem(fileMenu, MI_SaveDefaultSettings); - // QMenu *projectManagementMenu = fileMenu->addMenu(tr("Project Management")); - //{ - // //addMenuItem(projectManagementMenu, MI_ProjectSettings); - //} + QMenu *projectManagementMenu = fileMenu->addMenu(tr("Project Management")); + { + addMenuItem(projectManagementMenu, MI_NewProject); + addMenuItem(projectManagementMenu, MI_ProjectSettings); + projectManagementMenu->addSeparator(); + addMenuItem(projectManagementMenu, MI_SaveDefaultSettings); + } fileMenu->addSeparator(); QMenu *importMenu = fileMenu->addMenu(tr("Import")); { addMenuItem(importMenu, MI_ImportMagpieFile); } @@ -627,7 +627,7 @@ QMenuBar *StackedMenuBar::createFullMenuBar() { addMenuItem(renderMenu, MI_FastRender); // Menu' SCAN CLEANUP - QMenu* scanCleanupMenu = addMenu(tr("Cleanup"), fullMenuBar); + QMenu *scanCleanupMenu = addMenu(tr("Cleanup"), fullMenuBar); addMenuItem(scanCleanupMenu, MI_CleanupSettings); addMenuItem(scanCleanupMenu, MI_CleanupPreview); addMenuItem(scanCleanupMenu, MI_CameraTest); diff --git a/toonz/sources/toonz/menubarcommandids.h b/toonz/sources/toonz/menubarcommandids.h index 2c232d96..74174479 100644 --- a/toonz/sources/toonz/menubarcommandids.h +++ b/toonz/sources/toonz/menubarcommandids.h @@ -41,7 +41,7 @@ #define MI_NewNoteLevel "MI_NewNoteLevel" #define MI_RemoveEmptyColumns "MI_RemoveEmptyColumns" #define MI_NewProject "MI_NewProject" -//#define MI_ProjectSettings "MI_ProjectSettings" +#define MI_ProjectSettings "MI_ProjectSettings" #define MI_SaveDefaultSettings "MI_SaveDefaultSettings" #define MI_OutputSettings "MI_OutputSettings" #define MI_PreviewSettings "MI_PreviewSettings" diff --git a/toonz/sources/toonz/projectpopup.cpp b/toonz/sources/toonz/projectpopup.cpp index e845bc1a..2be010d5 100644 --- a/toonz/sources/toonz/projectpopup.cpp +++ b/toonz/sources/toonz/projectpopup.cpp @@ -20,6 +20,9 @@ // TnzCore includes #include "tsystem.h" #include "tenv.h" +#include "tapp.h" +#include "toonz/tscenehandle.h" +#include "toonz/toonzscene.h" // Qt includes #include @@ -50,6 +53,7 @@ ProjectPopup::ProjectPopup(bool isModal) m_choosePrjLabel = new QLabel(tr("Project:"), this); m_prjNameLabel = new QLabel(tr("Project Name:"), this); + m_pathFieldLabel = new QLabel(tr("Create Project In:"), this); m_nameFld = new LineEdit(); m_projectLocationFld = @@ -70,7 +74,7 @@ ProjectPopup::ProjectPopup(bool isModal) Qt::AlignRight | Qt::AlignVCenter); upperLayout->addWidget(m_nameFld, 0, 1); - upperLayout->addWidget(new QLabel(tr("Create Project In:"), this), 1, 0, + upperLayout->addWidget(m_pathFieldLabel, 1, 0, Qt::AlignRight | Qt::AlignVCenter); upperLayout->addWidget(m_projectLocationFld, 1, 1); } @@ -175,11 +179,12 @@ void ProjectPopup::showEvent(QShowEvent *) { //----------------------------------------------------------------------------- ProjectSettingsPopup::ProjectSettingsPopup() : ProjectPopup(false) { - setWindowTitle(tr("Project Settings")); + setWindowTitle(tr("Switch Project")); m_prjNameLabel->hide(); m_nameFld->hide(); - m_choosePrjLabel->show(); + m_choosePrjLabel->hide(); + m_pathFieldLabel->setText(tr("Project:")); int i; for (i = 0; i < m_folderFlds.size(); i++) { @@ -191,6 +196,97 @@ ProjectSettingsPopup::ProjectSettingsPopup() : ProjectPopup(false) { connect(cb, SIGNAL(stateChanged(int)), this, SLOT(onUseSceneChekboxChanged(int))); } + connect(m_projectLocationFld, &DVGui::FileField::pathChanged, this, + &ProjectSettingsPopup::projectChanged); +} + +//----------------------------------------------------------------------------- + +void ProjectSettingsPopup::projectChanged() { + TProjectManager *pm = TProjectManager::instance(); + TFilePath projectFolder = TFilePath(m_projectLocationFld->getPath()); + TFilePath path = pm->projectFolderToProjectPath(projectFolder); + + if (path == pm->getCurrentProjectPath()) { + return; + } + if (!TSystem::doesExistFileOrLevel(projectFolder)) { + projectFolder = + TApp::instance()->getCurrentScene()->getScene()->decodeFilePath( + projectFolder); + m_projectLocationFld->setPath(projectFolder.getQString()); + if (!TSystem::doesExistFileOrLevel(projectFolder)) { + DVGui::warning(tr( + "This is not a valid folder. Please choose an existing location.")); + m_projectLocationFld->setPath(m_oldPath.getQString()); + return; + } + } + if (!pm->isProject(projectFolder)) { + QStringList buttonList; + buttonList.append(tr("Yes")); + buttonList.append(tr("No")); + int answer = DVGui::MsgBox(tr("No project found at this location \n" + "What would you like to do?"), + tr("Make a new project"), tr("Cancel"), 1, this); + if (answer != 1) { + m_projectLocationFld->blockSignals(true); + m_projectLocationFld->setPath(TApp::instance() + ->getCurrentScene() + ->getScene() + ->getProject() + ->getProjectFolder() + .getQString()); + m_projectLocationFld->blockSignals(false); + } else { + ProjectCreatePopup *popup = new ProjectCreatePopup(); + popup->setPath(projectFolder.getQString()); + popup->exec(); + accept(); + return; + } + } + + if (!IoCmd::saveSceneIfNeeded(QObject::tr("Change Project"))) { + m_projectLocationFld->blockSignals(true); + m_projectLocationFld->setPath(TApp::instance() + ->getCurrentScene() + ->getScene() + ->getProject() + ->getProjectFolder() + .getQString()); + m_projectLocationFld->blockSignals(false); + return; + } + + pm->setCurrentProjectPath(path); + + TProject *projectP = + TProjectManager::instance()->getCurrentProject().getPointer(); + + // In case the project file was upgraded to current version, save it now + if (projectP->getProjectPath() != path) { + projectP->save(); + } + + updateFieldsFromProject(projectP); + IoCmd::newScene(); + accept(); +} + +//----------------------------------------------------------------------------- + +void ProjectSettingsPopup::onProjectChanged() { + m_projectLocationFld->blockSignals(true); + m_projectLocationFld->setPath(TApp::instance() + ->getCurrentScene() + ->getScene() + ->getProject() + ->getProjectFolder() + .getQString()); + m_projectLocationFld->blockSignals(false); + TProjectP currentProject = TProjectManager::instance()->getCurrentProject(); + updateFieldsFromProject(currentProject.getPointer()); } //----------------------------------------------------------------------------- @@ -223,21 +319,50 @@ void ProjectSettingsPopup::onUseSceneChekboxChanged(int) { //----------------------------------------------------------------------------- -// OpenPopupCommandHandler openProjectSettingsPopup( -// MI_ProjectSettings); +void ProjectSettingsPopup::showEvent(QShowEvent *) { + TProjectP currentProject = TProjectManager::instance()->getCurrentProject(); + updateFieldsFromProject(currentProject.getPointer()); + + m_nameFld->setText(""); + + m_projectLocationFld->blockSignals(true); + m_projectLocationFld->setPath(TProjectManager::instance() + ->getCurrentProjectPath() + .getParentDir() + .getQString()); + m_oldPath = TFilePath(m_projectLocationFld->getPath()); + m_projectLocationFld->blockSignals(false); + + resize(600, 75); + QSizePolicy sizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); + sizePolicy.setHorizontalStretch(0); + sizePolicy.setVerticalStretch(0); + setSizePolicy(sizePolicy); + setMinimumSize(QSize(600, 75)); + setMaximumSize(QSize(600, 75)); + setFixedSize(width(), height()); + setSizeGripEnabled(false); +} + +//----------------------------------------------------------------------------- + +OpenPopupCommandHandler openProjectSettingsPopup( + MI_ProjectSettings); //============================================================================= -/*! \class ProjectCreatePopup - \brief The ProjectCreatePopup class provides a modal dialog to +/* class ProjectCreatePopup + The ProjectCreatePopup class provides a modal dialog to create a new project. - Inherits \b ProjectPopup. + Inherits ProjectPopup. */ //----------------------------------------------------------------------------- ProjectCreatePopup::ProjectCreatePopup() : ProjectPopup(true) { setWindowTitle(tr("New Project")); + m_pathFieldLabel->setText(tr("Create Project In:")); + QPushButton *okBtn = new QPushButton(tr("OK"), this); okBtn->setDefault(true); QPushButton *cancelBtn = new QPushButton(tr("Cancel"), this); diff --git a/toonz/sources/toonz/projectpopup.h b/toonz/sources/toonz/projectpopup.h index 8c41c41f..dc718800 100644 --- a/toonz/sources/toonz/projectpopup.h +++ b/toonz/sources/toonz/projectpopup.h @@ -15,90 +15,8 @@ class LineEdit; class CheckBox; } -class DvDirTreeView; class QComboBox; -//============================================================================= -// ProjectDvDirModelRootNode - -class ProjectDvDirModelRootNode final : public DvDirModelNode { -public: - ProjectDvDirModelRootNode(); - void refreshChildren() override; -}; - -//============================================================================= -// ProjectDvDirModelFileFolderNode - -class ProjectDvDirModelFileFolderNode : public DvDirModelFileFolderNode { -public: - ProjectDvDirModelFileFolderNode(DvDirModelNode *parent, std::wstring name, - const TFilePath &path) - : DvDirModelFileFolderNode(parent, name, path) {} - ProjectDvDirModelFileFolderNode(DvDirModelNode *parent, const TFilePath &path) - : DvDirModelFileFolderNode(parent, path) {} - DvDirModelNode *makeChild(std::wstring name) override; - DvDirModelFileFolderNode *createNode(DvDirModelNode *parent, - const TFilePath &path); -}; - -//============================================================================= -// ProjectDvDirModelSpecialFileFolderNode - -class ProjectDvDirModelSpecialFileFolderNode final - : public ProjectDvDirModelFileFolderNode { - QPixmap m_pixmap; - -public: - ProjectDvDirModelSpecialFileFolderNode(DvDirModelNode *parent, - std::wstring name, - const TFilePath &path) - : ProjectDvDirModelFileFolderNode(parent, name, path) {} - QPixmap getPixmap(bool isOpen) const override { return m_pixmap; } - void setPixmap(const QPixmap &pixmap) { m_pixmap = pixmap; } -}; - -//============================================================================= -// ProjectDvDirModelProjectNode - -class ProjectDvDirModelProjectNode final - : public ProjectDvDirModelFileFolderNode { -public: - ProjectDvDirModelProjectNode(DvDirModelNode *parent, const TFilePath &path) - : ProjectDvDirModelFileFolderNode(parent, path) {} - void makeCurrent() {} - QPixmap getPixmap(bool isOpen) const override; -}; - -//============================================================================= -// ProjectDirModel - -class ProjectDirModel final : public QAbstractItemModel { - DvDirModelNode *m_root; - -public: - ProjectDirModel(); - ~ProjectDirModel(); - - DvDirModelNode *getNode(const QModelIndex &index) const; - QModelIndex index(int row, int column, - const QModelIndex &parent) const override; - QModelIndex parent(const QModelIndex &index) const override; - QModelIndex childByName(const QModelIndex &parent, - const std::wstring &name) const; - int columnCount(const QModelIndex &parent) const override { return 1; } - QVariant data(const QModelIndex &index, - int role = Qt::DisplayRole) const override; - Qt::ItemFlags flags(const QModelIndex &index) const override; - bool setData(const QModelIndex &index, const QVariant &value, - int role = Qt::EditRole) override; - int rowCount(const QModelIndex &parent = QModelIndex()) const override; - bool hasChildren(const QModelIndex &parent) const override; - void refresh(const QModelIndex &index); - void refreshFolderChild(const QModelIndex &i = QModelIndex()); - QModelIndex getIndexByNode(DvDirModelNode *node) const; -}; - //============================================================================= // ProjectPopup //----------------------------------------------------------------------------- @@ -113,6 +31,7 @@ protected: QLabel *m_prjNameLabel; QLabel *m_choosePrjLabel; + QLabel *m_pathFieldLabel; DVGui::FileField *m_projectLocationFld; @@ -137,12 +56,19 @@ protected: class ProjectSettingsPopup final : public ProjectPopup { Q_OBJECT + TFilePath m_oldPath; + public: ProjectSettingsPopup(); public slots: void onFolderChanged(); void onUseSceneChekboxChanged(int); + void projectChanged(); + void onProjectChanged() override; + +protected: + void showEvent(QShowEvent *) override; }; //=============================================================================