19#include "mainwindow2.h"
20#include "ui_mainwindow2.h"
23#include <QActionGroup>
29#include <QProgressDialog>
30#include <QTabletEvent>
31#include <QStandardPaths>
41#include "pencilsettings.h"
45#include "filemanager.h"
46#include "colormanager.h"
47#include "layermanager.h"
48#include "toolmanager.h"
49#include "playbackmanager.h"
50#include "selectionmanager.h"
51#include "soundmanager.h"
52#include "viewmanager.h"
53#include "selectionmanager.h"
54#include "undoredomanager.h"
56#include "actioncommands.h"
57#include "fileformat.h"
59#include "undoredocommand.h"
63#include "colorinspector.h"
64#include "colorpalettewidget.h"
65#include "tooloptionwidget.h"
66#include "preferencesdialog.h"
69#include "onionskinwidget.h"
70#include "pegbaralignmentdialog.h"
71#include "addtransparencytopaperdialog.h"
72#include "repositionframesdialog.h"
74#include "errordialog.h"
75#include "filedialog.h"
76#include "importimageseqdialog.h"
77#include "importlayersdialog.h"
78#include "importpositiondialog.h"
79#include "layeropacitydialog.h"
80#include "recentfilemenu.h"
81#include "shortcutfilter.h"
83#include "presetdialog.h"
84#include "pegbaralignmentdialog.h"
88#define BUILD_DATE S__GIT_TIMESTAMP
90#define BUILD_DATE __DATE__
93#if defined(PENCIL2D_RELEASE_BUILD)
94#define PENCIL_WINDOW_TITLE QString("[*]Pencil2D v%1").arg(APP_VERSION)
95#elif defined(PENCIL2D_NIGHTLY_BUILD)
96#define PENCIL_WINDOW_TITLE QString("[*]Pencil2D Nightly Build %1").arg(BUILD_DATE)
98#define PENCIL_WINDOW_TITLE QString("[*]Pencil2D Development Build %1").arg(BUILD_DATE)
103MainWindow2::MainWindow2(
QWidget* parent) :
111 mEditor =
new Editor(
this);
112 mEditor->setScribbleArea(ui->scribbleArea);
117 ui->scribbleArea->setEditor(mEditor);
118 ui->scribbleArea->init();
120 ui->statusBar->setEditor(mEditor);
121 ui->statusBar->updateZoomStatus();
122 ui->statusBar->setVisible(mEditor->preference()->isOn(SETTING::SHOW_STATUS_BAR));
125 mCommands->setCore(mEditor);
130 setupKeyboardShortcuts();
135 currentLayerChanged();
137 connect(mEditor, &Editor::needSave,
this, &MainWindow2::autoSave);
139 mEditor->tools()->setDefaultTool();
140 ui->background->init(mEditor->preference());
142 setWindowTitle(PENCIL_WINDOW_TITLE);
145MainWindow2::~MainWindow2()
150void MainWindow2::createDockWidgets()
156 mColorBox->
setToolTip(
tr(
"color palette:<br>use <b>(C)</b><br>toggle at cursor"));
164 mColorPalette->setCore(mEditor);
185 mStartIcon =
QIcon(
":icons/controls/play.png");
186 mStopIcon =
QIcon(
":icons/controls/stop.png");
191 pWidget->setFeatures(QDockWidget::DockWidgetFeature::DockWidgetClosable |
192 QDockWidget::DockWidgetFeature::DockWidgetMovable |
193 QDockWidget::DockWidgetFeature::DockWidgetFloatable);
196 pWidget->setEditor(mEditor);
198 qDebug() <<
"Init Dock widget: " << pWidget->objectName();
218 makeConnections(mEditor, ui->scribbleArea);
219 makeConnections(mEditor);
220 makeConnections(mEditor, mTimeLine);
221 makeConnections(mEditor, mColorBox);
222 makeConnections(mEditor, mColorInspector);
223 makeConnections(mEditor, mColorPalette);
224 makeConnections(mEditor, mToolOptions);
225 makeConnections(mEditor, ui->statusBar);
229 w->setFloating(
false);
235void MainWindow2::createMenus()
268 replaceUndoRedoActions();
274 connect(mEditor->select(), &SelectionManager::selectionChanged,
this, &MainWindow2::selectionChanged);
290 connect(ui->actionChangeLineColorCurrent_keyframe, &
QAction::triggered, mCommands, &ActionCommands::changeKeyframeLineColor);
291 connect(ui->actionChangeLineColorAll_keyframes_on_layer, &
QAction::triggered, mCommands, &ActionCommands::changeallKeyframeLineColor);
294 QList<QAction*> visibilityActions = ui->menuLayer_Visibility->actions();
296 visibilityGroup->setExclusive(
true);
297 for (
int i = 0; i < visibilityActions.
size(); i++) {
298 QAction* action = visibilityActions[i];
299 visibilityGroup->addAction(action);
302 visibilityActions[mEditor->preference()->getInt(SETTING::LAYER_VISIBILITY)]->setChecked(
true);
303 connect(mEditor->preference(), &PreferenceManager::optionChanged, [=](SETTING e) {
304 if (e == SETTING::LAYER_VISIBILITY) {
305 visibilityActions[mEditor->preference()->getInt(SETTING::LAYER_VISIBILITY)]->setChecked(true);
311 connect(ui->actionZoom_Out, &
QAction::triggered, mCommands, &ActionCommands::ZoomOut);
312 connect(ui->actionRotate_Clockwise, &
QAction::triggered, mCommands, &ActionCommands::rotateClockwise);
313 connect(ui->actionRotate_Anticlockwise, &
QAction::triggered, mCommands, &ActionCommands::rotateCounterClockwise);
314 connect(ui->actionReset_Rotation, &
QAction::triggered, mEditor->view(), &ViewManager::resetRotation);
315 connect(ui->actionReset_View, &
QAction::triggered, mEditor->view(), &ViewManager::resetView);
316 connect(ui->actionCenter_View, &
QAction::triggered, mEditor->view(), &ViewManager::centerView);
317 connect(ui->actionZoom400, &
QAction::triggered, mEditor->view(), &ViewManager::scale400);
318 connect(ui->actionZoom300, &
QAction::triggered, mEditor->view(), &ViewManager::scale300);
319 connect(ui->actionZoom200, &
QAction::triggered, mEditor->view(), &ViewManager::scale200);
320 connect(ui->actionZoom100, &
QAction::triggered, mEditor->view(), &ViewManager::scale100);
321 connect(ui->actionZoom50, &
QAction::triggered, mEditor->view(), &ViewManager::scale50);
322 connect(ui->actionZoom33, &
QAction::triggered, mEditor->view(), &ViewManager::scale33);
323 connect(ui->actionZoom25, &
QAction::triggered, mEditor->view(), &ViewManager::scale25);
324 connect(ui->actionHorizontal_Flip, &
QAction::triggered, mEditor->view(), &ViewManager::flipHorizontal);
325 connect(ui->actionVertical_Flip, &
QAction::triggered, mEditor->view(), &ViewManager::flipVertical);
326 connect(mEditor->view(), &ViewManager::viewFlipped,
this, &MainWindow2::viewFlipped);
330 bindPreferenceSetting(ui->actionStatusBar, prefs, SETTING::SHOW_STATUS_BAR);
331 bindPreferenceSetting(ui->actionThreePointPerspective, prefs, SETTING::OVERLAY_PERSPECTIVE3);
332 bindPreferenceSetting(ui->actionTwoPointPerspective, prefs, SETTING::OVERLAY_PERSPECTIVE2);
333 bindPreferenceSetting(ui->actionOnePointPerspective, prefs, SETTING::OVERLAY_PERSPECTIVE1);
334 bindPreferenceSetting(ui->actionSafeAreas, prefs, SETTING::OVERLAY_SAFE);
335 bindPreferenceSetting(ui->actionGoldenRatio, prefs, SETTING::OVERLAY_GOLDEN);
336 bindPreferenceSetting(ui->actionThirds, prefs, SETTING::OVERLAY_THIRDS);
337 bindPreferenceSetting(ui->actionCenter, prefs, SETTING::OVERLAY_CENTER);
338 bindPreferenceSetting(ui->actionGrid, prefs, SETTING::GRID);
339 bindPreferenceSetting(ui->actionShowOutlinesOnly, prefs, SETTING::OUTLINES);
340 bindPreferenceSetting(ui->actionShowInvisibleLines, prefs, SETTING::INVISIBLE_LINES);
341 bindPreferenceSetting(ui->actionOnionPrev, prefs, SETTING::PREV_ONION);
342 bindPreferenceSetting(ui->actionOnionNext, prefs, SETTING::NEXT_ONION);
344 bool enableSafeArea = (prefs->isOn(SETTING::ACTION_SAFE_ON) || prefs->isOn(SETTING::TITLE_SAFE_ON));
345 ui->actionSafeAreas->setEnabled(enableSafeArea);
347 auto perspectiveLinesAngleGroup =
new QActionGroup(
this);
348 perspectiveLinesAngleGroup->setExclusive(
true);
349 perspectiveLinesAngleGroup->addAction(ui->action2Degrees);
350 perspectiveLinesAngleGroup->addAction(ui->action3Degrees);
351 perspectiveLinesAngleGroup->addAction(ui->action5Degrees);
352 perspectiveLinesAngleGroup->addAction(ui->action7_5Degrees);
353 perspectiveLinesAngleGroup->addAction(ui->action10Degrees);
354 perspectiveLinesAngleGroup->addAction(ui->action15Degrees);
355 perspectiveLinesAngleGroup->addAction(ui->action20Degrees);
356 perspectiveLinesAngleGroup->addAction(ui->action30Degrees);
358 if (action == ui->action2Degrees) mEditor->preference()->set(SETTING::OVERLAY_ANGLE, 2);
359 else if (action == ui->action3Degrees) mEditor->preference()->set(SETTING::OVERLAY_ANGLE, 3);
360 else if (action == ui->action5Degrees) mEditor->preference()->set(SETTING::OVERLAY_ANGLE, 5);
361 else if (action == ui->action7_5Degrees) mEditor->preference()->set(SETTING::OVERLAY_ANGLE, 7);
362 else if (action == ui->action10Degrees) mEditor->preference()->set(SETTING::OVERLAY_ANGLE, 10);
363 else if (action == ui->action15Degrees) mEditor->preference()->set(SETTING::OVERLAY_ANGLE, 15);
364 else if (action == ui->action20Degrees) mEditor->preference()->set(SETTING::OVERLAY_ANGLE, 20);
365 else if (action == ui->action30Degrees) mEditor->preference()->set(SETTING::OVERLAY_ANGLE, 30);
366 else Q_UNREACHABLE();
367 emit mEditor->view()->viewChanged();
370 switch (prefs->getInt(SETTING::OVERLAY_ANGLE)) {
371 case 2: ui->action2Degrees->setChecked(
true);
break;
372 case 3: ui->action3Degrees->setChecked(
true);
break;
373 case 5: ui->action5Degrees->setChecked(
true);
break;
374 case 7: ui->action7_5Degrees->setChecked(
true);
break;
375 case 10: ui->action10Degrees->setChecked(
true);
break;
376 case 15: ui->action15Degrees->setChecked(
true);
break;
377 case 20: ui->action20Degrees->setChecked(
true);
break;
378 case 30: ui->action30Degrees->setChecked(
true);
break;
385 connect(ui->actionLoop, &
QAction::triggered, pPlaybackManager, &PlaybackManager::setLooping);
386 connect(ui->actionLoopControl, &
QAction::triggered, pPlaybackManager, &PlaybackManager::enableRangedPlayback);
387 connect(pPlaybackManager, &PlaybackManager::loopStateChanged, ui->actionLoop, &
QAction::setChecked);
388 connect(pPlaybackManager, &PlaybackManager::loopStateChanged, mTimeLine, &TimeLine::setLoop);
389 connect(pPlaybackManager, &PlaybackManager::rangedPlaybackStateChanged, ui->actionLoopControl, &
QAction::setChecked);
390 connect(pPlaybackManager, &PlaybackManager::rangedPlaybackStateChanged, mTimeLine, &TimeLine::setRangeState);
391 connect(pPlaybackManager, &PlaybackManager::playStateChanged, mTimeLine, &TimeLine::setPlaying);
392 connect(pPlaybackManager, &PlaybackManager::playStateChanged,
this, &MainWindow2::changePlayState);
394 connect(ui->actionFlip_inbetween, &
QAction::triggered, pPlaybackManager, &PlaybackManager::playFlipInBetween);
395 connect(ui->actionFlip_rolling, &
QAction::triggered, pPlaybackManager, &PlaybackManager::playFlipRoll);
398 connect(ui->actionRemove_Frame, &
QAction::triggered, mCommands, &ActionCommands::removeKey);
399 connect(ui->actionAdd_Frame_Exposure, &
QAction::triggered, mCommands, &ActionCommands::addExposureToSelectedFrames);
400 connect(ui->actionSubtract_Frame_Exposure, &
QAction::triggered, mCommands, &ActionCommands::subtractExposureFromSelectedFrames);
401 connect(ui->actionNext_Frame, &
QAction::triggered, mCommands, &ActionCommands::GotoNextFrame);
402 connect(ui->actionPrevious_Frame, &
QAction::triggered, mCommands, &ActionCommands::GotoPrevFrame);
403 connect(ui->actionNext_KeyFrame, &
QAction::triggered, mCommands, &ActionCommands::GotoNextKeyFrame);
404 connect(ui->actionPrev_KeyFrame, &
QAction::triggered, mCommands, &ActionCommands::GotoPrevKeyFrame);
405 connect(ui->actionDuplicate_Frame, &
QAction::triggered, mCommands, &ActionCommands::duplicateKey);
406 connect(ui->actionMove_Frame_Forward, &
QAction::triggered, mCommands, &ActionCommands::moveFrameForward);
407 connect(ui->actionMove_Frame_Backward, &
QAction::triggered, mCommands, &ActionCommands::moveFrameBackward);
409 connect(ui->actionReverse_Frames_Order, &
QAction::triggered, mCommands, &ActionCommands::reverseSelectedFrames);
410 connect(ui->actionRemove_Frames, &
QAction::triggered, mCommands, &ActionCommands::removeSelectedFrames);
416 connect(ui->actionPolyline, &
QAction::triggered, mToolBox, &ToolBoxWidget::polylineOn);
422 connect(ui->actionEyedropper, &
QAction::triggered, mToolBox, &ToolBoxWidget::eyedropperOn);
424 connect(ui->actionResetToolsDefault, &
QAction::triggered, mEditor->tools(), &ToolManager::resetAllTools);
427 QMenu* winMenu = ui->menuWindows;
428 const std::vector<QAction*> actions
430 mToolBox->toggleViewAction(),
431 mToolOptions->toggleViewAction(),
432 mColorBox->toggleViewAction(),
433 mColorPalette->toggleViewAction(),
434 mTimeLine->toggleViewAction(),
435 mColorInspector->toggleViewAction(),
436 mOnionSkinWidget->toggleViewAction()
439 for (
QAction* action : actions)
442 winMenu->
insertAction(ui->menuToolbars->menuAction(), action);
445 connect(ui->actionResetWindows, &
QAction::triggered,
this, &MainWindow2::resetAndDockAllSubWidgets);
446 connect(ui->actionLockWindows, &
QAction::toggled,
this, &MainWindow2::lockWidgets);
447 bindPreferenceSetting(ui->actionLockWindows, prefs, SETTING::LAYOUT_LOCK);
451 connect(ui->actionQuick_Guide, &
QAction::triggered, mCommands, &ActionCommands::quickGuide);
455 connect(ui->actionCheck_for_Updates, &
QAction::triggered, mCommands, &ActionCommands::checkForUpdates);
456 connect(ui->actionReport_Bug, &
QAction::triggered, mCommands, &ActionCommands::reportbug);
457 connect(ui->actionOpen_Temporary_Directory, &
QAction::triggered, mCommands, &ActionCommands::openTemporaryDirectory);
462 mRecentFileMenu->loadFromDisk();
463 ui->menuFile->insertMenu(ui->actionSave, mRecentFileMenu);
465 connect(mRecentFileMenu, &RecentFileMenu::loadRecentFile,
this, &MainWindow2::openFile);
468void MainWindow2::replaceUndoRedoActions()
470 ui->menuEdit->removeAction(ui->actionUndo);
471 ui->menuEdit->removeAction(ui->actionRedo);
472 ui->actionUndo = mEditor->undoRedo()->createUndoAction(
this, ui->actionUndo->icon());
473 ui->actionRedo = mEditor->undoRedo()->createRedoAction(
this, ui->actionRedo->icon());
474 ui->menuEdit->insertAction(ui->actionCut, ui->actionUndo);
475 ui->menuEdit->insertAction(ui->actionCut, ui->actionRedo);
478void MainWindow2::setOpacity(
int opacity)
480 mEditor->preference()->set(SETTING::WINDOW_OPACITY, 100 - opacity);
484void MainWindow2::updateSaveState()
488 ui->statusBar->updateModifiedStatus(hasUnsavedChanges);
491void MainWindow2::updateBackupActionState()
493 mEditor->undoRedo()->updateUndoAction(ui->actionUndo);
494 mEditor->undoRedo()->updateRedoAction(ui->actionRedo);
497void MainWindow2::openPegAlignDialog()
499 if (mPegAlign !=
nullptr)
502 tr(
"Dialog is already open!"),
512 flags &= (
~Qt::WindowContextHelpButtonHint);
521void MainWindow2::openLayerOpacityDialog()
523 if (mLayerOpacityDialog !=
nullptr)
526 tr(
"Dialog is already open!"),
532 mLayerOpacityDialog->setCore(mEditor);
533 mLayerOpacityDialog->initUI();
535 mLayerOpacityDialog->
show();
539 mLayerOpacityDialog =
nullptr;
543void MainWindow2::openAddTranspToPaperDialog()
545 if (mAddTranspToPaper)
548 mAddTranspToPaper->
raise();
553 mAddTranspToPaper->setCore(mEditor);
554 mAddTranspToPaper->initUI();
556 mAddTranspToPaper->
show();
562 mSuppressAutoSaveDialog =
true;
563 mAddTranspToPaper->traceScannedDrawings();
564 mSuppressAutoSaveDialog =
false;
567 mAddTranspToPaper =
nullptr;
571void MainWindow2::openRepositionDialog()
573 if (mEditor->layers()->currentLayer()->getSelectedFramesByPos().
count() < 2)
576 tr(
"Please select at least 2 frames!"),
580 if (mReposDialog !=
nullptr)
588 hideQuestionMark(*mReposDialog);
589 mReposDialog->setCore(mEditor);
590 mReposDialog->initUI();
591 mEditor->tools()->setCurrentTool(ToolType::MOVE);
593 mReposDialog->
show();
596void MainWindow2::closeRepositionDialog()
599 mReposDialog =
nullptr;
602void MainWindow2::currentLayerChanged()
604 bool isBitmap = (mEditor->layers()->currentLayer()->type() == Layer::BITMAP);
605 ui->menuChange_line_color->setEnabled(isBitmap);
607 bool isVector = (mEditor->layers()->currentLayer()->type() == Layer::VECTOR);
608 ui->actionShowInvisibleLines->setEnabled(isVector);
609 ui->actionShowOutlinesOnly->setEnabled(isVector);
612void MainWindow2::selectionChanged()
614 bool somethingSelected = mEditor->select()->somethingSelected();
615 ui->menuSelection->setEnabled(somethingSelected);
618void MainWindow2::viewFlipped()
620 ui->actionHorizontal_Flip->setChecked(mEditor->view()->isFlipHorizontal());
621 ui->actionVertical_Flip->setChecked(mEditor->view()->isFlipVertical());
640 m2ndCloseEvent =
true;
648void MainWindow2::newDocument()
650 if (maybeSave() && !tryLoadPreset())
656void MainWindow2::openDocument()
665 openObject(fileName);
669bool MainWindow2::saveAsNewDocument()
676 return saveObject(fileName);
679void MainWindow2::openStartupFile(
const QString& filename)
681 if (tryRecoverUnsavedProject())
686 if (!filename.
isEmpty() && openObject(filename))
691 loadMostRecent() || tryLoadPreset();
694void MainWindow2::openFile(
const QString& filename)
698 openObject(filename);
702bool MainWindow2::openObject(
const QString& strFilePath)
705 hideQuestionMark(progress);
709 Status s = mEditor->openObject(strFilePath, [&progress](
int p)
711 progress.setValue(p);
713 }, [&progress](
int max)
715 progress.setRange(0, max);
720 ErrorDialog errorDialog(s.title(), s.description(), s.details().str());
722 emptyDocumentWhenErrorOccurred();
727 settings.setValue(LAST_PCLX_PATH, mEditor->object()->filePath());
730 if (!mEditor->object()->filePath().
isEmpty())
732 mRecentFileMenu->addRecentFile(mEditor->object()->filePath());
733 mRecentFileMenu->saveToDisk();
740 ui->statusBar->updateModifiedStatus(
false);
742 progress.setValue(progress.maximum());
745 updateBackupActionState();
747 if (!
QFileInfo(strFilePath).isWritable())
750 tr(
"This program does not currently have permission to write to the file you have selected. "
751 "Please make sure you have write permission for this file before attempting to save it. "
752 "Alternatively, you can use the Save As... menu option to save to a writable location."),
759bool MainWindow2::saveObject(
QString strSavedFileName)
762 hideQuestionMark(progress);
766 mEditor->prepareSave();
770 connect(&fm, &FileManager::progressChanged, [&progress](
int p)
772 progress.setValue(p);
775 connect(&fm, &FileManager::progressRangeChanged, [&progress](
int max)
777 progress.setRange(0, max + 3);
780 Status st = fm.save(mEditor->object(), strSavedFileName);
785#if QT_VERSION >= QT_VERSION_CHECK(5, 4, 0)
790 errorLogFolder.mkpath(
"./logs");
791 errorLogFolder.cd(
"logs");
799 out << st.details().str();
804 st.description().append(
tr(
"<br><br>An error has occurred and your file may not have saved successfully."
805 "\nIf you believe that this error is an issue with Pencil2D, please create a new issue at:"
806 "<br><a href='https://github.com/pencil2d/pencil/issues'>https://github.com/pencil2d/pencil/issues</a><br>"
807 "Please be sure to include the following details in your issue:")), st.details().html());
812 mEditor->object()->setFilePath(strSavedFileName);
813 mEditor->object()->setModified(
false);
815 mEditor->clearTemporary();
818 settings.setValue(LAST_PCLX_PATH, strSavedFileName);
820 mRecentFileMenu->addRecentFile(strSavedFileName);
821 mRecentFileMenu->saveToDisk();
823 mTimeLine->updateContent();
828 progress.setValue(progress.maximum());
830 mEditor->resetAutoSaveCounter();
835bool MainWindow2::saveDocument()
837 if (!mEditor->object()->filePath().
isEmpty())
838 return saveObject(mEditor->object()->filePath());
840 return saveAsNewDocument();
843bool MainWindow2::maybeSave()
851 tr(
"This animation has been modified.\n Do you want to save your changes?"),
854 return saveDocument();
859bool MainWindow2::autoSave()
861 if (!mEditor->object()->filePath().
isEmpty())
863 return saveDocument();
866 if (mEditor->autoSaveNeverAskAgain())
869 if(mSuppressAutoSaveDialog)
874 msgBox.setWindowTitle(
tr(
"AutoSave Reminder"));
875 msgBox.setText(
tr(
"The animation is not saved yet.\n Do you want to save now?"));
880 int ret = msgBox.exec();
883 return saveDocument();
887 mEditor->dontAskAutoSave(
true);
893void MainWindow2::emptyDocumentWhenErrorOccurred()
901void MainWindow2::importImage()
905 if (strFilePath.
isEmpty()) {
return; }
909 OnScopeExit(
delete positionDialog)
911 positionDialog->
exec();
919 Status st = mEditor->importImage(strFilePath, importImageConfig);
922 ErrorDialog errorDialog(st.title(), st.description(), st.details().html());
927 ui->scribbleArea->updateFrame();
928 mTimeLine->updateContent();
931void MainWindow2::importImageSequence()
933 mSuppressAutoSaveDialog =
true;
936 OnScopeExit(
delete imageSeqDialog)
937 imageSeqDialog->setCore(mEditor);
941 imageSeqDialog->
exec();
948 OnScopeExit(
delete positionDialog)
950 positionDialog->
exec();
956 imageSeqDialog->importArbitrarySequence(positionDialog->importConfig());
958 mSuppressAutoSaveDialog =
false;
961void MainWindow2::importPredefinedImageSet()
964 OnScopeExit(
delete imageSeqDialog)
965 imageSeqDialog->setCore(mEditor);
969 mSuppressAutoSaveDialog =
true;
970 imageSeqDialog->
exec();
977 OnScopeExit(
delete positionDialog)
979 positionDialog->
exec();
985 imageSeqDialog->importPredefinedSet(positionDialog->importConfig());
986 mSuppressAutoSaveDialog =
false;
989void MainWindow2::importLayers()
992 importLayers->setCore(mEditor);
994 importLayers->
open();
997void MainWindow2::importAnimatedImage()
1000 mSuppressAutoSaveDialog =
true;
1002 mCommands->importAnimatedImage();
1004 mSuppressAutoSaveDialog =
false;
1007void MainWindow2::lockWidgets(
bool shouldLock)
1011 : (QDockWidget::DockWidgetFeature::DockWidgetClosable |
1012 QDockWidget::DockWidgetFeature::DockWidgetMovable |
1013 QDockWidget::DockWidgetFeature::DockWidgetFloatable);
1017 d->setFeatures(feat);
1022 QWidget* customTitleBarWidget = shouldLock ? (
new QWidget) :
nullptr;
1023 d->setTitleBarWidget(customTitleBarWidget);
1027void MainWindow2::preferences()
1032 mPrefDialog->
raise();
1038 mPrefDialog->init(mEditor->preference());
1040 connect(mPrefDialog, &PreferencesDialog::windowOpacityChange,
this, &MainWindow2::setOpacity);
1041 connect(mPrefDialog, &PreferencesDialog::soundScrubChanged, mEditor->playback(), &PlaybackManager::setSoundScrubActive);
1042 connect(mPrefDialog, &PreferencesDialog::soundScrubMsecChanged, mEditor->playback(), &PlaybackManager::setSoundScrubMsec);
1045 clearKeyboardShortcuts();
1046 setupKeyboardShortcuts();
1047 mPrefDialog =
nullptr;
1050 mPrefDialog->
show();
1053void MainWindow2::resetAndDockAllSubWidgets()
1056 settings.remove(SETTING_WINDOW_GEOMETRY);
1057 settings.remove(SETTING_WINDOW_STATE);
1061 dock->setFloating(
false);
1075void MainWindow2::newObject()
1077 auto object =
new Object();
1081 object->addNewCameraLayer();
1082 object->addNewBitmapLayer();
1086 object->data()->setCurrentLayer(1);
1088 mEditor->setObject(
object);
1094 updateBackupActionState();
1097bool MainWindow2::newObjectFromPresets(
int presetIndex)
1099 QString presetFilePath = PresetDialog::getPresetPath(presetIndex);
1107 Object*
object = fm.load(presetFilePath);
1109 if (!fm.error().ok() ||
object ==
nullptr)
1114 mEditor->setObject(
object);
1115 object->setFilePath(
QString());
1119 updateBackupActionState();
1124bool MainWindow2::loadMostRecent()
1126 if(!mEditor->preference()->isOn(SETTING::LOAD_MOST_RECENT))
1132 QString myPath = settings.value(LAST_PCLX_PATH,
QVariant(
"")).toString();
1137 return openObject(myPath);
1140bool MainWindow2::tryLoadPreset()
1142 if (!mEditor->preference()->isOn(SETTING::ASK_FOR_PRESET))
1144 int defaultPreset = mEditor->preference()->getInt(SETTING::DEFAULT_PRESET);
1145 return newObjectFromPresets(defaultPreset);
1157 int presetIndex = presetDialog->getPresetIndex();
1158 if (presetDialog->shouldAlwaysUse())
1160 mEditor->preference()->set(SETTING::ASK_FOR_PRESET, false);
1161 mEditor->preference()->set(SETTING::DEFAULT_PRESET, presetIndex);
1163 if (!newObjectFromPresets(presetIndex))
1168 presetDialog->
open();
1172void MainWindow2::closeDialogs()
1179void MainWindow2::readSettings()
1183 QVariant winGeometry = settings.
value(SETTING_WINDOW_GEOMETRY);
1189 int opacity = mEditor->preference()->getInt(SETTING::WINDOW_OPACITY);
1190 setOpacity(100 - opacity);
1192 bool isWindowsLocked = mEditor->preference()->isOn(SETTING::LAYOUT_LOCK);
1193 lockWidgets(isWindowsLocked);
1196void MainWindow2::writeSettings()
1199 settings.setValue(SETTING_WINDOW_GEOMETRY,
saveGeometry());
1200 settings.setValue(SETTING_WINDOW_STATE,
saveState());
1203void MainWindow2::setupKeyboardShortcuts()
1205 checkExistingShortcuts();
1209 strCommandName =
QString(
"shortcuts/") + strCommandName;
1215 ui->actionNew->setShortcut(cmdKeySeq(CMD_NEW_FILE));
1216 ui->actionOpen->setShortcut(cmdKeySeq(CMD_OPEN_FILE));
1217 ui->actionSave->setShortcut(cmdKeySeq(CMD_SAVE_FILE));
1218 ui->actionSave_as->setShortcut(cmdKeySeq(CMD_SAVE_AS));
1220 ui->actionImport_Image->setShortcut(cmdKeySeq(CMD_IMPORT_IMAGE));
1221 ui->actionImport_ImageSeq->setShortcut(cmdKeySeq(CMD_IMPORT_IMAGE_SEQ));
1222 ui->actionImport_ImageSeqNum->setShortcut(cmdKeySeq(CMD_IMPORT_IMAGE_PREDEFINED_SET));
1223 ui->actionImport_MovieVideo->setShortcut(cmdKeySeq(CMD_IMPORT_MOVIE_VIDEO));
1224 ui->actionImport_AnimatedImage->setShortcut(cmdKeySeq(CMD_IMPORT_ANIMATED_IMAGE));
1225 ui->actionImportLayers_from_pclx->setShortcut(cmdKeySeq(CMD_IMPORT_LAYERS));
1226 ui->actionImport_Sound->setShortcut(cmdKeySeq(CMD_IMPORT_SOUND));
1227 ui->actionImport_MovieAudio->setShortcut(cmdKeySeq(CMD_IMPORT_MOVIE_AUDIO));
1228 ui->actionImport_Append_Palette->setShortcut(cmdKeySeq(CMD_IMPORT_PALETTE));
1229 ui->actionImport_Replace_Palette->setShortcut(cmdKeySeq(CMD_IMPORT_PALETTE_REPLACE));
1231 ui->actionExport_Image->setShortcut(cmdKeySeq(CMD_EXPORT_IMAGE));
1232 ui->actionExport_ImageSeq->setShortcut(cmdKeySeq(CMD_EXPORT_IMAGE_SEQ));
1233 ui->actionExport_Movie->setShortcut(cmdKeySeq(CMD_EXPORT_MOVIE));
1234 ui->actionExport_Animated_GIF->setShortcut(cmdKeySeq(CMD_EXPORT_GIF));
1235 ui->actionExport_Palette->setShortcut(cmdKeySeq(CMD_EXPORT_PALETTE));
1238 ui->actionUndo->setShortcut(cmdKeySeq(CMD_UNDO));
1239 ui->actionRedo->setShortcut(cmdKeySeq(CMD_REDO));
1240 ui->actionCut->setShortcut(cmdKeySeq(CMD_CUT));
1241 ui->actionCopy->setShortcut(cmdKeySeq(CMD_COPY));
1242 ui->actionPaste_Previous->setShortcut(cmdKeySeq(CMD_PASTE_FROM_PREVIOUS));
1243 ui->actionPaste->setShortcut(cmdKeySeq(CMD_PASTE));
1244 ui->actionClearFrame->setShortcut(cmdKeySeq(CMD_CLEAR_FRAME));
1245 ui->actionFlip_X->setShortcut(cmdKeySeq(CMD_SELECTION_FLIP_HORIZONTAL));
1246 ui->actionFlip_Y->setShortcut(cmdKeySeq(CMD_SELECTION_FLIP_VERTICAL));
1247 ui->actionSelect_All->setShortcut(cmdKeySeq(CMD_SELECT_ALL));
1248 ui->actionDeselect_All->setShortcut(cmdKeySeq(CMD_DESELECT_ALL));
1249 ui->actionPegbarAlignment->setShortcut(cmdKeySeq(CMD_PEGBAR_ALIGNMENT));
1250 ui->actionPreference->setShortcut(cmdKeySeq(CMD_PREFERENCE));
1253 ui->actionResetWindows->setShortcut(cmdKeySeq(CMD_RESET_WINDOWS));
1254 ui->actionLockWindows->setShortcut(cmdKeySeq(CMD_LOCK_WINDOWS));
1255 ui->actionReset_View->setShortcut(cmdKeySeq(CMD_RESET_ZOOM_ROTATE));
1256 ui->actionCenter_View->setShortcut(cmdKeySeq(CMD_CENTER_VIEW));
1257 ui->actionZoom_In->setShortcut(cmdKeySeq(CMD_ZOOM_IN));
1258 ui->actionZoom_Out->setShortcut(cmdKeySeq(CMD_ZOOM_OUT));
1259 ui->actionZoom400->setShortcut(cmdKeySeq(CMD_ZOOM_400));
1260 ui->actionZoom300->setShortcut(cmdKeySeq(CMD_ZOOM_300));
1261 ui->actionZoom200->setShortcut(cmdKeySeq(CMD_ZOOM_200));
1262 ui->actionZoom100->setShortcut(cmdKeySeq(CMD_ZOOM_100));
1263 ui->actionZoom50->setShortcut(cmdKeySeq(CMD_ZOOM_50));
1264 ui->actionZoom33->setShortcut(cmdKeySeq(CMD_ZOOM_33));
1265 ui->actionZoom25->setShortcut(cmdKeySeq(CMD_ZOOM_25));
1266 ui->actionRotate_Clockwise->setShortcut(cmdKeySeq(CMD_ROTATE_CLOCK));
1267 ui->actionRotate_Anticlockwise->setShortcut(cmdKeySeq(CMD_ROTATE_ANTI_CLOCK));
1268 ui->actionReset_Rotation->setShortcut(cmdKeySeq(CMD_RESET_ROTATION));
1269 ui->actionHorizontal_Flip->setShortcut(cmdKeySeq(CMD_FLIP_HORIZONTAL));
1270 ui->actionVertical_Flip->setShortcut(cmdKeySeq(CMD_FLIP_VERTICAL));
1271 ui->actionGrid->setShortcut(cmdKeySeq(CMD_GRID));
1272 ui->actionCenter->setShortcut(cmdKeySeq(CMD_OVERLAY_CENTER));
1273 ui->actionThirds->setShortcut(cmdKeySeq(CMD_OVERLAY_THIRDS));
1274 ui->actionGoldenRatio->setShortcut(cmdKeySeq(CMD_OVERLAY_GOLDEN_RATIO));
1275 ui->actionSafeAreas->setShortcut(cmdKeySeq(CMD_OVERLAY_SAFE_AREAS));
1276 ui->actionOnePointPerspective->setShortcut(cmdKeySeq(CMD_OVERLAY_ONE_POINT_PERSPECTIVE));
1277 ui->actionTwoPointPerspective->setShortcut(cmdKeySeq(CMD_OVERLAY_TWO_POINT_PERSPECTIVE));
1278 ui->actionThreePointPerspective->setShortcut(cmdKeySeq(CMD_OVERLAY_THREE_POINT_PERSPECTIVE));
1279 ui->actionOnionPrev->setShortcut(cmdKeySeq(CMD_ONIONSKIN_PREV));
1280 ui->actionOnionNext->setShortcut(cmdKeySeq(CMD_ONIONSKIN_NEXT));
1281 ui->actionStatusBar->setShortcut(cmdKeySeq(CMD_TOGGLE_STATUS_BAR));
1284 ui->actionPlay->setShortcut(cmdKeySeq(CMD_PLAY));
1285 ui->actionLoop->setShortcut(cmdKeySeq(CMD_LOOP));
1286 ui->actionLoopControl->setShortcut(cmdKeySeq(CMD_LOOP_CONTROL));
1287 ui->actionPrevious_Frame->setShortcut(cmdKeySeq(CMD_GOTO_PREV_FRAME));
1288 ui->actionNext_Frame->setShortcut(cmdKeySeq(CMD_GOTO_NEXT_FRAME));
1289 ui->actionPrev_KeyFrame->setShortcut(cmdKeySeq(CMD_GOTO_PREV_KEY_FRAME));
1290 ui->actionNext_KeyFrame->setShortcut(cmdKeySeq(CMD_GOTO_NEXT_KEY_FRAME));
1291 ui->actionAdd_Frame->setShortcut(cmdKeySeq(CMD_ADD_FRAME));
1292 ui->actionDuplicate_Frame->setShortcut(cmdKeySeq(CMD_DUPLICATE_FRAME));
1293 ui->actionRemove_Frame->setShortcut(cmdKeySeq(CMD_REMOVE_FRAME));
1294 ui->actionAdd_Frame_Exposure->setShortcut(cmdKeySeq(CMD_SELECTION_ADD_FRAME_EXPOSURE));
1295 ui->actionSubtract_Frame_Exposure->setShortcut(cmdKeySeq(CMD_SELECTION_SUBTRACT_FRAME_EXPOSURE));
1296 ui->actionReverse_Frames_Order->setShortcut(cmdKeySeq(CMD_REVERSE_SELECTED_FRAMES));
1297 ui->actionRemove_Frames->setShortcut(cmdKeySeq(CMD_REMOVE_SELECTED_FRAMES));
1298 ui->actionMove_Frame_Backward->setShortcut(cmdKeySeq(CMD_MOVE_FRAME_BACKWARD));
1299 ui->actionMove_Frame_Forward->setShortcut(cmdKeySeq(CMD_MOVE_FRAME_FORWARD));
1300 ui->actionFlip_inbetween->setShortcut(cmdKeySeq(CMD_FLIP_INBETWEEN));
1301 ui->actionFlip_rolling->setShortcut(cmdKeySeq(CMD_FLIP_ROLLING));
1302 ui->actionReposition_Selected_Frames->setShortcut(cmdKeySeq(CMD_SELECTION_REPOSITION_FRAMES));
1305 ui->actionMove->setShortcut(cmdKeySeq(CMD_TOOL_MOVE));
1306 ui->actionSelect->setShortcut(cmdKeySeq(CMD_TOOL_SELECT));
1307 ui->actionBrush->setShortcut(cmdKeySeq(CMD_TOOL_BRUSH));
1308 ui->actionPolyline->setShortcut(cmdKeySeq(CMD_TOOL_POLYLINE));
1309 ui->actionSmudge->setShortcut(cmdKeySeq(CMD_TOOL_SMUDGE));
1310 ui->actionPen->setShortcut(cmdKeySeq(CMD_TOOL_PEN));
1311 ui->actionHand->setShortcut(cmdKeySeq(CMD_TOOL_HAND));
1312 ui->actionPencil->setShortcut(cmdKeySeq(CMD_TOOL_PENCIL));
1313 ui->actionBucket->setShortcut(cmdKeySeq(CMD_TOOL_BUCKET));
1314 ui->actionEyedropper->setShortcut(cmdKeySeq(CMD_TOOL_EYEDROPPER));
1315 ui->actionEraser->setShortcut(cmdKeySeq(CMD_TOOL_ERASER));
1316 ui->actionResetToolsDefault->setShortcut(cmdKeySeq(CMD_RESET_ALL_TOOLS));
1318 ui->actionMove->installEventFilter(shortcutFilter);
1319 ui->actionMove->installEventFilter(shortcutFilter);
1320 ui->actionSelect->installEventFilter(shortcutFilter);
1321 ui->actionBrush->installEventFilter(shortcutFilter);
1322 ui->actionPolyline->installEventFilter(shortcutFilter);
1323 ui->actionSmudge->installEventFilter(shortcutFilter);
1324 ui->actionPen->installEventFilter(shortcutFilter);
1325 ui->actionHand->installEventFilter(shortcutFilter);
1326 ui->actionPencil->installEventFilter(shortcutFilter);
1327 ui->actionBucket->installEventFilter(shortcutFilter);
1328 ui->actionEyedropper->installEventFilter(shortcutFilter);
1329 ui->actionEraser->installEventFilter(shortcutFilter);
1332 ui->actionNew_Bitmap_Layer->setShortcut(cmdKeySeq(CMD_NEW_BITMAP_LAYER));
1333 ui->actionNew_Vector_Layer->setShortcut(cmdKeySeq(CMD_NEW_VECTOR_LAYER));
1334 ui->actionNew_Camera_Layer->setShortcut(cmdKeySeq(CMD_NEW_CAMERA_LAYER));
1335 ui->actionNew_Sound_Layer->setShortcut(cmdKeySeq(CMD_NEW_SOUND_LAYER));
1336 ui->actionDelete_Current_Layer->setShortcut(cmdKeySeq(CMD_DELETE_CUR_LAYER));
1337 ui->actionChangeLineColorCurrent_keyframe->setShortcut(cmdKeySeq(CMD_CHANGE_LINE_COLOR_KEYFRAME));
1338 ui->actionChangeLineColorAll_keyframes_on_layer->setShortcut(cmdKeySeq(CMD_CHANGE_LINE_COLOR_LAYER));
1339 ui->actionChangeLayerOpacity->setShortcut(cmdKeySeq(CMD_CHANGE_LAYER_OPACITY));
1341 ui->actionVisibilityCurrentLayerOnly->setShortcut(cmdKeySeq(CMD_CURRENT_LAYER_VISIBILITY));
1342 ui->actionVisibilityRelative->setShortcut(cmdKeySeq(CMD_RELATIVE_LAYER_VISIBILITY));
1343 ui->actionVisibilityAll->setShortcut(cmdKeySeq(CMD_ALL_LAYER_VISIBILITY));
1345 mToolBox->toggleViewAction()->setShortcut(cmdKeySeq(CMD_TOGGLE_TOOLBOX));
1353 ui->actionHelp->setShortcut(cmdKeySeq(CMD_HELP));
1354 ui->actionExit->setShortcut(cmdKeySeq(CMD_EXIT));
1357void MainWindow2::clearKeyboardShortcuts()
1360 for (
QAction* action : actionList)
1366void MainWindow2::exportPalette()
1371 mEditor->object()->exportPalette(filePath);
1375void MainWindow2::importPalette()
1380 mEditor->object()->importPalette(filePath);
1381 mColorPalette->refreshColorList();
1382 mColorPalette->adjustSwatches();
1383 mEditor->color()->setColorNumber(0);
1387void MainWindow2::openPalette()
1389 for (
int i = 0; i < mEditor->object()->getColorCount(); i++)
1391 if (!mEditor->object()->isColorInUse(i))
1397 msgBox.
setText(
tr(
"Opening a palette will replace the old palette.\n"
1398 "Color(s) in strokes will be altered by this action!"));
1414 mEditor->object()->openPalette(filePath);
1415 mColorPalette->refreshColorList();
1416 mEditor->color()->setColorNumber(0);
1419void MainWindow2::makeConnections(
Editor* editor)
1421 connect(editor->undoRedo(), &UndoRedoManager::didUpdateUndoStack,
this, &MainWindow2::updateSaveState);
1422 connect(editor->undoRedo(), &UndoRedoManager::didUpdateUndoStack,
this, &MainWindow2::updateBackupActionState);
1423 connect(editor, &Editor::needDisplayInfo,
this, &MainWindow2::displayMessageBox);
1424 connect(editor, &Editor::needDisplayInfoNoTitle,
this, &MainWindow2::displayMessageBoxNoTitle);
1425 connect(editor->layers(), &LayerManager::currentLayerChanged,
this, &MainWindow2::currentLayerChanged);
1426 connect(editor->select(), &SelectionManager::selectionChanged,
this, &MainWindow2::selectionChanged);
1427 connect(editor, &Editor::canCopyChanged,
this, [=](
bool canCopy) {
1428 ui->actionCopy->setEnabled(canCopy);
1429 ui->actionCut->setEnabled(canCopy);
1434void MainWindow2::makeConnections(
Editor* editor,
ColorBox* colorBox)
1436 connect(colorBox, &ColorBox::colorChanged, editor->color(), &ColorManager::setFrontColor);
1437 connect(editor->color(), &ColorManager::colorChanged, colorBox, &ColorBox::setColor);
1442 connect(colorInspector, &ColorInspector::colorChanged, editor->color(), &ColorManager::setFrontColor);
1443 connect(editor->color(), &ColorManager::colorChanged, colorInspector, &ColorInspector::setColor);
1448 connect(editor->tools(), &ToolManager::toolChanged, scribbleArea, &ScribbleArea::updateToolCursor);
1449 connect(editor->tools(), &ToolManager::toolChanged, mToolBox, &ToolBoxWidget::onToolSetActive);
1450 connect(editor->tools(), &ToolManager::toolPropertyChanged, scribbleArea, &ScribbleArea::updateToolCursor);
1462void MainWindow2::makeConnections(
Editor* pEditor,
TimeLine* pTimeline)
1465 connect(pTimeline, &TimeLine::duplicateLayerClick, mCommands, &ActionCommands::duplicateLayer);
1466 connect(pTimeline, &TimeLine::duplicateKeyClick, mCommands, &ActionCommands::duplicateKey);
1468 connect(pTimeline, &TimeLine::soundClick, pPlaybackManager, &PlaybackManager::enableSound);
1469 connect(pTimeline, &TimeLine::fpsChanged, pPlaybackManager, &PlaybackManager::setFps);
1470 connect(pTimeline, &TimeLine::fpsChanged, pEditor, &Editor::setFps);
1473 connect(pTimeline, &TimeLine::removeKeyClick, mCommands, &ActionCommands::removeKey);
1475 connect(pTimeline, &TimeLine::newBitmapLayer, mCommands, &ActionCommands::addNewBitmapLayer);
1476 connect(pTimeline, &TimeLine::newVectorLayer, mCommands, &ActionCommands::addNewVectorLayer);
1477 connect(pTimeline, &TimeLine::newSoundLayer, mCommands, &ActionCommands::addNewSoundLayer);
1478 connect(pTimeline, &TimeLine::newCameraLayer, mCommands, &ActionCommands::addNewCameraLayer);
1479 connect(mTimeLine, &TimeLine::playButtonTriggered, mCommands, &ActionCommands::PlayStop);
1480 connect(pTimeline, &TimeLine::deleteCurrentLayerClick, mCommands, &ActionCommands::deleteCurrentLayer);
1484 connect(pTimeline, &TimeLine::selectionChanged,
this, &MainWindow2::updateCopyCutPasteEnabled);
1486 connect(mEditor->select(), &SelectionManager::selectionChanged,
this, &MainWindow2::updateCopyCutPasteEnabled);
1488 connect(pEditor->layers(), &LayerManager::currentLayerChanged, pTimeline, &TimeLine::updateUI);
1490 connect(pEditor->sound(), &SoundManager::soundClipDurationChanged, pTimeline, &TimeLine::updateUI);
1495 connect(pEditor, &Editor::objectLoaded, pTimeline, &TimeLine::onObjectLoaded);
1496 connect(pEditor, &Editor::updateTimeLine, pTimeline, &TimeLine::updateUI);
1497 connect(pEditor, &Editor::updateTimeLineCached, pTimeline, &TimeLine::updateUICached);
1499 connect(pEditor->layers(), &LayerManager::currentLayerChanged,
this, &MainWindow2::updateLayerMenu);
1500 connect(pEditor->layers(), &LayerManager::currentLayerChanged, mToolOptions, &ToolOptionWidget::updateUI);
1509 toolOptions->makeConnectionToEditor(editor);
1514 connect(pEditor, &Editor::objectLoaded, pColorPalette, &ColorPaletteWidget::updateUI);
1517 ScribbleArea* pScribbleArea = pEditor->getScribbleArea();
1519 connect(pColorPalette, &ColorPaletteWidget::colorNumberChanged, pColorManager, &ColorManager::setColorNumber);
1520 connect(pColorManager, &ColorManager::colorNumberChanged, pScribbleArea, &ScribbleArea::paletteColorChanged);
1521 connect(pColorManager, &ColorManager::colorNumberChanged, pColorPalette, &ColorPaletteWidget::selectColorNumber);
1524void MainWindow2::makeConnections(
Editor* editor,
StatusBar *statusBar)
1533void MainWindow2::updateCopyCutPasteEnabled()
1535 bool canCopy = mEditor->canCopy();
1536 bool canPaste = mEditor->canPaste();
1538 ui->actionCopy->setEnabled(canCopy);
1539 ui->actionCut->setEnabled(canCopy);
1540 ui->actionPaste->setEnabled(canPaste);
1543void MainWindow2::updateLayerMenu()
1545 ui->actionDelete_Current_Layer->setEnabled(mEditor->layers()->canDeleteLayer(mEditor->currentLayerIndex()));
1548void MainWindow2::changePlayState(
bool isPlaying)
1552 ui->actionPlay->setText(
tr(
"Stop"));
1553 ui->actionPlay->setIcon(mStopIcon);
1557 ui->actionPlay->setText(
tr(
"Play"));
1558 ui->actionPlay->setIcon(mStartIcon);
1563void MainWindow2::importMovieVideo()
1566 mSuppressAutoSaveDialog =
true;
1568 mCommands->importMovieVideo();
1570 mSuppressAutoSaveDialog =
false;
1573bool MainWindow2::event(
QEvent* event)
1581void MainWindow2::displayMessageBox(
const QString& title,
const QString& body)
1586void MainWindow2::displayMessageBoxNoTitle(
const QString& body)
1591bool MainWindow2::tryRecoverUnsavedProject()
1594 QStringList recoverables = fm.searchForUnsavedProjects();
1596 if (recoverables.
empty())
1601 QString caption =
tr(
"Restore Project?");
1602 QString text =
tr(
"Pencil2D didn't close correctly. Would you like to restore the project?");
1604 QString recoverPath = recoverables[0];
1615 hideQuestionMark(*msgBox);
1622void MainWindow2::startProjectRecovery(
int result)
1637 Object* o = fm.recoverUnsavedProject(recoverPath);
1638 if (!fm.error().ok())
1640 Q_ASSERT(o ==
nullptr);
1641 const QString title =
tr(
"Recovery Failed.");
1642 const QString text =
tr(
"Sorry! Pencil2D is unable to restore your project");
1648 mEditor->setObject(o);
1650 updateBackupActionState();
1652 const QString title =
tr(
"Recovery Succeeded!");
1653 const QString text =
tr(
"Please save your work immediately to prevent loss of data");
1657void MainWindow2::createToolbars()
1662 mMainToolbar->
addAction(ui->actionOpen);
1663 mMainToolbar->
addAction(ui->actionSave);
1665 mMainToolbar->
addAction(ui->actionUndo);
1666 mMainToolbar->
addAction(ui->actionRedo);
1669 mMainToolbar->
addAction(ui->actionCopy);
1670 mMainToolbar->
addAction(ui->actionPaste);
1671 mMainToolbar->
addAction(ui->actionClearFrame);
1675 mViewToolbar->
addAction(ui->actionZoom_In);
1676 mViewToolbar->
addAction(ui->actionZoom_Out);
1677 mViewToolbar->
addAction(ui->actionReset_View);
1679 mViewToolbar->
addAction(ui->actionHorizontal_Flip);
1680 mViewToolbar->
addAction(ui->actionVertical_Flip);
1682 mViewToolbar->
addAction(ui->actionShowInvisibleLines);
1683 mViewToolbar->
addAction(ui->actionShowOutlinesOnly);
1687 mOverlayToolbar->
addAction(ui->actionGrid);
1688 mOverlayToolbar->
addAction(ui->actionCenter);
1689 mOverlayToolbar->
addAction(ui->actionThirds);
1690 mOverlayToolbar->
addAction(ui->actionGoldenRatio);
1691 mOverlayToolbar->
addAction(ui->actionSafeAreas);
1692 mOverlayToolbar->
addAction(ui->actionOnePointPerspective);
1693 mOverlayToolbar->
addAction(ui->actionTwoPointPerspective);
1694 mOverlayToolbar->
addAction(ui->actionThreePointPerspective);
1700 perspectiveLinesAngleButton->
setDefaultAction(ui->menuPerspectiveLinesAngle->menuAction());
1702 mOverlayToolbar->
addWidget(perspectiveLinesAngleButton);
1704 mToolbars = { mMainToolbar, mViewToolbar, mOverlayToolbar };
1708 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
bool exists() 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 open(QObject *receiver, const char *member)
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)
QVariant property(const char *name) const const
QObject * sender() const const
bool setProperty(const char *name, const QVariant &value)
QString tr(const char *sourceText, const char *disambiguation, int n)
QString writableLocation(QStandardPaths::StandardLocation type)
bool isEmpty() const const
QString & prepend(QChar ch)
void keySequence(QWindow *window, const QKeySequence &keySequence)
char * toString(const T &value)
QByteArray toByteArray() const const
QString toString() const const