File indexing completed on 2024-06-16 04:38:14

0001 /*
0002     SPDX-FileCopyrightText: 2007-2009 Sergio Pistone <sergio_pistone@yahoo.com.ar>
0003     SPDX-FileCopyrightText: 2010-2022 Mladen Milinkovic <max@smoothware.net>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include "subtitlelineactions.h"
0009 #include "core/richtext/richdocument.h"
0010 #include "core/subtitle.h"
0011 
0012 #include <KLocalizedString>
0013 
0014 using namespace SubtitleComposer;
0015 
0016 // *** SubtitleLineAction
0017 SubtitleLineAction::SubtitleLineAction(SubtitleLine *line, UndoStack::DirtyMode dirtyMode, const QString &description)
0018     : UndoAction(dirtyMode, line->subtitle(), description),
0019       m_line(line)
0020 {}
0021 
0022 SubtitleLineAction::~SubtitleLineAction()
0023 {}
0024 
0025 
0026 // *** SetLinePrimaryTextAction
0027 SetLinePrimaryTextAction::SetLinePrimaryTextAction(SubtitleLine *line, RichDocument *primaryDoc)
0028     : SubtitleLineAction(line, UndoStack::Primary, i18n("Set Line Text")),
0029       m_primaryDoc(primaryDoc),
0030       m_primaryDocState(primaryDoc->availableUndoSteps())
0031 {}
0032 
0033 SetLinePrimaryTextAction::~SetLinePrimaryTextAction()
0034 {}
0035 
0036 bool
0037 SetLinePrimaryTextAction::mergeWith(const QUndoCommand *command)
0038 {
0039     const SetLinePrimaryTextAction *cur = static_cast<const SetLinePrimaryTextAction *>(command);
0040     return cur->m_primaryDoc == m_primaryDoc && cur->m_primaryDocState == m_primaryDocState;
0041 }
0042 
0043 void
0044 SetLinePrimaryTextAction::undo()
0045 {
0046     const bool prev = m_line->ignoreDocChanges(true);
0047     while(m_primaryDoc->isUndoAvailable() && m_primaryDoc->availableUndoSteps() >= m_primaryDocState)
0048         m_primaryDoc->undo();
0049     m_line->ignoreDocChanges(prev);
0050     emit m_line->primaryTextChanged();
0051 }
0052 
0053 void
0054 SetLinePrimaryTextAction::redo()
0055 {
0056     const bool prev = m_line->ignoreDocChanges(true);
0057     while(m_primaryDoc->isRedoAvailable() && m_primaryDoc->availableUndoSteps() < m_primaryDocState)
0058         m_primaryDoc->redo();
0059     m_line->ignoreDocChanges(prev);
0060     emit m_line->primaryTextChanged();
0061 }
0062 
0063 
0064 // *** SetLineSecondaryTextAction
0065 SetLineSecondaryTextAction::SetLineSecondaryTextAction(SubtitleLine *line, RichDocument *secondaryDoc)
0066     : SubtitleLineAction(line, UndoStack::Secondary, i18n("Set Line Secondary Text")),
0067       m_secondaryDoc(secondaryDoc),
0068       m_secondaryDocState(secondaryDoc->availableUndoSteps())
0069 {}
0070 
0071 SetLineSecondaryTextAction::~SetLineSecondaryTextAction()
0072 {}
0073 
0074 bool
0075 SetLineSecondaryTextAction::mergeWith(const QUndoCommand *command)
0076 {
0077     const SetLineSecondaryTextAction *cur = static_cast<const SetLineSecondaryTextAction *>(command);
0078     return cur->m_secondaryDoc == m_secondaryDoc && cur->m_secondaryDocState == m_secondaryDocState;
0079 }
0080 
0081 void
0082 SetLineSecondaryTextAction::undo()
0083 {
0084     const bool prev = m_line->ignoreDocChanges(true);
0085     while(m_secondaryDoc->isUndoAvailable() && m_secondaryDoc->availableUndoSteps() >= m_secondaryDocState)
0086         m_secondaryDoc->undo();
0087     m_line->ignoreDocChanges(prev);
0088     emit m_line->secondaryTextChanged();
0089 }
0090 
0091 void
0092 SetLineSecondaryTextAction::redo()
0093 {
0094     const bool prev = m_line->ignoreDocChanges(true);
0095     while(m_secondaryDoc->isRedoAvailable() && m_secondaryDoc->availableUndoSteps() < m_secondaryDocState)
0096         m_secondaryDoc->redo();
0097     m_line->ignoreDocChanges(prev);
0098     emit m_line->secondaryTextChanged();
0099 }
0100 
0101 
0102 
0103 // *** SetLineShowTimeAction
0104 SetLineShowTimeAction::SetLineShowTimeAction(SubtitleLine *line, const Time &showTime)
0105     : SubtitleLineAction(line, UndoStack::Both, i18n("Set Line Show Time")),
0106       m_showTime(showTime)
0107 {}
0108 
0109 SetLineShowTimeAction::~SetLineShowTimeAction()
0110 {}
0111 
0112 bool
0113 SetLineShowTimeAction::mergeWith(const QUndoCommand *command)
0114 {
0115     const SetLineShowTimeAction *currentAction = static_cast<const SetLineShowTimeAction *>(command);
0116     return &currentAction->m_line == &m_line;
0117 }
0118 
0119 void
0120 SetLineShowTimeAction::redo()
0121 {
0122     Time tmp = m_line->m_showTime;
0123     m_line->m_showTime = m_showTime;
0124     m_showTime = tmp;
0125 
0126     emit m_line->showTimeChanged(m_line->m_showTime);
0127 }
0128 
0129 
0130 // *** SetLineHideTimeAction
0131 SetLineHideTimeAction::SetLineHideTimeAction(SubtitleLine *line, const Time &hideTime)
0132     : SubtitleLineAction(line, UndoStack::Both, i18n("Set Line Hide Time")),
0133       m_hideTime(hideTime)
0134 {}
0135 
0136 SetLineHideTimeAction::~SetLineHideTimeAction()
0137 {}
0138 
0139 bool
0140 SetLineHideTimeAction::mergeWith(const QUndoCommand *command)
0141 {
0142     const SetLineHideTimeAction *currentAction = static_cast<const SetLineHideTimeAction *>(command);
0143     return &currentAction->m_line == &m_line;
0144 }
0145 
0146 void
0147 SetLineHideTimeAction::redo()
0148 {
0149     Time tmp = m_line->m_hideTime;
0150     m_line->m_hideTime = m_hideTime;
0151     m_hideTime = tmp;
0152 
0153     emit m_line->hideTimeChanged(m_line->m_hideTime);
0154 }
0155 
0156 
0157 // *** SetLineTimesAction
0158 SetLineTimesAction::SetLineTimesAction(SubtitleLine *line, const Time &showTime, const Time &hideTime, QString description)
0159     : SubtitleLineAction(line, UndoStack::Both, description),
0160       m_showTime(showTime),
0161       m_hideTime(hideTime)
0162 {}
0163 
0164 SetLineTimesAction::~SetLineTimesAction()
0165 {}
0166 
0167 bool
0168 SetLineTimesAction::mergeWith(const QUndoCommand *command)
0169 {
0170     const SetLineTimesAction *currentAction = static_cast<const SetLineTimesAction *>(command);
0171     return &currentAction->m_line == &m_line;
0172 }
0173 
0174 void
0175 SetLineTimesAction::redo()
0176 {
0177     if(m_line->m_showTime != m_showTime) {
0178         Time tmp = m_line->m_showTime;
0179         m_line->m_showTime = m_showTime;
0180         m_showTime = tmp;
0181 
0182         emit m_line->showTimeChanged(m_line->m_showTime);
0183     }
0184 
0185     if(m_line->m_hideTime != m_hideTime) {
0186         Time tmp = m_line->m_hideTime;
0187         m_line->m_hideTime = m_hideTime;
0188         m_hideTime = tmp;
0189 
0190         emit m_line->hideTimeChanged(m_line->m_hideTime);
0191     }
0192 }
0193 
0194 // *** SetLineErrorsAction
0195 SetLineErrorsAction::SetLineErrorsAction(SubtitleLine *line, int errorFlags)
0196     : SubtitleLineAction(line, UndoStack::None, i18n("Set Line Errors")),
0197       m_errorFlags(errorFlags)
0198 {}
0199 
0200 SetLineErrorsAction::~SetLineErrorsAction()
0201 {}
0202 
0203 bool
0204 SetLineErrorsAction::mergeWith(const QUndoCommand *command)
0205 {
0206     const SetLineErrorsAction *currentAction = static_cast<const SetLineErrorsAction *>(command);
0207     return &currentAction->m_line == &m_line;
0208 }
0209 
0210 void
0211 SetLineErrorsAction::redo()
0212 {
0213     int tmp = m_line->m_errorFlags;
0214     m_line->m_errorFlags = m_errorFlags;
0215     m_errorFlags = tmp;
0216 
0217     emit m_line->errorFlagsChanged(m_line->m_errorFlags);
0218 }