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