19#include "mainwindow2.h"
20#include "ui_mainwindow2.h"
23#include <QActionGroup>
29#include <QProgressDialog>
30#include <QTabletEvent>
31#include <QStandardPaths>
40#include "pencilsettings.h"
44#include "filemanager.h"
45#include "colormanager.h"
46#include "layermanager.h"
47#include "toolmanager.h"
48#include "playbackmanager.h"
49#include "selectionmanager.h"
50#include "soundmanager.h"
51#include "viewmanager.h"
52#include "selectionmanager.h"
53#include "undoredomanager.h"
55#include "actioncommands.h"
56#include "fileformat.h"
58#include "undoredocommand.h"
62#include "colorinspector.h"
63#include "colorpalettewidget.h"
64#include "tooloptionwidget.h"
65#include "preferencesdialog.h"
68#include "onionskinwidget.h"
69#include "pegbaralignmentdialog.h"
70#include "addtransparencytopaperdialog.h"
71#include "repositionframesdialog.h"
73#include "errordialog.h"
74#include "filedialog.h"
75#include "importimageseqdialog.h"
76#include "importlayersdialog.h"
77#include "importpositiondialog.h"
78#include "layeropacitydialog.h"
79#include "recentfilemenu.h"
80#include "shortcutfilter.h"
82#include "presetdialog.h"
83#include "pegbaralignmentdialog.h"
87#define BUILD_DATE S__GIT_TIMESTAMP
89#define BUILD_DATE __DATE__
92#if defined(PENCIL2D_RELEASE_BUILD)
93#define PENCIL_WINDOW_TITLE QString("[*]Pencil2D v%1").arg(APP_VERSION)
94#elif defined(PENCIL2D_NIGHTLY_BUILD)
95#define PENCIL_WINDOW_TITLE QString("[*]Pencil2D Nightly Build %1").arg(BUILD_DATE)
97#define PENCIL_WINDOW_TITLE QString("[*]Pencil2D Development Build %1").arg(BUILD_DATE)
102MainWindow2::MainWindow2(
QWidget* parent) :
110 mEditor =
new Editor(
this);
111 mEditor->setScribbleArea(ui->scribbleArea);
116 ui->scribbleArea->setEditor(mEditor);
117 ui->scribbleArea->init();
119 ui->statusBar->setEditor(mEditor);
120 ui->statusBar->updateZoomStatus();
121 ui->statusBar->setVisible(mEditor->preference()->isOn(SETTING::SHOW_STATUS_BAR));
124 mCommands->setCore(mEditor);
129 setupKeyboardShortcuts();
134 currentLayerChanged();
136 connect(mEditor, &Editor::needSave,
this, &MainWindow2::autoSave);
138 mEditor->tools()->setDefaultTool();
139 ui->background->init(mEditor->preference());
141 setWindowTitle(PENCIL_WINDOW_TITLE);
144MainWindow2::~MainWindow2()
149void MainWindow2::createDockWidgets()
155 mColorBox->
setToolTip(
tr(
"color palette:<br>use <b>(C)</b><br>toggle at cursor"));
163 mColorPalette->setCore(mEditor);
184 mStartIcon =
QIcon(
":icons/controls/play.png");
185 mStopIcon =
QIcon(
":icons/controls/stop.png");
190 pWidget->setFeatures(QDockWidget::DockWidgetFeature::DockWidgetClosable |
191 QDockWidget::DockWidgetFeature::DockWidgetMovable |
192 QDockWidget::DockWidgetFeature::DockWidgetFloatable);
195 pWidget->setEditor(mEditor);
197 qDebug() <<
"Init Dock widget: " << pWidget->objectName();
217 makeConnections(mEditor, ui->scribbleArea);
218 makeConnections(mEditor);
219 makeConnections(mEditor, mTimeLine);
220 makeConnections(mEditor, mColorBox);
221 makeConnections(mEditor, mColorInspector);
222 makeConnections(mEditor, mColorPalette);
223 makeConnections(mEditor, mToolOptions);
224 makeConnections(mEditor, ui->statusBar);
228 w->setFloating(
false);
234void MainWindow2::createMenus()
267 replaceUndoRedoActions();
273 connect(mEditor->select(), &SelectionManager::selectionChanged,
this, &MainWindow2::selectionChanged);
289 connect(ui->actionChangeLineColorCurrent_keyframe, &
QAction::triggered, mCommands, &ActionCommands::changeKeyframeLineColor);
290 connect(ui->actionChangeLineColorAll_keyframes_on_layer, &
QAction::triggered, mCommands, &ActionCommands::changeallKeyframeLineColor);
293 QList<QAction*> visibilityActions = ui->menuLayer_Visibility->actions();
295 visibilityGroup->setExclusive(
true);
296 for (
int i = 0; i < visibilityActions.
size(); i++) {
297 QAction* action = visibilityActions[i];
298 visibilityGroup->addAction(action);
301 visibilityActions[mEditor->preference()->getInt(SETTING::LAYER_VISIBILITY)]->setChecked(
true);
302 connect(mEditor->preference(), &PreferenceManager::optionChanged, [=](SETTING e) {
303 if (e == SETTING::LAYER_VISIBILITY) {
304 visibilityActions[mEditor->preference()->getInt(SETTING::LAYER_VISIBILITY)]->setChecked(true);
310 connect(ui->actionZoom_Out, &
QAction::triggered, mCommands, &ActionCommands::ZoomOut);
311 connect(ui->actionRotate_Clockwise, &
QAction::triggered, mCommands, &ActionCommands::rotateClockwise);
312 connect(ui->actionRotate_Anticlockwise, &
QAction::triggered, mCommands, &ActionCommands::rotateCounterClockwise);
313 connect(ui->actionReset_Rotation, &
QAction::triggered, mEditor->view(), &ViewManager::resetRotation);
314 connect(ui->actionReset_View, &
QAction::triggered, mEditor->view(), &ViewManager::resetView);
315 connect(ui->actionCenter_View, &
QAction::triggered, mEditor->view(), &ViewManager::centerView);
316 connect(ui->actionZoom400, &
QAction::triggered, mEditor->view(), &ViewManager::scale400);
317 connect(ui->actionZoom300, &
QAction::triggered, mEditor->view(), &ViewManager::scale300);
318 connect(ui->actionZoom200, &
QAction::triggered, mEditor->view(), &ViewManager::scale200);
319 connect(ui->actionZoom100, &
QAction::triggered, mEditor->view(), &ViewManager::scale100);
320 connect(ui->actionZoom50, &
QAction::triggered, mEditor->view(), &ViewManager::scale50);
321 connect(ui->actionZoom33, &
QAction::triggered, mEditor->view(), &ViewManager::scale33);
322 connect(ui->actionZoom25, &
QAction::triggered, mEditor->view(), &ViewManager::scale25);
323 connect(ui->actionHorizontal_Flip, &
QAction::triggered, mEditor->view(), &ViewManager::flipHorizontal);
324 connect(ui->actionVertical_Flip, &
QAction::triggered, mEditor->view(), &ViewManager::flipVertical);
325 connect(mEditor->view(), &ViewManager::viewFlipped,
this, &MainWindow2::viewFlipped);
329 bindPreferenceSetting(ui->actionStatusBar, prefs, SETTING::SHOW_STATUS_BAR);
330 bindPreferenceSetting(ui->actionThreePointPerspective, prefs, SETTING::OVERLAY_PERSPECTIVE3);
331 bindPreferenceSetting(ui->actionTwoPointPerspective, prefs, SETTING::OVERLAY_PERSPECTIVE2);
332 bindPreferenceSetting(ui->actionOnePointPerspective, prefs, SETTING::OVERLAY_PERSPECTIVE1);
333 bindPreferenceSetting(ui->actionSafeAreas, prefs, SETTING::OVERLAY_SAFE);
334 bindPreferenceSetting(ui->actionGoldenRatio, prefs, SETTING::OVERLAY_GOLDEN);
335 bindPreferenceSetting(ui->actionThirds, prefs, SETTING::OVERLAY_THIRDS);
336 bindPreferenceSetting(ui->actionCenter, prefs, SETTING::OVERLAY_CENTER);
337 bindPreferenceSetting(ui->actionGrid, prefs, SETTING::GRID);
338 bindPreferenceSetting(ui->actionShowOutlinesOnly, prefs, SETTING::OUTLINES);
339 bindPreferenceSetting(ui->actionShowInvisibleLines, prefs, SETTING::INVISIBLE_LINES);
340 bindPreferenceSetting(ui->actionOnionPrev, prefs, SETTING::PREV_ONION);
341 bindPreferenceSetting(ui->actionOnionNext, prefs, SETTING::NEXT_ONION);
343 bool enableSafeArea = (prefs->isOn(SETTING::ACTION_SAFE_ON) || prefs->isOn(SETTING::TITLE_SAFE_ON));
344 ui->actionSafeAreas->setEnabled(enableSafeArea);
346 auto perspectiveLinesAngleGroup =
new QActionGroup(
this);
347 perspectiveLinesAngleGroup->setExclusive(
true);
348 perspectiveLinesAngleGroup->addAction(ui->action2Degrees);
349 perspectiveLinesAngleGroup->addAction(ui->action3Degrees);
350 perspectiveLinesAngleGroup->addAction(ui->action5Degrees);
351 perspectiveLinesAngleGroup->addAction(ui->action7_5Degrees);
352 perspectiveLinesAngleGroup->addAction(ui->action10Degrees);
353 perspectiveLinesAngleGroup->addAction(ui->action15Degrees);
354 perspectiveLinesAngleGroup->addAction(ui->action20Degrees);
355 perspectiveLinesAngleGroup->addAction(ui->action30Degrees);
357 if (action == ui->action2Degrees) mEditor->preference()->set(SETTING::OVERLAY_ANGLE, 2);
358 else if (action == ui->action3Degrees) mEditor->preference()->set(SETTING::OVERLAY_ANGLE, 3);
359 else if (action == ui->action5Degrees) mEditor->preference()->set(SETTING::OVERLAY_ANGLE, 5);
360 else if (action == ui->action7_5Degrees) mEditor->preference()->set(SETTING::OVERLAY_ANGLE, 7);
361 else if (action == ui->action10Degrees) mEditor->preference()->set(SETTING::OVERLAY_ANGLE, 10);
362 else if (action == ui->action15Degrees) mEditor->preference()->set(SETTING::OVERLAY_ANGLE, 15);
363 else if (action == ui->action20Degrees) mEditor->preference()->set(SETTING::OVERLAY_ANGLE, 20);
364 else if (action == ui->action30Degrees) mEditor->preference()->set(SETTING::OVERLAY_ANGLE, 30);
365 else Q_UNREACHABLE();
366 emit mEditor->view()->viewChanged();
369 switch (prefs->getInt(SETTING::OVERLAY_ANGLE)) {
370 case 2: ui->action2Degrees->setChecked(
true);
break;
371 case 3: ui->action3Degrees->setChecked(
true);
break;
372 case 5: ui->action5Degrees->setChecked(
true);
break;
373 case 7: ui->action7_5Degrees->setChecked(
true);
break;
374 case 10: ui->action10Degrees->setChecked(
true);
break;
375 case 15: ui->action15Degrees->setChecked(
true);
break;
376 case 20: ui->action20Degrees->setChecked(
true);
break;
377 case 30: ui->action30Degrees->setChecked(
true);
break;
384 connect(ui->actionLoop, &
QAction::triggered, pPlaybackManager, &PlaybackManager::setLooping);
385 connect(ui->actionLoopControl, &
QAction::triggered, pPlaybackManager, &PlaybackManager::enableRangedPlayback);
386 connect(pPlaybackManager, &PlaybackManager::loopStateChanged, ui->actionLoop, &
QAction::setChecked);
387 connect(pPlaybackManager, &PlaybackManager::loopStateChanged, mTimeLine, &TimeLine::setLoop);
388 connect(pPlaybackManager, &PlaybackManager::rangedPlaybackStateChanged, ui->actionLoopControl, &
QAction::setChecked);
389 connect(pPlaybackManager, &PlaybackManager::rangedPlaybackStateChanged, mTimeLine, &TimeLine::setRangeState);
390 connect(pPlaybackManager, &PlaybackManager::playStateChanged, mTimeLine, &TimeLine::setPlaying);
391 connect(pPlaybackManager, &PlaybackManager::playStateChanged,
this, &MainWindow2::changePlayState);
393 connect(ui->actionFlip_inbetween, &
QAction::triggered, pPlaybackManager, &PlaybackManager::playFlipInBetween);
394 connect(ui->actionFlip_rolling, &
QAction::triggered, pPlaybackManager, &PlaybackManager::playFlipRoll);
397 connect(ui->actionRemove_Frame, &
QAction::triggered, mCommands, &ActionCommands::removeKey);
398 connect(ui->actionAdd_Frame_Exposure, &
QAction::triggered, mCommands, &ActionCommands::addExposureToSelectedFrames);
399 connect(ui->actionSubtract_Frame_Exposure, &
QAction::triggered, mCommands, &ActionCommands::subtractExposureFromSelectedFrames);
400 connect(ui->actionNext_Frame, &
QAction::triggered, mCommands, &ActionCommands::GotoNextFrame);
401 connect(ui->actionPrevious_Frame, &
QAction::triggered, mCommands, &ActionCommands::GotoPrevFrame);
402 connect(ui->actionNext_KeyFrame, &
QAction::triggered, mCommands, &ActionCommands::GotoNextKeyFrame);
403 connect(ui->actionPrev_KeyFrame, &
QAction::triggered, mCommands, &ActionCommands::GotoPrevKeyFrame);
404 connect(ui->actionDuplicate_Frame, &
QAction::triggered, mCommands, &ActionCommands::duplicateKey);
405 connect(ui->actionMove_Frame_Forward, &
QAction::triggered, mCommands, &ActionCommands::moveFrameForward);
406 connect(ui->actionMove_Frame_Backward, &
QAction::triggered, mCommands, &ActionCommands::moveFrameBackward);
408 connect(ui->actionReverse_Frames_Order, &
QAction::triggered, mCommands, &ActionCommands::reverseSelectedFrames);
409 connect(ui->actionRemove_Frames, &
QAction::triggered, mCommands, &ActionCommands::removeSelectedFrames);
415 connect(ui->actionPolyline, &
QAction::triggered, mToolBox, &ToolBoxWidget::polylineOn);
421 connect(ui->actionEyedropper, &
QAction::triggered, mToolBox, &ToolBoxWidget::eyedropperOn);
423 connect(ui->actionResetToolsDefault, &
QAction::triggered, mEditor->tools(), &ToolManager::resetAllTools);
426 QMenu* winMenu = ui->menuWindows;
427 const std::vector<QAction*> actions
429 mToolBox->toggleViewAction(),
430 mToolOptions->toggleViewAction(),
431 mColorBox->toggleViewAction(),
432 mColorPalette->toggleViewAction(),
433 mTimeLine->toggleViewAction(),
434 mColorInspector->toggleViewAction(),
435 mOnionSkinWidget->toggleViewAction()
438 for (
QAction* action : actions)
441 winMenu->
insertAction(ui->menuToolbars->menuAction(), action);
444 connect(ui->actionResetWindows, &
QAction::triggered,
this, &MainWindow2::resetAndDockAllSubWidgets);
445 connect(ui->actionLockWindows, &
QAction::toggled,
this, &MainWindow2::lockWidgets);
446 bindPreferenceSetting(ui->actionLockWindows, prefs, SETTING::LAYOUT_LOCK);
450 connect(ui->actionQuick_Guide, &
QAction::triggered, mCommands, &ActionCommands::quickGuide);
454 connect(ui->actionCheck_for_Updates, &
QAction::triggered, mCommands, &ActionCommands::checkForUpdates);
455 connect(ui->actionReport_Bug, &
QAction::triggered, mCommands, &ActionCommands::reportbug);
456 connect(ui->actionOpen_Temporary_Directory, &
QAction::triggered, mCommands, &ActionCommands::openTemporaryDirectory);
461 mRecentFileMenu->loadFromDisk();
462 ui->menuFile->insertMenu(ui->actionSave, mRecentFileMenu);
464 connect(mRecentFileMenu, &RecentFileMenu::loadRecentFile,
this, &MainWindow2::openFile);
467void MainWindow2::replaceUndoRedoActions()
469 ui->menuEdit->removeAction(ui->actionUndo);
470 ui->menuEdit->removeAction(ui->actionRedo);
471 ui->actionUndo = mEditor->undoRedo()->createUndoAction(
this, ui->actionUndo->icon());
472 ui->actionRedo = mEditor->undoRedo()->createRedoAction(
this, ui->actionRedo->icon());
473 ui->menuEdit->insertAction(ui->actionCut, ui->actionUndo);
474 ui->menuEdit->insertAction(ui->actionCut, ui->actionRedo);
477void MainWindow2::setOpacity(
int opacity)
479 mEditor->preference()->set(SETTING::WINDOW_OPACITY, 100 - opacity);
483void MainWindow2::updateSaveState()
487 ui->statusBar->updateModifiedStatus(hasUnsavedChanges);
490void MainWindow2::updateBackupActionState()
492 mEditor->undoRedo()->updateUndoAction(ui->actionUndo);
493 mEditor->undoRedo()->updateRedoAction(ui->actionRedo);
496void MainWindow2::openPegAlignDialog()
498 if (mPegAlign !=
nullptr)
501 tr(
"Dialog is already open!"),
511 flags &= (
~Qt::WindowContextHelpButtonHint);
520void MainWindow2::openLayerOpacityDialog()
522 if (mLayerOpacityDialog !=
nullptr)
525 tr(
"Dialog is already open!"),
531 mLayerOpacityDialog->setCore(mEditor);
532 mLayerOpacityDialog->initUI();
534 mLayerOpacityDialog->
show();
538 mLayerOpacityDialog =
nullptr;
542void MainWindow2::openAddTranspToPaperDialog()
544 if (mAddTranspToPaper)
547 mAddTranspToPaper->
raise();
552 mAddTranspToPaper->setCore(mEditor);
553 mAddTranspToPaper->initUI();
555 mAddTranspToPaper->
show();
561 mSuppressAutoSaveDialog =
true;
562 mAddTranspToPaper->traceScannedDrawings();
563 mSuppressAutoSaveDialog =
false;
566 mAddTranspToPaper =
nullptr;
570void MainWindow2::openRepositionDialog()
572 if (mEditor->layers()->currentLayer()->getSelectedFramesByPos().
count() < 2)
575 tr(
"Please select at least 2 frames!"),
579 if (mReposDialog !=
nullptr)
587 hideQuestionMark(*mReposDialog);
588 mReposDialog->setCore(mEditor);
589 mReposDialog->initUI();
590 mEditor->tools()->setCurrentTool(ToolType::MOVE);
592 mReposDialog->
show();
595void MainWindow2::closeRepositionDialog()
598 mReposDialog =
nullptr;
601void MainWindow2::currentLayerChanged()
603 bool isBitmap = (mEditor->layers()->currentLayer()->type() == Layer::BITMAP);
604 ui->menuChange_line_color->setEnabled(isBitmap);
606 bool isVector = (mEditor->layers()->currentLayer()->type() == Layer::VECTOR);
607 ui->actionShowInvisibleLines->setEnabled(isVector);
608 ui->actionShowOutlinesOnly->setEnabled(isVector);
611void MainWindow2::selectionChanged()
613 bool somethingSelected = mEditor->select()->somethingSelected();
614 ui->menuSelection->setEnabled(somethingSelected);
617void MainWindow2::viewFlipped()
619 ui->actionHorizontal_Flip->setChecked(mEditor->view()->isFlipHorizontal());
620 ui->actionVertical_Flip->setChecked(mEditor->view()->isFlipVertical());
639 m2ndCloseEvent =
true;
647void MainWindow2::newDocument()
649 if (maybeSave() && !tryLoadPreset())
655void MainWindow2::openDocument()
664 openObject(fileName);
668bool MainWindow2::saveAsNewDocument()
675 return saveObject(fileName);
678void MainWindow2::openStartupFile(
const QString& filename)
680 if (tryRecoverUnsavedProject())
685 if (!filename.
isEmpty() && openObject(filename))
690 loadMostRecent() || tryLoadPreset();
693void MainWindow2::openFile(
const QString& filename)
697 openObject(filename);
701bool MainWindow2::openObject(
const QString& strFilePath)
704 hideQuestionMark(progress);
708 Status s = mEditor->openObject(strFilePath, [&progress](
int p)
710 progress.setValue(p);
712 }, [&progress](
int max)
714 progress.setRange(0, max);
719 ErrorDialog errorDialog(s.title(), s.description(), s.details().str());
721 emptyDocumentWhenErrorOccurred();
726 settings.setValue(LAST_PCLX_PATH, mEditor->object()->filePath());
729 if (!mEditor->object()->filePath().
isEmpty())
731 mRecentFileMenu->addRecentFile(mEditor->object()->filePath());
732 mRecentFileMenu->saveToDisk();
739 ui->statusBar->updateModifiedStatus(
false);
741 progress.setValue(progress.maximum());
744 updateBackupActionState();
746 if (!
QFileInfo(strFilePath).isWritable())
749 tr(
"This program does not currently have permission to write to the file you have selected. "
750 "Please make sure you have write permission for this file before attempting to save it. "
751 "Alternatively, you can use the Save As... menu option to save to a writable location."),
758bool MainWindow2::saveObject(
QString strSavedFileName)
761 hideQuestionMark(progress);
765 mEditor->prepareSave();
769 connect(&fm, &FileManager::progressChanged, [&progress](
int p)
771 progress.setValue(p);
774 connect(&fm, &FileManager::progressRangeChanged, [&progress](
int max)
776 progress.setRange(0, max + 3);
779 Status st = fm.save(mEditor->object(), strSavedFileName);
784#if QT_VERSION >= QT_VERSION_CHECK(5, 4, 0)
789 errorLogFolder.mkpath(
"./logs");
790 errorLogFolder.cd(
"logs");
798 out << st.details().str();
803 st.description().append(
tr(
"<br><br>An error has occurred and your file may not have saved successfully."
804 "\nIf you believe that this error is an issue with Pencil2D, please create a new issue at:"
805 "<br><a href='https://github.com/pencil2d/pencil/issues'>https://github.com/pencil2d/pencil/issues</a><br>"
806 "Please be sure to include the following details in your issue:")), st.details().html());
811 mEditor->object()->setFilePath(strSavedFileName);
812 mEditor->object()->setModified(
false);
814 mEditor->clearTemporary();
817 settings.setValue(LAST_PCLX_PATH, strSavedFileName);
819 mRecentFileMenu->addRecentFile(strSavedFileName);
820 mRecentFileMenu->saveToDisk();
822 mTimeLine->updateContent();
827 progress.setValue(progress.maximum());
829 mEditor->resetAutoSaveCounter();
834bool MainWindow2::saveDocument()
836 if (!mEditor->object()->filePath().
isEmpty())
837 return saveObject(mEditor->object()->filePath());
839 return saveAsNewDocument();
842bool MainWindow2::maybeSave()
850 tr(
"This animation has been modified.\n Do you want to save your changes?"),
853 return saveDocument();
858bool MainWindow2::autoSave()
860 if (!mEditor->object()->filePath().
isEmpty())
862 return saveDocument();
865 if (mEditor->autoSaveNeverAskAgain())
868 if(mSuppressAutoSaveDialog)
873 msgBox.setWindowTitle(
tr(
"AutoSave Reminder"));
874 msgBox.setText(
tr(
"The animation is not saved yet.\n Do you want to save now?"));
879 int ret = msgBox.exec();
882 return saveDocument();
886 mEditor->dontAskAutoSave(
true);
892void MainWindow2::emptyDocumentWhenErrorOccurred()
900void MainWindow2::importImage()
904 if (strFilePath.
isEmpty()) {
return; }
908 OnScopeExit(
delete positionDialog)
910 positionDialog->
exec();
918 Status st = mEditor->importImage(strFilePath, importImageConfig);
921 ErrorDialog errorDialog(st.title(), st.description(), st.details().html());
926 ui->scribbleArea->updateFrame();
927 mTimeLine->updateContent();
930void MainWindow2::importImageSequence()
932 mSuppressAutoSaveDialog =
true;
935 OnScopeExit(
delete imageSeqDialog)
936 imageSeqDialog->setCore(mEditor);
940 imageSeqDialog->
exec();
947 OnScopeExit(
delete positionDialog)
949 positionDialog->
exec();
955 imageSeqDialog->importArbitrarySequence(positionDialog->importConfig());
957 mSuppressAutoSaveDialog =
false;
960void MainWindow2::importPredefinedImageSet()
963 OnScopeExit(
delete imageSeqDialog)
964 imageSeqDialog->setCore(mEditor);
968 mSuppressAutoSaveDialog =
true;
969 imageSeqDialog->
exec();
976 OnScopeExit(
delete positionDialog)
978 positionDialog->
exec();
984 imageSeqDialog->importPredefinedSet(positionDialog->importConfig());
985 mSuppressAutoSaveDialog =
false;
988void MainWindow2::importLayers()
991 importLayers->setCore(mEditor);
993 importLayers->
open();
996void MainWindow2::importAnimatedImage()
999 mSuppressAutoSaveDialog =
true;
1001 mCommands->importAnimatedImage();
1003 mSuppressAutoSaveDialog =
false;
1006void MainWindow2::lockWidgets(
bool shouldLock)
1010 : (QDockWidget::DockWidgetFeature::DockWidgetClosable |
1011 QDockWidget::DockWidgetFeature::DockWidgetMovable |
1012 QDockWidget::DockWidgetFeature::DockWidgetFloatable);
1016 d->setFeatures(feat);
1021 QWidget* customTitleBarWidget = shouldLock ? (
new QWidget) :
nullptr;
1022 d->setTitleBarWidget(customTitleBarWidget);
1026void MainWindow2::preferences()
1031 mPrefDialog->
raise();
1037 mPrefDialog->init(mEditor->preference());
1039 connect(mPrefDialog, &PreferencesDialog::windowOpacityChange,
this, &MainWindow2::setOpacity);
1040 connect(mPrefDialog, &PreferencesDialog::soundScrubChanged, mEditor->playback(), &PlaybackManager::setSoundScrubActive);
1041 connect(mPrefDialog, &PreferencesDialog::soundScrubMsecChanged, mEditor->playback(), &PlaybackManager::setSoundScrubMsec);
1044 clearKeyboardShortcuts();
1045 setupKeyboardShortcuts();
1046 mPrefDialog =
nullptr;
1049 mPrefDialog->
show();
1052void MainWindow2::resetAndDockAllSubWidgets()
1055 settings.remove(SETTING_WINDOW_GEOMETRY);
1056 settings.remove(SETTING_WINDOW_STATE);
1060 dock->setFloating(
false);
1074void MainWindow2::newObject()
1076 auto object =
new Object();
1080 object->addNewCameraLayer();
1081 object->addNewBitmapLayer();
1085 object->data()->setCurrentLayer(1);
1087 mEditor->setObject(
object);
1093 updateBackupActionState();
1096bool MainWindow2::newObjectFromPresets(
int presetIndex)
1098 QString presetFilePath = PresetDialog::getPresetPath(presetIndex);
1106 Object*
object = fm.load(presetFilePath);
1108 if (!fm.error().ok() ||
object ==
nullptr)
1113 mEditor->setObject(
object);
1114 object->setFilePath(
QString());
1118 updateBackupActionState();
1123bool MainWindow2::loadMostRecent()
1125 if(!mEditor->preference()->isOn(SETTING::LOAD_MOST_RECENT))
1131 QString myPath = settings.value(LAST_PCLX_PATH,
QVariant(
"")).toString();
1136 return openObject(myPath);
1139bool MainWindow2::tryLoadPreset()
1141 if (!mEditor->preference()->isOn(SETTING::ASK_FOR_PRESET))
1143 int defaultPreset = mEditor->preference()->getInt(SETTING::DEFAULT_PRESET);
1144 return newObjectFromPresets(defaultPreset);
1156 int presetIndex = presetDialog->getPresetIndex();
1157 if (presetDialog->shouldAlwaysUse())
1159 mEditor->preference()->set(SETTING::ASK_FOR_PRESET, false);
1160 mEditor->preference()->set(SETTING::DEFAULT_PRESET, presetIndex);
1162 if (!newObjectFromPresets(presetIndex))
1167 presetDialog->
open();
1171void MainWindow2::closeDialogs()
1178void MainWindow2::readSettings()
1182 QVariant winGeometry = settings.
value(SETTING_WINDOW_GEOMETRY);
1188 int opacity = mEditor->preference()->getInt(SETTING::WINDOW_OPACITY);
1189 setOpacity(100 - opacity);
1191 bool isWindowsLocked = mEditor->preference()->isOn(SETTING::LAYOUT_LOCK);
1192 lockWidgets(isWindowsLocked);
1195void MainWindow2::writeSettings()
1198 settings.setValue(SETTING_WINDOW_GEOMETRY,
saveGeometry());
1199 settings.setValue(SETTING_WINDOW_STATE,
saveState());
1202void MainWindow2::setupKeyboardShortcuts()
1204 checkExistingShortcuts();
1208 strCommandName =
QString(
"shortcuts/") + strCommandName;
1214 ui->actionNew->setShortcut(cmdKeySeq(CMD_NEW_FILE));
1215 ui->actionOpen->setShortcut(cmdKeySeq(CMD_OPEN_FILE));
1216 ui->actionSave->setShortcut(cmdKeySeq(CMD_SAVE_FILE));
1217 ui->actionSave_as->setShortcut(cmdKeySeq(CMD_SAVE_AS));
1219 ui->actionImport_Image->setShortcut(cmdKeySeq(CMD_IMPORT_IMAGE));
1220 ui->actionImport_ImageSeq->setShortcut(cmdKeySeq(CMD_IMPORT_IMAGE_SEQ));
1221 ui->actionImport_ImageSeqNum->setShortcut(cmdKeySeq(CMD_IMPORT_IMAGE_PREDEFINED_SET));
1222 ui->actionImport_MovieVideo->setShortcut(cmdKeySeq(CMD_IMPORT_MOVIE_VIDEO));
1223 ui->actionImport_AnimatedImage->setShortcut(cmdKeySeq(CMD_IMPORT_ANIMATED_IMAGE));
1224 ui->actionImportLayers_from_pclx->setShortcut(cmdKeySeq(CMD_IMPORT_LAYERS));
1225 ui->actionImport_Sound->setShortcut(cmdKeySeq(CMD_IMPORT_SOUND));
1226 ui->actionImport_MovieAudio->setShortcut(cmdKeySeq(CMD_IMPORT_MOVIE_AUDIO));
1227 ui->actionImport_Append_Palette->setShortcut(cmdKeySeq(CMD_IMPORT_PALETTE));
1228 ui->actionImport_Replace_Palette->setShortcut(cmdKeySeq(CMD_IMPORT_PALETTE_REPLACE));
1230 ui->actionExport_Image->setShortcut(cmdKeySeq(CMD_EXPORT_IMAGE));
1231 ui->actionExport_ImageSeq->setShortcut(cmdKeySeq(CMD_EXPORT_IMAGE_SEQ));
1232 ui->actionExport_Movie->setShortcut(cmdKeySeq(CMD_EXPORT_MOVIE));
1233 ui->actionExport_Animated_GIF->setShortcut(cmdKeySeq(CMD_EXPORT_GIF));
1234 ui->actionExport_Palette->setShortcut(cmdKeySeq(CMD_EXPORT_PALETTE));
1237 ui->actionUndo->setShortcut(cmdKeySeq(CMD_UNDO));
1238 ui->actionRedo->setShortcut(cmdKeySeq(CMD_REDO));
1239 ui->actionCut->setShortcut(cmdKeySeq(CMD_CUT));
1240 ui->actionCopy->setShortcut(cmdKeySeq(CMD_COPY));
1241 ui->actionPaste_Previous->setShortcut(cmdKeySeq(CMD_PASTE_FROM_PREVIOUS));
1242 ui->actionPaste->setShortcut(cmdKeySeq(CMD_PASTE));
1243 ui->actionClearFrame->setShortcut(cmdKeySeq(CMD_CLEAR_FRAME));
1244 ui->actionFlip_X->setShortcut(cmdKeySeq(CMD_SELECTION_FLIP_HORIZONTAL));
1245 ui->actionFlip_Y->setShortcut(cmdKeySeq(CMD_SELECTION_FLIP_VERTICAL));
1246 ui->actionSelect_All->setShortcut(cmdKeySeq(CMD_SELECT_ALL));
1247 ui->actionDeselect_All->setShortcut(cmdKeySeq(CMD_DESELECT_ALL));
1248 ui->actionPegbarAlignment->setShortcut(cmdKeySeq(CMD_PEGBAR_ALIGNMENT));
1249 ui->actionPreference->setShortcut(cmdKeySeq(CMD_PREFERENCE));
1252 ui->actionResetWindows->setShortcut(cmdKeySeq(CMD_RESET_WINDOWS));
1253 ui->actionLockWindows->setShortcut(cmdKeySeq(CMD_LOCK_WINDOWS));
1254 ui->actionReset_View->setShortcut(cmdKeySeq(CMD_RESET_ZOOM_ROTATE));
1255 ui->actionCenter_View->setShortcut(cmdKeySeq(CMD_CENTER_VIEW));
1256 ui->actionZoom_In->setShortcut(cmdKeySeq(CMD_ZOOM_IN));
1257 ui->actionZoom_Out->setShortcut(cmdKeySeq(CMD_ZOOM_OUT));
1258 ui->actionZoom400->setShortcut(cmdKeySeq(CMD_ZOOM_400));
1259 ui->actionZoom300->setShortcut(cmdKeySeq(CMD_ZOOM_300));
1260 ui->actionZoom200->setShortcut(cmdKeySeq(CMD_ZOOM_200));
1261 ui->actionZoom100->setShortcut(cmdKeySeq(CMD_ZOOM_100));
1262 ui->actionZoom50->setShortcut(cmdKeySeq(CMD_ZOOM_50));
1263 ui->actionZoom33->setShortcut(cmdKeySeq(CMD_ZOOM_33));
1264 ui->actionZoom25->setShortcut(cmdKeySeq(CMD_ZOOM_25));
1265 ui->actionRotate_Clockwise->setShortcut(cmdKeySeq(CMD_ROTATE_CLOCK));
1266 ui->actionRotate_Anticlockwise->setShortcut(cmdKeySeq(CMD_ROTATE_ANTI_CLOCK));
1267 ui->actionReset_Rotation->setShortcut(cmdKeySeq(CMD_RESET_ROTATION));
1268 ui->actionHorizontal_Flip->setShortcut(cmdKeySeq(CMD_FLIP_HORIZONTAL));
1269 ui->actionVertical_Flip->setShortcut(cmdKeySeq(CMD_FLIP_VERTICAL));
1270 ui->actionGrid->setShortcut(cmdKeySeq(CMD_GRID));
1271 ui->actionCenter->setShortcut(cmdKeySeq(CMD_OVERLAY_CENTER));
1272 ui->actionThirds->setShortcut(cmdKeySeq(CMD_OVERLAY_THIRDS));
1273 ui->actionGoldenRatio->setShortcut(cmdKeySeq(CMD_OVERLAY_GOLDEN_RATIO));
1274 ui->actionSafeAreas->setShortcut(cmdKeySeq(CMD_OVERLAY_SAFE_AREAS));
1275 ui->actionOnePointPerspective->setShortcut(cmdKeySeq(CMD_OVERLAY_ONE_POINT_PERSPECTIVE));
1276 ui->actionTwoPointPerspective->setShortcut(cmdKeySeq(CMD_OVERLAY_TWO_POINT_PERSPECTIVE));
1277 ui->actionThreePointPerspective->setShortcut(cmdKeySeq(CMD_OVERLAY_THREE_POINT_PERSPECTIVE));
1278 ui->actionOnionPrev->setShortcut(cmdKeySeq(CMD_ONIONSKIN_PREV));
1279 ui->actionOnionNext->setShortcut(cmdKeySeq(CMD_ONIONSKIN_NEXT));
1280 ui->actionStatusBar->setShortcut(cmdKeySeq(CMD_TOGGLE_STATUS_BAR));
1283 ui->actionPlay->setShortcut(cmdKeySeq(CMD_PLAY));
1284 ui->actionLoop->setShortcut(cmdKeySeq(CMD_LOOP));
1285 ui->actionLoopControl->setShortcut(cmdKeySeq(CMD_LOOP_CONTROL));
1286 ui->actionPrevious_Frame->setShortcut(cmdKeySeq(CMD_GOTO_PREV_FRAME));
1287 ui->actionNext_Frame->setShortcut(cmdKeySeq(CMD_GOTO_NEXT_FRAME));
1288 ui->actionPrev_KeyFrame->setShortcut(cmdKeySeq(CMD_GOTO_PREV_KEY_FRAME));
1289 ui->actionNext_KeyFrame->setShortcut(cmdKeySeq(CMD_GOTO_NEXT_KEY_FRAME));
1290 ui->actionAdd_Frame->setShortcut(cmdKeySeq(CMD_ADD_FRAME));
1291 ui->actionDuplicate_Frame->setShortcut(cmdKeySeq(CMD_DUPLICATE_FRAME));
1292 ui->actionRemove_Frame->setShortcut(cmdKeySeq(CMD_REMOVE_FRAME));
1293 ui->actionAdd_Frame_Exposure->setShortcut(cmdKeySeq(CMD_SELECTION_ADD_FRAME_EXPOSURE));
1294 ui->actionSubtract_Frame_Exposure->setShortcut(cmdKeySeq(CMD_SELECTION_SUBTRACT_FRAME_EXPOSURE));
1295 ui->actionReverse_Frames_Order->setShortcut(cmdKeySeq(CMD_REVERSE_SELECTED_FRAMES));
1296 ui->actionRemove_Frames->setShortcut(cmdKeySeq(CMD_REMOVE_SELECTED_FRAMES));
1297 ui->actionMove_Frame_Backward->setShortcut(cmdKeySeq(CMD_MOVE_FRAME_BACKWARD));
1298 ui->actionMove_Frame_Forward->setShortcut(cmdKeySeq(CMD_MOVE_FRAME_FORWARD));
1299 ui->actionFlip_inbetween->setShortcut(cmdKeySeq(CMD_FLIP_INBETWEEN));
1300 ui->actionFlip_rolling->setShortcut(cmdKeySeq(CMD_FLIP_ROLLING));
1301 ui->actionReposition_Selected_Frames->setShortcut(cmdKeySeq(CMD_SELECTION_REPOSITION_FRAMES));
1304 ui->actionMove->setShortcut(cmdKeySeq(CMD_TOOL_MOVE));
1305 ui->actionSelect->setShortcut(cmdKeySeq(CMD_TOOL_SELECT));
1306 ui->actionBrush->setShortcut(cmdKeySeq(CMD_TOOL_BRUSH));
1307 ui->actionPolyline->setShortcut(cmdKeySeq(CMD_TOOL_POLYLINE));
1308 ui->actionSmudge->setShortcut(cmdKeySeq(CMD_TOOL_SMUDGE));
1309 ui->actionPen->setShortcut(cmdKeySeq(CMD_TOOL_PEN));
1310 ui->actionHand->setShortcut(cmdKeySeq(CMD_TOOL_HAND));
1311 ui->actionPencil->setShortcut(cmdKeySeq(CMD_TOOL_PENCIL));
1312 ui->actionBucket->setShortcut(cmdKeySeq(CMD_TOOL_BUCKET));
1313 ui->actionEyedropper->setShortcut(cmdKeySeq(CMD_TOOL_EYEDROPPER));
1314 ui->actionEraser->setShortcut(cmdKeySeq(CMD_TOOL_ERASER));
1315 ui->actionResetToolsDefault->setShortcut(cmdKeySeq(CMD_RESET_ALL_TOOLS));
1317 ui->actionMove->installEventFilter(shortcutFilter);
1318 ui->actionMove->installEventFilter(shortcutFilter);
1319 ui->actionSelect->installEventFilter(shortcutFilter);
1320 ui->actionBrush->installEventFilter(shortcutFilter);
1321 ui->actionPolyline->installEventFilter(shortcutFilter);
1322 ui->actionSmudge->installEventFilter(shortcutFilter);
1323 ui->actionPen->installEventFilter(shortcutFilter);
1324 ui->actionHand->installEventFilter(shortcutFilter);
1325 ui->actionPencil->installEventFilter(shortcutFilter);
1326 ui->actionBucket->installEventFilter(shortcutFilter);
1327 ui->actionEyedropper->installEventFilter(shortcutFilter);
1328 ui->actionEraser->installEventFilter(shortcutFilter);
1331 ui->actionNew_Bitmap_Layer->setShortcut(cmdKeySeq(CMD_NEW_BITMAP_LAYER));
1332 ui->actionNew_Vector_Layer->setShortcut(cmdKeySeq(CMD_NEW_VECTOR_LAYER));
1333 ui->actionNew_Camera_Layer->setShortcut(cmdKeySeq(CMD_NEW_CAMERA_LAYER));
1334 ui->actionNew_Sound_Layer->setShortcut(cmdKeySeq(CMD_NEW_SOUND_LAYER));
1335 ui->actionDelete_Current_Layer->setShortcut(cmdKeySeq(CMD_DELETE_CUR_LAYER));
1336 ui->actionChangeLineColorCurrent_keyframe->setShortcut(cmdKeySeq(CMD_CHANGE_LINE_COLOR_KEYFRAME));
1337 ui->actionChangeLineColorAll_keyframes_on_layer->setShortcut(cmdKeySeq(CMD_CHANGE_LINE_COLOR_LAYER));
1338 ui->actionChangeLayerOpacity->setShortcut(cmdKeySeq(CMD_CHANGE_LAYER_OPACITY));
1340 ui->actionVisibilityCurrentLayerOnly->setShortcut(cmdKeySeq(CMD_CURRENT_LAYER_VISIBILITY));
1341 ui->actionVisibilityRelative->setShortcut(cmdKeySeq(CMD_RELATIVE_LAYER_VISIBILITY));
1342 ui->actionVisibilityAll->setShortcut(cmdKeySeq(CMD_ALL_LAYER_VISIBILITY));
1344 mToolBox->toggleViewAction()->setShortcut(cmdKeySeq(CMD_TOGGLE_TOOLBOX));
1352 ui->actionHelp->setShortcut(cmdKeySeq(CMD_HELP));
1353 ui->actionExit->setShortcut(cmdKeySeq(CMD_EXIT));
1356void MainWindow2::clearKeyboardShortcuts()
1359 for (
QAction* action : actionList)
1365void MainWindow2::exportPalette()
1370 mEditor->object()->exportPalette(filePath);
1374void MainWindow2::importPalette()
1379 mEditor->object()->importPalette(filePath);
1380 mColorPalette->refreshColorList();
1381 mColorPalette->adjustSwatches();
1382 mEditor->color()->setColorNumber(0);
1386void MainWindow2::openPalette()
1388 for (
int i = 0; i < mEditor->object()->getColorCount(); i++)
1390 if (!mEditor->object()->isColorInUse(i))
1396 msgBox.
setText(
tr(
"Opening a palette will replace the old palette.\n"
1397 "Color(s) in strokes will be altered by this action!"));
1413 mEditor->object()->openPalette(filePath);
1414 mColorPalette->refreshColorList();
1415 mEditor->color()->setColorNumber(0);
1418void MainWindow2::makeConnections(
Editor* editor)
1420 connect(editor->undoRedo(), &UndoRedoManager::didUpdateUndoStack,
this, &MainWindow2::updateSaveState);
1421 connect(editor->undoRedo(), &UndoRedoManager::didUpdateUndoStack,
this, &MainWindow2::updateBackupActionState);
1422 connect(editor, &Editor::needDisplayInfo,
this, &MainWindow2::displayMessageBox);
1423 connect(editor, &Editor::needDisplayInfoNoTitle,
this, &MainWindow2::displayMessageBoxNoTitle);
1424 connect(editor->layers(), &LayerManager::currentLayerChanged,
this, &MainWindow2::currentLayerChanged);
1425 connect(editor->select(), &SelectionManager::selectionChanged,
this, &MainWindow2::selectionChanged);
1426 connect(editor, &Editor::canCopyChanged,
this, [=](
bool canCopy) {
1427 ui->actionCopy->setEnabled(canCopy);
1428 ui->actionCut->setEnabled(canCopy);
1433void MainWindow2::makeConnections(
Editor* editor,
ColorBox* colorBox)
1435 connect(colorBox, &ColorBox::colorChanged, editor->color(), &ColorManager::setFrontColor);
1436 connect(editor->color(), &ColorManager::colorChanged, colorBox, &ColorBox::setColor);
1441 connect(colorInspector, &ColorInspector::colorChanged, editor->color(), &ColorManager::setFrontColor);
1442 connect(editor->color(), &ColorManager::colorChanged, colorInspector, &ColorInspector::setColor);
1447 connect(editor->tools(), &ToolManager::toolChanged, scribbleArea, &ScribbleArea::updateToolCursor);
1448 connect(editor->tools(), &ToolManager::toolChanged, mToolBox, &ToolBoxWidget::onToolSetActive);
1449 connect(editor->tools(), &ToolManager::toolPropertyChanged, scribbleArea, &ScribbleArea::updateToolCursor);
1461void MainWindow2::makeConnections(
Editor* pEditor,
TimeLine* pTimeline)
1464 connect(pTimeline, &TimeLine::duplicateLayerClick, mCommands, &ActionCommands::duplicateLayer);
1465 connect(pTimeline, &TimeLine::duplicateKeyClick, mCommands, &ActionCommands::duplicateKey);
1467 connect(pTimeline, &TimeLine::soundClick, pPlaybackManager, &PlaybackManager::enableSound);
1468 connect(pTimeline, &TimeLine::fpsChanged, pPlaybackManager, &PlaybackManager::setFps);
1469 connect(pTimeline, &TimeLine::fpsChanged, pEditor, &Editor::setFps);
1472 connect(pTimeline, &TimeLine::removeKeyClick, mCommands, &ActionCommands::removeKey);
1474 connect(pTimeline, &TimeLine::newBitmapLayer, mCommands, &ActionCommands::addNewBitmapLayer);
1475 connect(pTimeline, &TimeLine::newVectorLayer, mCommands, &ActionCommands::addNewVectorLayer);
1476 connect(pTimeline, &TimeLine::newSoundLayer, mCommands, &ActionCommands::addNewSoundLayer);
1477 connect(pTimeline, &TimeLine::newCameraLayer, mCommands, &ActionCommands::addNewCameraLayer);
1478 connect(mTimeLine, &TimeLine::playButtonTriggered, mCommands, &ActionCommands::PlayStop);
1479 connect(pTimeline, &TimeLine::deleteCurrentLayerClick, mCommands, &ActionCommands::deleteCurrentLayer);
1483 connect(pTimeline, &TimeLine::selectionChanged,
this, &MainWindow2::updateCopyCutPasteEnabled);
1485 connect(mEditor->select(), &SelectionManager::selectionChanged,
this, &MainWindow2::updateCopyCutPasteEnabled);
1487 connect(pEditor->layers(), &LayerManager::currentLayerChanged, pTimeline, &TimeLine::updateUI);
1489 connect(pEditor->sound(), &SoundManager::soundClipDurationChanged, pTimeline, &TimeLine::updateUI);
1494 connect(pEditor, &Editor::objectLoaded, pTimeline, &TimeLine::onObjectLoaded);
1495 connect(pEditor, &Editor::updateTimeLine, pTimeline, &TimeLine::updateUI);
1496 connect(pEditor, &Editor::updateTimeLineCached, pTimeline, &TimeLine::updateUICached);
1498 connect(pEditor->layers(), &LayerManager::currentLayerChanged,
this, &MainWindow2::updateLayerMenu);
1499 connect(pEditor->layers(), &LayerManager::currentLayerChanged, mToolOptions, &ToolOptionWidget::updateUI);
1508 toolOptions->makeConnectionToEditor(editor);
1513 connect(pEditor, &Editor::objectLoaded, pColorPalette, &ColorPaletteWidget::updateUI);
1516 ScribbleArea* pScribbleArea = pEditor->getScribbleArea();
1518 connect(pColorPalette, &ColorPaletteWidget::colorNumberChanged, pColorManager, &ColorManager::setColorNumber);
1519 connect(pColorManager, &ColorManager::colorNumberChanged, pScribbleArea, &ScribbleArea::paletteColorChanged);
1520 connect(pColorManager, &ColorManager::colorNumberChanged, pColorPalette, &ColorPaletteWidget::selectColorNumber);
1523void MainWindow2::makeConnections(
Editor* editor,
StatusBar *statusBar)
1532void MainWindow2::updateCopyCutPasteEnabled()
1534 bool canCopy = mEditor->canCopy();
1535 bool canPaste = mEditor->canPaste();
1537 ui->actionCopy->setEnabled(canCopy);
1538 ui->actionCut->setEnabled(canCopy);
1539 ui->actionPaste->setEnabled(canPaste);
1542void MainWindow2::updateLayerMenu()
1544 ui->actionDelete_Current_Layer->setEnabled(mEditor->layers()->canDeleteLayer(mEditor->currentLayerIndex()));
1547void MainWindow2::changePlayState(
bool isPlaying)
1551 ui->actionPlay->setText(
tr(
"Stop"));
1552 ui->actionPlay->setIcon(mStopIcon);
1556 ui->actionPlay->setText(
tr(
"Play"));
1557 ui->actionPlay->setIcon(mStartIcon);
1562void MainWindow2::importMovieVideo()
1565 mSuppressAutoSaveDialog =
true;
1567 mCommands->importMovieVideo();
1569 mSuppressAutoSaveDialog =
false;
1572bool MainWindow2::event(
QEvent* event)
1580void MainWindow2::displayMessageBox(
const QString& title,
const QString& body)
1585void MainWindow2::displayMessageBoxNoTitle(
const QString& body)
1590bool MainWindow2::tryRecoverUnsavedProject()
1593 QStringList recoverables = fm.searchForUnsavedProjects();
1595 if (recoverables.
empty())
1600 QString caption =
tr(
"Restore Project?");
1601 QString text =
tr(
"Pencil2D didn't close correctly. Would you like to restore the project?");
1603 QString recoverPath = recoverables[0];
1614 hideQuestionMark(*msgBox);
1621void MainWindow2::startProjectRecovery(
int result)
1636 Object* o = fm.recoverUnsavedProject(recoverPath);
1637 if (!fm.error().ok())
1639 Q_ASSERT(o ==
nullptr);
1640 const QString title =
tr(
"Recovery Failed.");
1641 const QString text =
tr(
"Sorry! Pencil2D is unable to restore your project");
1647 mEditor->setObject(o);
1649 updateBackupActionState();
1651 const QString title =
tr(
"Recovery Succeeded!");
1652 const QString text =
tr(
"Please save your work immediately to prevent loss of data");
1656void MainWindow2::createToolbars()
1661 mMainToolbar->
addAction(ui->actionOpen);
1662 mMainToolbar->
addAction(ui->actionSave);
1664 mMainToolbar->
addAction(ui->actionUndo);
1665 mMainToolbar->
addAction(ui->actionRedo);
1668 mMainToolbar->
addAction(ui->actionCopy);
1669 mMainToolbar->
addAction(ui->actionPaste);
1670 mMainToolbar->
addAction(ui->actionClearFrame);
1674 mViewToolbar->
addAction(ui->actionZoom_In);
1675 mViewToolbar->
addAction(ui->actionZoom_Out);
1676 mViewToolbar->
addAction(ui->actionReset_View);
1678 mViewToolbar->
addAction(ui->actionHorizontal_Flip);
1679 mViewToolbar->
addAction(ui->actionVertical_Flip);
1681 mViewToolbar->
addAction(ui->actionShowInvisibleLines);
1682 mViewToolbar->
addAction(ui->actionShowOutlinesOnly);
1686 mOverlayToolbar->
addAction(ui->actionGrid);
1687 mOverlayToolbar->
addAction(ui->actionCenter);
1688 mOverlayToolbar->
addAction(ui->actionThirds);
1689 mOverlayToolbar->
addAction(ui->actionGoldenRatio);
1690 mOverlayToolbar->
addAction(ui->actionSafeAreas);
1691 mOverlayToolbar->
addAction(ui->actionOnePointPerspective);
1692 mOverlayToolbar->
addAction(ui->actionTwoPointPerspective);
1693 mOverlayToolbar->
addAction(ui->actionThreePointPerspective);
1699 perspectiveLinesAngleButton->
setDefaultAction(ui->menuPerspectiveLinesAngle->menuAction());
1701 mOverlayToolbar->
addWidget(perspectiveLinesAngleButton);
1703 mToolbars = { mMainToolbar, mViewToolbar, mOverlayToolbar };
1707 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