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"
43#include "polylinetool.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 "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();
274 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::openRepositionDialog()
544 if (mEditor->layers()->currentLayer()->getSelectedFramesByPos().
count() < 2)
547 tr(
"Please select at least 2 frames!"),
551 if (mReposDialog !=
nullptr)
559 hideQuestionMark(*mReposDialog);
560 mReposDialog->setCore(mEditor);
561 mReposDialog->initUI();
562 mEditor->tools()->setCurrentTool(ToolType::MOVE);
564 mReposDialog->
show();
567void MainWindow2::closeRepositionDialog()
570 mReposDialog =
nullptr;
573void MainWindow2::currentLayerChanged()
575 bool isBitmap = (mEditor->layers()->currentLayer()->type() == Layer::BITMAP);
576 ui->menuChange_line_color->setEnabled(isBitmap);
578 bool isVector = (mEditor->layers()->currentLayer()->type() == Layer::VECTOR);
579 ui->actionShowInvisibleLines->setEnabled(isVector);
580 ui->actionShowOutlinesOnly->setEnabled(isVector);
583void MainWindow2::selectionChanged()
585 bool somethingSelected = mEditor->select()->somethingSelected();
586 ui->menuSelection->setEnabled(somethingSelected);
589void MainWindow2::viewFlipped()
591 ui->actionHorizontal_Flip->setChecked(mEditor->view()->isFlipHorizontal());
592 ui->actionVertical_Flip->setChecked(mEditor->view()->isFlipVertical());
611 m2ndCloseEvent =
true;
619void MainWindow2::newDocument()
621 if (maybeSave() && !tryLoadPreset())
627void MainWindow2::openDocument()
636 openObject(fileName);
640bool MainWindow2::saveAsNewDocument()
647 return saveObject(fileName);
650void MainWindow2::openStartupFile(
const QString& filename)
652 if (tryRecoverUnsavedProject())
657 if (!filename.
isEmpty() && openObject(filename))
662 loadMostRecent() || tryLoadPreset();
665void MainWindow2::openFile(
const QString& filename)
669 openObject(filename);
673bool MainWindow2::openObject(
const QString& strFilePath)
676 hideQuestionMark(progress);
680 Status s = mEditor->openObject(strFilePath, [&progress](
int p)
682 progress.setValue(p);
684 }, [&progress](
int max)
686 progress.setRange(0, max);
691 ErrorDialog errorDialog(s.title(), s.description(), s.details().str());
693 emptyDocumentWhenErrorOccurred();
698 settings.setValue(LAST_PCLX_PATH, mEditor->object()->filePath());
701 if (!mEditor->object()->filePath().
isEmpty())
703 mRecentFileMenu->addRecentFile(mEditor->object()->filePath());
704 mRecentFileMenu->saveToDisk();
711 ui->statusBar->updateModifiedStatus(
false);
713 progress.setValue(progress.maximum());
716 updateBackupActionState();
718 if (!
QFileInfo(strFilePath).isWritable())
721 tr(
"This program does not currently have permission to write to the file you have selected. "
722 "Please make sure you have write permission for this file before attempting to save it. "
723 "Alternatively, you can use the Save As... menu option to save to a writable location."),
730bool MainWindow2::saveObject(
QString strSavedFileName)
733 hideQuestionMark(progress);
737 mEditor->prepareSave();
741 connect(&fm, &FileManager::progressChanged, [&progress](
int p)
743 progress.setValue(p);
746 connect(&fm, &FileManager::progressRangeChanged, [&progress](
int max)
748 progress.setRange(0, max + 3);
751 Status st = fm.save(mEditor->object(), strSavedFileName);
756#if QT_VERSION >= QT_VERSION_CHECK(5, 4, 0)
761 errorLogFolder.mkpath(
"./logs");
762 errorLogFolder.cd(
"logs");
770 out << st.details().str();
775 st.description().append(
tr(
"<br><br>An error has occurred and your file may not have saved successfully."
776 "If you believe that this error is an issue with Pencil2D, please create a new issue at:"
777 "<br><a href='https://github.com/pencil2d/pencil/issues'>https://github.com/pencil2d/pencil/issues</a><br>"
778 "Please be sure to include the following details in your issue:")), st.details().html());
783 mEditor->object()->setFilePath(strSavedFileName);
784 mEditor->object()->setModified(
false);
786 mEditor->clearTemporary();
789 settings.setValue(LAST_PCLX_PATH, strSavedFileName);
791 mRecentFileMenu->addRecentFile(strSavedFileName);
792 mRecentFileMenu->saveToDisk();
794 mTimeLine->updateContent();
799 progress.setValue(progress.maximum());
801 mEditor->resetAutoSaveCounter();
806bool MainWindow2::saveDocument()
808 if (!mEditor->object()->filePath().
isEmpty())
809 return saveObject(mEditor->object()->filePath());
811 return saveAsNewDocument();
814bool MainWindow2::maybeSave()
822 tr(
"This animation has been modified.\n Do you want to save your changes?"),
825 return saveDocument();
830bool MainWindow2::autoSave()
832 if (!mEditor->object()->filePath().
isEmpty())
834 return saveDocument();
837 if (mEditor->autoSaveNeverAskAgain())
840 if(mSuppressAutoSaveDialog)
845 msgBox.setWindowTitle(
tr(
"AutoSave Reminder"));
846 msgBox.setText(
tr(
"The animation is not saved yet.\n Do you want to save now?"));
851 int ret = msgBox.exec();
854 return saveDocument();
858 mEditor->dontAskAutoSave(
true);
864void MainWindow2::emptyDocumentWhenErrorOccurred()
872void MainWindow2::importImage()
876 if (strFilePath.
isEmpty()) {
return; }
880 OnScopeExit(
delete positionDialog)
882 positionDialog->
exec();
889 Status st = mEditor->importImage(strFilePath);
892 ErrorDialog errorDialog(st.title(), st.description(), st.details().html());
897 ui->scribbleArea->updateFrame();
898 mTimeLine->updateContent();
901void MainWindow2::importImageSequence()
903 mSuppressAutoSaveDialog =
true;
906 OnScopeExit(
delete imageSeqDialog)
907 imageSeqDialog->setCore(mEditor);
911 imageSeqDialog->
exec();
918 OnScopeExit(
delete positionDialog)
920 positionDialog->
exec();
926 imageSeqDialog->importArbitrarySequence();
928 mSuppressAutoSaveDialog =
false;
931void MainWindow2::importPredefinedImageSet()
934 OnScopeExit(
delete imageSeqDialog)
935 imageSeqDialog->setCore(mEditor);
939 mSuppressAutoSaveDialog =
true;
940 imageSeqDialog->
exec();
947 OnScopeExit(
delete positionDialog)
949 positionDialog->
exec();
955 imageSeqDialog->importPredefinedSet();
956 mSuppressAutoSaveDialog =
false;
959void MainWindow2::importLayers()
962 importLayers->setCore(mEditor);
964 importLayers->
open();
967void MainWindow2::importAnimatedImage()
970 mSuppressAutoSaveDialog =
true;
972 mCommands->importAnimatedImage();
974 mSuppressAutoSaveDialog =
false;
977void MainWindow2::lockWidgets(
bool shouldLock)
981 : (QDockWidget::DockWidgetFeature::DockWidgetClosable |
982 QDockWidget::DockWidgetFeature::DockWidgetMovable |
983 QDockWidget::DockWidgetFeature::DockWidgetFloatable);
987 d->setFeatures(feat);
992 QWidget* customTitleBarWidget = shouldLock ? (
new QWidget) :
nullptr;
993 d->setTitleBarWidget(customTitleBarWidget);
997void MainWindow2::preferences()
1002 mPrefDialog->
raise();
1008 mPrefDialog->init(mEditor->preference());
1010 connect(mPrefDialog, &PreferencesDialog::windowOpacityChange,
this, &MainWindow2::setOpacity);
1011 connect(mPrefDialog, &PreferencesDialog::soundScrubChanged, mEditor->playback(), &PlaybackManager::setSoundScrubActive);
1012 connect(mPrefDialog, &PreferencesDialog::soundScrubMsecChanged, mEditor->playback(), &PlaybackManager::setSoundScrubMsec);
1015 clearKeyboardShortcuts();
1016 setupKeyboardShortcuts();
1017 mPrefDialog =
nullptr;
1020 mPrefDialog->
show();
1023void MainWindow2::resetAndDockAllSubWidgets()
1026 settings.remove(SETTING_WINDOW_GEOMETRY);
1027 settings.remove(SETTING_WINDOW_STATE);
1031 dock->setFloating(
false);
1045void MainWindow2::newObject()
1047 auto object =
new Object();
1051 object->addNewCameraLayer();
1052 object->addNewBitmapLayer();
1056 object->data()->setCurrentLayer(1);
1058 mEditor->setObject(
object);
1064 updateBackupActionState();
1067bool MainWindow2::newObjectFromPresets(
int presetIndex)
1069 QString presetFilePath = PresetDialog::getPresetPath(presetIndex);
1077 Object*
object = fm.load(presetFilePath);
1079 if (!fm.error().ok() ||
object ==
nullptr)
1084 mEditor->setObject(
object);
1085 object->setFilePath(
QString());
1089 updateBackupActionState();
1094bool MainWindow2::loadMostRecent()
1096 if(!mEditor->preference()->isOn(SETTING::LOAD_MOST_RECENT))
1102 QString myPath = settings.value(LAST_PCLX_PATH,
QVariant(
"")).toString();
1107 return openObject(myPath);
1110bool MainWindow2::tryLoadPreset()
1112 if (!mEditor->preference()->isOn(SETTING::ASK_FOR_PRESET))
1114 int defaultPreset = mEditor->preference()->getInt(SETTING::DEFAULT_PRESET);
1115 return newObjectFromPresets(defaultPreset);
1127 int presetIndex = presetDialog->getPresetIndex();
1128 if (presetDialog->shouldAlwaysUse())
1130 mEditor->preference()->set(SETTING::ASK_FOR_PRESET, false);
1131 mEditor->preference()->set(SETTING::DEFAULT_PRESET, presetIndex);
1133 if (!newObjectFromPresets(presetIndex))
1138 presetDialog->
open();
1142void MainWindow2::closeDialogs()
1149void MainWindow2::readSettings()
1153 QVariant winGeometry = settings.
value(SETTING_WINDOW_GEOMETRY);
1159 int opacity = mEditor->preference()->getInt(SETTING::WINDOW_OPACITY);
1160 setOpacity(100 - opacity);
1162 bool isWindowsLocked = mEditor->preference()->isOn(SETTING::LAYOUT_LOCK);
1163 lockWidgets(isWindowsLocked);
1166void MainWindow2::writeSettings()
1169 settings.setValue(SETTING_WINDOW_GEOMETRY,
saveGeometry());
1170 settings.setValue(SETTING_WINDOW_STATE,
saveState());
1173void MainWindow2::setupKeyboardShortcuts()
1175 checkExistingShortcuts();
1179 strCommandName =
QString(
"shortcuts/") + strCommandName;
1185 ui->actionNew->setShortcut(cmdKeySeq(CMD_NEW_FILE));
1186 ui->actionOpen->setShortcut(cmdKeySeq(CMD_OPEN_FILE));
1187 ui->actionSave->setShortcut(cmdKeySeq(CMD_SAVE_FILE));
1188 ui->actionSave_as->setShortcut(cmdKeySeq(CMD_SAVE_AS));
1190 ui->actionImport_Image->setShortcut(cmdKeySeq(CMD_IMPORT_IMAGE));
1191 ui->actionImport_ImageSeq->setShortcut(cmdKeySeq(CMD_IMPORT_IMAGE_SEQ));
1192 ui->actionImport_ImageSeqNum->setShortcut(cmdKeySeq(CMD_IMPORT_IMAGE_PREDEFINED_SET));
1193 ui->actionImport_MovieVideo->setShortcut(cmdKeySeq(CMD_IMPORT_MOVIE_VIDEO));
1194 ui->actionImport_AnimatedImage->setShortcut(cmdKeySeq(CMD_IMPORT_ANIMATED_IMAGE));
1195 ui->actionImportLayers_from_pclx->setShortcut(cmdKeySeq(CMD_IMPORT_LAYERS));
1196 ui->actionImport_Sound->setShortcut(cmdKeySeq(CMD_IMPORT_SOUND));
1197 ui->actionImport_MovieAudio->setShortcut(cmdKeySeq(CMD_IMPORT_MOVIE_AUDIO));
1198 ui->actionImport_Append_Palette->setShortcut(cmdKeySeq(CMD_IMPORT_PALETTE));
1199 ui->actionImport_Replace_Palette->setShortcut(cmdKeySeq(CMD_IMPORT_PALETTE_REPLACE));
1201 ui->actionExport_Image->setShortcut(cmdKeySeq(CMD_EXPORT_IMAGE));
1202 ui->actionExport_ImageSeq->setShortcut(cmdKeySeq(CMD_EXPORT_IMAGE_SEQ));
1203 ui->actionExport_Movie->setShortcut(cmdKeySeq(CMD_EXPORT_MOVIE));
1204 ui->actionExport_Animated_GIF->setShortcut(cmdKeySeq(CMD_EXPORT_GIF));
1205 ui->actionExport_Palette->setShortcut(cmdKeySeq(CMD_EXPORT_PALETTE));
1208 ui->actionUndo->setShortcut(cmdKeySeq(CMD_UNDO));
1209 ui->actionRedo->setShortcut(cmdKeySeq(CMD_REDO));
1210 ui->actionRemoveLastPolylineSegment->setShortcut(cmdKeySeq(CMD_REMOVE_LAST_POLYLINE_SEGMENT));
1211 ui->actionCut->setShortcut(cmdKeySeq(CMD_CUT));
1212 ui->actionCopy->setShortcut(cmdKeySeq(CMD_COPY));
1213 ui->actionPaste_Previous->setShortcut(cmdKeySeq(CMD_PASTE_FROM_PREVIOUS));
1214 ui->actionPaste->setShortcut(cmdKeySeq(CMD_PASTE));
1215 ui->actionClearFrame->setShortcut(cmdKeySeq(CMD_CLEAR_FRAME));
1216 ui->actionFlip_X->setShortcut(cmdKeySeq(CMD_SELECTION_FLIP_HORIZONTAL));
1217 ui->actionFlip_Y->setShortcut(cmdKeySeq(CMD_SELECTION_FLIP_VERTICAL));
1218 ui->actionSelect_All->setShortcut(cmdKeySeq(CMD_SELECT_ALL));
1219 ui->actionDeselect_All->setShortcut(cmdKeySeq(CMD_DESELECT_ALL));
1220 ui->actionPegbarAlignment->setShortcut(cmdKeySeq(CMD_PEGBAR_ALIGNMENT));
1221 ui->actionPreference->setShortcut(cmdKeySeq(CMD_PREFERENCE));
1224 ui->actionResetWindows->setShortcut(cmdKeySeq(CMD_RESET_WINDOWS));
1225 ui->actionLockWindows->setShortcut(cmdKeySeq(CMD_LOCK_WINDOWS));
1226 ui->actionReset_View->setShortcut(cmdKeySeq(CMD_RESET_ZOOM_ROTATE));
1227 ui->actionCenter_View->setShortcut(cmdKeySeq(CMD_CENTER_VIEW));
1228 ui->actionZoom_In->setShortcut(cmdKeySeq(CMD_ZOOM_IN));
1229 ui->actionZoom_Out->setShortcut(cmdKeySeq(CMD_ZOOM_OUT));
1230 ui->actionZoom400->setShortcut(cmdKeySeq(CMD_ZOOM_400));
1231 ui->actionZoom300->setShortcut(cmdKeySeq(CMD_ZOOM_300));
1232 ui->actionZoom200->setShortcut(cmdKeySeq(CMD_ZOOM_200));
1233 ui->actionZoom100->setShortcut(cmdKeySeq(CMD_ZOOM_100));
1234 ui->actionZoom50->setShortcut(cmdKeySeq(CMD_ZOOM_50));
1235 ui->actionZoom33->setShortcut(cmdKeySeq(CMD_ZOOM_33));
1236 ui->actionZoom25->setShortcut(cmdKeySeq(CMD_ZOOM_25));
1237 ui->actionRotate_Clockwise->setShortcut(cmdKeySeq(CMD_ROTATE_CLOCK));
1238 ui->actionRotate_Anticlockwise->setShortcut(cmdKeySeq(CMD_ROTATE_ANTI_CLOCK));
1239 ui->actionReset_Rotation->setShortcut(cmdKeySeq(CMD_RESET_ROTATION));
1240 ui->actionHorizontal_Flip->setShortcut(cmdKeySeq(CMD_FLIP_HORIZONTAL));
1241 ui->actionVertical_Flip->setShortcut(cmdKeySeq(CMD_FLIP_VERTICAL));
1242 ui->actionGrid->setShortcut(cmdKeySeq(CMD_GRID));
1243 ui->actionCenter->setShortcut(cmdKeySeq(CMD_OVERLAY_CENTER));
1244 ui->actionThirds->setShortcut(cmdKeySeq(CMD_OVERLAY_THIRDS));
1245 ui->actionGoldenRatio->setShortcut(cmdKeySeq(CMD_OVERLAY_GOLDEN_RATIO));
1246 ui->actionSafeAreas->setShortcut(cmdKeySeq(CMD_OVERLAY_SAFE_AREAS));
1247 ui->actionOnePointPerspective->setShortcut(cmdKeySeq(CMD_OVERLAY_ONE_POINT_PERSPECTIVE));
1248 ui->actionTwoPointPerspective->setShortcut(cmdKeySeq(CMD_OVERLAY_TWO_POINT_PERSPECTIVE));
1249 ui->actionThreePointPerspective->setShortcut(cmdKeySeq(CMD_OVERLAY_THREE_POINT_PERSPECTIVE));
1250 ui->actionOnionPrev->setShortcut(cmdKeySeq(CMD_ONIONSKIN_PREV));
1251 ui->actionOnionNext->setShortcut(cmdKeySeq(CMD_ONIONSKIN_NEXT));
1252 ui->actionStatusBar->setShortcut(cmdKeySeq(CMD_TOGGLE_STATUS_BAR));
1255 ui->actionPlay->setShortcut(cmdKeySeq(CMD_PLAY));
1256 ui->actionLoop->setShortcut(cmdKeySeq(CMD_LOOP));
1257 ui->actionLoopControl->setShortcut(cmdKeySeq(CMD_LOOP_CONTROL));
1258 ui->actionPrevious_Frame->setShortcut(cmdKeySeq(CMD_GOTO_PREV_FRAME));
1259 ui->actionNext_Frame->setShortcut(cmdKeySeq(CMD_GOTO_NEXT_FRAME));
1260 ui->actionPrev_KeyFrame->setShortcut(cmdKeySeq(CMD_GOTO_PREV_KEY_FRAME));
1261 ui->actionNext_KeyFrame->setShortcut(cmdKeySeq(CMD_GOTO_NEXT_KEY_FRAME));
1262 ui->actionAdd_Frame->setShortcut(cmdKeySeq(CMD_ADD_FRAME));
1263 ui->actionDuplicate_Frame->setShortcut(cmdKeySeq(CMD_DUPLICATE_FRAME));
1264 ui->actionRemove_Frame->setShortcut(cmdKeySeq(CMD_REMOVE_FRAME));
1265 ui->actionAdd_Frame_Exposure->setShortcut(cmdKeySeq(CMD_SELECTION_ADD_FRAME_EXPOSURE));
1266 ui->actionSubtract_Frame_Exposure->setShortcut(cmdKeySeq(CMD_SELECTION_SUBTRACT_FRAME_EXPOSURE));
1267 ui->actionReverse_Frames_Order->setShortcut(cmdKeySeq(CMD_REVERSE_SELECTED_FRAMES));
1268 ui->actionRemove_Frames->setShortcut(cmdKeySeq(CMD_REMOVE_SELECTED_FRAMES));
1269 ui->actionMove_Frame_Backward->setShortcut(cmdKeySeq(CMD_MOVE_FRAME_BACKWARD));
1270 ui->actionMove_Frame_Forward->setShortcut(cmdKeySeq(CMD_MOVE_FRAME_FORWARD));
1271 ui->actionFlip_inbetween->setShortcut(cmdKeySeq(CMD_FLIP_INBETWEEN));
1272 ui->actionFlip_rolling->setShortcut(cmdKeySeq(CMD_FLIP_ROLLING));
1273 ui->actionReposition_Selected_Frames->setShortcut(cmdKeySeq(CMD_SELECTION_REPOSITION_FRAMES));
1276 ui->actionMove->setShortcut(cmdKeySeq(CMD_TOOL_MOVE));
1277 ui->actionSelect->setShortcut(cmdKeySeq(CMD_TOOL_SELECT));
1278 ui->actionBrush->setShortcut(cmdKeySeq(CMD_TOOL_BRUSH));
1279 ui->actionPolyline->setShortcut(cmdKeySeq(CMD_TOOL_POLYLINE));
1280 ui->actionSmudge->setShortcut(cmdKeySeq(CMD_TOOL_SMUDGE));
1281 ui->actionPen->setShortcut(cmdKeySeq(CMD_TOOL_PEN));
1282 ui->actionHand->setShortcut(cmdKeySeq(CMD_TOOL_HAND));
1283 ui->actionPencil->setShortcut(cmdKeySeq(CMD_TOOL_PENCIL));
1284 ui->actionBucket->setShortcut(cmdKeySeq(CMD_TOOL_BUCKET));
1285 ui->actionEyedropper->setShortcut(cmdKeySeq(CMD_TOOL_EYEDROPPER));
1286 ui->actionEraser->setShortcut(cmdKeySeq(CMD_TOOL_ERASER));
1287 ui->actionResetToolsDefault->setShortcut(cmdKeySeq(CMD_RESET_ALL_TOOLS));
1289 ui->actionMove->installEventFilter(shortcutFilter);
1290 ui->actionMove->installEventFilter(shortcutFilter);
1291 ui->actionSelect->installEventFilter(shortcutFilter);
1292 ui->actionBrush->installEventFilter(shortcutFilter);
1293 ui->actionPolyline->installEventFilter(shortcutFilter);
1294 ui->actionSmudge->installEventFilter(shortcutFilter);
1295 ui->actionPen->installEventFilter(shortcutFilter);
1296 ui->actionHand->installEventFilter(shortcutFilter);
1297 ui->actionPencil->installEventFilter(shortcutFilter);
1298 ui->actionBucket->installEventFilter(shortcutFilter);
1299 ui->actionEyedropper->installEventFilter(shortcutFilter);
1300 ui->actionEraser->installEventFilter(shortcutFilter);
1303 ui->actionNew_Bitmap_Layer->setShortcut(cmdKeySeq(CMD_NEW_BITMAP_LAYER));
1304 ui->actionNew_Vector_Layer->setShortcut(cmdKeySeq(CMD_NEW_VECTOR_LAYER));
1305 ui->actionNew_Camera_Layer->setShortcut(cmdKeySeq(CMD_NEW_CAMERA_LAYER));
1306 ui->actionNew_Sound_Layer->setShortcut(cmdKeySeq(CMD_NEW_SOUND_LAYER));
1307 ui->actionDelete_Current_Layer->setShortcut(cmdKeySeq(CMD_DELETE_CUR_LAYER));
1308 ui->actionChangeLineColorCurrent_keyframe->setShortcut(cmdKeySeq(CMD_CHANGE_LINE_COLOR_KEYFRAME));
1309 ui->actionChangeLineColorAll_keyframes_on_layer->setShortcut(cmdKeySeq(CMD_CHANGE_LINE_COLOR_LAYER));
1310 ui->actionChangeLayerOpacity->setShortcut(cmdKeySeq(CMD_CHANGE_LAYER_OPACITY));
1312 ui->actionVisibilityCurrentLayerOnly->setShortcut(cmdKeySeq(CMD_CURRENT_LAYER_VISIBILITY));
1313 ui->actionVisibilityRelative->setShortcut(cmdKeySeq(CMD_RELATIVE_LAYER_VISIBILITY));
1314 ui->actionVisibilityAll->setShortcut(cmdKeySeq(CMD_ALL_LAYER_VISIBILITY));
1316 mToolBox->toggleViewAction()->setShortcut(cmdKeySeq(CMD_TOGGLE_TOOLBOX));
1324 ui->actionHelp->setShortcut(cmdKeySeq(CMD_HELP));
1325 ui->actionExit->setShortcut(cmdKeySeq(CMD_EXIT));
1328 addAction(ui->actionRemoveLastPolylineSegment);
1331void MainWindow2::clearKeyboardShortcuts()
1334 for (
QAction* action : actionList)
1340void MainWindow2::exportPalette()
1345 mEditor->object()->exportPalette(filePath);
1349void MainWindow2::importPalette()
1354 mEditor->object()->importPalette(filePath);
1355 mColorPalette->refreshColorList();
1356 mColorPalette->adjustSwatches();
1357 mEditor->color()->setColorNumber(0);
1361void MainWindow2::openPalette()
1363 for (
int i = 0; i < mEditor->object()->getColorCount(); i++)
1365 if (!mEditor->object()->isColorInUse(i))
1371 msgBox.
setText(
tr(
"Opening a palette will replace the old palette.\n"
1372 "Color(s) in strokes will be altered by this action!"));
1388 mEditor->object()->openPalette(filePath);
1389 mColorPalette->refreshColorList();
1390 mEditor->color()->setColorNumber(0);
1393void MainWindow2::makeConnections(
Editor* editor)
1395 connect(editor->undoRedo(), &UndoRedoManager::didUpdateUndoStack,
this, &MainWindow2::updateSaveState);
1396 connect(editor->undoRedo(), &UndoRedoManager::didUpdateUndoStack,
this, &MainWindow2::updateBackupActionState);
1397 connect(editor, &Editor::needDisplayInfo,
this, &MainWindow2::displayMessageBox);
1398 connect(editor, &Editor::needDisplayInfoNoTitle,
this, &MainWindow2::displayMessageBoxNoTitle);
1399 connect(editor->layers(), &LayerManager::currentLayerChanged,
this, &MainWindow2::currentLayerChanged);
1400 connect(editor->select(), &SelectionManager::selectionChanged,
this, &MainWindow2::selectionChanged);
1401 connect(editor, &Editor::canCopyChanged,
this, [=](
bool canCopy) {
1402 ui->actionCopy->setEnabled(canCopy);
1403 ui->actionCut->setEnabled(canCopy);
1408void MainWindow2::makeConnections(
Editor* editor,
ColorBox* colorBox)
1410 connect(colorBox, &ColorBox::colorChanged, editor->color(), &ColorManager::setFrontColor);
1411 connect(editor->color(), &ColorManager::colorChanged, colorBox, &ColorBox::setColor);
1416 connect(colorInspector, &ColorInspector::colorChanged, editor->color(), &ColorManager::setFrontColor);
1417 connect(editor->color(), &ColorManager::colorChanged, colorInspector, &ColorInspector::setColor);
1422 connect(editor->tools(), &ToolManager::toolChanged, scribbleArea, &ScribbleArea::updateToolCursor);
1423 connect(editor->tools(), &ToolManager::toolChanged, mToolBox, &ToolBoxWidget::onToolSetActive);
1424 connect(editor->tools(), &ToolManager::toolPropertyChanged, scribbleArea, &ScribbleArea::updateToolCursor);
1436void MainWindow2::makeConnections(
Editor* pEditor,
TimeLine* pTimeline)
1439 connect(pTimeline, &TimeLine::duplicateLayerClick, mCommands, &ActionCommands::duplicateLayer);
1440 connect(pTimeline, &TimeLine::duplicateKeyClick, mCommands, &ActionCommands::duplicateKey);
1442 connect(pTimeline, &TimeLine::soundClick, pPlaybackManager, &PlaybackManager::enableSound);
1443 connect(pTimeline, &TimeLine::fpsChanged, pPlaybackManager, &PlaybackManager::setFps);
1444 connect(pTimeline, &TimeLine::fpsChanged, pEditor, &Editor::setFps);
1447 connect(pTimeline, &TimeLine::removeKeyClick, mCommands, &ActionCommands::removeKey);
1449 connect(pTimeline, &TimeLine::newBitmapLayer, mCommands, &ActionCommands::addNewBitmapLayer);
1450 connect(pTimeline, &TimeLine::newVectorLayer, mCommands, &ActionCommands::addNewVectorLayer);
1451 connect(pTimeline, &TimeLine::newSoundLayer, mCommands, &ActionCommands::addNewSoundLayer);
1452 connect(pTimeline, &TimeLine::newCameraLayer, mCommands, &ActionCommands::addNewCameraLayer);
1453 connect(mTimeLine, &TimeLine::playButtonTriggered, mCommands, &ActionCommands::PlayStop);
1454 connect(pTimeline, &TimeLine::deleteCurrentLayerClick, mCommands, &ActionCommands::deleteCurrentLayer);
1458 connect(pTimeline, &TimeLine::selectionChanged,
this, &MainWindow2::updateCopyCutPasteEnabled);
1460 connect(mEditor->select(), &SelectionManager::selectionChanged,
this, &MainWindow2::updateCopyCutPasteEnabled);
1462 connect(pEditor->layers(), &LayerManager::currentLayerChanged, pTimeline, &TimeLine::updateUI);
1464 connect(pEditor->sound(), &SoundManager::soundClipDurationChanged, pTimeline, &TimeLine::updateUI);
1469 connect(pEditor, &Editor::objectLoaded, pTimeline, &TimeLine::onObjectLoaded);
1470 connect(pEditor, &Editor::updateTimeLine, pTimeline, &TimeLine::updateUI);
1471 connect(pEditor, &Editor::updateTimeLineCached, pTimeline, &TimeLine::updateUICached);
1473 connect(pEditor->layers(), &LayerManager::currentLayerChanged,
this, &MainWindow2::updateLayerMenu);
1474 connect(pEditor->layers(), &LayerManager::currentLayerChanged, mToolOptions, &ToolOptionWidget::updateUI);
1483 toolOptions->makeConnectionToEditor(editor);
1488 connect(pEditor, &Editor::objectLoaded, pColorPalette, &ColorPaletteWidget::updateUI);
1491 ScribbleArea* pScribbleArea = pEditor->getScribbleArea();
1493 connect(pColorPalette, &ColorPaletteWidget::colorNumberChanged, pColorManager, &ColorManager::setColorNumber);
1494 connect(pColorManager, &ColorManager::colorNumberChanged, pScribbleArea, &ScribbleArea::paletteColorChanged);
1495 connect(pColorManager, &ColorManager::colorNumberChanged, pColorPalette, &ColorPaletteWidget::selectColorNumber);
1498void MainWindow2::makeConnections(
Editor* editor,
StatusBar *statusBar)
1507void MainWindow2::updateCopyCutPasteEnabled()
1509 bool canCopy = mEditor->canCopy();
1510 bool canPaste = mEditor->canPaste();
1512 ui->actionCopy->setEnabled(canCopy);
1513 ui->actionCut->setEnabled(canCopy);
1514 ui->actionPaste->setEnabled(canPaste);
1517void MainWindow2::updateLayerMenu()
1519 ui->actionDelete_Current_Layer->setEnabled(mEditor->layers()->canDeleteLayer(mEditor->currentLayerIndex()));
1522void MainWindow2::changePlayState(
bool isPlaying)
1526 ui->actionPlay->setText(
tr(
"Stop"));
1527 ui->actionPlay->setIcon(mStopIcon);
1531 ui->actionPlay->setText(
tr(
"Play"));
1532 ui->actionPlay->setIcon(mStartIcon);
1537void MainWindow2::importMovieVideo()
1540 mSuppressAutoSaveDialog =
true;
1542 mCommands->importMovieVideo();
1544 mSuppressAutoSaveDialog =
false;
1547bool MainWindow2::event(
QEvent* event)
1555void MainWindow2::displayMessageBox(
const QString& title,
const QString& body)
1560void MainWindow2::displayMessageBoxNoTitle(
const QString& body)
1565bool MainWindow2::tryRecoverUnsavedProject()
1568 QStringList recoverables = fm.searchForUnsavedProjects();
1570 if (recoverables.
empty())
1575 QString caption =
tr(
"Restore Project?");
1576 QString text =
tr(
"Pencil2D didn't close correctly. Would you like to restore the project?");
1578 QString recoverPath = recoverables[0];
1589 hideQuestionMark(*msgBox);
1596void MainWindow2::startProjectRecovery(
int result)
1611 Object* o = fm.recoverUnsavedProject(recoverPath);
1612 if (!fm.error().ok())
1614 Q_ASSERT(o ==
nullptr);
1615 const QString title =
tr(
"Recovery Failed.");
1616 const QString text =
tr(
"Sorry! Pencil2D is unable to restore your project");
1622 mEditor->setObject(o);
1624 updateBackupActionState();
1626 const QString title =
tr(
"Recovery Succeeded!");
1627 const QString text =
tr(
"Please save your work immediately to prevent loss of data");
1631void MainWindow2::createToolbars()
1636 mMainToolbar->
addAction(ui->actionOpen);
1637 mMainToolbar->
addAction(ui->actionSave);
1639 mMainToolbar->
addAction(ui->actionUndo);
1640 mMainToolbar->
addAction(ui->actionRedo);
1643 mMainToolbar->
addAction(ui->actionCopy);
1644 mMainToolbar->
addAction(ui->actionPaste);
1645 mMainToolbar->
addAction(ui->actionClearFrame);
1649 mViewToolbar->
addAction(ui->actionZoom_In);
1650 mViewToolbar->
addAction(ui->actionZoom_Out);
1651 mViewToolbar->
addAction(ui->actionReset_View);
1653 mViewToolbar->
addAction(ui->actionHorizontal_Flip);
1654 mViewToolbar->
addAction(ui->actionVertical_Flip);
1656 mViewToolbar->
addAction(ui->actionShowInvisibleLines);
1657 mViewToolbar->
addAction(ui->actionShowOutlinesOnly);
1661 mOverlayToolbar->
addAction(ui->actionGrid);
1662 mOverlayToolbar->
addAction(ui->actionCenter);
1663 mOverlayToolbar->
addAction(ui->actionThirds);
1664 mOverlayToolbar->
addAction(ui->actionGoldenRatio);
1665 mOverlayToolbar->
addAction(ui->actionSafeAreas);
1666 mOverlayToolbar->
addAction(ui->actionOnePointPerspective);
1667 mOverlayToolbar->
addAction(ui->actionTwoPointPerspective);
1668 mOverlayToolbar->
addAction(ui->actionThreePointPerspective);
1674 perspectiveLinesAngleButton->
setDefaultAction(ui->menuPerspectiveLinesAngle->menuAction());
1676 mOverlayToolbar->
addWidget(perspectiveLinesAngleButton);
1678 mToolbars = { mMainToolbar, mViewToolbar, mOverlayToolbar };
1682 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