19#include "mainwindow2.h"
20#include "ui_mainwindow2.h"
23#include <QActionGroup>
29#include <QProgressDialog>
30#include <QTabletEvent>
31#include <QStandardPaths>
43#include "pencilsettings.h"
47#include "filemanager.h"
48#include "colormanager.h"
49#include "layermanager.h"
50#include "toolmanager.h"
51#include "playbackmanager.h"
52#include "selectionmanager.h"
53#include "soundmanager.h"
54#include "viewmanager.h"
55#include "selectionmanager.h"
56#include "undoredomanager.h"
58#include "actioncommands.h"
59#include "fileformat.h"
61#include "undoredocommand.h"
65#include "colorinspector.h"
66#include "colorpalettewidget.h"
67#include "tooloptionwidget.h"
68#include "preferencesdialog.h"
71#include "onionskinwidget.h"
72#include "pegbaralignmentdialog.h"
73#include "addtransparencytopaperdialog.h"
74#include "repositionframesdialog.h"
76#include "errordialog.h"
77#include "filedialog.h"
78#include "importimageseqdialog.h"
79#include "importlayersdialog.h"
80#include "importpositiondialog.h"
81#include "layeropacitydialog.h"
82#include "recentfilemenu.h"
83#include "shortcutfilter.h"
85#include "presetdialog.h"
86#include "pegbaralignmentdialog.h"
87#include "autosaverbytime.h"
91#define BUILD_DATE S__GIT_TIMESTAMP
93#define BUILD_DATE __DATE__
99 if (version.startsWith(
"99.0.0")) {
100 return QString(
"[*]Pencil2D Nightly Build %1").
arg(BUILD_DATE);
101 }
else if (version ==
"0.0.0.0") {
102 return QString(
"[*]Pencil2D Development Build %1").
arg(BUILD_DATE);
104 return QString(
"[*]Pencil2D %1").
arg(APP_VERSION);
111MainWindow2::MainWindow2(
QWidget* parent) :
119 mEditor =
new Editor(
this);
120 mEditor->setScribbleArea(ui->scribbleArea);
125 ui->scribbleArea->setEditor(mEditor);
126 ui->scribbleArea->init();
128 ui->statusBar->setEditor(mEditor);
129 ui->statusBar->updateZoomStatus();
130 ui->statusBar->setVisible(mEditor->preference()->isOn(SETTING::SHOW_STATUS_BAR));
133 mCommands->setCore(mEditor);
138 setupKeyboardShortcuts();
143 currentLayerChanged();
145 connect(mEditor, &Editor::needSave,
this, &MainWindow2::autoSave);
148 connect(mAutoSaver, &AutosaverByTime::timeout,
this, &MainWindow2::autoSaveTimeout);
150 mEditor->tools()->setDefaultTool();
151 ui->background->init(mEditor->preference());
153 setWindowTitle(getWindowTitle());
156void MainWindow2::autoSaveTimeout()
159 fm.writeToWorkingFolder(mEditor->object());
162MainWindow2::~MainWindow2()
167void MainWindow2::createDockWidgets()
173 mColorBox->
setToolTip(
tr(
"color palette:<br>use <b>(C)</b><br>toggle at cursor"));
181 mColorPalette->setCore(mEditor);
202 mStartIcon =
QIcon(
":icons/controls/play.png");
203 mStopIcon =
QIcon(
":icons/controls/stop.png");
208 pWidget->setFeatures(QDockWidget::DockWidgetFeature::DockWidgetClosable |
209 QDockWidget::DockWidgetFeature::DockWidgetMovable |
210 QDockWidget::DockWidgetFeature::DockWidgetFloatable);
213 pWidget->setEditor(mEditor);
215 qDebug() <<
"Init Dock widget: " << pWidget->objectName();
235 makeConnections(mEditor, ui->scribbleArea);
236 makeConnections(mEditor);
237 makeConnections(mEditor, mTimeLine);
238 makeConnections(mEditor, mColorBox);
239 makeConnections(mEditor, mColorInspector);
240 makeConnections(mEditor, mColorPalette);
241 makeConnections(mEditor, mToolOptions);
242 makeConnections(mEditor, ui->statusBar);
246 if (w->isFloating()) {
254void MainWindow2::createMenus()
287 replaceUndoRedoActions();
293 connect(mEditor->select(), &SelectionManager::selectionChanged,
this, &MainWindow2::selectionChanged);
309 connect(ui->actionChangeLineColorCurrent_keyframe, &
QAction::triggered, mCommands, &ActionCommands::changeKeyframeLineColor);
310 connect(ui->actionChangeLineColorAll_keyframes_on_layer, &
QAction::triggered, mCommands, &ActionCommands::changeallKeyframeLineColor);
313 QList<QAction*> visibilityActions = ui->menuLayer_Visibility->actions();
315 visibilityGroup->setExclusive(
true);
316 for (
int i = 0; i < visibilityActions.
size(); i++) {
317 QAction* action = visibilityActions[i];
318 visibilityGroup->addAction(action);
321 visibilityActions[mEditor->preference()->getInt(SETTING::LAYER_VISIBILITY)]->setChecked(
true);
322 connect(mEditor->preference(), &PreferenceManager::optionChanged, [=](SETTING e) {
323 if (e == SETTING::LAYER_VISIBILITY) {
324 visibilityActions[mEditor->preference()->getInt(SETTING::LAYER_VISIBILITY)]->setChecked(true);
330 connect(ui->actionZoom_Out, &
QAction::triggered, mCommands, &ActionCommands::ZoomOut);
331 connect(ui->actionRotate_Clockwise, &
QAction::triggered, mCommands, &ActionCommands::rotateClockwise);
332 connect(ui->actionRotate_Anticlockwise, &
QAction::triggered, mCommands, &ActionCommands::rotateCounterClockwise);
333 connect(ui->actionReset_Rotation, &
QAction::triggered, mEditor->view(), &ViewManager::resetRotation);
334 connect(ui->actionReset_View, &
QAction::triggered, mEditor->view(), &ViewManager::resetView);
335 connect(ui->actionCenter_View, &
QAction::triggered, mEditor->view(), &ViewManager::centerView);
336 connect(ui->actionZoom400, &
QAction::triggered, mEditor->view(), &ViewManager::scale400);
337 connect(ui->actionZoom300, &
QAction::triggered, mEditor->view(), &ViewManager::scale300);
338 connect(ui->actionZoom200, &
QAction::triggered, mEditor->view(), &ViewManager::scale200);
339 connect(ui->actionZoom100, &
QAction::triggered, mEditor->view(), &ViewManager::scale100);
340 connect(ui->actionZoom50, &
QAction::triggered, mEditor->view(), &ViewManager::scale50);
341 connect(ui->actionZoom33, &
QAction::triggered, mEditor->view(), &ViewManager::scale33);
342 connect(ui->actionZoom25, &
QAction::triggered, mEditor->view(), &ViewManager::scale25);
343 connect(ui->actionHorizontal_Flip, &
QAction::triggered, mEditor->view(), &ViewManager::flipHorizontal);
344 connect(ui->actionVertical_Flip, &
QAction::triggered, mEditor->view(), &ViewManager::flipVertical);
345 connect(mEditor->view(), &ViewManager::viewFlipped,
this, &MainWindow2::viewFlipped);
349 bindPreferenceSetting(ui->actionStatusBar, prefs, SETTING::SHOW_STATUS_BAR);
350 bindPreferenceSetting(ui->actionThreePointPerspective, prefs, SETTING::OVERLAY_PERSPECTIVE3);
351 bindPreferenceSetting(ui->actionTwoPointPerspective, prefs, SETTING::OVERLAY_PERSPECTIVE2);
352 bindPreferenceSetting(ui->actionOnePointPerspective, prefs, SETTING::OVERLAY_PERSPECTIVE1);
353 bindPreferenceSetting(ui->actionSafeAreas, prefs, SETTING::OVERLAY_SAFE);
354 bindPreferenceSetting(ui->actionGoldenRatio, prefs, SETTING::OVERLAY_GOLDEN);
355 bindPreferenceSetting(ui->actionThirds, prefs, SETTING::OVERLAY_THIRDS);
356 bindPreferenceSetting(ui->actionCenter, prefs, SETTING::OVERLAY_CENTER);
357 bindPreferenceSetting(ui->actionGrid, prefs, SETTING::GRID);
358 bindPreferenceSetting(ui->actionShowOutlinesOnly, prefs, SETTING::OUTLINES);
359 bindPreferenceSetting(ui->actionShowInvisibleLines, prefs, SETTING::INVISIBLE_LINES);
360 bindPreferenceSetting(ui->actionOnionPrev, prefs, SETTING::PREV_ONION);
361 bindPreferenceSetting(ui->actionOnionNext, prefs, SETTING::NEXT_ONION);
363 bool enableSafeArea = (prefs->isOn(SETTING::ACTION_SAFE_ON) || prefs->isOn(SETTING::TITLE_SAFE_ON));
364 ui->actionSafeAreas->setEnabled(enableSafeArea);
366 auto perspectiveLinesAngleGroup =
new QActionGroup(
this);
367 perspectiveLinesAngleGroup->setExclusive(
true);
368 perspectiveLinesAngleGroup->addAction(ui->action2Degrees);
369 perspectiveLinesAngleGroup->addAction(ui->action3Degrees);
370 perspectiveLinesAngleGroup->addAction(ui->action5Degrees);
371 perspectiveLinesAngleGroup->addAction(ui->action7_5Degrees);
372 perspectiveLinesAngleGroup->addAction(ui->action10Degrees);
373 perspectiveLinesAngleGroup->addAction(ui->action15Degrees);
374 perspectiveLinesAngleGroup->addAction(ui->action20Degrees);
375 perspectiveLinesAngleGroup->addAction(ui->action30Degrees);
377 if (action == ui->action2Degrees) mEditor->preference()->set(SETTING::OVERLAY_ANGLE, 2);
378 else if (action == ui->action3Degrees) mEditor->preference()->set(SETTING::OVERLAY_ANGLE, 3);
379 else if (action == ui->action5Degrees) mEditor->preference()->set(SETTING::OVERLAY_ANGLE, 5);
380 else if (action == ui->action7_5Degrees) mEditor->preference()->set(SETTING::OVERLAY_ANGLE, 7);
381 else if (action == ui->action10Degrees) mEditor->preference()->set(SETTING::OVERLAY_ANGLE, 10);
382 else if (action == ui->action15Degrees) mEditor->preference()->set(SETTING::OVERLAY_ANGLE, 15);
383 else if (action == ui->action20Degrees) mEditor->preference()->set(SETTING::OVERLAY_ANGLE, 20);
384 else if (action == ui->action30Degrees) mEditor->preference()->set(SETTING::OVERLAY_ANGLE, 30);
385 else Q_UNREACHABLE();
386 emit mEditor->view()->viewChanged();
389 switch (prefs->getInt(SETTING::OVERLAY_ANGLE)) {
390 case 2: ui->action2Degrees->setChecked(
true);
break;
391 case 3: ui->action3Degrees->setChecked(
true);
break;
392 case 5: ui->action5Degrees->setChecked(
true);
break;
393 case 7: ui->action7_5Degrees->setChecked(
true);
break;
394 case 10: ui->action10Degrees->setChecked(
true);
break;
395 case 15: ui->action15Degrees->setChecked(
true);
break;
396 case 20: ui->action20Degrees->setChecked(
true);
break;
397 case 30: ui->action30Degrees->setChecked(
true);
break;
404 connect(ui->actionLoop, &
QAction::triggered, pPlaybackManager, &PlaybackManager::setLooping);
405 connect(ui->actionLoopControl, &
QAction::triggered, pPlaybackManager, &PlaybackManager::enableRangedPlayback);
406 connect(pPlaybackManager, &PlaybackManager::loopStateChanged, ui->actionLoop, &
QAction::setChecked);
407 connect(pPlaybackManager, &PlaybackManager::loopStateChanged, mTimeLine, &TimeLine::setLoop);
408 connect(pPlaybackManager, &PlaybackManager::rangedPlaybackStateChanged, ui->actionLoopControl, &
QAction::setChecked);
409 connect(pPlaybackManager, &PlaybackManager::rangedPlaybackStateChanged, mTimeLine, &TimeLine::setRangeState);
410 connect(pPlaybackManager, &PlaybackManager::playStateChanged, mTimeLine, &TimeLine::setPlaying);
411 connect(pPlaybackManager, &PlaybackManager::playStateChanged,
this, &MainWindow2::changePlayState);
413 connect(ui->actionFlip_inbetween, &
QAction::triggered, pPlaybackManager, &PlaybackManager::playFlipInBetween);
414 connect(ui->actionFlip_rolling, &
QAction::triggered, pPlaybackManager, &PlaybackManager::playFlipRoll);
417 connect(ui->actionRemove_Frame, &
QAction::triggered, mCommands, &ActionCommands::removeKey);
418 connect(ui->actionAdd_Frame_Exposure, &
QAction::triggered, mCommands, &ActionCommands::addExposureToSelectedFrames);
419 connect(ui->actionSubtract_Frame_Exposure, &
QAction::triggered, mCommands, &ActionCommands::subtractExposureFromSelectedFrames);
420 connect(ui->actionNext_Frame, &
QAction::triggered, mCommands, &ActionCommands::GotoNextFrame);
421 connect(ui->actionPrevious_Frame, &
QAction::triggered, mCommands, &ActionCommands::GotoPrevFrame);
422 connect(ui->actionNext_KeyFrame, &
QAction::triggered, mCommands, &ActionCommands::GotoNextKeyFrame);
423 connect(ui->actionPrev_KeyFrame, &
QAction::triggered, mCommands, &ActionCommands::GotoPrevKeyFrame);
424 connect(ui->actionDuplicate_Frame, &
QAction::triggered, mCommands, &ActionCommands::duplicateKey);
425 connect(ui->actionMove_Frame_Forward, &
QAction::triggered, mCommands, &ActionCommands::moveFrameForward);
426 connect(ui->actionMove_Frame_Backward, &
QAction::triggered, mCommands, &ActionCommands::moveFrameBackward);
428 connect(ui->actionReverse_Frames_Order, &
QAction::triggered, mCommands, &ActionCommands::reverseSelectedFrames);
429 connect(ui->actionRemove_Frames, &
QAction::triggered, mCommands, &ActionCommands::removeSelectedFrames);
433 toolsActionGroup->setExclusive(
true);
434 toolsActionGroup->addAction(ui->actionMove);
435 toolsActionGroup->addAction(ui->actionSelect);
436 toolsActionGroup->addAction(ui->actionBrush);
437 toolsActionGroup->addAction(ui->actionPolyline);
438 toolsActionGroup->addAction(ui->actionSmudge);
439 toolsActionGroup->addAction(ui->actionPen);
440 toolsActionGroup->addAction(ui->actionHand);
441 toolsActionGroup->addAction(ui->actionPencil);
442 toolsActionGroup->addAction(ui->actionBucket);
443 toolsActionGroup->addAction(ui->actionEyedropper);
444 toolsActionGroup->addAction(ui->actionEraser);
445 toolsActionGroup->addAction(ui->actionResetToolsDefault);
448 if (action == ui->actionMove) mToolBox->setActiveTool(MOVE);
449 else if (action == ui->actionSelect) mToolBox->setActiveTool(SELECT);
450 else if (action == ui->actionBrush) mToolBox->setActiveTool(BRUSH);
451 else if (action == ui->actionPolyline) mToolBox->setActiveTool(POLYLINE);
452 else if (action == ui->actionSmudge) mToolBox->setActiveTool(SMUDGE);
453 else if (action == ui->actionPen) mToolBox->setActiveTool(PEN);
454 else if (action == ui->actionHand) mToolBox->setActiveTool(HAND);
455 else if (action == ui->actionPencil) mToolBox->setActiveTool(PENCIL);
456 else if (action == ui->actionBucket) mToolBox->setActiveTool(BUCKET);
457 else if (action == ui->actionEyedropper) mToolBox->setActiveTool(EYEDROPPER);
458 else if (action == ui->actionEraser) mToolBox->setActiveTool(ERASER);
459 else if (action == ui->actionResetToolsDefault) mCommands->resetAllTools();
460 else Q_UNREACHABLE();
464 QMenu* winMenu = ui->menuWindows;
465 const std::vector<QAction*> actions
467 mToolBox->toggleViewAction(),
468 mToolOptions->toggleViewAction(),
469 mColorBox->toggleViewAction(),
470 mColorPalette->toggleViewAction(),
471 mTimeLine->toggleViewAction(),
472 mColorInspector->toggleViewAction(),
473 mOnionSkinWidget->toggleViewAction()
476 for (
QAction* action : actions)
479 winMenu->insertAction(ui->menuToolbars->menuAction(), action);
481 winMenu->insertSeparator(ui->menuToolbars->menuAction());
482 connect(ui->actionResetWindows, &
QAction::triggered,
this, &MainWindow2::resetAndDockAllSubWidgets);
483 connect(ui->actionLockWindows, &
QAction::toggled,
this, &MainWindow2::lockWidgets);
484 bindPreferenceSetting(ui->actionLockWindows, prefs, SETTING::LAYOUT_LOCK);
488 connect(ui->actionQuick_Guide, &
QAction::triggered, mCommands, &ActionCommands::quickGuide);
492 connect(ui->actionCheck_for_Updates, &
QAction::triggered, mCommands, &ActionCommands::checkForUpdates);
493 connect(ui->actionReport_Bug, &
QAction::triggered, mCommands, &ActionCommands::reportbug);
494 connect(ui->actionOpen_Temporary_Directory, &
QAction::triggered, mCommands, &ActionCommands::openTemporaryDirectory);
499 mRecentFileMenu->loadFromDisk();
500 ui->menuFile->insertMenu(ui->actionSave, mRecentFileMenu);
502 connect(mRecentFileMenu, &RecentFileMenu::loadRecentFile,
this, &MainWindow2::openFile);
505void MainWindow2::replaceUndoRedoActions()
507 ui->menuEdit->removeAction(ui->actionUndo);
508 ui->menuEdit->removeAction(ui->actionRedo);
509 ui->actionUndo = mEditor->undoRedo()->createUndoAction(
this, ui->actionUndo->icon());
510 ui->actionRedo = mEditor->undoRedo()->createRedoAction(
this, ui->actionRedo->icon());
511 ui->menuEdit->insertAction(ui->actionCut, ui->actionUndo);
512 ui->menuEdit->insertAction(ui->actionCut, ui->actionRedo);
515void MainWindow2::setOpacity(
int opacity)
517 mEditor->preference()->set(SETTING::WINDOW_OPACITY, 100 - opacity);
521void MainWindow2::updateSaveState()
525 ui->statusBar->updateModifiedStatus(hasUnsavedChanges);
528void MainWindow2::updateBackupActionState()
530 mEditor->undoRedo()->updateUndoAction(ui->actionUndo);
531 mEditor->undoRedo()->updateRedoAction(ui->actionRedo);
534void MainWindow2::openPegAlignDialog()
536 if (mPegAlign !=
nullptr)
539 tr(
"Dialog is already open!"),
549 flags &= (
~Qt::WindowContextHelpButtonHint);
558void MainWindow2::openLayerOpacityDialog()
560 if (mLayerOpacityDialog !=
nullptr)
563 tr(
"Dialog is already open!"),
569 mLayerOpacityDialog->setCore(mEditor);
570 mLayerOpacityDialog->initUI();
572 mLayerOpacityDialog->
show();
576 mLayerOpacityDialog =
nullptr;
580void MainWindow2::openAddTranspToPaperDialog()
582 if (mAddTranspToPaper)
585 mAddTranspToPaper->
raise();
590 mAddTranspToPaper->setCore(mEditor);
591 mAddTranspToPaper->initUI();
593 mAddTranspToPaper->
show();
599 mSuppressAutoSaveDialog =
true;
600 mAddTranspToPaper->traceScannedDrawings();
601 mSuppressAutoSaveDialog =
false;
604 mAddTranspToPaper =
nullptr;
608void MainWindow2::openRepositionDialog()
610 if (mEditor->layers()->currentLayer()->getSelectedFramesByPos().
count() < 2)
613 tr(
"Please select at least 2 frames!"),
617 if (mReposDialog !=
nullptr)
625 hideQuestionMark(*mReposDialog);
626 mReposDialog->setCore(mEditor);
627 mReposDialog->initUI();
628 mEditor->tools()->setCurrentTool(ToolType::MOVE);
630 mReposDialog->
show();
633void MainWindow2::closeRepositionDialog()
636 mReposDialog =
nullptr;
639void MainWindow2::currentLayerChanged()
641 bool isBitmap = (mEditor->layers()->currentLayer()->type() == Layer::BITMAP);
642 ui->menuChange_line_color->setEnabled(isBitmap);
644 bool isVector = (mEditor->layers()->currentLayer()->type() == Layer::VECTOR);
645 ui->actionShowInvisibleLines->setEnabled(isVector);
646 ui->actionShowOutlinesOnly->setEnabled(isVector);
649void MainWindow2::selectionChanged()
651 bool somethingSelected = mEditor->select()->somethingSelected();
652 ui->menuSelection->setEnabled(somethingSelected);
655void MainWindow2::viewFlipped()
657 ui->actionHorizontal_Flip->setChecked(mEditor->view()->isFlipHorizontal());
658 ui->actionVertical_Flip->setChecked(mEditor->view()->isFlipVertical());
677 m2ndCloseEvent =
true;
685void MainWindow2::newDocument()
687 if (maybeSave() && !tryLoadPreset())
693void MainWindow2::openDocument()
702 openObject(fileName);
706bool MainWindow2::saveAsNewDocument()
713 return saveObject(fileName);
716void MainWindow2::openStartupFile(
const QString& filename)
718 if (checkForRecoverableProjects())
723 if (!filename.
isEmpty() && openObject(filename))
728 loadMostRecent() || tryLoadPreset();
731void MainWindow2::openFile(
const QString& filename)
735 openObject(filename);
739bool MainWindow2::openObject(
const QString& strFilePath)
742 hideQuestionMark(progress);
746 Status s = mEditor->openObject(strFilePath, [&progress](
int p)
748 progress.setValue(p);
750 }, [&progress](
int max)
752 progress.setRange(0, max);
757 ErrorDialog errorDialog(s.title(), s.description(), s.details().str());
759 emptyDocumentWhenErrorOccurred();
764 settings.setValue(LAST_PCLX_PATH, mEditor->object()->filePath());
767 if (!mEditor->object()->filePath().
isEmpty())
769 mRecentFileMenu->addRecentFile(mEditor->object()->filePath());
770 mRecentFileMenu->saveToDisk();
777 ui->statusBar->updateModifiedStatus(
false);
779 progress.setValue(progress.maximum());
782 updateBackupActionState();
784 if (!
QFileInfo(strFilePath).isWritable())
787 tr(
"This program does not currently have permission to write to the file you have selected. "
788 "Please make sure you have write permission for this file before attempting to save it. "
789 "Alternatively, you can use the Save As... menu option to save to a writable location."),
796bool MainWindow2::saveObject(
QString strSavedFileName)
799 hideQuestionMark(progress);
803 mEditor->prepareSave();
807 connect(&fm, &FileManager::progressChanged, [&progress](
int p)
809 progress.setValue(p);
812 connect(&fm, &FileManager::progressRangeChanged, [&progress](
int max)
814 progress.setRange(0, max + 3);
817 Status st = fm.save(mEditor->object(), strSavedFileName);
822#if QT_VERSION >= QT_VERSION_CHECK(5, 4, 0)
827 errorLogFolder.mkpath(
"./logs");
828 errorLogFolder.cd(
"logs");
836 out << st.details().str();
841 st.description().append(
tr(
"<br><br>An error has occurred and your file may not have saved successfully."
842 "\nIf you believe that this error is an issue with Pencil2D, please create a new issue at:"
843 "<br><a href='https://github.com/pencil2d/pencil/issues'>https://github.com/pencil2d/pencil/issues</a><br>"
844 "Please be sure to include the following details in your issue:")), st.details().html());
849 mEditor->object()->setFilePath(strSavedFileName);
850 mEditor->object()->setModified(
false);
852 mEditor->clearTemporary();
855 settings.setValue(LAST_PCLX_PATH, strSavedFileName);
857 mRecentFileMenu->addRecentFile(strSavedFileName);
858 mRecentFileMenu->saveToDisk();
860 mTimeLine->updateContent();
865 progress.setValue(progress.maximum());
867 mEditor->resetAutoSaveCounter();
872bool MainWindow2::saveDocument()
874 if (!mEditor->object()->filePath().
isEmpty())
875 return saveObject(mEditor->object()->filePath());
877 return saveAsNewDocument();
880bool MainWindow2::maybeSave()
888 tr(
"This animation has been modified.\n Do you want to save your changes?"),
891 return saveDocument();
896bool MainWindow2::autoSave()
898 if (!mEditor->object()->filePath().
isEmpty())
900 return saveDocument();
903 if (mEditor->autoSaveNeverAskAgain())
906 if(mSuppressAutoSaveDialog)
911 msgBox.setWindowTitle(
tr(
"AutoSave Reminder"));
912 msgBox.setText(
tr(
"The animation is not saved yet.\n Do you want to save now?"));
917 int ret = msgBox.exec();
920 return saveDocument();
924 mEditor->dontAskAutoSave(
true);
930void MainWindow2::emptyDocumentWhenErrorOccurred()
938void MainWindow2::importImage()
942 if (strFilePath.
isEmpty()) {
return; }
943 if (!QFile::exists(strFilePath)) {
return; }
946 OnScopeExit(
delete positionDialog)
948 positionDialog->
exec();
956 Status st = mEditor->importImage(strFilePath, importImageConfig);
959 ErrorDialog errorDialog(st.title(), st.description(), st.details().html());
964 ui->scribbleArea->updateFrame();
965 mTimeLine->updateContent();
968void MainWindow2::importImageSequence()
970 mSuppressAutoSaveDialog =
true;
973 OnScopeExit(
delete imageSeqDialog)
974 imageSeqDialog->setCore(mEditor);
978 imageSeqDialog->
exec();
985 OnScopeExit(
delete positionDialog)
987 positionDialog->
exec();
993 imageSeqDialog->importArbitrarySequence(positionDialog->importConfig());
995 mSuppressAutoSaveDialog =
false;
998void MainWindow2::importPredefinedImageSet()
1001 OnScopeExit(
delete imageSeqDialog)
1002 imageSeqDialog->setCore(mEditor);
1006 mSuppressAutoSaveDialog =
true;
1007 imageSeqDialog->
exec();
1014 OnScopeExit(
delete positionDialog)
1016 positionDialog->
exec();
1022 imageSeqDialog->importPredefinedSet(positionDialog->importConfig());
1023 mSuppressAutoSaveDialog =
false;
1026void MainWindow2::importLayers()
1029 importLayers->setCore(mEditor);
1031 importLayers->
open();
1034void MainWindow2::importAnimatedImage()
1037 mSuppressAutoSaveDialog =
true;
1039 mCommands->importAnimatedImage();
1041 mSuppressAutoSaveDialog =
false;
1044void MainWindow2::lockWidgets(
bool shouldLock)
1048 : (QDockWidget::DockWidgetFeature::DockWidgetClosable |
1049 QDockWidget::DockWidgetFeature::DockWidgetMovable |
1050 QDockWidget::DockWidgetFeature::DockWidgetFloatable);
1054 d->setFeatures(feat);
1055 d->lock(shouldLock);
1059void MainWindow2::preferences()
1064 mPrefDialog->
raise();
1070 mPrefDialog->init(mEditor->preference());
1072 connect(mPrefDialog, &PreferencesDialog::windowOpacityChange,
this, &MainWindow2::setOpacity);
1073 connect(mPrefDialog, &PreferencesDialog::soundScrubChanged, mEditor->playback(), &PlaybackManager::setSoundScrubActive);
1074 connect(mPrefDialog, &PreferencesDialog::soundScrubMsecChanged, mEditor->playback(), &PlaybackManager::setSoundScrubMsec);
1077 clearKeyboardShortcuts();
1078 setupKeyboardShortcuts();
1079 mPrefDialog =
nullptr;
1082 mPrefDialog->
show();
1085void MainWindow2::resetAndDockAllSubWidgets()
1088 settings.remove(SETTING_WINDOW_GEOMETRY);
1089 settings.remove(SETTING_WINDOW_STATE);
1093 dock->setFloating(
false);
1107void MainWindow2::newObject()
1109 auto object =
new Object();
1113 object->addNewCameraLayer();
1114 object->addNewBitmapLayer();
1118 object->data()->setCurrentLayer(1);
1120 mEditor->setObject(
object);
1125 updateBackupActionState();
1128bool MainWindow2::newObjectFromPresets(
int presetIndex)
1130 QString presetFilePath = PresetDialog::getPresetPath(presetIndex);
1138 Object*
object = fm.load(presetFilePath);
1140 if (!fm.error().ok() ||
object ==
nullptr)
1145 mEditor->setObject(
object);
1146 object->setFilePath(
QString());
1150 updateBackupActionState();
1155bool MainWindow2::loadMostRecent()
1157 if(!mEditor->preference()->isOn(SETTING::LOAD_MOST_RECENT))
1163 QString myPath = settings.value(LAST_PCLX_PATH,
QVariant(
"")).toString();
1164 if (myPath.
isEmpty() || !QFile::exists(myPath))
1168 return openObject(myPath);
1171bool MainWindow2::tryLoadPreset()
1173 if (!mEditor->preference()->isOn(SETTING::ASK_FOR_PRESET))
1175 int defaultPreset = mEditor->preference()->getInt(SETTING::DEFAULT_PRESET);
1176 return newObjectFromPresets(defaultPreset);
1188 int presetIndex = presetDialog->getPresetIndex();
1189 if (presetDialog->shouldAlwaysUse())
1191 mEditor->preference()->set(SETTING::ASK_FOR_PRESET, false);
1192 mEditor->preference()->set(SETTING::DEFAULT_PRESET, presetIndex);
1194 if (!newObjectFromPresets(presetIndex))
1199 presetDialog->
open();
1203void MainWindow2::closeDialogs()
1210void MainWindow2::readSettings()
1214 QVariant winGeometry = settings.
value(SETTING_WINDOW_GEOMETRY);
1220 int opacity = mEditor->preference()->getInt(SETTING::WINDOW_OPACITY);
1221 setOpacity(100 - opacity);
1223 bool isWindowsLocked = mEditor->preference()->isOn(SETTING::LAYOUT_LOCK);
1224 lockWidgets(isWindowsLocked);
1227void MainWindow2::writeSettings()
1230 settings.setValue(SETTING_WINDOW_GEOMETRY,
saveGeometry());
1231 settings.setValue(SETTING_WINDOW_STATE,
saveState());
1234void MainWindow2::setupKeyboardShortcuts()
1236 checkExistingShortcuts();
1240 strCommandName =
QString(
"shortcuts/") + strCommandName;
1246 ui->actionNew->setShortcut(cmdKeySeq(CMD_NEW_FILE));
1247 ui->actionOpen->setShortcut(cmdKeySeq(CMD_OPEN_FILE));
1248 ui->actionSave->setShortcut(cmdKeySeq(CMD_SAVE_FILE));
1249 ui->actionSave_as->setShortcut(cmdKeySeq(CMD_SAVE_AS));
1251 ui->actionImport_Image->setShortcut(cmdKeySeq(CMD_IMPORT_IMAGE));
1252 ui->actionImport_ImageSeq->setShortcut(cmdKeySeq(CMD_IMPORT_IMAGE_SEQ));
1253 ui->actionImport_ImageSeqNum->setShortcut(cmdKeySeq(CMD_IMPORT_IMAGE_PREDEFINED_SET));
1254 ui->actionImport_MovieVideo->setShortcut(cmdKeySeq(CMD_IMPORT_MOVIE_VIDEO));
1255 ui->actionImport_AnimatedImage->setShortcut(cmdKeySeq(CMD_IMPORT_ANIMATED_IMAGE));
1256 ui->actionImportLayers_from_pclx->setShortcut(cmdKeySeq(CMD_IMPORT_LAYERS));
1257 ui->actionImport_Sound->setShortcut(cmdKeySeq(CMD_IMPORT_SOUND));
1258 ui->actionImport_MovieAudio->setShortcut(cmdKeySeq(CMD_IMPORT_MOVIE_AUDIO));
1259 ui->actionImport_Append_Palette->setShortcut(cmdKeySeq(CMD_IMPORT_PALETTE));
1260 ui->actionImport_Replace_Palette->setShortcut(cmdKeySeq(CMD_IMPORT_PALETTE_REPLACE));
1262 ui->actionExport_Image->setShortcut(cmdKeySeq(CMD_EXPORT_IMAGE));
1263 ui->actionExport_ImageSeq->setShortcut(cmdKeySeq(CMD_EXPORT_IMAGE_SEQ));
1264 ui->actionExport_Movie->setShortcut(cmdKeySeq(CMD_EXPORT_MOVIE));
1265 ui->actionExport_Animated_GIF->setShortcut(cmdKeySeq(CMD_EXPORT_GIF));
1266 ui->actionExport_Palette->setShortcut(cmdKeySeq(CMD_EXPORT_PALETTE));
1269 ui->actionUndo->setShortcut(cmdKeySeq(CMD_UNDO));
1270 ui->actionRedo->setShortcut(cmdKeySeq(CMD_REDO));
1271 ui->actionCut->setShortcut(cmdKeySeq(CMD_CUT));
1272 ui->actionCopy->setShortcut(cmdKeySeq(CMD_COPY));
1273 ui->actionPaste_Previous->setShortcut(cmdKeySeq(CMD_PASTE_FROM_PREVIOUS));
1274 ui->actionPaste->setShortcut(cmdKeySeq(CMD_PASTE));
1275 ui->actionClearFrame->setShortcut(cmdKeySeq(CMD_CLEAR_FRAME));
1276 ui->actionFlip_X->setShortcut(cmdKeySeq(CMD_SELECTION_FLIP_HORIZONTAL));
1277 ui->actionFlip_Y->setShortcut(cmdKeySeq(CMD_SELECTION_FLIP_VERTICAL));
1278 ui->actionSelect_All->setShortcut(cmdKeySeq(CMD_SELECT_ALL));
1279 ui->actionDeselect_All->setShortcut(cmdKeySeq(CMD_DESELECT_ALL));
1280 ui->actionPegbarAlignment->setShortcut(cmdKeySeq(CMD_PEGBAR_ALIGNMENT));
1281 ui->actionPreference->setShortcut(cmdKeySeq(CMD_PREFERENCE));
1284 ui->actionResetWindows->setShortcut(cmdKeySeq(CMD_RESET_WINDOWS));
1285 ui->actionLockWindows->setShortcut(cmdKeySeq(CMD_LOCK_WINDOWS));
1286 ui->actionReset_View->setShortcut(cmdKeySeq(CMD_RESET_ZOOM_ROTATE));
1287 ui->actionCenter_View->setShortcut(cmdKeySeq(CMD_CENTER_VIEW));
1288 ui->actionZoom_In->setShortcut(cmdKeySeq(CMD_ZOOM_IN));
1289 ui->actionZoom_Out->setShortcut(cmdKeySeq(CMD_ZOOM_OUT));
1290 ui->actionZoom400->setShortcut(cmdKeySeq(CMD_ZOOM_400));
1291 ui->actionZoom300->setShortcut(cmdKeySeq(CMD_ZOOM_300));
1292 ui->actionZoom200->setShortcut(cmdKeySeq(CMD_ZOOM_200));
1293 ui->actionZoom100->setShortcut(cmdKeySeq(CMD_ZOOM_100));
1294 ui->actionZoom50->setShortcut(cmdKeySeq(CMD_ZOOM_50));
1295 ui->actionZoom33->setShortcut(cmdKeySeq(CMD_ZOOM_33));
1296 ui->actionZoom25->setShortcut(cmdKeySeq(CMD_ZOOM_25));
1297 ui->actionRotate_Clockwise->setShortcut(cmdKeySeq(CMD_ROTATE_CLOCK));
1298 ui->actionRotate_Anticlockwise->setShortcut(cmdKeySeq(CMD_ROTATE_ANTI_CLOCK));
1299 ui->actionReset_Rotation->setShortcut(cmdKeySeq(CMD_RESET_ROTATION));
1300 ui->actionHorizontal_Flip->setShortcut(cmdKeySeq(CMD_FLIP_HORIZONTAL));
1301 ui->actionVertical_Flip->setShortcut(cmdKeySeq(CMD_FLIP_VERTICAL));
1302 ui->actionGrid->setShortcut(cmdKeySeq(CMD_GRID));
1303 ui->actionCenter->setShortcut(cmdKeySeq(CMD_OVERLAY_CENTER));
1304 ui->actionThirds->setShortcut(cmdKeySeq(CMD_OVERLAY_THIRDS));
1305 ui->actionGoldenRatio->setShortcut(cmdKeySeq(CMD_OVERLAY_GOLDEN_RATIO));
1306 ui->actionSafeAreas->setShortcut(cmdKeySeq(CMD_OVERLAY_SAFE_AREAS));
1307 ui->actionOnePointPerspective->setShortcut(cmdKeySeq(CMD_OVERLAY_ONE_POINT_PERSPECTIVE));
1308 ui->actionTwoPointPerspective->setShortcut(cmdKeySeq(CMD_OVERLAY_TWO_POINT_PERSPECTIVE));
1309 ui->actionThreePointPerspective->setShortcut(cmdKeySeq(CMD_OVERLAY_THREE_POINT_PERSPECTIVE));
1310 ui->actionOnionPrev->setShortcut(cmdKeySeq(CMD_ONIONSKIN_PREV));
1311 ui->actionOnionNext->setShortcut(cmdKeySeq(CMD_ONIONSKIN_NEXT));
1312 ui->actionStatusBar->setShortcut(cmdKeySeq(CMD_TOGGLE_STATUS_BAR));
1315 ui->actionPlay->setShortcut(cmdKeySeq(CMD_PLAY));
1316 ui->actionLoop->setShortcut(cmdKeySeq(CMD_LOOP));
1317 ui->actionLoopControl->setShortcut(cmdKeySeq(CMD_LOOP_CONTROL));
1318 ui->actionPrevious_Frame->setShortcut(cmdKeySeq(CMD_GOTO_PREV_FRAME));
1319 ui->actionNext_Frame->setShortcut(cmdKeySeq(CMD_GOTO_NEXT_FRAME));
1320 ui->actionPrev_KeyFrame->setShortcut(cmdKeySeq(CMD_GOTO_PREV_KEY_FRAME));
1321 ui->actionNext_KeyFrame->setShortcut(cmdKeySeq(CMD_GOTO_NEXT_KEY_FRAME));
1322 ui->actionAdd_Frame->setShortcut(cmdKeySeq(CMD_ADD_FRAME));
1323 ui->actionDuplicate_Frame->setShortcut(cmdKeySeq(CMD_DUPLICATE_FRAME));
1324 ui->actionRemove_Frame->setShortcut(cmdKeySeq(CMD_REMOVE_FRAME));
1325 ui->actionAdd_Frame_Exposure->setShortcut(cmdKeySeq(CMD_SELECTION_ADD_FRAME_EXPOSURE));
1326 ui->actionSubtract_Frame_Exposure->setShortcut(cmdKeySeq(CMD_SELECTION_SUBTRACT_FRAME_EXPOSURE));
1327 ui->actionReverse_Frames_Order->setShortcut(cmdKeySeq(CMD_REVERSE_SELECTED_FRAMES));
1328 ui->actionRemove_Frames->setShortcut(cmdKeySeq(CMD_REMOVE_SELECTED_FRAMES));
1329 ui->actionMove_Frame_Backward->setShortcut(cmdKeySeq(CMD_MOVE_FRAME_BACKWARD));
1330 ui->actionMove_Frame_Forward->setShortcut(cmdKeySeq(CMD_MOVE_FRAME_FORWARD));
1331 ui->actionFlip_inbetween->setShortcut(cmdKeySeq(CMD_FLIP_INBETWEEN));
1332 ui->actionFlip_rolling->setShortcut(cmdKeySeq(CMD_FLIP_ROLLING));
1333 ui->actionReposition_Selected_Frames->setShortcut(cmdKeySeq(CMD_SELECTION_REPOSITION_FRAMES));
1336 ui->actionMove->setShortcut(cmdKeySeq(CMD_TOOL_MOVE));
1337 ui->actionSelect->setShortcut(cmdKeySeq(CMD_TOOL_SELECT));
1338 ui->actionBrush->setShortcut(cmdKeySeq(CMD_TOOL_BRUSH));
1339 ui->actionPolyline->setShortcut(cmdKeySeq(CMD_TOOL_POLYLINE));
1340 ui->actionSmudge->setShortcut(cmdKeySeq(CMD_TOOL_SMUDGE));
1341 ui->actionPen->setShortcut(cmdKeySeq(CMD_TOOL_PEN));
1342 ui->actionHand->setShortcut(cmdKeySeq(CMD_TOOL_HAND));
1343 ui->actionPencil->setShortcut(cmdKeySeq(CMD_TOOL_PENCIL));
1344 ui->actionBucket->setShortcut(cmdKeySeq(CMD_TOOL_BUCKET));
1345 ui->actionEyedropper->setShortcut(cmdKeySeq(CMD_TOOL_EYEDROPPER));
1346 ui->actionEraser->setShortcut(cmdKeySeq(CMD_TOOL_ERASER));
1347 ui->actionResetToolsDefault->setShortcut(cmdKeySeq(CMD_RESET_ALL_TOOLS));
1349 ui->actionMove->installEventFilter(shortcutFilter);
1350 ui->actionMove->installEventFilter(shortcutFilter);
1351 ui->actionSelect->installEventFilter(shortcutFilter);
1352 ui->actionBrush->installEventFilter(shortcutFilter);
1353 ui->actionPolyline->installEventFilter(shortcutFilter);
1354 ui->actionSmudge->installEventFilter(shortcutFilter);
1355 ui->actionPen->installEventFilter(shortcutFilter);
1356 ui->actionHand->installEventFilter(shortcutFilter);
1357 ui->actionPencil->installEventFilter(shortcutFilter);
1358 ui->actionBucket->installEventFilter(shortcutFilter);
1359 ui->actionEyedropper->installEventFilter(shortcutFilter);
1360 ui->actionEraser->installEventFilter(shortcutFilter);
1363 ui->actionNew_Bitmap_Layer->setShortcut(cmdKeySeq(CMD_NEW_BITMAP_LAYER));
1364 ui->actionNew_Vector_Layer->setShortcut(cmdKeySeq(CMD_NEW_VECTOR_LAYER));
1365 ui->actionNew_Camera_Layer->setShortcut(cmdKeySeq(CMD_NEW_CAMERA_LAYER));
1366 ui->actionNew_Sound_Layer->setShortcut(cmdKeySeq(CMD_NEW_SOUND_LAYER));
1367 ui->actionDelete_Current_Layer->setShortcut(cmdKeySeq(CMD_DELETE_CUR_LAYER));
1368 ui->actionChangeLineColorCurrent_keyframe->setShortcut(cmdKeySeq(CMD_CHANGE_LINE_COLOR_KEYFRAME));
1369 ui->actionChangeLineColorAll_keyframes_on_layer->setShortcut(cmdKeySeq(CMD_CHANGE_LINE_COLOR_LAYER));
1370 ui->actionChangeLayerOpacity->setShortcut(cmdKeySeq(CMD_CHANGE_LAYER_OPACITY));
1372 ui->actionVisibilityCurrentLayerOnly->setShortcut(cmdKeySeq(CMD_CURRENT_LAYER_VISIBILITY));
1373 ui->actionVisibilityRelative->setShortcut(cmdKeySeq(CMD_RELATIVE_LAYER_VISIBILITY));
1374 ui->actionVisibilityAll->setShortcut(cmdKeySeq(CMD_ALL_LAYER_VISIBILITY));
1376 mToolBox->toggleViewAction()->setShortcut(cmdKeySeq(CMD_TOGGLE_TOOLBOX));
1384 ui->actionHelp->setShortcut(cmdKeySeq(CMD_HELP));
1385 ui->actionExit->setShortcut(cmdKeySeq(CMD_EXIT));
1388void MainWindow2::clearKeyboardShortcuts()
1391 for (
QAction* action : actionList)
1397void MainWindow2::exportPalette()
1402 mEditor->object()->exportPalette(filePath);
1406void MainWindow2::importPalette()
1411 mEditor->object()->importPalette(filePath);
1412 mColorPalette->refreshColorList();
1413 mColorPalette->adjustSwatches();
1414 mEditor->color()->setColorNumber(0);
1418void MainWindow2::openPalette()
1420 for (
int i = 0; i < mEditor->object()->getColorCount(); i++)
1422 if (!mEditor->object()->isColorInUse(i))
1428 msgBox.
setText(
tr(
"Opening a palette will replace the old palette.\n"
1429 "Color(s) in strokes will be altered by this action!"));
1445 mEditor->object()->openPalette(filePath);
1446 mColorPalette->refreshColorList();
1447 mEditor->color()->setColorNumber(0);
1450void MainWindow2::makeConnections(
Editor* editor)
1452 connect(editor->undoRedo(), &UndoRedoManager::didUpdateUndoStack,
this, &MainWindow2::updateSaveState);
1453 connect(editor->undoRedo(), &UndoRedoManager::didUpdateUndoStack,
this, &MainWindow2::updateBackupActionState);
1454 connect(editor, &Editor::needDisplayInfo,
this, &MainWindow2::displayMessageBox);
1455 connect(editor, &Editor::needDisplayInfoNoTitle,
this, &MainWindow2::displayMessageBoxNoTitle);
1456 connect(editor->layers(), &LayerManager::currentLayerChanged,
this, &MainWindow2::currentLayerChanged);
1457 connect(editor->select(), &SelectionManager::selectionChanged,
this, &MainWindow2::selectionChanged);
1458 connect(editor, &Editor::canCopyChanged,
this, [=](
bool canCopy) {
1459 ui->actionCopy->setEnabled(canCopy);
1460 ui->actionCut->setEnabled(canCopy);
1465void MainWindow2::makeConnections(
Editor* editor,
ColorBox* colorBox)
1467 connect(colorBox, &ColorBox::colorChanged, editor->color(), &ColorManager::setFrontColor);
1468 connect(editor->color(), &ColorManager::colorChanged, colorBox, &ColorBox::setColor);
1473 connect(colorInspector, &ColorInspector::colorChanged, editor->color(), &ColorManager::setFrontColor);
1474 connect(editor->color(), &ColorManager::colorChanged, colorInspector, &ColorInspector::setColor);
1479 connect(editor->tools(), &ToolManager::toolChanged, scribbleArea, &ScribbleArea::updateToolCursor);
1480 connect(editor->tools(), &ToolManager::toolChanged, mToolBox, &ToolBoxDockWidget::setActiveTool);
1482 connect(scribbleArea, &ScribbleArea::requestFocus,
this, &MainWindow2::onFocusRequested);
1493void MainWindow2::makeConnections(
Editor* pEditor,
TimeLine* pTimeline)
1496 connect(pTimeline, &TimeLine::duplicateLayerClick, mCommands, &ActionCommands::duplicateLayer);
1497 connect(pTimeline, &TimeLine::duplicateKeyClick, mCommands, &ActionCommands::duplicateKey);
1499 connect(pTimeline, &TimeLine::soundClick, pPlaybackManager, &PlaybackManager::enableSound);
1500 connect(pTimeline, &TimeLine::fpsChanged, pPlaybackManager, &PlaybackManager::setFps);
1501 connect(pTimeline, &TimeLine::fpsChanged, pEditor, &Editor::setFps);
1504 connect(pTimeline, &TimeLine::removeKeyClick, mCommands, &ActionCommands::removeKey);
1506 connect(pTimeline, &TimeLine::newBitmapLayer, mCommands, &ActionCommands::addNewBitmapLayer);
1507 connect(pTimeline, &TimeLine::newVectorLayer, mCommands, &ActionCommands::addNewVectorLayer);
1508 connect(pTimeline, &TimeLine::newSoundLayer, mCommands, &ActionCommands::addNewSoundLayer);
1509 connect(pTimeline, &TimeLine::newCameraLayer, mCommands, &ActionCommands::addNewCameraLayer);
1510 connect(mTimeLine, &TimeLine::playButtonTriggered, mCommands, &ActionCommands::PlayStop);
1511 connect(pTimeline, &TimeLine::deleteCurrentLayerClick, mCommands, &ActionCommands::deleteCurrentLayer);
1515 connect(pTimeline, &TimeLine::selectionChanged,
this, &MainWindow2::updateCopyCutPasteEnabled);
1517 connect(mEditor->select(), &SelectionManager::selectionChanged,
this, &MainWindow2::updateCopyCutPasteEnabled);
1519 connect(pEditor->layers(), &LayerManager::currentLayerChanged, pTimeline, &TimeLine::updateUI);
1521 connect(pEditor->sound(), &SoundManager::soundClipDurationChanged, pTimeline, &TimeLine::updateUI);
1526 connect(pEditor, &Editor::objectLoaded, pTimeline, &TimeLine::onObjectLoaded);
1527 connect(pEditor, &Editor::updateTimeLine, pTimeline, &TimeLine::updateUI);
1528 connect(pEditor, &Editor::updateTimeLineCached, pTimeline, &TimeLine::updateUICached);
1530 connect(pEditor->layers(), &LayerManager::currentLayerChanged,
this, &MainWindow2::updateLayerMenu);
1539 toolOptions->makeConnectionToEditor(editor);
1544 connect(pEditor, &Editor::objectLoaded, pColorPalette, &ColorPaletteWidget::updateUI);
1547 ScribbleArea* pScribbleArea = pEditor->getScribbleArea();
1549 connect(pColorPalette, &ColorPaletteWidget::colorNumberChanged, pColorManager, &ColorManager::setColorNumber);
1550 connect(pColorManager, &ColorManager::colorNumberChanged, pScribbleArea, &ScribbleArea::paletteColorChanged);
1551 connect(pColorManager, &ColorManager::colorNumberChanged, pColorPalette, &ColorPaletteWidget::selectColorNumber);
1554void MainWindow2::makeConnections(
Editor* editor,
StatusBar *statusBar)
1563void MainWindow2::updateCopyCutPasteEnabled()
1565 bool canCopy = mEditor->canCopy();
1566 bool canPaste = mEditor->canPaste();
1568 ui->actionCopy->setEnabled(canCopy);
1569 ui->actionCut->setEnabled(canCopy);
1570 ui->actionPaste->setEnabled(canPaste);
1573void MainWindow2::updateLayerMenu()
1575 ui->actionDelete_Current_Layer->setEnabled(mEditor->layers()->canDeleteLayer(mEditor->currentLayerIndex()));
1578void MainWindow2::changePlayState(
bool isPlaying)
1582 ui->actionPlay->setText(
tr(
"Stop"));
1583 ui->actionPlay->setIcon(mStopIcon);
1587 ui->actionPlay->setText(
tr(
"Play"));
1588 ui->actionPlay->setIcon(mStartIcon);
1593void MainWindow2::importMovieVideo()
1596 mSuppressAutoSaveDialog =
true;
1598 mCommands->importMovieVideo();
1600 mSuppressAutoSaveDialog =
false;
1603bool MainWindow2::event(
QEvent* event)
1611void MainWindow2::onFocusRequested(
QWidget *widget)
1613 ScribbleArea* scribbleArea = qobject_cast<ScribbleArea*>(widget);
1617 bool hasEditingFocus =
false;
1620 hasEditingFocus = qobject_cast<QLineEdit*>(currentFocus) ||
1621 qobject_cast<QAbstractSpinBox*>(currentFocus);
1624 if (scribbleArea && !scribbleArea->
hasFocus() && !hasEditingFocus) {
1629void MainWindow2::displayMessageBox(
const QString& title,
const QString& body)
1634void MainWindow2::displayMessageBoxNoTitle(
const QString& body)
1639bool MainWindow2::checkForRecoverableProjects()
1642 QStringList recoverables = fm.searchForUnsavedProjects();
1644 foreach (
const QString path, recoverables)
1646 if (tryRecoverProject(path))
1655bool MainWindow2::tryRecoverProject(
const QString recoverPath)
1657 QString caption =
tr(
"Restore Project?");
1658 QString text =
tr(
"Pencil2D didn't close correctly. Would you like to restore the project?");
1661 hideQuestionMark(msgBox);
1670 int result = msgBox.
exec();
1680 return startProjectRecovery(recoverPath);
1688bool MainWindow2::startProjectRecovery(
const QString recoverPath)
1691 Object* o = fm.recoverUnsavedProject(recoverPath);
1692 if (!fm.error().ok())
1694 Q_ASSERT(o ==
nullptr);
1695 const QString title =
tr(
"Recovery Failed.");
1696 const QString text =
tr(
"Sorry! Pencil2D is unable to restore your project");
1702 mEditor->setObject(o);
1704 updateBackupActionState();
1706 const QString title =
tr(
"Recovery Succeeded!");
1707 const QString text =
tr(
"Please save your work immediately to prevent loss of data");
1713void MainWindow2::createToolbars()
1718 mMainToolbar->
addAction(ui->actionOpen);
1719 mMainToolbar->
addAction(ui->actionSave);
1721 mMainToolbar->
addAction(ui->actionUndo);
1722 mMainToolbar->
addAction(ui->actionRedo);
1725 mMainToolbar->
addAction(ui->actionCopy);
1726 mMainToolbar->
addAction(ui->actionPaste);
1727 mMainToolbar->
addAction(ui->actionClearFrame);
1731 mViewToolbar->
addAction(ui->actionZoom_In);
1732 mViewToolbar->
addAction(ui->actionZoom_Out);
1733 mViewToolbar->
addAction(ui->actionReset_View);
1735 mViewToolbar->
addAction(ui->actionHorizontal_Flip);
1736 mViewToolbar->
addAction(ui->actionVertical_Flip);
1738 mViewToolbar->
addAction(ui->actionShowInvisibleLines);
1739 mViewToolbar->
addAction(ui->actionShowOutlinesOnly);
1743 mOverlayToolbar->
addAction(ui->actionGrid);
1744 mOverlayToolbar->
addAction(ui->actionCenter);
1745 mOverlayToolbar->
addAction(ui->actionThirds);
1746 mOverlayToolbar->
addAction(ui->actionGoldenRatio);
1747 mOverlayToolbar->
addAction(ui->actionSafeAreas);
1748 mOverlayToolbar->
addAction(ui->actionOnePointPerspective);
1749 mOverlayToolbar->
addAction(ui->actionTwoPointPerspective);
1750 mOverlayToolbar->
addAction(ui->actionThreePointPerspective);
1756 perspectiveLinesAngleButton->
setDefaultAction(ui->menuPerspectiveLinesAngle->menuAction());
1758 mOverlayToolbar->
addWidget(perspectiveLinesAngleButton);
1760 mToolbars = { mMainToolbar, mViewToolbar, mOverlayToolbar };
1764 ui->menuToolbars->addAction(tb->toggleViewAction());
Status insertKeyFrameAtCurrentPosition()
Will insert a keyframe at the current position and push connected frames to the right.
void framesModified()
This should be emitted after modifying multiple frames.
void frameModified(int frameNumber)
This should be emitted after modifying the frame content.
void scrubbed(int frameNumber)
This should be emitted after scrubbing.
static QString getSaveFileName(QWidget *parent, FileType fileType, const QString &caption=QString())
Shows a file dialog which allows the user to select a file save path.
static QString getOpenFileName(QWidget *parent, FileType fileType, const QString &caption=QString())
Shows a file dialog which allows the user to select a file to open.
void notifyAnimationLengthChanged()
This should be emitted whenever the animation length frames, eg.
void windowActivated()
Emitted when window regains focus.
void onScrubbed(int frameNumber)
Frame scrubbed, invalidate relevant cache.
void onViewChanged()
View updated, invalidate relevant cache.
void onObjectLoaded()
Object updated, invalidate all cache.
void onFramesModified()
Multiple frames modified, invalidate cache for affected frames.
void onPlayStateChanged()
Playstate changed, invalidate relevant cache.
void onLayerChanged()
Layer changed, invalidate relevant cache.
void onFrameModified(int frameNumber)
Frame modified, invalidate cache for frame if any.
The status bar of Pencil2D's main window.
void updateToolStatus(ToolType tool)
Updates the status bar with information about the current tool.
void zoomChanged(double scale)
This signal is sent when the user chooses a new zoom level through the status bar.
void updateZoomStatus()
Updates the zoom level displayed in the status bar.
void extendLength(int frame)
Extends the timeline frame length if necessary.
bool hasUnsavedChanges() const
Checks whether there are unsaved changes.
void setShortcut(const QKeySequence &shortcut)
void toggled(bool checked)
void triggered(bool checked)
void triggered(QAction *action)
void processEvents(QEventLoop::ProcessEventsFlags flags)
QDateTime currentDateTime()
void setTimeSpec(Qt::TimeSpec spec)
QString toString(Qt::DateFormat format) const const
void finished(int result)
QEvent::Type type() const const
int count(const T &value) const const
void addDockWidget(Qt::DockWidgetArea area, QDockWidget *dockwidget)
void addToolBar(Qt::ToolBarArea area, QToolBar *toolbar)
void setDockNestingEnabled(bool enabled)
virtual bool event(QEvent *event) override
bool restoreState(const QByteArray &state, int version)
QByteArray saveState(int version) const const
QStatusBar * statusBar() const const
virtual int exec() override
void setIconPixmap(const QPixmap &pixmap)
void setInformativeText(const QString &text)
void setWindowModality(Qt::WindowModality windowModality)
void setWindowTitle(const QString &title)
void setText(const QString &text)
QMessageBox::StandardButton warning(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton)
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
void setObjectName(const QString &name)
QString tr(const char *sourceText, const char *disambiguation, int n)
QString writableLocation(QStandardPaths::StandardLocation type)
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const const
bool isEmpty() const const
QString & prepend(QChar ch)
void keySequence(QWindow *window, const QKeySequence &keySequence)
char * toString(const T &value)
QByteArray toByteArray() const const