File indexing completed on 2024-05-12 04:57:15

0001 #include "application.h"
0002 
0003 #include "appglobal.h"
0004 #include "actions/kcodecactionext.h"
0005 #include "actions/krecentfilesactionext.h"
0006 #include "actions/useraction.h"
0007 #include "actions/useractionnames.h"
0008 #include "core/undo/undostack.h"
0009 #include "gui/playerwidget.h"
0010 #include "gui/waveform/waveformwidget.h"
0011 #include "scripting/scriptsmanager.h"
0012 #include "translate/translatedialog.h"
0013 #include "videoplayer/videoplayer.h"
0014 
0015 #include <QAction>
0016 #include <QMenu>
0017 #include <QTextCodec>
0018 
0019 #include <KLocalizedString>
0020 #include <kwidgetsaddons_version.h>
0021 
0022 
0023 using namespace SubtitleComposer;
0024 
0025 void
0026 Application::setupActions()
0027 {
0028     KActionCollection *actionCollection = m_mainWindow->actionCollection();
0029     UserActionManager *actionManager = UserActionManager::instance();
0030     VideoPlayer *videoPlayer = VideoPlayer::instance();
0031 
0032     QAction *quitAction = KStandardAction::quit(m_mainWindow, &MainWindow::close, actionCollection);
0033     quitAction->setStatusTip(i18n("Exit the application"));
0034 
0035     QAction *prefsAction = KStandardAction::preferences(this, &Application::showPreferences, actionCollection);
0036     prefsAction->setStatusTip(i18n("Configure Subtitle Composer"));
0037 
0038     QAction *newSubtitleAction = new QAction(actionCollection);
0039     newSubtitleAction->setIcon(QIcon::fromTheme("document-new"));
0040     newSubtitleAction->setText(i18nc("@action:inmenu Create a new subtitle", "New"));
0041     newSubtitleAction->setStatusTip(i18n("Create an empty subtitle"));
0042     actionCollection->setDefaultShortcuts(newSubtitleAction, KStandardShortcut::openNew());
0043     connect(newSubtitleAction, &QAction::triggered, this, &Application::newSubtitle);
0044     actionCollection->addAction(ACT_NEW_SUBTITLE, newSubtitleAction);
0045     actionManager->addAction(newSubtitleAction, UserAction::FullScreenOff);
0046 
0047     QAction *openSubtitleAction = new QAction(actionCollection);
0048     openSubtitleAction->setIcon(QIcon::fromTheme("document-open"));
0049     openSubtitleAction->setText(i18nc("@action:inmenu Open subtitle file", "Open Subtitle..."));
0050     openSubtitleAction->setStatusTip(i18n("Open subtitle file"));
0051     actionCollection->setDefaultShortcuts(openSubtitleAction, KStandardShortcut::open());
0052     connect(openSubtitleAction, &QAction::triggered, this, [this](){ openSubtitle(); });
0053     actionCollection->addAction(ACT_OPEN_SUBTITLE, openSubtitleAction);
0054     actionManager->addAction(openSubtitleAction, 0);
0055 
0056     m_reopenSubtitleAsAction = new KCodecActionExt(actionCollection, KCodecActionExt::Open);
0057     m_reopenSubtitleAsAction->setIcon(QIcon::fromTheme("view-refresh"));
0058     m_reopenSubtitleAsAction->setText(i18n("Reload As..."));
0059     m_reopenSubtitleAsAction->setStatusTip(i18n("Reload opened file with a different encoding"));
0060     connect(m_reopenSubtitleAsAction, &KCodecActionExt::triggered, this, &Application::reopenSubtitleWithCodec);
0061     actionCollection->addAction(ACT_REOPEN_SUBTITLE_AS, m_reopenSubtitleAsAction);
0062     actionManager->addAction(m_reopenSubtitleAsAction, UserAction::SubOpened | UserAction::SubPClean | UserAction::FullScreenOff);
0063 
0064     m_recentSubtitlesAction = new KRecentFilesActionExt(actionCollection);
0065     m_recentSubtitlesAction->setIcon(QIcon::fromTheme("document-open"));
0066     m_recentSubtitlesAction->setText(i18nc("@action:inmenu Open rencently used subtitle file", "Open &Recent Subtitle"));
0067     m_recentSubtitlesAction->setStatusTip(i18n("Open subtitle file"));
0068     connect(m_recentSubtitlesAction, &KRecentFilesActionExt::urlSelected, this, [this](const QUrl &url){ openSubtitle(url); });
0069     actionCollection->addAction(ACT_RECENT_SUBTITLES, m_recentSubtitlesAction);
0070 
0071     QAction *saveSubtitleAction = new QAction(actionCollection);
0072     saveSubtitleAction->setIcon(QIcon::fromTheme("document-save"));
0073     saveSubtitleAction->setText(i18n("Save"));
0074     saveSubtitleAction->setStatusTip(i18n("Save opened subtitle"));
0075     actionCollection->setDefaultShortcuts(saveSubtitleAction, KStandardShortcut::save());
0076     connect(saveSubtitleAction, &QAction::triggered, this, [this](){ saveSubtitle(QTextCodec::codecForName(m_subtitleEncoding.toUtf8())); });
0077     actionCollection->addAction(ACT_SAVE_SUBTITLE, saveSubtitleAction);
0078     actionManager->addAction(saveSubtitleAction, UserAction::SubPDirty | UserAction::FullScreenOff);
0079 
0080     m_saveSubtitleAsAction = new KCodecActionExt(actionCollection, KCodecActionExt::Save);
0081     m_saveSubtitleAsAction->setIcon(QIcon::fromTheme("document-save-as"));
0082     m_saveSubtitleAsAction->setText(i18n("Save As..."));
0083     m_saveSubtitleAsAction->setStatusTip(i18n("Save opened subtitle with different settings"));
0084     connect(m_saveSubtitleAsAction, &KCodecActionExt::triggered, this, &Application::saveSubtitleAs);
0085     connect(m_saveSubtitleAsAction, &QAction::triggered, this, [&](){ saveSubtitleAs(); });
0086     actionCollection->addAction(ACT_SAVE_SUBTITLE_AS, m_saveSubtitleAsAction);
0087     actionManager->addAction(m_saveSubtitleAsAction, UserAction::SubOpened | UserAction::FullScreenOff);
0088 
0089     QAction *closeSubtitleAction = new QAction(actionCollection);
0090     closeSubtitleAction->setIcon(QIcon::fromTheme("window-close"));
0091     closeSubtitleAction->setText(i18n("Close"));
0092     closeSubtitleAction->setStatusTip(i18n("Close opened subtitle"));
0093     actionCollection->setDefaultShortcuts(closeSubtitleAction, KStandardShortcut::close());
0094     connect(closeSubtitleAction, &QAction::triggered, this, &Application::closeSubtitle);
0095     actionCollection->addAction(ACT_CLOSE_SUBTITLE, closeSubtitleAction);
0096     actionManager->addAction(closeSubtitleAction, UserAction::SubOpened | UserAction::FullScreenOff);
0097 
0098     QAction *newSubtitleTrAction = new QAction(actionCollection);
0099     newSubtitleTrAction->setIcon(QIcon::fromTheme("document-new"));
0100     newSubtitleTrAction->setText(i18n("New Translation"));
0101     newSubtitleTrAction->setStatusTip(i18n("Create an empty translation subtitle"));
0102     actionCollection->setDefaultShortcut(newSubtitleTrAction, QKeySequence("Ctrl+Shift+N"));
0103     connect(newSubtitleTrAction, &QAction::triggered, this, &Application::newSubtitleTr);
0104     actionCollection->addAction(ACT_NEW_SUBTITLE_TR, newSubtitleTrAction);
0105     actionManager->addAction(newSubtitleTrAction, UserAction::SubOpened | UserAction::FullScreenOff);
0106 
0107     QAction *openSubtitleTrAction = new QAction(actionCollection);
0108     openSubtitleTrAction->setIcon(QIcon::fromTheme("document-open"));
0109     openSubtitleTrAction->setText(i18n("Open Translation..."));
0110     openSubtitleTrAction->setStatusTip(i18n("Open translation subtitle file"));
0111     actionCollection->setDefaultShortcut(openSubtitleTrAction, QKeySequence("Ctrl+Shift+O"));
0112     connect(openSubtitleTrAction, &QAction::triggered, this, [this](){ openSubtitleTr(); });
0113     actionCollection->addAction(ACT_OPEN_SUBTITLE_TR, openSubtitleTrAction);
0114     actionManager->addAction(openSubtitleTrAction, UserAction::SubOpened);
0115 
0116     m_reopenSubtitleTrAsAction = new KCodecActionExt(actionCollection, KCodecActionExt::Open);
0117     m_reopenSubtitleTrAsAction->setIcon(QIcon::fromTheme("view-refresh"));
0118     m_reopenSubtitleTrAsAction->setText(i18n("Reload Translation As..."));
0119     m_reopenSubtitleTrAsAction->setStatusTip(i18n("Reload opened translation file with a different encoding"));
0120     connect(m_reopenSubtitleTrAsAction, &KCodecActionExt::triggered, this, &Application::reopenSubtitleTrWithCodec);
0121     actionCollection->addAction(ACT_REOPEN_SUBTITLE_TR_AS, m_reopenSubtitleTrAsAction);
0122     actionManager->addAction(m_reopenSubtitleTrAsAction, UserAction::SubTrOpened | UserAction::SubSClean | UserAction::FullScreenOff);
0123 
0124     m_recentSubtitlesTrAction = new KRecentFilesActionExt(actionCollection);
0125     m_recentSubtitlesTrAction->setIcon(QIcon::fromTheme("document-open"));
0126     m_recentSubtitlesTrAction->setText(i18n("Open &Recent Translation"));
0127     m_recentSubtitlesTrAction->setStatusTip(i18n("Open translation subtitle file"));
0128     connect(m_recentSubtitlesTrAction, &KRecentFilesActionExt::urlSelected, this, [this](const QUrl &url){ openSubtitleTr(url); });
0129     actionCollection->addAction(ACT_RECENT_SUBTITLES_TR, m_recentSubtitlesTrAction);
0130     actionManager->addAction(m_recentSubtitlesTrAction, UserAction::SubOpened | UserAction::FullScreenOff);
0131 
0132     QAction *saveSubtitleTrAction = new QAction(actionCollection);
0133     saveSubtitleTrAction->setIcon(QIcon::fromTheme("document-save"));
0134     saveSubtitleTrAction->setText(i18n("Save Translation"));
0135     saveSubtitleTrAction->setStatusTip(i18n("Save opened translation subtitle"));
0136     actionCollection->setDefaultShortcut(saveSubtitleTrAction, QKeySequence("Ctrl+Shift+S"));
0137     connect(saveSubtitleTrAction, &QAction::triggered, this, [&](){
0138         saveSubtitleTr(QTextCodec::codecForName(m_subtitleTrEncoding.toUtf8()));
0139     });
0140     actionCollection->addAction(ACT_SAVE_SUBTITLE_TR, saveSubtitleTrAction);
0141     actionManager->addAction(saveSubtitleTrAction, UserAction::SubSDirty | UserAction::FullScreenOff);
0142 
0143     m_saveSubtitleTrAsAction = new KCodecActionExt(actionCollection, KCodecActionExt::Save);
0144     m_saveSubtitleTrAsAction->setIcon(QIcon::fromTheme("document-save-as"));
0145     m_saveSubtitleTrAsAction->setText(i18n("Save Translation As..."));
0146     m_saveSubtitleTrAsAction->setStatusTip(i18n("Save opened translation subtitle with different settings"));
0147     connect(m_saveSubtitleTrAsAction, &KCodecActionExt::triggered, this, &Application::saveSubtitleTrAs);
0148     connect(m_saveSubtitleTrAsAction, &QAction::triggered, this, [&](){ saveSubtitleTrAs(); });
0149     actionCollection->addAction(ACT_SAVE_SUBTITLE_TR_AS, m_saveSubtitleTrAsAction);
0150     actionManager->addAction(m_saveSubtitleTrAsAction, UserAction::SubTrOpened | UserAction::FullScreenOff);
0151 
0152     QAction *closeSubtitleTrAction = new QAction(actionCollection);
0153     closeSubtitleTrAction->setIcon(QIcon::fromTheme("window-close"));
0154     closeSubtitleTrAction->setText(i18n("Close Translation"));
0155     closeSubtitleTrAction->setStatusTip(i18n("Close opened translation subtitle"));
0156     actionCollection->setDefaultShortcut(closeSubtitleTrAction, QKeySequence("Ctrl+Shift+F4; Ctrl+Shift+W"));
0157     connect(closeSubtitleTrAction, &QAction::triggered, this, &Application::closeSubtitleTr);
0158     actionCollection->addAction(ACT_CLOSE_SUBTITLE_TR, closeSubtitleTrAction);
0159     actionManager->addAction(closeSubtitleTrAction, UserAction::SubTrOpened | UserAction::FullScreenOff);
0160 
0161     QAction *undoAction = appUndoStack()->undoAction();
0162     undoAction->setIcon(QIcon::fromTheme("edit-undo"));
0163     actionCollection->setDefaultShortcuts(undoAction, KStandardShortcut::undo());
0164     actionCollection->addAction(ACT_UNDO, undoAction);
0165 
0166     QAction *redoAction = appUndoStack()->redoAction();
0167     redoAction->setIcon(QIcon::fromTheme("edit-redo"));
0168     actionCollection->setDefaultShortcuts(redoAction, KStandardShortcut::redo());
0169     actionCollection->addAction(ACT_REDO, redoAction);
0170 
0171     QAction *splitSubtitleAction = new QAction(actionCollection);
0172     splitSubtitleAction->setText(i18n("Split Subtitle..."));
0173     splitSubtitleAction->setStatusTip(i18n("Split the opened subtitle in two parts"));
0174     connect(splitSubtitleAction, &QAction::triggered, this, &Application::splitSubtitle);
0175     actionCollection->addAction(ACT_SPLIT_SUBTITLE, splitSubtitleAction);
0176     actionManager->addAction(splitSubtitleAction, UserAction::SubHasLine | UserAction::FullScreenOff);
0177 
0178     QAction *joinSubtitlesAction = new QAction(actionCollection);
0179     joinSubtitlesAction->setText(i18n("Join Subtitles..."));
0180     joinSubtitlesAction->setStatusTip(i18n("Append to the opened subtitle another one"));
0181     connect(joinSubtitlesAction, &QAction::triggered, this, &Application::joinSubtitles);
0182     actionCollection->addAction(ACT_JOIN_SUBTITLES, joinSubtitlesAction);
0183     actionManager->addAction(joinSubtitlesAction, UserAction::SubOpened | UserAction::FullScreenOff);
0184 
0185     QAction *insertBeforeCurrentLineAction = new QAction(actionCollection);
0186     insertBeforeCurrentLineAction->setIcon(QIcon::fromTheme(QStringLiteral("list-add")));
0187     insertBeforeCurrentLineAction->setText(i18n("Insert Before"));
0188     insertBeforeCurrentLineAction->setStatusTip(i18n("Insert empty line before current one"));
0189     actionCollection->setDefaultShortcut(insertBeforeCurrentLineAction, QKeySequence("Ctrl+Insert"));
0190     connect(insertBeforeCurrentLineAction, &QAction::triggered, this, &Application::insertBeforeCurrentLine);
0191     actionCollection->addAction(ACT_INSERT_BEFORE_CURRENT_LINE, insertBeforeCurrentLineAction);
0192     actionManager->addAction(insertBeforeCurrentLineAction, UserAction::SubOpened | UserAction::FullScreenOff);
0193 
0194     QAction *insertAfterCurrentLineAction = new QAction(actionCollection);
0195     insertAfterCurrentLineAction->setIcon(QIcon::fromTheme(QStringLiteral("list-add")));
0196     insertAfterCurrentLineAction->setText(i18n("Insert After"));
0197     insertAfterCurrentLineAction->setStatusTip(i18n("Insert empty line after current one"));
0198     actionCollection->setDefaultShortcut(insertAfterCurrentLineAction, QKeySequence("Insert"));
0199     connect(insertAfterCurrentLineAction, &QAction::triggered, this, &Application::insertAfterCurrentLine);
0200     actionCollection->addAction(ACT_INSERT_AFTER_CURRENT_LINE, insertAfterCurrentLineAction);
0201     actionManager->addAction(insertAfterCurrentLineAction, UserAction::SubOpened | UserAction::FullScreenOff);
0202 
0203     QAction *removeSelectedLinesAction = new QAction(actionCollection);
0204     removeSelectedLinesAction->setIcon(QIcon::fromTheme(QStringLiteral("list-remove")));
0205     removeSelectedLinesAction->setText(i18n("Remove"));
0206     removeSelectedLinesAction->setStatusTip(i18n("Remove selected lines"));
0207     actionCollection->setDefaultShortcut(removeSelectedLinesAction, QKeySequence("Delete"));
0208     connect(removeSelectedLinesAction, &QAction::triggered, this, &Application::removeSelectedLines);
0209     actionCollection->addAction(ACT_REMOVE_SELECTED_LINES, removeSelectedLinesAction);
0210     actionManager->addAction(removeSelectedLinesAction, UserAction::HasSelection | UserAction::FullScreenOff);
0211 
0212     QAction *splitSelectedLinesAction = new QAction(actionCollection);
0213     splitSelectedLinesAction->setText(i18n("Split Lines"));
0214     splitSelectedLinesAction->setStatusTip(i18n("Split selected lines"));
0215     connect(splitSelectedLinesAction, &QAction::triggered, this, &Application::splitSelectedLines);
0216     actionCollection->addAction(ACT_SPLIT_SELECTED_LINES, splitSelectedLinesAction);
0217     actionManager->addAction(splitSelectedLinesAction, UserAction::HasSelection | UserAction::FullScreenOff);
0218 
0219     QAction *joinSelectedLinesAction = new QAction(actionCollection);
0220     joinSelectedLinesAction->setText(i18n("Join Lines"));
0221     joinSelectedLinesAction->setStatusTip(i18n("Join selected lines"));
0222     connect(joinSelectedLinesAction, &QAction::triggered, this, &Application::joinSelectedLines);
0223     actionCollection->addAction(ACT_JOIN_SELECTED_LINES, joinSelectedLinesAction);
0224     actionManager->addAction(joinSelectedLinesAction, UserAction::HasSelection | UserAction::FullScreenOff);
0225 
0226     QAction *selectAllLinesAction = new QAction(actionCollection);
0227     selectAllLinesAction->setIcon(QIcon::fromTheme(QStringLiteral("edit-select-all")));
0228     selectAllLinesAction->setText(i18n("Select All"));
0229     selectAllLinesAction->setStatusTip(i18n("Select all lines"));
0230     actionCollection->setDefaultShortcuts(selectAllLinesAction, KStandardShortcut::selectAll());
0231     connect(selectAllLinesAction, &QAction::triggered, this, &Application::selectAllLines);
0232     actionCollection->addAction(ACT_SELECT_ALL_LINES, selectAllLinesAction);
0233     actionManager->addAction(selectAllLinesAction, UserAction::SubHasLine | UserAction::FullScreenOff);
0234 
0235     QAction *gotoLineAction = new QAction(actionCollection);
0236     gotoLineAction->setText(i18n("Go to Line..."));
0237     gotoLineAction->setStatusTip(i18n("Go to specified line"));
0238     actionCollection->setDefaultShortcuts(gotoLineAction, KStandardShortcut::gotoLine());
0239     connect(gotoLineAction, &QAction::triggered, this, &Application::gotoLine);
0240     actionCollection->addAction(ACT_GOTO_LINE, gotoLineAction);
0241     actionManager->addAction(gotoLineAction, UserAction::SubHasLines);
0242 
0243     QAction *findAction = new QAction(actionCollection);
0244     findAction->setIcon(QIcon::fromTheme("edit-find"));
0245     findAction->setText(i18n("Find..."));
0246     findAction->setStatusTip(i18n("Find occurrences of strings or regular expressions"));
0247     actionCollection->setDefaultShortcuts(findAction, KStandardShortcut::find());
0248     connect(findAction, &QAction::triggered, this, &Application::find);
0249     actionCollection->addAction(ACT_FIND, findAction);
0250     actionManager->addAction(findAction, UserAction::SubHasLine);
0251 
0252     QAction *findNextAction = new QAction(actionCollection);
0253     findNextAction->setIcon(QIcon::fromTheme("go-down-search"));
0254     findNextAction->setText(i18n("Find Next"));
0255     findNextAction->setStatusTip(i18n("Find next occurrence of string or regular expression"));
0256     actionCollection->setDefaultShortcuts(findNextAction, KStandardShortcut::findNext());
0257     connect(findNextAction, &QAction::triggered, this, &Application::findNext);
0258     actionCollection->addAction(ACT_FIND_NEXT, findNextAction);
0259     actionManager->addAction(findNextAction, UserAction::SubHasLine);
0260 
0261     QAction *findPreviousAction = new QAction(actionCollection);
0262     findPreviousAction->setIcon(QIcon::fromTheme("go-up-search"));
0263     findPreviousAction->setText(i18n("Find Previous"));
0264     findPreviousAction->setStatusTip(i18n("Find previous occurrence of string or regular expression"));
0265     actionCollection->setDefaultShortcuts(findPreviousAction, KStandardShortcut::findPrev());
0266     connect(findPreviousAction, &QAction::triggered, this, &Application::findPrevious);
0267     actionCollection->addAction(ACT_FIND_PREVIOUS, findPreviousAction);
0268     actionManager->addAction(findPreviousAction, UserAction::SubHasLine);
0269 
0270     QAction *replaceAction = new QAction(actionCollection);
0271     replaceAction->setText(i18n("Replace..."));
0272     replaceAction->setStatusTip(i18n("Replace occurrences of strings or regular expressions"));
0273     actionCollection->setDefaultShortcuts(replaceAction, KStandardShortcut::replace());
0274     connect(replaceAction, &QAction::triggered, this, &Application::replace);
0275     actionCollection->addAction(ACT_REPLACE, replaceAction);
0276     actionManager->addAction(replaceAction, UserAction::SubHasLine | UserAction::FullScreenOff);
0277 
0278     QAction *retrocedeCurrentLineAction = new QAction(actionCollection);
0279     retrocedeCurrentLineAction->setIcon(QIcon::fromTheme("go-down"));
0280     retrocedeCurrentLineAction->setText(i18n("Retrocede current line"));
0281     retrocedeCurrentLineAction->setStatusTip(i18n("Makes the line before the current one active"));
0282     actionCollection->setDefaultShortcut(retrocedeCurrentLineAction, QKeySequence("Alt+Up"));
0283     connect(retrocedeCurrentLineAction, &QAction::triggered, this, &Application::retrocedeCurrentLine);
0284     actionCollection->addAction(ACT_RETROCEDE_CURRENT_LINE, retrocedeCurrentLineAction);
0285     actionManager->addAction(retrocedeCurrentLineAction, UserAction::SubHasLines | UserAction::HasSelection);
0286 
0287     QAction *advanceCurrentLineAction = new QAction(actionCollection);
0288     advanceCurrentLineAction->setIcon(QIcon::fromTheme("go-down"));
0289     advanceCurrentLineAction->setText(i18n("Advance current line"));
0290     advanceCurrentLineAction->setStatusTip(i18n("Makes the line after the current one active"));
0291     actionCollection->setDefaultShortcut(advanceCurrentLineAction, QKeySequence("Alt+Down"));
0292     connect(advanceCurrentLineAction, &QAction::triggered, this, &Application::advanceCurrentLine);
0293     actionCollection->addAction(ACT_ADVANCE_CURRENT_LINE, advanceCurrentLineAction);
0294     actionManager->addAction(advanceCurrentLineAction, UserAction::SubHasLines | UserAction::HasSelection);
0295 
0296     QAction *detectErrorsAction = new QAction(actionCollection);
0297     detectErrorsAction->setIcon(QIcon::fromTheme("edit-find"));
0298     detectErrorsAction->setText(i18n("Detect Errors..."));
0299     detectErrorsAction->setStatusTip(i18n("Detect errors in the current subtitle"));
0300     actionCollection->setDefaultShortcut(detectErrorsAction, QKeySequence("Ctrl+E"));
0301     connect(detectErrorsAction, &QAction::triggered, this, &Application::detectErrors);
0302     actionCollection->addAction(ACT_DETECT_ERRORS, detectErrorsAction);
0303     actionManager->addAction(detectErrorsAction, UserAction::HasSelection | UserAction::FullScreenOff);
0304 
0305     QAction *clearErrorsAction = new QAction(actionCollection);
0306     clearErrorsAction->setText(i18n("Clear Errors/Marks"));
0307     clearErrorsAction->setStatusTip(i18n("Clear detected errors and marks in the current subtitle"));
0308     actionCollection->setDefaultShortcut(clearErrorsAction, QKeySequence("Ctrl+Shift+E"));
0309     connect(clearErrorsAction, &QAction::triggered, this, &Application::clearErrors);
0310     actionCollection->addAction(ACT_CLEAR_ERRORS, clearErrorsAction);
0311     actionManager->addAction(clearErrorsAction, UserAction::HasSelection | UserAction::FullScreenOff);
0312 
0313     QAction *nextErrorAction = new QAction(actionCollection);
0314     nextErrorAction->setIcon(QIcon::fromTheme("go-down-search"));
0315     nextErrorAction->setText(i18n("Select Next Error/Mark"));
0316     nextErrorAction->setStatusTip(i18n("Select next line with error or mark"));
0317     actionCollection->setDefaultShortcut(nextErrorAction, QKeySequence("F4"));
0318     connect(nextErrorAction, &QAction::triggered, this, &Application::selectNextError);
0319     actionCollection->addAction(ACT_SELECT_NEXT_ERROR, nextErrorAction);
0320     actionManager->addAction(nextErrorAction, UserAction::SubHasLine);
0321 
0322     QAction *prevErrorAction = new QAction(actionCollection);
0323     prevErrorAction->setIcon(QIcon::fromTheme("go-up-search"));
0324     prevErrorAction->setText(i18n("Select Previous Error/Mark"));
0325     prevErrorAction->setStatusTip(i18n("Select previous line with error or mark"));
0326     actionCollection->setDefaultShortcut(prevErrorAction, QKeySequence("Shift+F4"));
0327     connect(prevErrorAction, &QAction::triggered, this, &Application::selectPreviousError);
0328     actionCollection->addAction(ACT_SELECT_PREVIOUS_ERROR, prevErrorAction);
0329     actionManager->addAction(prevErrorAction, UserAction::SubHasLine);
0330 
0331     QAction *spellCheckAction = new QAction(actionCollection);
0332     spellCheckAction->setIcon(QIcon::fromTheme("tools-check-spelling"));
0333     spellCheckAction->setText(i18n("Spelling..."));
0334     spellCheckAction->setStatusTip(i18n("Check lines spelling"));
0335     connect(spellCheckAction, &QAction::triggered, this, &Application::spellCheck);
0336     actionCollection->addAction(ACT_SPELL_CHECK, spellCheckAction);
0337     actionManager->addAction(spellCheckAction, UserAction::SubHasLine | UserAction::FullScreenOff);
0338 
0339     QAction *toggleSelectedLinesMarkAction = new QAction(actionCollection);
0340     toggleSelectedLinesMarkAction->setText(i18n("Toggle Mark"));
0341     toggleSelectedLinesMarkAction->setStatusTip(i18n("Toggle mark on selected lines"));
0342     actionCollection->setDefaultShortcut(toggleSelectedLinesMarkAction, QKeySequence("Ctrl+M"));
0343     connect(toggleSelectedLinesMarkAction, &QAction::triggered, this, &Application::toggleSelectedLinesMark);
0344     actionCollection->addAction(ACT_TOGGLE_SELECTED_LINES_MARK, toggleSelectedLinesMarkAction);
0345     actionManager->addAction(toggleSelectedLinesMarkAction, UserAction::HasSelection | UserAction::FullScreenOff);
0346 
0347     QAction *toggleSelectedLinesBoldAction = new QAction(actionCollection);
0348     toggleSelectedLinesBoldAction->setIcon(QIcon::fromTheme("format-text-bold"));
0349     toggleSelectedLinesBoldAction->setText(i18n("Toggle Bold"));
0350     toggleSelectedLinesBoldAction->setStatusTip(i18n("Toggle selected lines bold attribute"));
0351     actionCollection->setDefaultShortcut(toggleSelectedLinesBoldAction, QKeySequence("Ctrl+B"));
0352     connect(toggleSelectedLinesBoldAction, &QAction::triggered, this, &Application::toggleSelectedLinesBold);
0353     actionCollection->addAction(ACT_TOGGLE_SELECTED_LINES_BOLD, toggleSelectedLinesBoldAction);
0354     actionManager->addAction(toggleSelectedLinesBoldAction, UserAction::HasSelection | UserAction::FullScreenOff);
0355 
0356     QAction *toggleSelectedLinesItalicAction = new QAction(actionCollection);
0357     toggleSelectedLinesItalicAction->setIcon(QIcon::fromTheme("format-text-italic"));
0358     toggleSelectedLinesItalicAction->setText(i18n("Toggle Italic"));
0359     toggleSelectedLinesItalicAction->setStatusTip(i18n("Toggle selected lines italic attribute"));
0360     actionCollection->setDefaultShortcut(toggleSelectedLinesItalicAction, QKeySequence("Ctrl+I"));
0361     connect(toggleSelectedLinesItalicAction, &QAction::triggered, this, &Application::toggleSelectedLinesItalic);
0362     actionCollection->addAction(ACT_TOGGLE_SELECTED_LINES_ITALIC, toggleSelectedLinesItalicAction);
0363     actionManager->addAction(toggleSelectedLinesItalicAction, UserAction::HasSelection | UserAction::FullScreenOff);
0364 
0365     QAction *toggleSelectedLinesUnderlineAction = new QAction(actionCollection);
0366     toggleSelectedLinesUnderlineAction->setIcon(QIcon::fromTheme("format-text-underline"));
0367     toggleSelectedLinesUnderlineAction->setText(i18n("Toggle Underline"));
0368     toggleSelectedLinesUnderlineAction->setStatusTip(i18n("Toggle selected lines underline attribute"));
0369     actionCollection->setDefaultShortcut(toggleSelectedLinesUnderlineAction, QKeySequence("Ctrl+U"));
0370     connect(toggleSelectedLinesUnderlineAction, &QAction::triggered, this, &Application::toggleSelectedLinesUnderline);
0371     actionCollection->addAction(ACT_TOGGLE_SELECTED_LINES_UNDERLINE, toggleSelectedLinesUnderlineAction);
0372     actionManager->addAction(toggleSelectedLinesUnderlineAction, UserAction::HasSelection | UserAction::FullScreenOff);
0373 
0374     QAction *toggleSelectedLinesStrikeThroughAction = new QAction(actionCollection);
0375     toggleSelectedLinesStrikeThroughAction->setIcon(QIcon::fromTheme("format-text-strikethrough"));
0376     toggleSelectedLinesStrikeThroughAction->setText(i18n("Toggle Strike Through"));
0377     toggleSelectedLinesStrikeThroughAction->setStatusTip(i18n("Toggle selected lines strike through attribute"));
0378     actionCollection->setDefaultShortcut(toggleSelectedLinesStrikeThroughAction, QKeySequence("Ctrl+T"));
0379     connect(toggleSelectedLinesStrikeThroughAction, &QAction::triggered, this, &Application::toggleSelectedLinesStrikeThrough);
0380     actionCollection->addAction(ACT_TOGGLE_SELECTED_LINES_STRIKETHROUGH, toggleSelectedLinesStrikeThroughAction);
0381     actionManager->addAction(toggleSelectedLinesStrikeThroughAction, UserAction::HasSelection | UserAction::FullScreenOff);
0382 
0383     QAction *changeSelectedLinesColorAction = new QAction(actionCollection);
0384     changeSelectedLinesColorAction->setIcon(QIcon::fromTheme("format-text-color"));
0385     changeSelectedLinesColorAction->setText(i18n("Change Text Color"));
0386     changeSelectedLinesColorAction->setStatusTip(i18n("Change text color of selected lines"));
0387     actionCollection->setDefaultShortcut(changeSelectedLinesColorAction, QKeySequence("Ctrl+Shift+C"));
0388     connect(changeSelectedLinesColorAction, &QAction::triggered, this, &Application::changeSelectedLinesColor);
0389     actionCollection->addAction(ACT_CHANGE_SELECTED_LINES_TEXT_COLOR, changeSelectedLinesColorAction);
0390     actionManager->addAction(changeSelectedLinesColorAction, UserAction::HasSelection | UserAction::FullScreenOff);
0391 
0392     QAction *shiftAction = new QAction(actionCollection);
0393     shiftAction->setText(i18n("Shift..."));
0394     shiftAction->setStatusTip(i18n("Shift lines an specified amount of time"));
0395     actionCollection->setDefaultShortcut(shiftAction, QKeySequence("Ctrl+D"));
0396     connect(shiftAction, &QAction::triggered, this, &Application::shiftLines);
0397     actionCollection->addAction(ACT_SHIFT, shiftAction);
0398     actionManager->addAction(shiftAction, UserAction::SubHasLine | UserAction::FullScreenOff | UserAction::AnchorsNone);
0399 
0400     QAction *shiftSelectedLinesFwdAction = new QAction(actionCollection);
0401     actionCollection->setDefaultShortcut(shiftSelectedLinesFwdAction, QKeySequence("Shift++"));
0402     connect(shiftSelectedLinesFwdAction, &QAction::triggered, this, &Application::shiftSelectedLinesForwards);
0403     actionCollection->addAction(ACT_SHIFT_SELECTED_LINES_FORWARDS, shiftSelectedLinesFwdAction);
0404     actionManager->addAction(shiftSelectedLinesFwdAction, UserAction::HasSelection | UserAction::FullScreenOff | UserAction::EditableShowTime);
0405 
0406     QAction *shiftSelectedLinesBwdAction = new QAction(actionCollection);
0407     actionCollection->setDefaultShortcut(shiftSelectedLinesBwdAction, QKeySequence("Shift+-"));
0408     connect(shiftSelectedLinesBwdAction, &QAction::triggered, this, &Application::shiftSelectedLinesBackwards);
0409     actionCollection->addAction(ACT_SHIFT_SELECTED_LINES_BACKWARDS, shiftSelectedLinesBwdAction);
0410     actionManager->addAction(shiftSelectedLinesBwdAction, UserAction::HasSelection | UserAction::FullScreenOff | UserAction::EditableShowTime);
0411 
0412     QAction *adjustAction = new QAction(actionCollection);
0413     adjustAction->setText(i18n("Adjust..."));
0414     adjustAction->setStatusTip(i18n("Linearly adjust all lines to a specified interval"));
0415     actionCollection->setDefaultShortcut(adjustAction, QKeySequence("Ctrl+J"));
0416     connect(adjustAction, &QAction::triggered, this, &Application::adjustLines);
0417     actionCollection->addAction(ACT_ADJUST, adjustAction);
0418     actionManager->addAction(adjustAction, UserAction::SubHasLines | UserAction::FullScreenOff | UserAction::AnchorsNone);
0419 
0420     QAction *changeFrameRateAction = new QAction(actionCollection);
0421     changeFrameRateAction->setText(i18n("Change Frame Rate..."));
0422     changeFrameRateAction->setStatusTip(i18n("Retime subtitle lines by reinterpreting its frame rate"));
0423     connect(changeFrameRateAction, &QAction::triggered, this, &Application::changeFrameRate);
0424     actionCollection->addAction(ACT_CHANGE_FRAME_RATE, changeFrameRateAction);
0425     actionManager->addAction(changeFrameRateAction, UserAction::SubOpened | UserAction::FullScreenOff | UserAction::AnchorsNone);
0426 
0427     QAction *durationLimitsAction = new QAction(actionCollection);
0428     durationLimitsAction->setText(i18n("Enforce Duration Limits..."));
0429     durationLimitsAction->setStatusTip(i18n("Enforce lines minimum and/or maximum duration limits"));
0430     actionCollection->setDefaultShortcut(durationLimitsAction, QKeySequence("Ctrl+L"));
0431     connect(durationLimitsAction, &QAction::triggered, this, &Application::enforceDurationLimits);
0432     actionCollection->addAction(ACT_DURATION_LIMITS, durationLimitsAction);
0433     actionManager->addAction(durationLimitsAction, UserAction::SubHasLine | UserAction::FullScreenOff);
0434 
0435     QAction *autoDurationsAction = new QAction(actionCollection);
0436     autoDurationsAction->setText(i18n("Set Automatic Durations..."));
0437     autoDurationsAction->setStatusTip(i18n("Set lines durations based on amount of letters, words and line breaks"));
0438     connect(autoDurationsAction, &QAction::triggered, this, &Application::setAutoDurations);
0439     actionCollection->addAction(ACT_AUTOMATIC_DURATIONS, autoDurationsAction);
0440     actionManager->addAction(autoDurationsAction, UserAction::SubHasLine | UserAction::FullScreenOff);
0441 
0442     QAction *maximizeDurationsAction = new QAction(actionCollection);
0443     maximizeDurationsAction->setText(i18n("Maximize Durations..."));
0444     maximizeDurationsAction->setStatusTip(i18n("Extend lines durations up to their next lines show time"));
0445     connect(maximizeDurationsAction, &QAction::triggered, this, &Application::maximizeDurations);
0446     actionCollection->addAction(ACT_MAXIMIZE_DURATIONS, maximizeDurationsAction);
0447     actionManager->addAction(maximizeDurationsAction, UserAction::SubHasLine | UserAction::FullScreenOff);
0448 
0449     QAction *fixOverlappingLinesAction = new QAction(actionCollection);
0450     fixOverlappingLinesAction->setText(i18n("Fix Overlapping Times..."));
0451     fixOverlappingLinesAction->setStatusTip(i18n("Fix lines overlapping times"));
0452     connect(fixOverlappingLinesAction, &QAction::triggered, this, &Application::fixOverlappingLines);
0453     actionCollection->addAction(ACT_FIX_OVERLAPPING_LINES, fixOverlappingLinesAction);
0454     actionManager->addAction(fixOverlappingLinesAction, UserAction::SubHasLine | UserAction::FullScreenOff);
0455 
0456     QAction *syncWithSubtitleAction = new QAction(actionCollection);
0457     syncWithSubtitleAction->setText(i18n("Synchronize with Subtitle..."));
0458     syncWithSubtitleAction->setStatusTip(i18n("Copy timing information from another subtitle"));
0459     connect(syncWithSubtitleAction, &QAction::triggered, this, &Application::syncWithSubtitle);
0460     actionCollection->addAction(ACT_SYNC_WITH_SUBTITLE, syncWithSubtitleAction);
0461     actionManager->addAction(syncWithSubtitleAction, UserAction::SubHasLine | UserAction::FullScreenOff | UserAction::AnchorsNone);
0462 
0463     QAction *breakLinesAction = new QAction(actionCollection);
0464     breakLinesAction->setText(i18n("Break Lines..."));
0465     breakLinesAction->setStatusTip(i18n("Automatically set line breaks"));
0466     connect(breakLinesAction, &QAction::triggered, this, &Application::breakLines);
0467     actionCollection->addAction(ACT_ADJUST_TEXTS, breakLinesAction);
0468     actionManager->addAction(breakLinesAction, UserAction::SubHasLine | UserAction::FullScreenOff);
0469 
0470     QAction *unbreakTextsAction = new QAction(actionCollection);
0471     unbreakTextsAction->setText(i18n("Unbreak Lines..."));
0472     unbreakTextsAction->setStatusTip(i18n("Remove line breaks from lines"));
0473     connect(unbreakTextsAction, &QAction::triggered, this, &Application::unbreakTexts);
0474     actionCollection->addAction(ACT_UNBREAK_TEXTS, unbreakTextsAction);
0475     actionManager->addAction(unbreakTextsAction, UserAction::SubHasLine | UserAction::FullScreenOff);
0476 
0477     QAction *simplifySpacesAction = new QAction(actionCollection);
0478     simplifySpacesAction->setText(i18n("Simplify Spaces..."));
0479     simplifySpacesAction->setStatusTip(i18n("Remove unneeded spaces from lines"));
0480     connect(simplifySpacesAction, &QAction::triggered, this, &Application::simplifySpaces);
0481     actionCollection->addAction(ACT_SIMPLIFY_SPACES, simplifySpacesAction);
0482     actionManager->addAction(simplifySpacesAction, UserAction::SubHasLine | UserAction::FullScreenOff);
0483 
0484     QAction *changeCaseAction = new QAction(actionCollection);
0485     changeCaseAction->setText(i18n("Change Case..."));
0486     changeCaseAction->setStatusTip(i18n("Change lines text to upper, lower, title or sentence case"));
0487     connect(changeCaseAction, &QAction::triggered, this, &Application::changeCase);
0488     actionCollection->addAction(ACT_CHANGE_CASE, changeCaseAction);
0489     actionManager->addAction(changeCaseAction, UserAction::SubHasLine | UserAction::FullScreenOff);
0490 
0491     QAction *fixPunctuationAction = new QAction(actionCollection);
0492     fixPunctuationAction->setText(i18n("Fix Punctuation..."));
0493     fixPunctuationAction->setStatusTip(i18n("Fix punctuation errors in lines"));
0494     connect(fixPunctuationAction, &QAction::triggered, this, &Application::fixPunctuation);
0495     actionCollection->addAction(ACT_FIX_PUNCTUATION, fixPunctuationAction);
0496     actionManager->addAction(fixPunctuationAction, UserAction::SubHasLine | UserAction::FullScreenOff);
0497 
0498     QAction *translateAction = new QAction(actionCollection);
0499     translateAction->setText(i18n("Translate..."));
0500     translateAction->setStatusTip(i18n("Translate lines texts using Google services"));
0501     QObject::connect(translateAction, &QAction::triggered, this, &TranslateDialog::performTranslation);
0502     actionCollection->addAction(ACT_TRANSLATE, translateAction);
0503     actionManager->addAction(translateAction, UserAction::SubHasLine | UserAction::FullScreenOff);
0504 
0505     QAction *editCurrentLineInPlaceAction = new QAction(actionCollection);
0506     editCurrentLineInPlaceAction->setText(i18n("Edit Line in Place"));
0507     editCurrentLineInPlaceAction->setStatusTip(i18n("Edit current line text in place"));
0508     actionCollection->setDefaultShortcut(editCurrentLineInPlaceAction, QKeySequence("F2"));
0509     connect(editCurrentLineInPlaceAction, &QAction::triggered, m_mainWindow->m_linesWidget, &LinesWidget::editCurrentLineInPlace);
0510     actionCollection->addAction(ACT_EDIT_CURRENT_LINE_IN_PLACE, editCurrentLineInPlaceAction);
0511     actionManager->addAction(editCurrentLineInPlaceAction, UserAction::HasSelection | UserAction::FullScreenOff);
0512 
0513     QAction *openVideoAction = new QAction(actionCollection);
0514     openVideoAction->setIcon(QIcon::fromTheme("document-open"));
0515     openVideoAction->setText(i18n("Open Video..."));
0516     openVideoAction->setStatusTip(i18n("Open video file"));
0517     connect(openVideoAction, &QAction::triggered, this, [this](){ openVideo(); });
0518     actionCollection->addAction(ACT_OPEN_VIDEO, openVideoAction);
0519 
0520     m_recentVideosAction = new KRecentFilesActionExt(actionCollection);
0521     m_recentVideosAction->setIcon(QIcon::fromTheme("document-open"));
0522     m_recentVideosAction->setText(i18n("Open &Recent Video"));
0523     m_recentVideosAction->setStatusTip(i18n("Open video file"));
0524     connect(m_recentVideosAction, &KRecentFilesActionExt::urlSelected, this, [this](const QUrl &url){ openVideo(url); });
0525     actionCollection->addAction(ACT_RECENT_VIDEOS, m_recentVideosAction);
0526 
0527     QAction *demuxTextStreamAction = new KSelectAction(actionCollection);
0528     demuxTextStreamAction->setIcon(QIcon::fromTheme("select_stream"));
0529     demuxTextStreamAction->setText(i18n("Import Subtitle Stream"));
0530     demuxTextStreamAction->setStatusTip(i18n("Import subtitle stream into subtitle editor"));
0531     connect(demuxTextStreamAction->menu(), &QMenu::triggered, this, [this](QAction *action){ demuxTextStream(action->data().value<int>()); });
0532     actionCollection->addAction(ACT_DEMUX_TEXT_STREAM, demuxTextStreamAction);
0533 
0534     QAction *speechImportStreamAction = new KSelectAction(actionCollection);
0535     speechImportStreamAction->setIcon(QIcon::fromTheme("select_stream"));
0536     speechImportStreamAction->setText(i18n("Recognize Speech"));
0537     speechImportStreamAction->setStatusTip(i18n("Recognize speech in audio stream"));
0538     connect(speechImportStreamAction->menu(), &QMenu::triggered, this, [this](QAction *action){ speechImportAudioStream(action->data().value<int>()); });
0539     actionCollection->addAction(ACT_ASR_IMPORT_AUDIO_STREAM, speechImportStreamAction);
0540 
0541     QAction *closeVideoAction = new QAction(actionCollection);
0542     closeVideoAction->setIcon(QIcon::fromTheme("window-close"));
0543     closeVideoAction->setText(i18n("Close Video"));
0544     closeVideoAction->setStatusTip(i18n("Close video file"));
0545     connect(closeVideoAction, &QAction::triggered, videoPlayer, &VideoPlayer::closeFile);
0546     actionCollection->addAction(ACT_CLOSE_VIDEO, closeVideoAction);
0547     actionManager->addAction(closeVideoAction, UserAction::VideoOpened);
0548 
0549     KToggleAction *fullScreenAction = new KToggleAction(actionCollection);
0550     fullScreenAction->setIcon(QIcon::fromTheme("view-fullscreen"));
0551     fullScreenAction->setText(i18n("Full Screen Mode"));
0552     fullScreenAction->setStatusTip(i18n("Toggle full screen mode"));
0553     actionCollection->setDefaultShortcuts(fullScreenAction, KStandardShortcut::fullScreen());
0554     connect(fullScreenAction, &QAction::toggled, this, &Application::setFullScreenMode);
0555     actionCollection->addAction(ACT_TOGGLE_FULL_SCREEN, fullScreenAction);
0556 
0557     QAction *stopAction = new QAction(actionCollection);
0558     stopAction->setIcon(QIcon::fromTheme("media-playback-stop"));
0559     stopAction->setText(i18n("Stop"));
0560     stopAction->setStatusTip(i18n("Stop video playback"));
0561     connect(stopAction, &QAction::triggered, videoPlayer, &VideoPlayer::stop);
0562     actionCollection->addAction(ACT_STOP, stopAction);
0563     actionManager->addAction(stopAction, UserAction::VideoPlaying);
0564 
0565     QAction *playPauseAction = new QAction(actionCollection);
0566     playPauseAction->setIcon(QIcon::fromTheme("media-playback-start"));
0567     playPauseAction->setText(i18n("Play"));
0568     playPauseAction->setStatusTip(i18n("Toggle video playing/paused"));
0569     actionCollection->setDefaultShortcut(playPauseAction, QKeySequence("Ctrl+Space"));
0570     connect(playPauseAction, &QAction::triggered, videoPlayer, &VideoPlayer::togglePlayPaused);
0571     actionCollection->addAction(ACT_PLAY_PAUSE, playPauseAction);
0572     actionManager->addAction(playPauseAction, UserAction::VideoOpened);
0573 
0574     QAction *seekBackwardAction = new QAction(actionCollection);
0575     seekBackwardAction->setIcon(QIcon::fromTheme("media-seek-backward"));
0576     seekBackwardAction->setText(i18n("Seek Backward"));
0577     actionCollection->setDefaultShortcut(seekBackwardAction, QKeySequence("Left"));
0578     connect(seekBackwardAction, &QAction::triggered, this, &Application::seekBackward);
0579     actionCollection->addAction(ACT_SEEK_BACKWARD, seekBackwardAction);
0580     actionManager->addAction(seekBackwardAction, UserAction::VideoPlaying);
0581 
0582     QAction *seekForwardAction = new QAction(actionCollection);
0583     seekForwardAction->setIcon(QIcon::fromTheme("media-seek-forward"));
0584     seekForwardAction->setText(i18n("Seek Forward"));
0585     actionCollection->setDefaultShortcut(seekForwardAction, QKeySequence("Right"));
0586     connect(seekForwardAction, &QAction::triggered, this, &Application::seekForward);
0587     actionCollection->addAction(ACT_SEEK_FORWARD, seekForwardAction);
0588     actionManager->addAction(seekForwardAction, UserAction::VideoPlaying);
0589 
0590     QAction *stepFrameBackwardAction = new QAction(actionCollection);
0591     stepFrameBackwardAction->setText(i18n("Frame Step Backward"));
0592     actionCollection->setDefaultShortcut(stepFrameBackwardAction, QKeySequence("Ctrl+Left"));
0593     connect(stepFrameBackwardAction, &QAction::triggered, this, &Application::stepBackward);
0594     actionCollection->addAction(ACT_STEP_FRAME_BACKWARD, stepFrameBackwardAction);
0595     actionManager->addAction(stepFrameBackwardAction, UserAction::VideoPlaying);
0596 
0597     QAction *stepFrameForwardAction = new QAction(actionCollection);
0598     stepFrameForwardAction->setText(i18n("Frame Step Forward"));
0599     actionCollection->setDefaultShortcut(stepFrameForwardAction, QKeySequence("Ctrl+Right"));
0600     connect(stepFrameForwardAction, &QAction::triggered, this, &Application::stepForward);
0601     actionCollection->addAction(ACT_STEP_FRAME_FORWARD, stepFrameForwardAction);
0602     actionManager->addAction(stepFrameForwardAction, UserAction::VideoPlaying);
0603 
0604     QAction *seekToPrevLineAction = new QAction(actionCollection);
0605     seekToPrevLineAction->setIcon(QIcon::fromTheme("media-skip-backward"));
0606     seekToPrevLineAction->setText(i18n("Seek to Previous Line"));
0607     seekToPrevLineAction->setStatusTip(i18n("Seek to previous subtitle line show time"));
0608     actionCollection->setDefaultShortcut(seekToPrevLineAction, QKeySequence("Ctrl+Shift+Up"));
0609     connect(seekToPrevLineAction, &QAction::triggered, this, &Application::seekToPrevLine);
0610     actionCollection->addAction(ACT_SEEK_TO_PREVIOUS_LINE, seekToPrevLineAction);
0611     actionManager->addAction(seekToPrevLineAction, UserAction::SubHasLine | UserAction::VideoPlaying);
0612 
0613     QAction *playrateIncreaseAction = new QAction(actionCollection);
0614     playrateIncreaseAction->setIcon(QIcon::fromTheme(QStringLiteral("playrate_plus")));
0615     playrateIncreaseAction->setText(i18n("Increase media play rate"));
0616     playrateIncreaseAction->setStatusTip(i18n("Increase media playback rate"));
0617     connect(playrateIncreaseAction, &QAction::triggered, this, &Application::playrateIncrease);
0618     actionCollection->addAction(ACT_PLAY_RATE_INCREASE, playrateIncreaseAction);
0619     actionManager->addAction(playrateIncreaseAction, UserAction::VideoPlaying);
0620 
0621     QAction *playrateDecreaseAction = new QAction(actionCollection);
0622     playrateDecreaseAction->setIcon(QIcon::fromTheme(QStringLiteral("playrate_minus")));
0623     playrateDecreaseAction->setText(i18n("Decrease media play rate"));
0624     playrateDecreaseAction->setStatusTip(i18n("Decrease media playback rate"));
0625     connect(playrateDecreaseAction, &QAction::triggered, this, &Application::playrateDecrease);
0626     actionCollection->addAction(ACT_PLAY_RATE_DECREASE, playrateDecreaseAction);
0627     actionManager->addAction(playrateDecreaseAction, UserAction::VideoPlaying);
0628 
0629     QAction *playCurrentLineAndPauseAction = new QAction(actionCollection);
0630     playCurrentLineAndPauseAction->setText(i18n("Play Current Line and Pause"));
0631     playCurrentLineAndPauseAction->setStatusTip(i18n("Seek to selected subtitle line show time, play it and then pause"));
0632     actionCollection->setDefaultShortcut(playCurrentLineAndPauseAction, QKeySequence("Ctrl+Return"));
0633     connect(playCurrentLineAndPauseAction, &QAction::triggered, this, &Application::playOnlyCurrentLine);
0634     actionCollection->addAction(ACT_PLAY_CURRENT_LINE_AND_PAUSE, playCurrentLineAndPauseAction);
0635     actionManager->addAction(playCurrentLineAndPauseAction, UserAction::SubHasLine | UserAction::VideoPlaying);
0636 
0637     QAction *seekCurrentLineAction = new QAction(actionCollection);
0638     seekCurrentLineAction->setText(i18n("Seek to Current Line"));
0639     seekCurrentLineAction->setStatusTip(i18n("Seek to selected subtitle line show time"));
0640     connect(seekCurrentLineAction, &QAction::triggered, this, &Application::seekToCurrentLine);
0641     actionCollection->addAction(ACT_SEEK_TO_CURRENT_LINE, seekCurrentLineAction);
0642     actionManager->addAction(seekCurrentLineAction, UserAction::SubHasLine | UserAction::VideoPlaying);
0643 
0644     QAction *seekToNextLineAction = new QAction(actionCollection);
0645     seekToNextLineAction->setIcon(QIcon::fromTheme("media-skip-forward"));
0646     seekToNextLineAction->setText(i18n("Seek to Next Line"));
0647     seekToNextLineAction->setStatusTip(i18n("Seek to next subtitle line show time"));
0648     actionCollection->setDefaultShortcut(seekToNextLineAction, QKeySequence("Ctrl+Shift+Down"));
0649     connect(seekToNextLineAction, &QAction::triggered, this, &Application::seekToNextLine);
0650     actionCollection->addAction(ACT_SEEK_TO_NEXT_LINE, seekToNextLineAction);
0651     actionManager->addAction(seekToNextLineAction, UserAction::SubHasLine | UserAction::VideoPlaying);
0652 
0653     QAction *setCurrentLineShowTimeFromVideoAction = new QAction(actionCollection);
0654     setCurrentLineShowTimeFromVideoAction->setIcon(QIcon::fromTheme(QStringLiteral("set_show_time")));
0655     setCurrentLineShowTimeFromVideoAction->setText(i18n("Set Line Show Time to Video Position"));
0656     setCurrentLineShowTimeFromVideoAction->setStatusTip(i18n("Set current line show time to video position"));
0657     actionCollection->setDefaultShortcut(setCurrentLineShowTimeFromVideoAction, QKeySequence("Shift+Z"));
0658     connect(setCurrentLineShowTimeFromVideoAction, &QAction::triggered, this, &Application::setCurrentLineShowTimeFromVideo);
0659     actionCollection->addAction(ACT_SET_CURRENT_LINE_SHOW_TIME, setCurrentLineShowTimeFromVideoAction);
0660     actionManager->addAction(setCurrentLineShowTimeFromVideoAction, UserAction::HasSelection | UserAction::VideoPlaying | UserAction::EditableShowTime);
0661 
0662     QAction *setCurrentLineHideTimeFromVideoAction = new QAction(actionCollection);
0663     setCurrentLineHideTimeFromVideoAction->setIcon(QIcon::fromTheme(QStringLiteral("set_hide_time")));
0664     setCurrentLineHideTimeFromVideoAction->setText(i18n("Set Line Hide Time to Video Position"));
0665     setCurrentLineHideTimeFromVideoAction->setStatusTip(i18n("Set current line hide time to video position"));
0666     actionCollection->setDefaultShortcut(setCurrentLineHideTimeFromVideoAction, QKeySequence("Shift+X"));
0667     connect(setCurrentLineHideTimeFromVideoAction, &QAction::triggered, this, &Application::setCurrentLineHideTimeFromVideo);
0668     actionCollection->addAction(ACT_SET_CURRENT_LINE_HIDE_TIME, setCurrentLineHideTimeFromVideoAction);
0669     actionManager->addAction(setCurrentLineHideTimeFromVideoAction, UserAction::HasSelection | UserAction::VideoPlaying | UserAction::EditableShowTime);
0670 
0671     QAction *shiftToVideoPositionAction = new QAction(actionCollection);
0672     shiftToVideoPositionAction->setText(i18n("Shift Current Line to Video Position"));
0673     shiftToVideoPositionAction->setStatusTip(i18n("Set current line show time to video position by equally shifting all lines"));
0674     actionCollection->setDefaultShortcut(shiftToVideoPositionAction, QKeySequence("Shift+A"));
0675     connect(shiftToVideoPositionAction, &QAction::triggered, this, &Application::shiftToVideoPosition);
0676     actionCollection->addAction(ACT_SHIFT_TO_VIDEO_POSITION, shiftToVideoPositionAction);
0677     actionManager->addAction(shiftToVideoPositionAction, UserAction::HasSelection | UserAction::VideoPlaying | UserAction::FullScreenOff | UserAction::EditableShowTime);
0678 
0679     KToggleAction *currentLineFollowsVideoAction = new KToggleAction(actionCollection);
0680     currentLineFollowsVideoAction->setIcon(QIcon::fromTheme(QStringLiteral("current_line_follows_video")));
0681     currentLineFollowsVideoAction->setText(i18n("Current Line Follows Video"));
0682     currentLineFollowsVideoAction->setStatusTip(i18n("Make current line follow the playing video position"));
0683     connect(currentLineFollowsVideoAction, &QAction::toggled, this, &Application::onLinkCurrentLineToVideoToggled);
0684     actionCollection->addAction(ACT_CURRENT_LINE_FOLLOWS_VIDEO, currentLineFollowsVideoAction);
0685 
0686     KToggleAction *toggleMuteAction = new KToggleAction(actionCollection);
0687     toggleMuteAction->setIcon(QIcon::fromTheme("audio-volume-muted"));
0688     toggleMuteAction->setText(i18nc("@action:inmenu Toggle audio muted", "Mute"));
0689     toggleMuteAction->setStatusTip(i18n("Enable/disable playback sound"));
0690     actionCollection->setDefaultShortcut(toggleMuteAction, QKeySequence("/"));
0691     connect(toggleMuteAction, &QAction::toggled, videoPlayer, &VideoPlayer::setMuted);
0692     actionCollection->addAction(ACT_TOGGLE_MUTED, toggleMuteAction);
0693 
0694     QAction *increaseVolumeAction = new QAction(actionCollection);
0695     increaseVolumeAction->setIcon(QIcon::fromTheme("audio-volume-high"));
0696     increaseVolumeAction->setText(i18n("Increase Volume"));
0697     increaseVolumeAction->setStatusTip(i18n("Increase volume by 5%"));
0698     actionCollection->setDefaultShortcut(increaseVolumeAction, Qt::Key_Plus);
0699     connect(increaseVolumeAction, &QAction::triggered, videoPlayer, &VideoPlayer::increaseVolume);
0700     actionCollection->addAction(ACT_INCREASE_VOLUME, increaseVolumeAction);
0701 
0702     QAction *decreaseVolumeAction = new QAction(actionCollection);
0703     decreaseVolumeAction->setIcon(QIcon::fromTheme("audio-volume-low"));
0704     decreaseVolumeAction->setText(i18n("Decrease Volume"));
0705     decreaseVolumeAction->setStatusTip(i18n("Decrease volume by 5%"));
0706     actionCollection->setDefaultShortcut(decreaseVolumeAction, Qt::Key_Minus);
0707     connect(decreaseVolumeAction, &QAction::triggered, videoPlayer, &VideoPlayer::decreaseVolume);
0708     actionCollection->addAction(ACT_DECREASE_VOLUME, decreaseVolumeAction);
0709 
0710     KSelectAction *setActiveAudioStreamAction = new KSelectAction(actionCollection);
0711     setActiveAudioStreamAction->setIcon(QIcon::fromTheme(QStringLiteral("languages")));
0712     setActiveAudioStreamAction->setText(i18n("Audio Streams"));
0713     setActiveAudioStreamAction->setStatusTip(i18n("Select active audio stream"));
0714 #if KWIDGETSADDONS_VERSION < QT_VERSION_CHECK(5, 78, 0)
0715     connect(setActiveAudioStreamAction, QOverload<int>::of(&KSelectAction::triggered), videoPlayer, &VideoPlayer::selectAudioStream);
0716 #else
0717     connect(setActiveAudioStreamAction, &KSelectAction::indexTriggered, videoPlayer, &VideoPlayer::selectAudioStream);
0718 #endif
0719     actionCollection->addAction(ACT_SET_ACTIVE_AUDIO_STREAM, setActiveAudioStreamAction);
0720     actionManager->addAction(setActiveAudioStreamAction, UserAction::VideoOpened);
0721 
0722     QAction *increaseSubtitleFontAction = new QAction(actionCollection);
0723     increaseSubtitleFontAction->setIcon(QIcon::fromTheme("format-font-size-more"));
0724     increaseSubtitleFontAction->setText(i18n("Increase Font Size"));
0725     increaseSubtitleFontAction->setStatusTip(i18n("Increase subtitles font size by 1 point"));
0726     actionCollection->setDefaultShortcut(increaseSubtitleFontAction, QKeySequence("Alt++"));
0727     connect(increaseSubtitleFontAction, &QAction::triggered, m_mainWindow->m_playerWidget, &PlayerWidget::increaseFontSize);
0728     actionCollection->addAction(ACT_INCREASE_SUBTITLE_FONT, increaseSubtitleFontAction);
0729 
0730     QAction *decreaseSubtitleFontAction = new QAction(actionCollection);
0731     decreaseSubtitleFontAction->setIcon(QIcon::fromTheme("format-font-size-less"));
0732     decreaseSubtitleFontAction->setText(i18n("Decrease Font Size"));
0733     decreaseSubtitleFontAction->setStatusTip(i18n("Decrease subtitles font size by 1 point"));
0734     actionCollection->setDefaultShortcut(decreaseSubtitleFontAction, QKeySequence("Alt+-"));
0735     connect(decreaseSubtitleFontAction, &QAction::triggered, m_mainWindow->m_playerWidget, &PlayerWidget::decreaseFontSize);
0736     actionCollection->addAction(ACT_DECREASE_SUBTITLE_FONT, decreaseSubtitleFontAction);
0737 
0738     KSelectAction *setActiveSubtitleStreamAction = new KSelectAction(actionCollection);
0739     setActiveSubtitleStreamAction->setIcon(QIcon::fromTheme(QStringLiteral("languages")));
0740     setActiveSubtitleStreamAction->setText(i18n("Displayed Subtitle Text"));
0741     setActiveSubtitleStreamAction->setStatusTip(i18n("Select visible subtitle text"));
0742 #if KWIDGETSADDONS_VERSION < QT_VERSION_CHECK(5, 78, 0)
0743     connect(setActiveSubtitleStreamAction, QOverload<int>::of(&KSelectAction::triggered), this, &Application::setActiveSubtitleStream);
0744 #else
0745     connect(setActiveSubtitleStreamAction, &KSelectAction::indexTriggered, this, &Application::setActiveSubtitleStream);
0746 #endif
0747     actionCollection->addAction(ACT_SET_ACTIVE_SUBTITLE_STREAM, setActiveSubtitleStreamAction);
0748     actionManager->addAction(setActiveSubtitleStreamAction, UserAction::SubTrOpened);
0749 
0750     QAction *toggleAnchor = new QAction(actionCollection);
0751     toggleAnchor->setIcon(QIcon::fromTheme(QStringLiteral("anchor")));
0752     toggleAnchor->setText(i18n("Toggle Anchor"));
0753     toggleAnchor->setStatusTip(i18n("(Un)Anchor current line's show time to timeline (Editing anchored line's show time will stretch/compact the timeline between adjacent anchors)"));
0754     actionCollection->setDefaultShortcut(toggleAnchor, QKeySequence("Alt+A"));
0755     connect(toggleAnchor, &QAction::triggered, this, &Application::anchorToggle);
0756     actionCollection->addAction(ACT_ANCHOR_TOGGLE, toggleAnchor);
0757     actionManager->addAction(toggleAnchor, UserAction::HasSelection | UserAction::FullScreenOff);
0758 
0759     QAction *removeAllAnchors = new QAction(actionCollection);
0760     removeAllAnchors->setText(i18n("Remove All Anchors"));
0761     removeAllAnchors->setStatusTip(i18n("Unanchor show time from the timeline on all anchored lines"));
0762     actionCollection->setDefaultShortcut(removeAllAnchors, QKeySequence("Alt+Shift+A"));
0763     connect(removeAllAnchors, &QAction::triggered, this, &Application::anchorRemoveAll);
0764     actionCollection->addAction(ACT_ANCHOR_REMOVE_ALL, removeAllAnchors);
0765     actionManager->addAction(removeAllAnchors, UserAction::HasSelection | UserAction::FullScreenOff | UserAction::AnchorsSome);
0766 
0767     QAction *scriptsManagerAction = new QAction(actionCollection);
0768     scriptsManagerAction->setIcon(QIcon::fromTheme("folder-development"));
0769     scriptsManagerAction->setText(i18nc("@action:inmenu Manage user scripts", "Scripts Manager..."));
0770     scriptsManagerAction->setStatusTip(i18n("Manage user scripts"));
0771     connect(scriptsManagerAction, &QAction::triggered, m_scriptsManager, &ScriptsManager::showDialog);
0772     actionCollection->addAction(ACT_SCRIPTS_MANAGER, scriptsManagerAction);
0773     actionManager->addAction(scriptsManagerAction, UserAction::FullScreenOff);
0774 
0775     QAction *waveformZoomInAction = new QAction(actionCollection);
0776     waveformZoomInAction->setIcon(QIcon::fromTheme("zoom-in"));
0777     waveformZoomInAction->setText(i18n("Waveform Zoom In"));
0778     waveformZoomInAction->setStatusTip(i18n("Waveform Zoom In"));
0779     connect(waveformZoomInAction, &QAction::triggered, m_mainWindow->m_waveformWidget, &WaveformWidget::zoomIn);
0780     actionCollection->addAction(ACT_WAVEFORM_ZOOM_IN, waveformZoomInAction);
0781 
0782     QAction *waveformZoomOutAction = new QAction(actionCollection);
0783     waveformZoomOutAction->setIcon(QIcon::fromTheme("zoom-out"));
0784     waveformZoomOutAction->setText(i18n("Waveform Zoom Out"));
0785     waveformZoomOutAction->setStatusTip(i18n("Waveform Zoom Out"));
0786     connect(waveformZoomOutAction, &QAction::triggered, m_mainWindow->m_waveformWidget, &WaveformWidget::zoomOut);
0787     actionCollection->addAction(ACT_WAVEFORM_ZOOM_OUT, waveformZoomOutAction);
0788 
0789     QAction *waveformAutoScrollAction = new QAction(actionCollection);
0790     waveformAutoScrollAction->setCheckable(true);
0791     waveformAutoScrollAction->setIcon(QIcon::fromTheme(QStringLiteral("current_line_follows_video")));
0792     waveformAutoScrollAction->setText(i18n("Waveform Auto Scroll"));
0793     waveformAutoScrollAction->setStatusTip(i18n("Waveform display will automatically scroll to video position"));
0794     connect(waveformAutoScrollAction, &QAction::toggled, m_mainWindow->m_waveformWidget, &WaveformWidget::setAutoscroll);
0795     actionCollection->addAction(ACT_WAVEFORM_AUTOSCROLL, waveformAutoScrollAction);
0796 
0797     updateActionTexts();
0798 
0799     emit actionsReady();
0800 }