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