1 
2 
3 #include "exportscenepopup.h"
4 
5 // Tnz6 includes
6 #include "tapp.h"
7 #include "filebrowser.h"
8 #include "iocommand.h"
9 
10 // TnzQt includes
11 #include "toonzqt/gutil.h"
12 
13 // TnzLib includes
14 #include "toonz/tproject.h"
15 #include "toonz/toonzscene.h"
16 #include "toonz/sceneresources.h"
17 
18 // TnzCore includes
19 #include "tsystem.h"
20 
21 // Qt includes
22 #include <QVBoxLayout>
23 #include <QLabel>
24 #include <QButtonGroup>
25 #include <QRadioButton>
26 #include <QPushButton>
27 #include <QHeaderView>
28 #include <QPainter>
29 #include <QApplication>
30 #include <QMainWindow>
31 
32 using namespace DVGui;
33 
34 //------------------------------------------------------------------------
35 namespace {
36 //------------------------------------------------------------------------
37 
importScene(TFilePath scenePath)38 TFilePath importScene(TFilePath scenePath) {
39   ToonzScene scene;
40   bool ret;
41   try {
42     ret = IoCmd::loadScene(scene, scenePath, true);
43   } catch (TException &e) {
44     DVGui::error(QObject::tr("Error loading scene %1 :%2")
45                      .arg(toQString(scenePath))
46                      .arg(QString::fromStdWString(e.getMessage())));
47 
48     return TFilePath();
49   } catch (...) {
50     DVGui::error(
51         QObject::tr("Error loading scene %1").arg(toQString(scenePath)));
52     return TFilePath();
53   }
54 
55   if (!ret) {
56     DVGui::error(QObject::tr("It is not possible to export the scene %1 "
57                              "because it does not belong to any project.")
58                      .arg(toQString(scenePath)));
59 
60     return TFilePath();
61   }
62 
63   TFilePath path = scene.getScenePath();
64   scene.save(scene.getScenePath());
65   DvDirModel::instance()->refreshFolder(
66       TProjectManager::instance()->getCurrentProjectPath().getParentDir());
67   return path;
68 }
69 
70 //------------------------------------------------------------------------
71 
collectAssets(TFilePath scenePath)72 int collectAssets(TFilePath scenePath) {
73   ToonzScene scene;
74   scene.load(scenePath);
75   ResourceCollector collector(&scene);
76   SceneResources resources(&scene, scene.getXsheet());
77   resources.accept(&collector);
78   int count = collector.getCollectedResourceCount();
79   if (count > 0) {
80     scene.save(scenePath);
81   }
82   return count;
83 }
84 
85 //------------------------------------------------------------------------
86 }  // namespace
87 //------------------------------------------------------------------------
88 
89 //=============================================================================
90 // MyDvDirModelFileFolderNode [File folder]
91 
makeChild(std::wstring name)92 DvDirModelNode *ExportSceneDvDirModelFileFolderNode::makeChild(
93     std::wstring name) {
94   return createExposeSceneNode(this, m_path + name);
95 }
96 
97 //-----------------------------------------------------------------------------
98 
99 DvDirModelFileFolderNode *
createExposeSceneNode(DvDirModelNode * parent,const TFilePath & path)100 ExportSceneDvDirModelFileFolderNode::createExposeSceneNode(
101     DvDirModelNode *parent, const TFilePath &path) {
102   DvDirModelFileFolderNode *node;
103   if (path.getType() == "tnz")
104     return 0;
105   else if (TProjectManager::instance()->isProject(path))
106     node = new ExportSceneDvDirModelProjectNode(parent, path);
107   else
108     node = new ExportSceneDvDirModelFileFolderNode(parent, path);
109   if (path.getName().find("_files") == std::string::npos)
110     node->enableRename(true);
111   return node;
112 }
113 
114 //=============================================================================
115 // ExportSceneDvDirModelProjectNode
116 
getPixmap(bool isOpen) const117 QPixmap ExportSceneDvDirModelProjectNode::getPixmap(bool isOpen) const {
118   static QPixmap openProjectPixmap(recolorPixmap(
119       svgToPixmap(getIconThemePath("actions/18/folder_project_on.svg"))));
120   static QPixmap closeProjectPixmap(recolorPixmap(
121       svgToPixmap(getIconThemePath("actions/18/folder_project.svg"))));
122   return isOpen ? openProjectPixmap : closeProjectPixmap;
123 }
124 
125 //-----------------------------------------------------------------------------
126 
isCurrent() const127 bool ExportSceneDvDirModelProjectNode::isCurrent() const {
128   TProjectManager *pm = TProjectManager::instance();
129   return pm->getCurrentProjectPath().getParentDir() == getPath();
130 }
131 
132 //-----------------------------------------------------------------------------
133 
134 DvDirModelFileFolderNode *
createExposeSceneNode(DvDirModelNode * parent,const TFilePath & path)135 ExportSceneDvDirModelProjectNode::createExposeSceneNode(DvDirModelNode *parent,
136                                                         const TFilePath &path) {
137   DvDirModelFileFolderNode *node;
138   if (path.getType() == "tnz")
139     return 0;
140   else {
141     node = new ExportSceneDvDirModelFileFolderNode(parent, path);
142     if (path.getName().find("_files") == std::string::npos)
143       node->enableRename(true);
144     TProject *project = new TProject();
145     project->load(
146         TProjectManager::instance()->projectFolderToProjectPath(getPath()));
147     int k = project->getFolderIndexFromPath(node->getPath());
148     node->setIsProjectFolder(k >= 0);
149   }
150   return node;
151 }
152 
153 //=============================================================================
154 // ExportSceneDvDirModelRootNode [Root]
155 
ExportSceneDvDirModelRootNode()156 ExportSceneDvDirModelRootNode::ExportSceneDvDirModelRootNode()
157     : DvDirModelNode(0, L"Root") {
158   m_nodeType = "Root";
159 }
160 
161 //-----------------------------------------------------------------------------
162 
add(std::wstring name,const TFilePath & path)163 void ExportSceneDvDirModelRootNode::add(std::wstring name,
164                                         const TFilePath &path) {
165   DvDirModelNode *child =
166       new ExportSceneDvDirModelFileFolderNode(this, name, path);
167   child->setRow((int)m_children.size());
168   m_children.push_back(child);
169 }
170 
171 //-----------------------------------------------------------------------------
172 
refreshChildren()173 void ExportSceneDvDirModelRootNode::refreshChildren() {
174   m_childrenValid = true;
175   m_children.clear();
176   // if(m_children.empty())
177   //{
178   TProjectManager *pm = TProjectManager::instance();
179   std::vector<TFilePath> projectRoots;
180   pm->getProjectRoots(projectRoots);
181 
182   int i;
183   for (i = 0; i < (int)projectRoots.size(); i++) {
184     TFilePath projectRoot = projectRoots[i];
185     ExportSceneDvDirModelSpecialFileFolderNode *projectRootNode =
186         new ExportSceneDvDirModelSpecialFileFolderNode(this, L"Project root",
187                                                        projectRoot);
188     projectRootNode->setPixmap(QPixmap(recolorPixmap(
189         svgToPixmap(getIconThemePath("actions/18/folder_project_root.svg")))));
190     m_projectRootNodes.push_back(projectRootNode);
191     addChild(projectRootNode);
192   }
193 
194   TFilePath sandboxProjectPath = pm->getSandboxProjectFolder();
195   m_sandboxProjectNode =
196       new ExportSceneDvDirModelProjectNode(this, sandboxProjectPath);
197   addChild(m_sandboxProjectNode);
198 
199   // SVN Repository
200   QList<SVNRepository> repositories =
201       VersionControl::instance()->getRepositories();
202   int count = repositories.size();
203   for (int i = 0; i < count; i++) {
204     SVNRepository repo = repositories.at(i);
205 
206     ExportSceneDvDirModelSpecialFileFolderNode *node =
207         new ExportSceneDvDirModelSpecialFileFolderNode(
208             this, repo.m_name.toStdWString(),
209             TFilePath(repo.m_localPath.toStdWString()));
210     node->setPixmap(QPixmap(svgToPixmap(":Resources/vcroot.svg")));
211     addChild(node);
212   }
213   //}
214 }
215 
216 //-----------------------------------------------------------------------------
217 
getNodeByPath(const TFilePath & path)218 DvDirModelNode *ExportSceneDvDirModelRootNode::getNodeByPath(
219     const TFilePath &path) {
220   DvDirModelNode *node = 0;
221   int i;
222   //! path could be the sandbox project or in the sandbox project
223   if (m_sandboxProjectNode && m_sandboxProjectNode->getPath() == path)
224     return m_sandboxProjectNode;
225   if (m_sandboxProjectNode) {
226     for (i = 0; i < m_sandboxProjectNode->getChildCount(); i++) {
227       DvDirModelNode *node =
228           m_sandboxProjectNode->getChild(i)->getNodeByPath(path);
229       if (node) return node;
230     }
231   }
232   //! or it could be a different project, under some project root
233   for (i = 0; i < (int)m_projectRootNodes.size(); i++) {
234     node = m_projectRootNodes[i]->getNodeByPath(path);
235     if (node) return node;
236   }
237   //! it could be a regular folder, somewhere in the file system
238 
239   return 0;
240 }
241 
242 //=============================================================================
243 // ExportSceneDvDirModel
244 
ExportSceneDvDirModel()245 ExportSceneDvDirModel::ExportSceneDvDirModel() {
246   m_root = new ExportSceneDvDirModelRootNode();
247   m_root->refreshChildren();
248 }
249 
250 //-----------------------------------------------------------------------------
251 
~ExportSceneDvDirModel()252 ExportSceneDvDirModel::~ExportSceneDvDirModel() { delete m_root; }
253 
254 //-----------------------------------------------------------------------------
255 
getNode(const QModelIndex & index) const256 DvDirModelNode *ExportSceneDvDirModel::getNode(const QModelIndex &index) const {
257   if (index.isValid())
258     return static_cast<DvDirModelNode *>(index.internalPointer());
259   else
260     return m_root;
261 }
262 
263 //-----------------------------------------------------------------------------
264 
index(int row,int column,const QModelIndex & parent) const265 QModelIndex ExportSceneDvDirModel::index(int row, int column,
266                                          const QModelIndex &parent) const {
267   if (column != 0) return QModelIndex();
268   DvDirModelNode *parentNode       = m_root;
269   if (parent.isValid()) parentNode = getNode(parent);
270   if (row < 0 || row >= parentNode->getChildCount()) return QModelIndex();
271   DvDirModelNode *node = parentNode->getChild(row);
272   return createIndex(row, column, node);
273 }
274 
275 //-----------------------------------------------------------------------------
276 
parent(const QModelIndex & index) const277 QModelIndex ExportSceneDvDirModel::parent(const QModelIndex &index) const {
278   if (!index.isValid()) return QModelIndex();
279   DvDirModelNode *node       = getNode(index);
280   DvDirModelNode *parentNode = node->getParent();
281   if (!parentNode || parentNode == m_root)
282     return QModelIndex();
283   else
284     return createIndex(parentNode->getRow(), 0, parentNode);
285 }
286 
287 //-----------------------------------------------------------------------------
288 
childByName(const QModelIndex & parent,const std::wstring & name) const289 QModelIndex ExportSceneDvDirModel::childByName(const QModelIndex &parent,
290                                                const std::wstring &name) const {
291   if (!parent.isValid()) return QModelIndex();
292   DvDirModelNode *parentNode = getNode(parent);
293   if (!parentNode) return QModelIndex();
294   int row = parentNode->rowByName(name);
295   if (row < 0 || row >= parentNode->getChildCount()) return QModelIndex();
296   DvDirModelNode *childNode = parentNode->getChild(row);
297   return createIndex(row, 0, childNode);
298 }
299 
300 //-----------------------------------------------------------------------------
301 
rowCount(const QModelIndex & parent) const302 int ExportSceneDvDirModel::rowCount(const QModelIndex &parent) const {
303   DvDirModelNode *node = getNode(parent);
304   int childCount       = node->getChildCount();
305   return childCount;
306 }
307 
308 //-----------------------------------------------------------------------------
309 
data(const QModelIndex & index,int role) const310 QVariant ExportSceneDvDirModel::data(const QModelIndex &index, int role) const {
311   if (!index.isValid()) return QVariant();
312   DvDirModelNode *node = getNode(index);
313   if (role == Qt::DisplayRole || role == Qt::EditRole)
314     return QString::fromStdWString(node->getName());
315   else if (role == Qt::DecorationRole) {
316     return QVariant();
317   } else if (role == Qt::ForegroundRole) {
318     if (!node || !node->isRenameEnabled())
319       return QBrush(Qt::blue);
320     else
321       return QVariant();
322   } else
323     return QVariant();
324 }
325 
326 //-----------------------------------------------------------------------------
327 
flags(const QModelIndex & index) const328 Qt::ItemFlags ExportSceneDvDirModel::flags(const QModelIndex &index) const {
329   Qt::ItemFlags flags = QAbstractItemModel::flags(index);
330   if (index.isValid()) {
331     DvDirModelNode *node = getNode(index);
332     if (node && node->isRenameEnabled()) flags |= Qt::ItemIsEditable;
333   }
334   return flags;
335 }
336 
337 //-----------------------------------------------------------------------------
338 
setData(const QModelIndex & index,const QVariant & value,int role)339 bool ExportSceneDvDirModel::setData(const QModelIndex &index,
340                                     const QVariant &value, int role) {
341   if (!index.isValid()) return false;
342   DvDirModelNode *node = getNode(index);
343   if (!node || !node->isRenameEnabled()) return false;
344   QString newName = value.toString();
345   if (newName == "") return false;
346   if (!node->setName(newName.toStdWString())) return false;
347   emit dataChanged(index, index);
348   return true;
349 }
350 
351 //-----------------------------------------------------------------------------
352 
hasChildren(const QModelIndex & parent) const353 bool ExportSceneDvDirModel::hasChildren(const QModelIndex &parent) const {
354   DvDirModelNode *node = getNode(parent);
355   return node->hasChildren();
356 }
357 
358 //-----------------------------------------------------------------------------
359 
refresh(const QModelIndex & index)360 void ExportSceneDvDirModel::refresh(const QModelIndex &index) {
361   DvDirModelNode *node;
362   if (!index.isValid())
363     node = m_root;
364   else
365     node = getNode(index);
366   if (!node) return;
367   emit layoutAboutToBeChanged();
368   emit beginRemoveRows(index, 0, node->getChildCount());
369   node->refreshChildren();
370   emit endRemoveRows();
371   emit layoutChanged();
372 }
373 
374 //=============================================================================
375 // ExportSceneTreeViewDelegate
376 
ExportSceneTreeViewDelegate(ExportSceneTreeView * parent)377 ExportSceneTreeViewDelegate::ExportSceneTreeViewDelegate(
378     ExportSceneTreeView *parent)
379     : QItemDelegate(parent), m_treeView(parent) {}
380 
381 //-----------------------------------------------------------------------------
382 
~ExportSceneTreeViewDelegate()383 ExportSceneTreeViewDelegate::~ExportSceneTreeViewDelegate() {}
384 
385 //-----------------------------------------------------------------------------
386 
paint(QPainter * painter,const QStyleOptionViewItem & option,const QModelIndex & index) const387 void ExportSceneTreeViewDelegate::paint(QPainter *painter,
388                                         const QStyleOptionViewItem &option,
389                                         const QModelIndex &index) const {
390   QRect rect           = option.rect;
391   DvDirModelNode *node = DvDirModel::instance()->getNode(index);
392   if (!node) return;
393 
394   ExportSceneDvDirModelProjectNode *pnode =
395       dynamic_cast<ExportSceneDvDirModelProjectNode *>(node);
396   ExportSceneDvDirModelFileFolderNode *fnode =
397       dynamic_cast<ExportSceneDvDirModelFileFolderNode *>(node);
398 
399   bool isCurrent = node == m_treeView->getCurrentNode();
400   if (isCurrent)
401     painter->fillRect(rect.adjusted(-2, 0, 0, 0),
402                       QBrush(m_treeView->getSelectedItemBackground()));
403 
404   QPixmap px = node->getPixmap(m_treeView->isExpanded(index));
405   if (!px.isNull()) {
406     int x = rect.left();
407     int y = rect.top() + (rect.height() - px.height()) / 2;
408     painter->drawPixmap(QPoint(x, y), px);
409   }
410   rect.adjust(pnode ? 31 : 22, 0, 0, 0);
411   QVariant d   = index.data();
412   QString name = QString::fromStdWString(node->getName());
413   if (fnode && fnode->isProjectFolder()) {
414     painter->setPen((isCurrent) ? m_treeView->getSelectedFolderTextColor()
415                                 : m_treeView->getFolderTextColor());
416   } else {
417     painter->setPen((isCurrent) ? m_treeView->getSelectedTextColor()
418                                 : m_treeView->getTextColor());
419   }
420   QRect nameBox;
421   painter->drawText(rect, Qt::AlignVCenter | Qt::AlignLeft, name, &nameBox);
422 
423   if (pnode) {
424     painter->setPen(m_treeView->getTextColor());
425     if (pnode->isCurrent())
426       painter->setBrush(Qt::red);
427     else
428       painter->setBrush(Qt::NoBrush);
429     int d = 8;
430     int y = (rect.height() - d) / 2;
431     painter->drawEllipse(rect.x() - d - 4, rect.y() + y, d, d);
432   }
433 }
434 
435 //-----------------------------------------------------------------------------
436 
sizeHint(const QStyleOptionViewItem & option,const QModelIndex & index) const437 QSize ExportSceneTreeViewDelegate::sizeHint(const QStyleOptionViewItem &option,
438                                             const QModelIndex &index) const {
439   return QSize(QItemDelegate::sizeHint(option, index).width() + 10, 22);
440 }
441 
442 //=============================================================================
443 // ExportSceneTreeView
444 
ExportSceneTreeView(QWidget * parent)445 ExportSceneTreeView::ExportSceneTreeView(QWidget *parent)
446     : StyledTreeView(parent) {
447   setStyleSheet("border:1px solid rgba(0,0,0,0.5);");
448   m_model = new ExportSceneDvDirModel();
449   setModel(m_model);
450   header()->close();
451   setItemDelegate(new ExportSceneTreeViewDelegate(this));
452   setSelectionMode(QAbstractItemView::SingleSelection);
453 
454   // Connect all possible changes that can alter the
455   // bottom horizontal scrollbar to resize contents...
456   bool ret = connect(this, SIGNAL(expanded(const QModelIndex &)), this,
457                      SLOT(resizeToConts()));
458   ret = ret && connect(this, SIGNAL(collapsed(const QModelIndex &)), this,
459                        SLOT(resizeToConts()));
460   ret = ret && connect(this->model(), SIGNAL(layoutChanged()), this,
461                        SLOT(resizeToConts()));
462 
463   assert(ret);
464   setAcceptDrops(true);
465 }
466 
467 //-----------------------------------------------------------------------------
468 
resizeToConts()469 void ExportSceneTreeView::resizeToConts() { resizeColumnToContents(0); }
470 
471 //-----------------------------------------------------------------------------
472 
refresh()473 void ExportSceneTreeView::refresh() { m_model->refresh(QModelIndex()); }
474 
475 //-----------------------------------------------------------------------------
476 
getCurrentNode() const477 DvDirModelNode *ExportSceneTreeView::getCurrentNode() const {
478   QModelIndex index    = currentIndex();
479   DvDirModelNode *node = m_model->getNode(index);
480   return node;
481 }
482 
483 //-----------------------------------------------------------------------------
484 
sizeHint() const485 QSize ExportSceneTreeView::sizeHint() const { return QSize(100, 100); }
486 
487 //-----------------------------------------------------------------------------
488 
showEvent(QShowEvent *)489 void ExportSceneTreeView::showEvent(QShowEvent *) { refresh(); }
490 
491 //-----------------------------------------------------------------------------
492 
focusInEvent(QFocusEvent * event)493 void ExportSceneTreeView::focusInEvent(QFocusEvent *event) {
494   QTreeView::focusInEvent(event);
495   emit focusIn();
496 }
497 
498 //=============================================================================
499 // ExportScenePopup
500 
ExportScenePopup(std::vector<TFilePath> scenes)501 ExportScenePopup::ExportScenePopup(std::vector<TFilePath> scenes)
502     : Dialog(TApp::instance()->getMainWindow(), true, false, "ExportScene")
503     , m_scenes(scenes)
504     , m_createNewProject(false) {
505   setWindowTitle(tr("Export Scene"));
506 
507   bool ret = true;
508 
509   QVBoxLayout *layout = new QVBoxLayout(this);
510 
511   //  m_command = new QLabel(this);
512   //  layout->addWidget(m_command);
513 
514   QButtonGroup *group = new QButtonGroup(this);
515   group->setExclusive(true);
516 
517   // Choose Project
518   QWidget *chooseProjectWidget     = new QWidget(this);
519   QVBoxLayout *chooseProjectLayout = new QVBoxLayout(chooseProjectWidget);
520 
521   m_chooseProjectButton =
522       new QRadioButton(tr("Choose Existing Project"), chooseProjectWidget);
523   group->addButton(m_chooseProjectButton, 0);
524   m_chooseProjectButton->setChecked(true);
525   chooseProjectLayout->addWidget(m_chooseProjectButton);
526 
527   m_projectTreeView = new ExportSceneTreeView(chooseProjectWidget);
528   m_projectTreeView->setMinimumWidth(200);
529   ret = ret && connect(m_projectTreeView, SIGNAL(focusIn()), this,
530                        SLOT(onProjectTreeViweFocusIn()));
531   chooseProjectLayout->addWidget(m_projectTreeView);
532 
533   chooseProjectWidget->setLayout(chooseProjectLayout);
534   layout->addWidget(chooseProjectWidget, 5);
535 
536   // New Project
537   QWidget *newProjectWidget     = new QWidget(this);
538   QGridLayout *newProjectLayout = new QGridLayout(newProjectWidget);
539 
540   m_newProjectButton =
541       new QRadioButton(tr("Create New Project"), newProjectWidget);
542   group->addButton(m_newProjectButton, 1);
543   newProjectLayout->addWidget(m_newProjectButton, 0, 0, 1, 2, Qt::AlignLeft);
544 
545   m_newProjectNameLabel = new QLabel(tr("Name:"), newProjectWidget);
546   newProjectLayout->addWidget(m_newProjectNameLabel, 1, 0, 1, 1,
547                               Qt::AlignRight);
548 
549   m_newProjectName = new LineEdit(newProjectWidget);
550   ret              = ret && connect(m_newProjectName, SIGNAL(focusIn()), this,
551                        SLOT(onProjectNameFocusIn()));
552   newProjectLayout->setColumnStretch(1, 5);
553   newProjectLayout->addWidget(m_newProjectName, 1, 1, 1, 1, Qt::AlignLeft);
554 
555   newProjectWidget->setLayout(chooseProjectLayout);
556   layout->addWidget(newProjectWidget);
557 
558   ret = ret &&
559         connect(group, SIGNAL(buttonClicked(int)), this, SLOT(switchMode(int)));
560 
561   addLayout(layout, false);
562 
563   QPushButton *okBtn = new QPushButton(tr("Export"), this);
564   okBtn->setDefault(true);
565   QPushButton *cancelBtn = new QPushButton(tr("Cancel"), this);
566   connect(okBtn, SIGNAL(clicked()), this, SLOT(onExport()));
567   connect(cancelBtn, SIGNAL(clicked()), this, SLOT(reject()));
568 
569   addButtonBarWidget(okBtn, cancelBtn);
570 
571   switchMode(0);
572   //  updateCommandLabel();
573 
574   assert(ret);
575 }
576 
577 //-----------------------------------------------------------------------------
578 
switchMode(int id)579 void ExportScenePopup::switchMode(int id) {
580   if (id == 0)  // choose Existing Project
581   {
582     m_createNewProject = false;
583     // m_projectTreeView->setEnabled(true);
584   } else  // create new project
585   {
586     assert(id == 1);
587     m_createNewProject = true;
588     // m_projectTreeView->setEnabled(false);
589   }
590 }
591 
592 //-----------------------------------------------------------------------------
593 
onProjectTreeViweFocusIn()594 void ExportScenePopup::onProjectTreeViweFocusIn() {
595   m_chooseProjectButton->setChecked(true);
596   switchMode(0);
597 }
598 
599 //-----------------------------------------------------------------------------
600 
onProjectNameFocusIn()601 void ExportScenePopup::onProjectNameFocusIn() {
602   m_newProjectButton->setChecked(true);
603   switchMode(1);
604 }
605 
606 //-----------------------------------------------------------------------------
607 
onExport()608 void ExportScenePopup::onExport() {
609   QApplication::setOverrideCursor(Qt::WaitCursor);
610   TProjectManager *pm      = TProjectManager::instance();
611   TFilePath oldProjectPath = pm->getCurrentProjectPath();
612   TFilePath projectPath;
613   if (!m_createNewProject) {
614     DvDirModelFileFolderNode *node =
615         (DvDirModelFileFolderNode *)m_projectTreeView->getCurrentNode();
616     if (!node || !pm->isProject(node->getPath())) {
617       QApplication::restoreOverrideCursor();
618       DVGui::warning(tr("The folder you selected is not a project."));
619       return;
620     }
621     projectPath = pm->projectFolderToProjectPath(node->getPath());
622     assert(projectPath != TFilePath());
623   } else  // Create project
624   {
625     projectPath = createNewProject();
626     if (projectPath == TFilePath()) {
627       QApplication::restoreOverrideCursor();
628       return;
629     }
630   }
631   pm->setCurrentProjectPath(projectPath);
632 
633   std::vector<TFilePath> newScenes;
634   int i;
635   for (i = 0; i < m_scenes.size(); i++) {
636     TFilePath newScenePath = importScene(m_scenes[i]);
637     if (newScenePath == TFilePath()) continue;
638     newScenes.push_back(newScenePath);
639   }
640   pm->setCurrentProjectPath(oldProjectPath);
641   if (newScenes.empty()) {
642     QApplication::restoreOverrideCursor();
643     DVGui::warning(tr("There was an error exporting the scene."));
644     return;
645   }
646   for (i = 0; i < newScenes.size(); i++) collectAssets(newScenes[i]);
647 
648   QApplication::restoreOverrideCursor();
649   accept();
650 }
651 
652 //-----------------------------------------------------------------------------
653 
createNewProject()654 TFilePath ExportScenePopup::createNewProject() {
655   TProjectManager *pm = TProjectManager::instance();
656   TFilePath projectName(m_newProjectName->text().toStdWString());
657   if (projectName == TFilePath()) {
658     DVGui::warning(
659         tr("The project name cannot be empty or contain any of the following "
660            "characters:(new line)   \\ / : * ? \"  |"));
661     return TFilePath();
662   }
663   if (projectName.isAbsolute()) {
664     // bad project name
665     DVGui::warning(
666         tr("The project name cannot be empty or contain any of the following "
667            "characters:(new line)   \\ / : * ? \"  |"));
668     return TFilePath();
669   }
670   if (pm->getProjectPathByName(projectName) != TFilePath()) {
671     // project already exists
672     DVGui::warning(tr("The project name you specified is already used."));
673     return TFilePath();
674   }
675 
676   TFilePath currentProjectRoot;
677   DvDirModelFileFolderNode *node = dynamic_cast<DvDirModelFileFolderNode *>(
678       m_projectTreeView->getCurrentNode());
679   if (node)
680     currentProjectRoot = node->getPath();
681   else
682     currentProjectRoot    = pm->getCurrentProjectRoot();
683   TFilePath projectFolder = currentProjectRoot + projectName;
684   TFilePath projectPath   = pm->projectFolderToProjectPath(projectFolder);
685   TProject *project       = new TProject();
686 
687   TProjectP currentProject = pm->getCurrentProject();
688   assert(currentProject);
689   int i;
690   for (i = 0; i < (int)currentProject->getFolderCount(); i++)
691     project->setFolder(currentProject->getFolderName(i),
692                        currentProject->getFolder(i));
693   project->save(projectPath);
694   DvDirModel::instance()->refreshFolder(currentProjectRoot);
695 
696   return projectPath;
697 }
698 
699 //-----------------------------------------------------------------------------
700 /*
701 void ExportScenePopup::updateCommandLabel()
702 {
703   if(m_scenes.empty())
704     return;
705   int sceneCount= m_scenes.size();
706   if(sceneCount==1)
707     m_command->setText(tr("Stai esportando la scena selezionata nel seguente
708 progetto:"));
709   else
710     m_command->setText(tr("Stai esportando ") + QString::number(sceneCount) +
711 tr(" scene nel seguente progetto:"));
712 }
713 */
714