1 /*
2     SPDX-FileCopyrightText: 2007-2009 Sergio Pistone <sergio_pistone@yahoo.com.ar>
3     SPDX-FileCopyrightText: 2010-2018 Mladen Milinkovic <max@smoothware.net>
4 
5     SPDX-License-Identifier: GPL-2.0-or-later
6 */
7 
8 #include "scripting_subtitleline.h"
9 #include "scripting_sstring.h"
10 #include "application.h"
11 #include "core/richdocument.h"
12 #include "core/subtitletarget.h"
13 
14 #include <QDebug>
15 
16 using namespace SubtitleComposer;
17 
18 static SubtitleTarget
toTextTarget(int value,int opDefault)19 toTextTarget(int value, int opDefault)
20 {
21 	if(value < Primary || value >= SubtitleTargetSize)
22 		return SubtitleTarget(opDefault);
23 	return SubtitleTarget(value);
24 }
25 
SubtitleLine(SubtitleComposer::SubtitleLine * backend,QObject * parent)26 Scripting::SubtitleLine::SubtitleLine(SubtitleComposer::SubtitleLine *backend, QObject *parent) :
27 	QObject(parent),
28 	m_backend(backend)
29 {}
30 
31 int
number() const32 Scripting::SubtitleLine::number() const
33 {
34 	return m_backend->number();
35 }
36 
37 int
index() const38 Scripting::SubtitleLine::index() const
39 {
40 	return m_backend->index();
41 }
42 
43 QObject *
prevLine() const44 Scripting::SubtitleLine::prevLine() const
45 {
46 	if(!m_backend->prevLine())
47 		return 0;
48 	return new Scripting::SubtitleLine(m_backend->prevLine(), const_cast<Scripting::SubtitleLine *>(this));
49 }
50 
51 QObject *
nextLine() const52 Scripting::SubtitleLine::nextLine() const
53 {
54 	if(!m_backend->nextLine())
55 		return 0;
56 	return new Scripting::SubtitleLine(m_backend->nextLine(), const_cast<Scripting::SubtitleLine *>(this));
57 }
58 
59 int
primaryCharacters() const60 Scripting::SubtitleLine::primaryCharacters() const
61 {
62 	return m_backend->primaryCharacters();
63 }
64 
65 int
primaryWords() const66 Scripting::SubtitleLine::primaryWords() const
67 {
68 	return m_backend->primaryWords();
69 }
70 
71 int
primaryLines() const72 Scripting::SubtitleLine::primaryLines() const
73 {
74 	return m_backend->primaryLines();
75 }
76 
77 QObject *
primaryText() const78 Scripting::SubtitleLine::primaryText() const
79 {
80 	return new Scripting::SString(m_backend->primaryDoc()->toRichText(), const_cast<Scripting::SubtitleLine *>(this));
81 }
82 
83 void
setPrimaryText(const QObject * object)84 Scripting::SubtitleLine::setPrimaryText(const QObject *object)
85 {
86 	const Scripting::SString *string = qobject_cast<const Scripting::SString *>(object);
87 	if(string)
88 		m_backend->primaryDoc()->setRichText(string->m_backend);
89 }
90 
91 QString
plainPrimaryText() const92 Scripting::SubtitleLine::plainPrimaryText() const
93 {
94 	return m_backend->primaryDoc()->toPlainText();
95 }
96 
97 void
setPlainPrimaryText(const QString & plainText)98 Scripting::SubtitleLine::setPlainPrimaryText(const QString &plainText)
99 {
100 	m_backend->primaryDoc()->setPlainText(plainText);
101 }
102 
103 QString
richPrimaryText() const104 Scripting::SubtitleLine::richPrimaryText() const
105 {
106 	return m_backend->primaryDoc()->toRichText();
107 }
108 
109 void
setRichPrimaryText(const QString & richText)110 Scripting::SubtitleLine::setRichPrimaryText(const QString &richText)
111 {
112 	SubtitleComposer::SString text;
113 	text.setRichString(richText);
114 	m_backend->primaryDoc()->setRichText(text);
115 }
116 
117 int
secondaryCharacters() const118 Scripting::SubtitleLine::secondaryCharacters() const
119 {
120 	return m_backend->secondaryCharacters();
121 }
122 
123 int
secondaryWords() const124 Scripting::SubtitleLine::secondaryWords() const
125 {
126 	return m_backend->secondaryWords();
127 }
128 
129 int
secondaryLines() const130 Scripting::SubtitleLine::secondaryLines() const
131 {
132 	return m_backend->secondaryLines();
133 }
134 
135 QObject *
secondaryText() const136 Scripting::SubtitleLine::secondaryText() const
137 {
138 	return new Scripting::SString(m_backend->secondaryDoc()->toRichText(), const_cast<Scripting::SubtitleLine *>(this));
139 }
140 
141 void
setSecondaryText(const QObject * object)142 Scripting::SubtitleLine::setSecondaryText(const QObject *object)
143 {
144 	if(app()->translationMode()) {
145 		const Scripting::SString *string = qobject_cast<const Scripting::SString *>(object);
146 		if(string)
147 			m_backend->secondaryDoc()->setRichText(string->m_backend);
148 	}
149 }
150 
151 QString
plainSecondaryText() const152 Scripting::SubtitleLine::plainSecondaryText() const
153 {
154 	return m_backend->secondaryDoc()->toPlainText();
155 }
156 
157 void
setPlainSecondaryText(const QString & plainText)158 Scripting::SubtitleLine::setPlainSecondaryText(const QString &plainText)
159 {
160 	if(app()->translationMode())
161 		m_backend->secondaryDoc()->setPlainText(plainText);
162 }
163 
164 QString
richSecondaryText() const165 Scripting::SubtitleLine::richSecondaryText() const
166 {
167 	return m_backend->secondaryDoc()->toRichText();
168 }
169 
170 void
setRichSecondaryText(const QString & richText)171 Scripting::SubtitleLine::setRichSecondaryText(const QString &richText)
172 {
173 	if(app()->translationMode()) {
174 		SubtitleComposer::SString text;
175 		text.setRichString(richText);
176 		m_backend->secondaryDoc()->setRichText(text);
177 	}
178 }
179 
180 void
breakText(int minLengthForBreak,int target)181 Scripting::SubtitleLine::breakText(int minLengthForBreak, int target)
182 {
183 	const int opDefault = app()->translationMode() ? Both : Primary;
184 
185 	m_backend->breakText(minLengthForBreak, toTextTarget(target, opDefault));
186 }
187 
188 void
unbreakText(int target)189 Scripting::SubtitleLine::unbreakText(int target)
190 {
191 	const int opDefault = app()->translationMode() ? Both : Primary;
192 
193 	m_backend->unbreakText(toTextTarget(target, opDefault));
194 }
195 
196 void
simplifyTextWhiteSpace(int target)197 Scripting::SubtitleLine::simplifyTextWhiteSpace(int target)
198 {
199 	const int opDefault = app()->translationMode() ? Both : Primary;
200 
201 	m_backend->simplifyTextWhiteSpace(toTextTarget(target, opDefault));
202 }
203 
204 int
showTime() const205 Scripting::SubtitleLine::showTime() const
206 {
207 	return m_backend->showTime().toMillis();
208 }
209 
210 void
setShowTime(int showTime)211 Scripting::SubtitleLine::setShowTime(int showTime)
212 {
213 	m_backend->setShowTime(showTime);
214 }
215 
216 int
hideTime() const217 Scripting::SubtitleLine::hideTime() const
218 {
219 	return m_backend->hideTime().toMillis();
220 }
221 
222 void
setHideTime(int hideTime)223 Scripting::SubtitleLine::setHideTime(int hideTime)
224 {
225 	m_backend->setHideTime(hideTime);
226 }
227 
228 int
durationTime() const229 Scripting::SubtitleLine::durationTime() const
230 {
231 	return m_backend->durationTime().toMillis();
232 }
233 
234 void
setDurationTime(int durationTime)235 Scripting::SubtitleLine::setDurationTime(int durationTime)
236 {
237 	m_backend->setDurationTime(durationTime);
238 }
239 
240 int
autoDuration(int msecsPerChar,int msecsPerWord,int msecsPerLine,int calculationTarget)241 Scripting::SubtitleLine::autoDuration(int msecsPerChar, int msecsPerWord, int msecsPerLine, int calculationTarget)
242 {
243 	const int opDefault = app()->translationMode() ? Both : Primary;
244 
245 	return m_backend->autoDuration(msecsPerChar, msecsPerWord, msecsPerLine, toTextTarget(calculationTarget, opDefault)).toMillis();
246 }
247 
248 void
shiftTimes(int mseconds)249 Scripting::SubtitleLine::shiftTimes(int mseconds)
250 {
251 	m_backend->shiftTimes(mseconds);
252 }
253 
254 void
adjustTimes(int shiftMseconds,double scaleFactor)255 Scripting::SubtitleLine::adjustTimes(int shiftMseconds, double scaleFactor)
256 {
257 	m_backend->adjustTimes(shiftMseconds, scaleFactor);
258 }
259 
260 int
errorCount() const261 Scripting::SubtitleLine::errorCount() const
262 {
263 	return m_backend->errorCount();
264 }
265 
266 int
errorFlags() const267 Scripting::SubtitleLine::errorFlags() const
268 {
269 	return m_backend->errorFlags();
270 }
271 
272 void
setErrorFlags(int errorFlags)273 Scripting::SubtitleLine::setErrorFlags(int errorFlags)
274 {
275 	m_backend->setErrorFlags(errorFlags);
276 }
277 
278 void
setErrorFlags(int errorFlags,bool value)279 Scripting::SubtitleLine::setErrorFlags(int errorFlags, bool value)
280 {
281 	m_backend->setErrorFlags(errorFlags, value);
282 }
283 
284 bool
checkEmptyPrimaryText(bool update)285 Scripting::SubtitleLine::checkEmptyPrimaryText(bool update)
286 {
287 	return m_backend->checkEmptyPrimaryText(update);
288 }
289 
290 bool
checkEmptySecondaryText(bool update)291 Scripting::SubtitleLine::checkEmptySecondaryText(bool update)
292 {
293 	return m_backend->checkEmptySecondaryText(update);
294 }
295 
296 bool
checkUntranslatedText(bool update)297 Scripting::SubtitleLine::checkUntranslatedText(bool update)
298 {
299 	return m_backend->checkUntranslatedText(update);
300 }
301 
302 bool
checkOverlapsWithNext(bool update)303 Scripting::SubtitleLine::checkOverlapsWithNext(bool update)
304 {
305 	return m_backend->checkOverlapsWithNext(update);
306 }
307 
308 bool
checkMinDuration(int minMsecs,bool update)309 Scripting::SubtitleLine::checkMinDuration(int minMsecs, bool update)
310 {
311 	return m_backend->checkMinDuration(minMsecs, update);
312 }
313 
314 bool
checkMaxDuration(int maxMsecs,bool update)315 Scripting::SubtitleLine::checkMaxDuration(int maxMsecs, bool update)
316 {
317 	return m_backend->checkMaxDuration(maxMsecs, update);
318 }
319 
320 bool
checkMinDurationPerPrimaryChar(int minMsecsPerChar,bool update)321 Scripting::SubtitleLine::checkMinDurationPerPrimaryChar(int minMsecsPerChar, bool update)
322 {
323 	return m_backend->checkMinDurationPerPrimaryChar(minMsecsPerChar, update);
324 }
325 
326 bool
checkMinDurationPerSecondaryChar(int minMsecsPerChar,bool update)327 Scripting::SubtitleLine::checkMinDurationPerSecondaryChar(int minMsecsPerChar, bool update)
328 {
329 	return m_backend->checkMinDurationPerSecondaryChar(minMsecsPerChar, update);
330 }
331 
332 bool
checkMaxDurationPerPrimaryChar(int maxMsecsPerChar,bool update)333 Scripting::SubtitleLine::checkMaxDurationPerPrimaryChar(int maxMsecsPerChar, bool update)
334 {
335 	return m_backend->checkMaxDurationPerPrimaryChar(maxMsecsPerChar, update);
336 }
337 
338 bool
checkMaxDurationPerSecondaryChar(int maxMsecsPerChar,bool update)339 Scripting::SubtitleLine::checkMaxDurationPerSecondaryChar(int maxMsecsPerChar, bool update)
340 {
341 	return m_backend->checkMaxDurationPerSecondaryChar(maxMsecsPerChar, update);
342 }
343 
344 bool
checkMaxPrimaryChars(int maxCharacters,bool update)345 Scripting::SubtitleLine::checkMaxPrimaryChars(int maxCharacters, bool update)
346 {
347 	return m_backend->checkMaxPrimaryChars(maxCharacters, update);
348 }
349 
350 bool
checkMaxSecondaryChars(int maxCharacters,bool update)351 Scripting::SubtitleLine::checkMaxSecondaryChars(int maxCharacters, bool update)
352 {
353 	return m_backend->checkMaxSecondaryChars(maxCharacters, update);
354 }
355 
356 bool
checkMaxPrimaryLines(int maxLines,bool update)357 Scripting::SubtitleLine::checkMaxPrimaryLines(int maxLines, bool update)
358 {
359 	return m_backend->checkMaxPrimaryLines(maxLines, update);
360 }
361 
362 bool
checkMaxSecondaryLines(int maxLines,bool update)363 Scripting::SubtitleLine::checkMaxSecondaryLines(int maxLines, bool update)
364 {
365 	return m_backend->checkMaxSecondaryLines(maxLines, update);
366 }
367 
368 bool
checkPrimaryUnneededSpaces(bool update)369 Scripting::SubtitleLine::checkPrimaryUnneededSpaces(bool update)
370 {
371 	return m_backend->checkPrimaryUnneededSpaces(update);
372 }
373 
374 bool
checkSecondaryUnneededSpaces(bool update)375 Scripting::SubtitleLine::checkSecondaryUnneededSpaces(bool update)
376 {
377 	return m_backend->checkSecondaryUnneededSpaces(update);
378 }
379 
380 bool
checkPrimaryCapitalAfterEllipsis(bool update)381 Scripting::SubtitleLine::checkPrimaryCapitalAfterEllipsis(bool update)
382 {
383 	return m_backend->checkPrimaryCapitalAfterEllipsis(update);
384 }
385 
386 bool
checkSecondaryCapitalAfterEllipsis(bool update)387 Scripting::SubtitleLine::checkSecondaryCapitalAfterEllipsis(bool update)
388 {
389 	return m_backend->checkSecondaryCapitalAfterEllipsis(update);
390 }
391 
392 bool
checkPrimaryUnneededDash(bool update)393 Scripting::SubtitleLine::checkPrimaryUnneededDash(bool update)
394 {
395 	return m_backend->checkPrimaryUnneededDash(update);
396 }
397 
398 bool
checkSecondaryUnneededDash(bool update)399 Scripting::SubtitleLine::checkSecondaryUnneededDash(bool update)
400 {
401 	return m_backend->checkSecondaryUnneededDash(update);
402 }
403 
404 int
check(int errorFlagsToCheck,bool update)405 Scripting::SubtitleLine::check(int errorFlagsToCheck, bool update)
406 {
407 	return m_backend->check(errorFlagsToCheck, update);
408 }
409 
410 bool
isRightToLeft() const411 Scripting::SubtitleLine::isRightToLeft() const
412 {
413 	return m_backend->primaryDoc()->toPlainText().isRightToLeft();
414 }
415