1 
2 
3 #include "psdsettingspopup.h"
4 
5 // Tnz6 includes
6 #include "tapp.h"
7 
8 // TnzQt includes
9 #include "toonzqt/checkbox.h"
10 
11 // TnzLib includes
12 #include "toonz/toonzscene.h"
13 #include "toonz/tscenehandle.h"
14 
15 // TnzCore includes
16 #include "tconvert.h"
17 
18 // Qt includes
19 #include <QPushButton>
20 #include <QLabel>
21 #include <QComboBox>
22 #include <QRadioButton>
23 #include <QSize>
24 #include <QStringList>
25 #include <QTreeWidgetItem>
26 #include <QMainWindow>
27 
28 using namespace DVGui;
29 #define REF_LAYER_BY_NAME
30 
31 QStringList modesDescription;
32 
33 // Per adesso non appare
34 // Costruisce la stringa delle info della psd da caricare che comparirà nel
35 // popup:
36 // Path, Dimensioni, numero di livelli, ecc..
doPSDInfo(TFilePath psdpath,QTreeWidget * psdTree)37 static void doPSDInfo(TFilePath psdpath, QTreeWidget *psdTree) {
38   psdTree->clear();
39   try {
40     TPSDReader *psdreader = new TPSDReader(psdpath);
41 
42     TPSDHeaderInfo header = psdreader->getPSDHeaderInfo();
43     int width             = header.cols;
44     int height            = header.rows;
45     int depth             = header.depth;
46     int channels          = header.channels;
47     int layersCount       = header.layersCount;
48     QString filename =
49         QString::fromStdString(psdpath.getName() + psdpath.getDottedType());
50     QString parentDir =
51         QString::fromStdWString(psdpath.getParentDir().getWideString());
52     QString dimension = QString::number(width) + "x" + QString::number(height);
53     QList<QTreeWidgetItem *> items;
54     items.append(new QTreeWidgetItem(
55         (QTreeWidget *)0, QStringList(QString("Filename: %1").arg(filename))));
56     items.append(new QTreeWidgetItem(
57         (QTreeWidget *)0,
58         QStringList(QString("Parent dir: %1").arg(parentDir))));
59     items.append(new QTreeWidgetItem(
60         (QTreeWidget *)0,
61         QStringList(QString("Dimension: %1").arg(dimension))));
62     items.append(new QTreeWidgetItem(
63         (QTreeWidget *)0,
64         QStringList(QString("Depth: %1").arg(QString::number(depth)))));
65     items.append(new QTreeWidgetItem(
66         (QTreeWidget *)0,
67         QStringList(QString("Channels: %1").arg(QString::number(channels)))));
68     QTreeWidgetItem *layersItem = new QTreeWidgetItem((QTreeWidget *)0);
69     int count                   = 0;
70     QList<QTreeWidgetItem *> layersItemChildren;
71     layersItemChildren.append(layersItem);
72     int scavenge = 0;
73     for (int i = layersCount - 1; i >= 0; i--) {
74       TPSDLayerInfo *li = psdreader->getLayerInfo(i);
75       int width         = li->right - li->left;
76       int height        = li->bottom - li->top;
77       QString layerName = li->name;
78       if (strcmp(li->name, "</Layer group>") == 0 ||
79           strcmp(li->name, "</Layer set>") == 0) {
80         scavenge--;
81       } else if (li->section > 0 && li->section <= 3) {
82         QTreeWidgetItem *child = new QTreeWidgetItem((QTreeWidget *)0);
83         child->setText(0, layerName);
84         layersItemChildren[scavenge]->addChild(child);
85         layersItemChildren.append(child);
86         scavenge++;
87       } else if (width > 0 && height > 0) {
88         if (scavenge >= 0) {
89           layersItemChildren[scavenge]->addChild(new QTreeWidgetItem(
90               (QTreeWidget *)0, QStringList(QString("%1").arg(layerName))));
91           count++;
92         }
93       }
94     }
95     QString layerItemText =
96         "Layers: " +
97         QString::number(count);  //+" ("+QString::number(layersCount)+")";
98     layersItem->setText(0, layerItemText);
99     items.append(layersItem);
100 
101     psdTree->insertTopLevelItems(0, items);
102   } catch (TImageException &e) {
103     error(QString::fromStdString(::to_string(e.getMessage())));
104     return;
105   }
106 }
107 
108 //=============================================================================
109 // PsdSettingsPopup
110 //-----------------------------------------------------------------------------
111 
PsdSettingsPopup()112 PsdSettingsPopup::PsdSettingsPopup()
113     : Dialog(TApp::instance()->getMainWindow(), true, true, "PsdSettings")
114     , m_mode(FLAT) {
115   bool ret = true;
116 
117   setWindowTitle(tr("Load PSD File"));
118 
119   if (modesDescription.isEmpty()) {
120     modesDescription
121         << tr("Flatten visible document layers into a single image. Layer "
122               "styles are maintained.")
123         << tr("Load document layers as frames into a single xsheet column.")
124         << tr("Load document layers as xhseet columns.");
125   }
126 
127   m_filename = new QLabel(tr(""));
128   m_filename->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
129   m_filename->setFixedHeight(WidgetHeight);
130   m_parentDir = new QLabel(tr(""));
131   m_parentDir->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
132   m_parentDir->setFixedHeight(WidgetHeight);
133   QLabel *nmLbl = new QLabel(tr("Name:"));
134   nmLbl->setObjectName("TitleTxtLabel");
135   QLabel *ptLbl = new QLabel(tr("Path:"));
136   ptLbl->setObjectName("TitleTxtLabel");
137   QGridLayout *grid = new QGridLayout();
138   grid->setColumnMinimumWidth(0, 65);
139   grid->addWidget(nmLbl, 0, 0, Qt::AlignRight);
140   grid->addWidget(m_filename, 0, 1, Qt::AlignLeft);
141   grid->addWidget(ptLbl, 1, 0, Qt::AlignRight);
142   grid->addWidget(m_parentDir, 1, 1, Qt::AlignLeft);
143   QHBoxLayout *layinfo = new QHBoxLayout;
144   layinfo->addLayout(grid);
145   layinfo->addStretch();
146   addLayout(layinfo, false);
147 
148   /*
149           m_psdTree = new QTreeWidget();
150           m_psdTree->setIconSize(QSize(21,17));
151           m_psdTree->setColumnCount(1);
152           m_psdTree->setMaximumHeight(7*WidgetHeight);
153           m_psdTree->setHeaderLabel("PSD Info");
154           addWidget(m_psdTree);			 */
155 
156   addSeparator();
157 
158   m_loadMode = new QComboBox();
159   m_loadMode->addItem(tr("Single Image"), QString("Single Image"));
160   m_loadMode->addItem(tr("Frames"), QString("Frames"));
161   m_loadMode->addItem(tr("Columns"), QString("Columns"));
162   m_loadMode->setFixedHeight(WidgetHeight);
163   m_loadMode->setFixedWidth(120);
164 
165   m_modeDescription = new QTextEdit(modesDescription[0]);
166   m_modeDescription->setFixedHeight(40);
167   m_modeDescription->setMinimumWidth(250);
168   m_modeDescription->setReadOnly(true);
169   m_createSubXSheet = new CheckBox(tr("Expose in a Sub-xsheet"));
170   m_createSubXSheet->setMaximumHeight(WidgetHeight);
171   m_createSubXSheet->setEnabled(false);
172 
173   m_levelNameType = new QComboBox();
174   QStringList types;
175   types << tr("FileName#LayerName") << tr("LayerName");
176   m_levelNameType->addItems(types);
177   m_levelNameType->setFixedHeight(WidgetHeight);
178   m_levelNameType->setEnabled(false);
179 
180   QLabel *modeLbl = new QLabel(tr("Load As:"));
181   modeLbl->setObjectName("TitleTxtLabel");
182 
183   QLabel *levelNameLbl = new QLabel(tr("Level Name:"));
184   levelNameLbl->setObjectName("TitleTxtLabel");
185 
186   QGridLayout *gridMode = new QGridLayout();
187   gridMode->setColumnMinimumWidth(0, 65);
188   gridMode->setMargin(0);
189   gridMode->addWidget(modeLbl, 0, 0, Qt::AlignRight);
190   gridMode->addWidget(m_loadMode, 0, 1, Qt::AlignLeft);
191   gridMode->addWidget(m_modeDescription, 1, 1, Qt::AlignLeft);
192   gridMode->addWidget(m_createSubXSheet, 2, 1, Qt::AlignLeft);
193   gridMode->addWidget(levelNameLbl, 3, 0, Qt::AlignRight);
194   gridMode->addWidget(m_levelNameType, 3, 1, Qt::AlignLeft);
195   QHBoxLayout *modeLayout = new QHBoxLayout;
196   modeLayout->addLayout(gridMode);
197   modeLayout->addStretch();
198   addLayout(modeLayout, false);
199 
200   addSeparator(tr("Group Option"));
201   m_psdFolderOptions = new QButtonGroup(this);
202   QList<QString> folderOptionsList;
203   folderOptionsList << tr("Ignore groups");
204   folderOptionsList << tr(
205       "Expose layers in a group as columns in a sub-xsheet");
206   folderOptionsList << tr("Expose layers in a group as frames in a column");
207 
208   QGridLayout *gridButton = new QGridLayout();
209   gridButton->setColumnMinimumWidth(0, 70);
210   int i;
211   for (i = 0; i < folderOptionsList.count(); i++) {
212     QRadioButton *radioButton = new QRadioButton(folderOptionsList.at(i));
213     if (i == 0) radioButton->setChecked(true);
214 
215     radioButton->setMaximumHeight(WidgetHeight);
216     if (m_mode != COLUMNS) {
217       radioButton->setEnabled(false);
218     }
219     m_psdFolderOptions->addButton(radioButton);
220     m_psdFolderOptions->setId(radioButton, i);
221     gridButton->addWidget(radioButton, i, 1);
222   }
223   QHBoxLayout *folderOptLayout = new QHBoxLayout;
224   folderOptLayout->addLayout(gridButton);
225   folderOptLayout->addStretch();
226   addLayout(folderOptLayout, false);
227 
228   ret = ret && connect(m_loadMode, SIGNAL(currentIndexChanged(const QString &)),
229                        SLOT(onModeChanged()));
230   assert(ret);
231   ret = ret && connect(m_psdFolderOptions, SIGNAL(buttonClicked(int)), this,
232                        SLOT(onFolderOptionChange(int)));
233   assert(ret);
234   m_okBtn     = new QPushButton(tr("OK"), this);
235   m_cancelBtn = new QPushButton(tr("Cancel"), this);
236   connect(m_okBtn, SIGNAL(clicked()), this, SLOT(onOk()));
237   connect(m_cancelBtn, SIGNAL(clicked()), this, SLOT(close()));
238   addButtonBarWidget(m_okBtn, m_cancelBtn);
239 }
240 
241 //-----------------------------------------------------------------------------
242 
setPath(const TFilePath & path)243 void PsdSettingsPopup::setPath(const TFilePath &path) {
244   m_path = path;
245   // doPSDInfo(path,m_psdTree);
246   QString filename =
247       QString::fromStdString(path.getName());  //+psdpath.getDottedType());
248   QString pathLbl =
249       QString::fromStdWString(path.getParentDir().getWideString());
250   m_filename->setText(filename);
251   m_parentDir->setText(pathLbl);
252 }
253 
onOk()254 void PsdSettingsPopup::onOk() {
255   doPsdParser();
256   accept();
257 }
258 
subxsheet()259 bool PsdSettingsPopup::subxsheet() {
260   return (m_createSubXSheet->isEnabled() && m_createSubXSheet->isChecked());
261 }
262 
levelNameType()263 int PsdSettingsPopup::levelNameType() {
264   return m_levelNameType->currentIndex();
265 }
266 
onModeChanged()267 void PsdSettingsPopup::onModeChanged() {
268   QString mode = m_loadMode->currentData().toString();
269   if (mode == "Single Image") {
270     m_mode = FLAT;
271     m_modeDescription->setText(modesDescription[0]);
272     m_createSubXSheet->setEnabled(false);
273     m_levelNameType->setEnabled(false);
274     QList<QAbstractButton *> buttons = m_psdFolderOptions->buttons();
275     while (!buttons.isEmpty()) {
276       QAbstractButton *btn = buttons.takeFirst();
277       btn->setEnabled(false);
278     }
279   } else if (mode == "Frames") {
280     m_mode = FRAMES;
281     m_modeDescription->setText(modesDescription[1]);
282     m_createSubXSheet->setEnabled(false);
283     m_levelNameType->setEnabled(false);
284     QList<QAbstractButton *> buttons = m_psdFolderOptions->buttons();
285     while (!buttons.isEmpty()) {
286       QAbstractButton *btn = buttons.takeFirst();
287       btn->setEnabled(false);
288     }
289   } else if (mode == "Columns") {
290     if (m_psdFolderOptions->checkedId() == 2 ||
291         m_psdFolderOptions->checkedId() == 1)
292       m_mode = FOLDER;
293     else
294       m_mode = COLUMNS;
295     m_modeDescription->setText(modesDescription[2]);
296     m_createSubXSheet->setEnabled(true);
297     m_levelNameType->setEnabled(true);
298     QList<QAbstractButton *> buttons = m_psdFolderOptions->buttons();
299     while (!buttons.isEmpty()) {
300       QAbstractButton *btn = buttons.takeFirst();
301       btn->setEnabled(true);
302     }
303   } else {
304     assert(false);
305   }
306 }
307 
onFolderOptionChange(int id)308 void PsdSettingsPopup::onFolderOptionChange(int id) {
309   switch (id) {
310   case 0:  // Ignore Folder
311     m_mode = COLUMNS;
312     break;
313   case 1:  // Fodler as SUBXSHEET
314     m_mode = FOLDER;
315     break;
316   case 2:  // Frames
317     m_mode = FOLDER;
318     break;
319   default:
320     assert(0);
321   }
322 }
getFolderOption()323 int PsdSettingsPopup::getFolderOption() {
324   return m_psdFolderOptions->checkedId();
325 }
326 
doPsdParser()327 void PsdSettingsPopup::doPsdParser() {
328   TFilePath psdpath =
329       TApp::instance()->getCurrentScene()->getScene()->decodeFilePath(m_path);
330   std::string mode = "";
331   switch (m_mode) {
332   case FLAT: {
333     break;
334   }
335   case FRAMES: {
336     mode = "#frames";
337     std::string name =
338         psdpath.getName() + "#1" + mode + psdpath.getDottedType();
339     psdpath = psdpath.getParentDir() + TFilePath(name);
340     break;
341   }
342   case COLUMNS: {
343     std::string name = psdpath.getName() + "#1" + psdpath.getDottedType();
344     psdpath          = psdpath.getParentDir() + TFilePath(name);
345     break;
346   }
347   case FOLDER: {
348     mode = "#group";
349     std::string name =
350         psdpath.getName() + "#1" + mode + psdpath.getDottedType();
351     psdpath = psdpath.getParentDir() + TFilePath(name);
352     break;
353   }
354   default: {
355     assert(false);
356     return;
357   }
358   }
359   try {
360     m_psdparser = new TPSDParser(psdpath);
361     m_psdLevelPaths.clear();
362     for (int i = 0; i < m_psdparser->getLevelsCount(); i++) {
363       int layerId      = m_psdparser->getLevelId(i);
364       std::string name = m_path.getName();
365       if (layerId > 0 && m_mode != FRAMES) {
366         if (m_levelNameType->currentIndex() == 0)  // FileName#LevelName
367           name += "#" + std::to_string(layerId);
368         else  // LevelName
369           name += "##" + std::to_string(layerId);
370       }
371       if (mode != "") name += mode;
372       name += m_path.getDottedType();
373       TFilePath psdpath = m_path.getParentDir() + TFilePath(name);
374       m_psdLevelPaths.push_back(psdpath);
375     }
376   } catch (TImageException &e) {
377     error(QString::fromStdString(::to_string(e.getMessage())));
378     return;
379   }
380 }
getPsdPath(int levelIndex)381 TFilePath PsdSettingsPopup::getPsdPath(int levelIndex) {
382   assert(levelIndex >= 0 && levelIndex < m_psdLevelPaths.size());
383   return m_psdLevelPaths[levelIndex];
384 }
getPsdFramePath(int levelIndex,int frameIndex)385 TFilePath PsdSettingsPopup::getPsdFramePath(int levelIndex, int frameIndex) {
386   int layerId      = m_psdparser->getLevelId(levelIndex);
387   int frameId      = m_psdparser->getFrameId(layerId, frameIndex);
388   std::string name = m_path.getName();
389   if (frameId > 0) name += "#" + std::to_string(frameId);
390   name += m_path.getDottedType();
391   TFilePath psdpath = TApp::instance()
392                           ->getCurrentScene()
393                           ->getScene()
394                           ->decodeFilePath(m_path)
395                           .getParentDir() +
396                       TFilePath(name);
397   return psdpath;
398 }
getFramesCount(int levelIndex)399 int PsdSettingsPopup::getFramesCount(int levelIndex) {
400   // assert(levelIndex>=0 && levelIndex<m_levels.size());
401   // return m_levels[levelIndex].framesCount;
402   int levelId = m_psdparser->getLevelId(levelIndex);
403   return m_psdparser->getFramesCount(levelId);
404 }
isFolder(int levelIndex)405 bool PsdSettingsPopup::isFolder(int levelIndex) {
406   // assert(levelIndex>=0 && levelIndex<m_levels.size());
407   // return m_levels[levelIndex].isFolder;
408   return m_psdparser->isFolder(levelIndex);
409 }
isSubFolder(int levelIndex,int frameIndex)410 bool PsdSettingsPopup::isSubFolder(int levelIndex, int frameIndex) {
411   return m_psdparser->isSubFolder(levelIndex, frameIndex);
412 }
getSubfolderLevelIndex(int psdLevelIndex,int frameIndex)413 int PsdSettingsPopup::getSubfolderLevelIndex(int psdLevelIndex,
414                                              int frameIndex) {
415   int levelId        = m_psdparser->getLevelId(psdLevelIndex);
416   int frameId        = m_psdparser->getFrameId(levelId, frameIndex);
417   int subFolderIndex = m_psdparser->getLevelIndexById(frameId);
418   return subFolderIndex;
419 }
420 
421 //-----------------------------------------------------------------------------
422 
423 //=============================================================================
424 
425 // OpenPopupCommandHandler<PsdSettingsPopup>
426 // openPsdSettingsPopup(MI_SceneSettings);
427