Switch Project Command (#83)

This commit is contained in:
Jeremy Bullock 2020-07-11 23:56:55 -06:00 committed by GitHub
parent 05958a4a7b
commit d4d155dccc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 169 additions and 115 deletions

View file

@ -17,9 +17,12 @@
<separator/>
<command>MI_LoadColorModel</command>
<separator/>
<command>MI_NewProject</command>
<separator/>
<command>MI_SaveDefaultSettings</command>
<menu title="Project Management">
<command>MI_NewProject</command>
<command>MI_ProjectSettings</command>
<separator/>
<command>MI_SaveDefaultSettings</command>
</menu>
<separator/>
<menu title="Import">
<command>MI_ImportMagpieFile</command>

View file

@ -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<QString> 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<QString> RecentFiles::getFilesNameList(FileType fileType) {
QList<QString> files =
(fileType == Scene)
? m_recentScenes
: (fileType == Level) ? m_recentLevels : m_recentFlipbookImages;
(fileType == Scene) ? m_recentScenes : (fileType == Level)
? m_recentLevels
: m_recentFlipbookImages;
QList<QString> 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);

View file

@ -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);

View file

@ -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"

View file

@ -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 <QPushButton>
@ -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<ProjectSettingsPopup> 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<ProjectSettingsPopup> 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);

View file

@ -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;
};
//=============================================================================