1 
2 
3 #include "levelcreatepopup.h"
4 
5 // Tnz6 includes
6 #include "menubarcommandids.h"
7 #include "tapp.h"
8 
9 // TnzTools includes
10 #include "tools/toolhandle.h"
11 
12 // TnzQt includes
13 #include "toonzqt/menubarcommand.h"
14 #include "toonzqt/gutil.h"
15 #include "toonzqt/doublefield.h"
16 #include "historytypes.h"
17 
18 // TnzLib includes
19 #include "toonz/toonzscene.h"
20 #include "toonz/txsheet.h"
21 #include "toonz/txshcell.h"
22 #include "toonz/txshsimplelevel.h"
23 #include "toonz/txshleveltypes.h"
24 #include "toonz/levelset.h"
25 #include "toonz/levelproperties.h"
26 #include "toonz/sceneproperties.h"
27 #include "toonz/tcamera.h"
28 #include "toonz/tframehandle.h"
29 #include "toonz/tcolumnhandle.h"
30 #include "toonz/tscenehandle.h"
31 #include "toonz/txsheethandle.h"
32 #include "toonz/tpalettehandle.h"
33 #include "toonz/preferences.h"
34 #include "toonz/palettecontroller.h"
35 #include "toonz/tproject.h"
36 #include "toonz/namebuilder.h"
37 
38 // TnzCore includes
39 #include "tsystem.h"
40 #include "tpalette.h"
41 #include "tvectorimage.h"
42 #include "trasterimage.h"
43 #include "ttoonzimage.h"
44 #include "timagecache.h"
45 #include "tundo.h"
46 #include "filebrowsermodel.h"
47 
48 // Qt includes
49 #include <QHBoxLayout>
50 #include <QLabel>
51 #include <QComboBox>
52 #include <QPushButton>
53 #include <QMainWindow>
54 
55 using namespace DVGui;
56 
57 //=============================================================================
58 namespace {
59 //-----------------------------------------------------------------------------
60 
61 //=============================================================================
62 // CreateLevelUndo
63 //-----------------------------------------------------------------------------
64 
65 class CreateLevelUndo final : public TUndo {
66   int m_rowIndex;
67   int m_columnIndex;
68   int m_frameCount;
69   int m_oldLevelCount;
70   int m_step;
71   TXshSimpleLevelP m_sl;
72   bool m_areColumnsShifted;
73 
74 public:
CreateLevelUndo(int row,int column,int frameCount,int step,bool areColumnsShifted)75   CreateLevelUndo(int row, int column, int frameCount, int step,
76                   bool areColumnsShifted)
77       : m_rowIndex(row)
78       , m_columnIndex(column)
79       , m_frameCount(frameCount)
80       , m_step(step)
81       , m_sl(0)
82       , m_areColumnsShifted(areColumnsShifted) {
83     TApp *app         = TApp::instance();
84     ToonzScene *scene = app->getCurrentScene()->getScene();
85     m_oldLevelCount   = scene->getLevelSet()->getLevelCount();
86   }
~CreateLevelUndo()87   ~CreateLevelUndo() { m_sl = 0; }
88 
onAdd(TXshSimpleLevelP sl)89   void onAdd(TXshSimpleLevelP sl) { m_sl = sl; }
90 
undo() const91   void undo() const override {
92     TApp *app         = TApp::instance();
93     ToonzScene *scene = app->getCurrentScene()->getScene();
94     TXsheet *xsh      = scene->getXsheet();
95     if (m_areColumnsShifted)
96       xsh->removeColumn(m_columnIndex);
97     else if (m_frameCount > 0)
98       xsh->removeCells(m_rowIndex, m_columnIndex, m_frameCount);
99 
100     TLevelSet *levelSet = scene->getLevelSet();
101     if (levelSet) {
102       int m = levelSet->getLevelCount();
103       while (m > 0 && m > m_oldLevelCount) {
104         --m;
105         TXshLevel *level = levelSet->getLevel(m);
106         if (level) levelSet->removeLevel(level);
107       }
108     }
109     app->getCurrentScene()->notifySceneChanged();
110     app->getCurrentScene()->notifyCastChange();
111     app->getCurrentXsheet()->notifyXsheetChanged();
112   }
113 
redo() const114   void redo() const override {
115     if (!m_sl.getPointer()) return;
116     TApp *app         = TApp::instance();
117     ToonzScene *scene = app->getCurrentScene()->getScene();
118     scene->getLevelSet()->insertLevel(m_sl.getPointer());
119     TXsheet *xsh = scene->getXsheet();
120     if (m_areColumnsShifted) xsh->insertColumn(m_columnIndex);
121     std::vector<TFrameId> fids;
122     m_sl->getFids(fids);
123     int i = m_rowIndex;
124     int f = 0;
125     while (i < m_frameCount + m_rowIndex) {
126       TFrameId fid = (fids.size() != 0) ? fids[f] : i;
127       TXshCell cell(m_sl.getPointer(), fid);
128       f++;
129       xsh->setCell(i, m_columnIndex, cell);
130       int appo = i++;
131       while (i < m_step + appo) xsh->setCell(i++, m_columnIndex, cell);
132     }
133     app->getCurrentScene()->notifySceneChanged();
134     app->getCurrentScene()->notifyCastChange();
135     app->getCurrentXsheet()->notifyXsheetChanged();
136   }
137 
getSize() const138   int getSize() const override { return sizeof *this; }
getHistoryString()139   QString getHistoryString() override {
140     return QObject::tr("Create Level %1  at Column %2")
141         .arg(QString::fromStdWString(m_sl->getName()))
142         .arg(QString::number(m_columnIndex + 1));
143   }
144 };
145 
146 //-----------------------------------------------------------------------------
147 }  // anonymous namespace
148 //-----------------------------------------------------------------------------
149 
150 //=============================================================================
151 /*! \class LevelCreatePopup
152                 \brief The LevelCreatePopup class provides a modal dialog to
153    create a new level.
154 
155                 Inherits \b Dialog.
156 */
157 //-----------------------------------------------------------------------------
158 
LevelCreatePopup()159 LevelCreatePopup::LevelCreatePopup()
160     : Dialog(TApp::instance()->getMainWindow(), true, true, "LevelCreate") {
161   setWindowTitle(tr("New Level"));
162 
163   m_nameFld     = new LineEdit(this);
164   m_fromFld     = new DVGui::IntLineEdit(this);
165   m_toFld       = new DVGui::IntLineEdit(this);
166   m_stepFld     = new DVGui::IntLineEdit(this);
167   m_incFld      = new DVGui::IntLineEdit(this);
168   m_levelTypeOm = new QComboBox();
169 
170   m_pathFld     = new FileField(0);
171   m_widthLabel  = new QLabel(tr("Width:"));
172   m_widthFld    = new DVGui::MeasuredDoubleLineEdit(0);
173   m_heightLabel = new QLabel(tr("Height:"));
174   m_heightFld   = new DVGui::MeasuredDoubleLineEdit(0);
175   m_dpiLabel    = new QLabel(tr("DPI:"));
176   m_dpiFld      = new DoubleLineEdit(0, 66.76);
177 
178   QPushButton *okBtn     = new QPushButton(tr("OK"), this);
179   QPushButton *cancelBtn = new QPushButton(tr("Cancel"), this);
180   QPushButton *applyBtn  = new QPushButton(tr("Apply"), this);
181 
182   // Exclude all character which cannot fit in a filepath (Win).
183   // Dots are also prohibited since they are internally managed by Toonz.
184   QRegExp rx("[^\\\\/:?*.\"<>|]+");
185   m_nameFld->setValidator(new QRegExpValidator(rx, this));
186 
187   m_levelTypeOm->addItem(tr("Toonz Vector Level"), (int)PLI_XSHLEVEL);
188   m_levelTypeOm->addItem(tr("Toonz Raster Level"), (int)TZP_XSHLEVEL);
189   m_levelTypeOm->addItem(tr("Raster Level"), (int)OVL_XSHLEVEL);
190   m_levelTypeOm->addItem(tr("Scan Level"), (int)TZI_XSHLEVEL);
191 
192   if (Preferences::instance()->getUnits() == "pixel") {
193     m_widthFld->setMeasure("camera.lx");
194     m_heightFld->setMeasure("camera.ly");
195   } else {
196     m_widthFld->setMeasure("level.lx");
197     m_heightFld->setMeasure("level.ly");
198   }
199 
200   m_widthFld->setRange(0.1, (std::numeric_limits<double>::max)());
201   m_heightFld->setRange(0.1, (std::numeric_limits<double>::max)());
202   m_dpiFld->setRange(0.1, (std::numeric_limits<double>::max)());
203 
204   okBtn->setDefault(true);
205 
206   //--- layout
207   m_topLayout->setMargin(0);
208   m_topLayout->setSpacing(0);
209   {
210     QGridLayout *guiLay = new QGridLayout();
211     guiLay->setMargin(10);
212     guiLay->setVerticalSpacing(10);
213     guiLay->setHorizontalSpacing(5);
214     {
215       // Name
216       guiLay->addWidget(new QLabel(tr("Name:")), 0, 0,
217                         Qt::AlignRight | Qt::AlignVCenter);
218       guiLay->addWidget(m_nameFld, 0, 1, 1, 4);
219 
220       // From-To
221       guiLay->addWidget(new QLabel(tr("From:")), 1, 0,
222                         Qt::AlignRight | Qt::AlignVCenter);
223       guiLay->addWidget(m_fromFld, 1, 1);
224       guiLay->addWidget(new QLabel(tr("To:")), 1, 2,
225                         Qt::AlignRight | Qt::AlignVCenter);
226       guiLay->addWidget(m_toFld, 1, 3);
227 
228       // Step-Inc
229       guiLay->addWidget(new QLabel(tr("Step:")), 2, 0,
230                         Qt::AlignRight | Qt::AlignVCenter);
231       guiLay->addWidget(m_stepFld, 2, 1);
232       guiLay->addWidget(new QLabel(tr("Increment:")), 2, 2,
233                         Qt::AlignRight | Qt::AlignVCenter);
234       guiLay->addWidget(m_incFld, 2, 3);
235 
236       // Type
237       guiLay->addWidget(new QLabel(tr("Type:")), 3, 0,
238                         Qt::AlignRight | Qt::AlignVCenter);
239       guiLay->addWidget(m_levelTypeOm, 3, 1, 1, 3);
240 
241       // Save In
242       guiLay->addWidget(new QLabel(tr("Save In:")), 4, 0,
243                         Qt::AlignRight | Qt::AlignVCenter);
244       guiLay->addWidget(m_pathFld, 4, 1, 1, 4);
245 
246       // Width - Height
247       guiLay->addWidget(m_widthLabel, 5, 0, Qt::AlignRight | Qt::AlignVCenter);
248       guiLay->addWidget(m_widthFld, 5, 1);
249       guiLay->addWidget(m_heightLabel, 5, 2, Qt::AlignRight | Qt::AlignVCenter);
250       guiLay->addWidget(m_heightFld, 5, 3);
251 
252       // DPI
253       guiLay->addWidget(m_dpiLabel, 6, 0, Qt::AlignRight | Qt::AlignVCenter);
254       guiLay->addWidget(m_dpiFld, 6, 1, 1, 3);
255     }
256     guiLay->setColumnStretch(0, 0);
257     guiLay->setColumnStretch(1, 0);
258     guiLay->setColumnStretch(2, 0);
259     guiLay->setColumnStretch(3, 0);
260     guiLay->setColumnStretch(4, 1);
261 
262     m_topLayout->addLayout(guiLay, 1);
263   }
264 
265   m_buttonLayout->setMargin(0);
266   m_buttonLayout->setSpacing(30);
267   {
268     m_buttonLayout->addStretch(1);
269     m_buttonLayout->addWidget(okBtn, 0);
270     m_buttonLayout->addWidget(applyBtn, 0);
271     m_buttonLayout->addWidget(cancelBtn, 0);
272     m_buttonLayout->addStretch(1);
273   }
274 
275   //---- signal-slot connections
276   bool ret = true;
277   ret      = ret && connect(m_levelTypeOm, SIGNAL(currentIndexChanged(int)),
278                        SLOT(onLevelTypeChanged(int)));
279   ret      = ret && connect(okBtn, SIGNAL(clicked()), this, SLOT(onOkBtn()));
280   ret      = ret && connect(cancelBtn, SIGNAL(clicked()), this, SLOT(reject()));
281   ret =
282       ret && connect(applyBtn, SIGNAL(clicked()), this, SLOT(onApplyButton()));
283 
284   setSizeWidgetEnable(false);
285 }
286 
287 //-----------------------------------------------------------------------------
288 
updatePath()289 void LevelCreatePopup::updatePath() {
290   ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene();
291   TFilePath defaultPath;
292   defaultPath = scene->getDefaultLevelPath(getLevelType()).getParentDir();
293   m_pathFld->setPath(toQString(defaultPath));
294 }
295 
296 //-----------------------------------------------------------------------------
297 
nextName()298 void LevelCreatePopup::nextName() {
299   const std::unique_ptr<NameBuilder> nameBuilder(NameBuilder::getBuilder(L""));
300 
301   std::wstring levelName = L"";
302 
303   // Select a different unique level name in case it already exists (either in
304   // scene or on disk)
305 
306   for (;;) {
307     levelName = nameBuilder->getNext();
308 
309     if (levelExists(levelName)) continue;
310 
311     break;
312   }
313 
314   m_nameFld->setText(QString::fromStdWString(levelName));
315 }
316 
317 //-----------------------------------------------------------------------------
318 
levelExists(std::wstring levelName)319 bool LevelCreatePopup::levelExists(std::wstring levelName) {
320   TFilePath fp;
321   TFilePath actualFp;
322   ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene();
323   TLevelSet *levelSet =
324       TApp::instance()->getCurrentScene()->getScene()->getLevelSet();
325 
326   TFilePath parentDir(m_pathFld->getPath().toStdWString());
327   fp = scene->getDefaultLevelPath(getLevelType(), levelName)
328            .withParentDir(parentDir);
329   actualFp = scene->decodeFilePath(fp);
330 
331   if (levelSet->getLevel(levelName) != 0 ||
332       TSystem::doesExistFileOrLevel(actualFp)) {
333     return true;
334   } else
335     return false;
336 }
337 
338 //-----------------------------------------------------------------------------
showEvent(QShowEvent *)339 void LevelCreatePopup::showEvent(QShowEvent *) {
340   update();
341   nextName();
342   m_nameFld->setFocus();
343   if (Preferences::instance()->getUnits() == "pixel") {
344     m_dpiFld->hide();
345     m_dpiLabel->hide();
346     m_widthFld->setDecimals(0);
347     m_heightFld->setDecimals(0);
348   } else {
349     m_dpiFld->show();
350     m_dpiLabel->show();
351     m_widthFld->setDecimals(4);
352     m_heightFld->setDecimals(4);
353   }
354 }
355 
356 //-----------------------------------------------------------------------------
357 
setSizeWidgetEnable(bool isEnable)358 void LevelCreatePopup::setSizeWidgetEnable(bool isEnable) {
359   m_widthLabel->setEnabled(isEnable);
360   m_heightLabel->setEnabled(isEnable);
361   m_widthFld->setEnabled(isEnable);
362   m_heightFld->setEnabled(isEnable);
363   m_dpiLabel->setEnabled(isEnable);
364   m_dpiFld->setEnabled(isEnable);
365 }
366 
367 //-----------------------------------------------------------------------------
368 
getLevelType() const369 int LevelCreatePopup::getLevelType() const {
370   return m_levelTypeOm->currentData().toInt();
371 }
372 
373 //-----------------------------------------------------------------------------
374 
onLevelTypeChanged(int index)375 void LevelCreatePopup::onLevelTypeChanged(int index) {
376   int type = m_levelTypeOm->itemData(index).toInt();
377   if (type == OVL_XSHLEVEL || type == TZP_XSHLEVEL)
378     setSizeWidgetEnable(true);
379   else
380     setSizeWidgetEnable(false);
381   updatePath();
382 
383   std::wstring levelName = m_nameFld->text().toStdWString();
384   // check if the name already exists or if it is a 1 letter name
385   // one letter names are most likely created automatically so
386   // this makes sure that automatically created names
387   // don't skip a letter.
388   if (levelExists(levelName) || levelName.length() == 1) {
389     nextName();
390   }
391   m_nameFld->setFocus();
392 }
393 
394 //-----------------------------------------------------------------------------
395 
onOkBtn()396 void LevelCreatePopup::onOkBtn() {
397   if (apply())
398     close();
399   else
400     m_nameFld->setFocus();
401 }
402 
403 //-----------------------------------------------------------------------------
404 
onApplyButton()405 void LevelCreatePopup::onApplyButton() {
406   if (apply()) {
407     nextName();
408   }
409   m_nameFld->setFocus();
410 }
411 
412 //-----------------------------------------------------------------------------
413 
apply()414 bool LevelCreatePopup::apply() {
415   TApp *app = TApp::instance();
416   int row   = app->getCurrentFrame()->getFrame();
417   int col   = app->getCurrentColumn()->getColumnIndex();
418   int i, j;
419 
420   ToonzScene *scene = app->getCurrentScene()->getScene();
421   TXsheet *xsh      = scene->getXsheet();
422 
423   bool validColumn = true;
424   if (xsh->getColumn(col))
425     validColumn =
426         xsh->getColumn(col)->getColumnType() == TXshColumn::eLevelType;
427 
428   int from   = (int)m_fromFld->getValue();
429   int to     = (int)m_toFld->getValue();
430   int inc    = (int)m_incFld->getValue();
431   int step   = (int)m_stepFld->getValue();
432   double w   = m_widthFld->getValue();
433   double h   = m_heightFld->getValue();
434   double dpi = m_dpiFld->getValue();
435   int xres   = std::max(tround(w * dpi), 1);
436   int yres   = std::max(tround(h * dpi), 1);
437   int lType  = getLevelType();
438 
439   std::wstring levelName = m_nameFld->text().toStdWString();
440   // tolgo i blanks prima e dopo
441 
442   i = levelName.find_first_not_of(L' ');
443   if (i == (int)std::wstring::npos)
444     levelName = L"";
445   else {
446     int j = levelName.find_last_not_of(L' ');
447     assert(j != (int)std::wstring::npos);
448     levelName = levelName.substr(i, j - i + 1);
449   }
450   if (levelName.empty()) {
451     error(tr("No level name specified: please choose a valid level name"));
452     return false;
453   }
454 
455   if (isReservedFileName_message(QString::fromStdWString(levelName)))
456     return false;
457 
458   if (from > to) {
459     error(tr("Invalid frame range"));
460     return false;
461   }
462   if (inc <= 0) {
463     error(tr("Invalid increment value"));
464     return false;
465   }
466   if (step <= 0) {
467     error(tr("Invalid step value"));
468     return false;
469   }
470 
471   int numFrames = step * (((to - from) / inc) + 1);
472 
473   if (scene->getLevelSet()->getLevel(levelName)) {
474     error(
475         tr("The level name specified is already used: please choose a "
476            "different level name"));
477     m_nameFld->selectAll();
478     return false;
479   }
480 
481   TFilePath parentDir(m_pathFld->getPath().toStdWString());
482   TFilePath fp =
483       scene->getDefaultLevelPath(lType, levelName).withParentDir(parentDir);
484 
485   TFilePath actualFp = scene->decodeFilePath(fp);
486   if (TSystem::doesExistFileOrLevel(actualFp)) {
487     error(
488         tr("The level name specified is already used: please choose a "
489            "different level name"));
490     m_nameFld->selectAll();
491     return false;
492   }
493   parentDir = scene->decodeFilePath(parentDir);
494   if (!TFileStatus(parentDir).doesExist()) {
495     QString question;
496     /*question = "Folder " +toQString(parentDir) +
497                                                      " doesn't exist.\nDo you
498        want to create it?";*/
499     question = tr("Folder %1 doesn't exist.\nDo you want to create it?")
500                    .arg(toQString(parentDir));
501     int ret = DVGui::MsgBox(question, QObject::tr("Yes"), QObject::tr("No"));
502     if (ret == 0 || ret == 2) return false;
503     try {
504       TSystem::mkDir(parentDir);
505       DvDirModel::instance()->refreshFolder(parentDir.getParentDir());
506     } catch (...) {
507       error(tr("Unable to create") + toQString(parentDir));
508       return false;
509     }
510   }
511 
512   /*-- これからLevelを配置しようとしているセルが空いているかどうかのチェック
513    * --*/
514   bool areColumnsShifted = false;
515   TXshCell cell          = xsh->getCell(row, col);
516   bool isInRange         = true;
517   if (col < 0)
518     isInRange = false;
519   else {
520     for (i = row; i < row + numFrames; i++) {
521       if (!cell.isEmpty()) {
522         isInRange = false;
523         break;
524       }
525       cell = xsh->getCell(i, col);
526     }
527   }
528   if (!validColumn) {
529     isInRange = false;
530   }
531 
532   /*-- 別のLevelに占有されていた場合、Columnを1つ右に移動 --*/
533   if (!isInRange) {
534     col += 1;
535     TApp::instance()->getCurrentColumn()->setColumnIndex(col);
536     areColumnsShifted = true;
537     xsh->insertColumn(col);
538   }
539 
540   CreateLevelUndo *undo =
541       new CreateLevelUndo(row, col, numFrames, step, areColumnsShifted);
542   TUndoManager::manager()->add(undo);
543 
544   TXshLevel *level =
545       scene->createNewLevel(lType, levelName, TDimension(), 0, fp);
546   TXshSimpleLevel *sl = dynamic_cast<TXshSimpleLevel *>(level);
547   assert(sl);
548   sl->setPath(fp, true);
549   if (lType == TZP_XSHLEVEL || lType == OVL_XSHLEVEL) {
550     sl->getProperties()->setDpiPolicy(LevelProperties::DP_ImageDpi);
551     sl->getProperties()->setDpi(dpi);
552     sl->getProperties()->setImageDpi(TPointD(dpi, dpi));
553     sl->getProperties()->setImageRes(TDimension(xres, yres));
554   }
555 
556   for (i = from; i <= to; i += inc) {
557     TFrameId fid(i);
558     TXshCell cell(sl, fid);
559     if (lType == PLI_XSHLEVEL)
560       sl->setFrame(fid, new TVectorImage());
561     else if (lType == TZP_XSHLEVEL) {
562       TRasterCM32P raster(xres, yres);
563       raster->fill(TPixelCM32());
564       TToonzImageP ti(raster, TRect());
565       ti->setDpi(dpi, dpi);
566       sl->setFrame(fid, ti);
567       ti->setSavebox(TRect(0, 0, xres - 1, yres - 1));
568     } else if (lType == OVL_XSHLEVEL) {
569       TRaster32P raster(xres, yres);
570       raster->clear();
571       TRasterImageP ri(raster);
572       ri->setDpi(dpi, dpi);
573       sl->setFrame(fid, ri);
574     }
575     for (j = 0; j < step; j++) xsh->setCell(row++, col, cell);
576   }
577 
578   if (lType == TZP_XSHLEVEL || lType == OVL_XSHLEVEL) {
579     sl->save(fp);
580     DvDirModel::instance()->refreshFolder(fp.getParentDir());
581   }
582 
583   undo->onAdd(sl);
584 
585   app->getCurrentScene()->notifySceneChanged();
586   app->getCurrentScene()->notifyCastChange();
587   app->getCurrentXsheet()->notifyXsheetChanged();
588 
589   // Cambia l'immagine corrente ma non cambiano ne' il frame ne' la colonna
590   // corrente
591   // (entrambi notificano il cambiamento dell'immagine al tool).
592   // devo verfificare che sia settato il tool giusto.
593   app->getCurrentTool()->onImageChanged(
594       (TImage::Type)app->getCurrentImageType());
595   return true;
596 }
597 
598 //-----------------------------------------------------------------------------
599 
update()600 void LevelCreatePopup::update() {
601   updatePath();
602   Preferences *pref = Preferences::instance();
603   if (pref->getUnits() == "pixel") {
604     m_widthFld->setMeasure("camera.lx");
605     m_heightFld->setMeasure("camera.ly");
606   } else {
607     m_widthFld->setMeasure("level.lx");
608     m_heightFld->setMeasure("level.ly");
609   }
610   if (pref->isNewLevelSizeToCameraSizeEnabled()) {
611     TCamera *currCamera =
612         TApp::instance()->getCurrentScene()->getScene()->getCurrentCamera();
613     TDimensionD camSize = currCamera->getSize();
614     m_widthFld->setValue(camSize.lx);
615     m_heightFld->setValue(camSize.ly);
616     m_dpiFld->setValue(currCamera->getDpi().x);
617   } else {
618     m_widthFld->setValue(pref->getDefLevelWidth());
619     m_heightFld->setValue(pref->getDefLevelHeight());
620     m_dpiFld->setValue(pref->getDefLevelDpi());
621   }
622 
623   int levelType = pref->getDefLevelType();
624   int index     = m_levelTypeOm->findData(levelType);
625   if (index >= 0) m_levelTypeOm->setCurrentIndex(index);
626 
627   /*
628 (old behaviour)
629 TCamera* camera = scene->getCurrentCamera();
630   TDimensionD cameraSize = camera->getSize();
631   m_widthFld->setValue(cameraSize.lx);
632   m_heightFld->setValue(cameraSize.ly);
633 if(camera->isXPrevalence())
634 m_dpiFld->setValue(camera->getDpi().x);
635 else
636 m_dpiFld->setValue(camera->getDpi().y);
637 */
638 }
639 
640 //-----------------------------------------------------------------------------
641 
642 OpenPopupCommandHandler<LevelCreatePopup> openLevelCreatePopup(MI_NewLevel);
643