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