Switch Project Command (#83)
This commit is contained in:
parent
05958a4a7b
commit
d4d155dccc
6 changed files with 169 additions and 115 deletions
|
@ -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>
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
//=============================================================================
|
||||
|
|
Loading…
Reference in a new issue