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 "actionwithtargetdialog.h"
9 #include "application.h"
10 
11 #include <QGroupBox>
12 #include <QButtonGroup>
13 #include <QRadioButton>
14 #include <QGridLayout>
15 
16 #include <QIcon>
17 #include <QDebug>
18 
19 using namespace SubtitleComposer;
20 
ActionWithTargetDialog(const QString & title,QWidget * parent)21 ActionWithTargetDialog::ActionWithTargetDialog(const QString &title, QWidget *parent) :
22 	ActionDialog(title, parent),
23 	m_targetGroupBox(0),
24 	m_targetLayout(0),
25 	m_lineTargetsButtonGroup(0),
26 	m_textTargetsButtonGroup(0),
27 	m_selectionTargetOnlyMode(false),
28 	m_selectionTargetWasChecked(false),
29 	m_translationMode(false),
30 	m_nonTranslationModeTarget(Primary)
31 {
32 }
33 
34 int
exec()35 ActionWithTargetDialog::exec()
36 {
37 	setTranslationMode(app()->translationMode());
38 	setSelectionTargetOnlyMode(app()->showingLinesContextMenu());
39 
40 	return ActionDialog::exec();
41 }
42 
43 void
show()44 ActionWithTargetDialog::show()
45 {
46 	setTranslationMode(app()->translationMode());
47 	setSelectionTargetOnlyMode(app()->showingLinesContextMenu());
48 
49 	ActionDialog::show();
50 }
51 
52 QGroupBox *
createTargetsGroupBox(const QString & title,bool addToLayout)53 ActionWithTargetDialog::createTargetsGroupBox(const QString &title, bool addToLayout)
54 {
55 	if(!m_targetGroupBox) {
56 		m_targetGroupBox = createGroupBox(title, addToLayout);
57 		m_targetLayout = createLayout(m_targetGroupBox);
58 	}
59 
60 	return m_targetGroupBox;
61 }
62 
63 void
updateTargetsGroupBoxHiddenState()64 ActionWithTargetDialog::updateTargetsGroupBoxHiddenState()
65 {
66 	bool hidden = true;
67 	QList<QWidget *> children = m_targetGroupBox->findChildren<QWidget *>();
68 	for(int index = 0, size = children.size(); index < size; ++index) {
69 		if(!children.at(index)->isHidden()) {
70 			hidden = false;
71 			break;
72 		}
73 	}
74 
75 	if(hidden != m_targetGroupBox->isHidden()) {
76 		if(hidden)
77 			m_targetGroupBox->hide();
78 		else
79 			m_targetGroupBox->show();
80 	}
81 }
82 
83 void
onDefaultButtonClicked()84 ActionWithTargetDialog::onDefaultButtonClicked()
85 {
86 	if(m_lineTargetsButtonGroup) {
87 		LinesTarget prevTarget = selectedLinesTarget();
88 		setSelectionTargetOnlyMode(!m_lineTargetsButtonGroup->button(0)->isHidden());
89 		setSelectedLinesTarget(prevTarget);     // setSelectionTargetOnlyMode resets the target so we restore it
90 	}
91 }
92 
93 void
setTargetsButtonsHiddenState(QButtonGroup * targetButtonGroup,bool hidden)94 ActionWithTargetDialog::setTargetsButtonsHiddenState(QButtonGroup *targetButtonGroup, bool hidden)
95 {
96 	if(!targetButtonGroup || hidden == targetButtonGroup->button(0)->isHidden())
97 		return;
98 
99 	QList<QAbstractButton *> buttons = targetButtonGroup->buttons();
100 	if(hidden) {
101 		for(int index = 0, size = buttons.size(); index < size; ++index)
102 			buttons.at(index)->hide();
103 	} else {
104 		for(int index = 0, size = buttons.size(); index < size; ++index)
105 			buttons.at(index)->show();
106 	}
107 
108 	updateTargetsGroupBoxHiddenState();
109 
110 	if(targetButtonGroup == m_lineTargetsButtonGroup) {
111 		m_buttonBox->button(QDialogButtonBox::RestoreDefaults)->setText(hidden ? i18n("Target >>") : i18n("Target <<"));
112 
113 		m_mainWidget->updateGeometry();
114 		setMinimumSize(minimumSizeHint());
115 		resize(size().width(), minimumSizeHint().height());
116 	}
117 }
118 
119 /// LINE TARGETS
120 /// ============
121 
122 void
createLineTargetsButtonGroup()123 ActionWithTargetDialog::createLineTargetsButtonGroup()
124 {
125 	QPushButton *btnDefault = m_buttonBox->addButton(QDialogButtonBox::RestoreDefaults);
126 	btnDefault->setIcon(QIcon());
127 	btnDefault->setText(i18n("Target <<"));
128 	btnDefault->setToolTip(QString());
129 	connect(btnDefault, &QAbstractButton::clicked, this, &ActionWithTargetDialog::onDefaultButtonClicked);
130 
131 	createTargetsGroupBox();
132 
133 	m_lineTargetsButtonGroup = new QButtonGroup(this);
134 
135 	for(int index = 0; index < None; ++index) {
136 		QRadioButton *radioButton = new QRadioButton(m_targetGroupBox);
137 		m_lineTargetsButtonGroup->addButton(radioButton, index);
138 		m_targetLayout->addWidget(radioButton, index, 0);
139 	}
140 
141 	m_lineTargetsButtonGroup->button(AllLines)->setText(i18n("All lines"));
142 	m_lineTargetsButtonGroup->button(Selection)->setText(i18n("Selected lines"));
143 	m_lineTargetsButtonGroup->button(FromSelected)->setText(i18n("All lines from first selected"));
144 	m_lineTargetsButtonGroup->button(UpToSelected)->setText(i18n("All lines up to last selected"));
145 
146 	m_lineTargetsButtonGroup->button(AllLines)->setChecked(true);
147 
148 	_setSelectionTargetOnlyMode(m_selectionTargetOnlyMode, true);
149 }
150 
151 ActionWithTargetDialog::LinesTarget
selectedLinesTarget() const152 ActionWithTargetDialog::selectedLinesTarget() const
153 {
154 	if(!m_lineTargetsButtonGroup) // lines target was not created
155 		return AllLines;
156 
157 	int checkedId = m_lineTargetsButtonGroup->checkedId();
158 	return checkedId == -1 ? None : (LinesTarget)checkedId;
159 }
160 
161 void
setSelectedLinesTarget(ActionWithTargetDialog::LinesTarget target)162 ActionWithTargetDialog::setSelectedLinesTarget(ActionWithTargetDialog::LinesTarget target)
163 {
164 	if(m_lineTargetsButtonGroup && m_lineTargetsButtonGroup->button(target))
165 		m_lineTargetsButtonGroup->button(target)->setChecked(true);
166 }
167 
168 bool
isLinesTargetEnabled(LinesTarget target) const169 ActionWithTargetDialog::isLinesTargetEnabled(LinesTarget target) const
170 {
171 	return m_lineTargetsButtonGroup && m_lineTargetsButtonGroup->button(target) && m_lineTargetsButtonGroup->button(target)->isEnabled();
172 }
173 
174 void
setLinesTargetEnabled(LinesTarget target,bool enabled)175 ActionWithTargetDialog::setLinesTargetEnabled(LinesTarget target, bool enabled)
176 {
177 	if(m_lineTargetsButtonGroup && m_lineTargetsButtonGroup->button(target))
178 		m_lineTargetsButtonGroup->button(target)->setEnabled(enabled);
179 }
180 
181 bool
selectionTargetOnlyMode() const182 ActionWithTargetDialog::selectionTargetOnlyMode() const
183 {
184 	return m_selectionTargetOnlyMode;
185 }
186 
187 void
setSelectionTargetOnlyMode(bool value)188 ActionWithTargetDialog::setSelectionTargetOnlyMode(bool value)
189 {
190 	_setSelectionTargetOnlyMode(value, false);
191 }
192 
193 void
_setSelectionTargetOnlyMode(bool value,bool force)194 ActionWithTargetDialog::_setSelectionTargetOnlyMode(bool value, bool force)
195 {
196 	if(force || m_selectionTargetOnlyMode != value) {
197 		m_selectionTargetOnlyMode = value;
198 
199 		if(!m_targetGroupBox || !m_lineTargetsButtonGroup)
200 			return;
201 
202 		if(m_selectionTargetOnlyMode) {
203 			m_selectionTargetWasChecked = m_lineTargetsButtonGroup->button(Selection)->isChecked();
204 			m_lineTargetsButtonGroup->button(Selection)->setEnabled(true);
205 			m_lineTargetsButtonGroup->button(Selection)->setChecked(true);
206 		} else {
207 			if(!m_selectionTargetWasChecked) {
208 				m_lineTargetsButtonGroup->button(AllLines)->setEnabled(true);
209 				m_lineTargetsButtonGroup->button(AllLines)->setChecked(true);
210 			}
211 		}
212 
213 		setTargetsButtonsHiddenState(m_lineTargetsButtonGroup, m_selectionTargetOnlyMode);
214 	}
215 }
216 
217 /// TEXT TARGETS
218 /// ============
219 
220 void
createTextTargetsButtonGroup()221 ActionWithTargetDialog::createTextTargetsButtonGroup()
222 {
223 	createTargetsGroupBox();
224 
225 	m_textTargetsButtonGroup = new QButtonGroup(this);
226 
227 	for(int index = 0; index < SubtitleTargetSize; ++index) {
228 		QRadioButton *radioButton = new QRadioButton(m_targetGroupBox);
229 		m_textTargetsButtonGroup->addButton(radioButton, index);
230 	}
231 
232 	m_textTargetsButtonGroup->button(Both)->setText(i18n("Both subtitles"));
233 	m_targetLayout->addWidget(m_textTargetsButtonGroup->button(Both), 0, 1);
234 
235 	m_textTargetsButtonGroup->button(Primary)->setText(i18n("Primary subtitle"));
236 	m_targetLayout->addWidget(m_textTargetsButtonGroup->button(Primary), 1, 1);
237 
238 	m_textTargetsButtonGroup->button(Secondary)->setText(i18n("Translation subtitle"));
239 	m_targetLayout->addWidget(m_textTargetsButtonGroup->button(Secondary), 2, 1);
240 
241 	_setTranslationMode(m_translationMode, true);
242 }
243 
244 SubtitleTarget
nonTranslationModeTarget() const245 ActionWithTargetDialog::nonTranslationModeTarget() const
246 {
247 	return m_nonTranslationModeTarget;
248 }
249 
250 void
setNonTranslationModeTarget(SubtitleTarget target)251 ActionWithTargetDialog::setNonTranslationModeTarget(SubtitleTarget target)
252 {
253 	if(m_nonTranslationModeTarget != target) {
254 		if(!m_translationMode && m_textTargetsButtonGroup) {
255 			m_textTargetsButtonGroup->button(m_nonTranslationModeTarget)->setChecked(false);
256 			m_textTargetsButtonGroup->button(target)->setChecked(true);
257 		}
258 
259 		m_nonTranslationModeTarget = target;
260 	}
261 }
262 
263 SubtitleTarget
selectedTextsTarget() const264 ActionWithTargetDialog::selectedTextsTarget() const
265 {
266 	if(!m_textTargetsButtonGroup) // texts target was not created
267 		return SubtitleTargetSize;
268 
269 	int checkedId = m_textTargetsButtonGroup->checkedId();
270 	return checkedId == -1 ? SubtitleTargetSize : SubtitleTarget(checkedId);
271 }
272 
273 void
setSelectedTextsTarget(SubtitleTarget target)274 ActionWithTargetDialog::setSelectedTextsTarget(SubtitleTarget target)
275 {
276 	if(m_textTargetsButtonGroup && m_textTargetsButtonGroup->button(target))
277 		m_textTargetsButtonGroup->button(target)->setChecked(true);
278 }
279 
280 bool
isTextsTargetEnabled(SubtitleTarget target) const281 ActionWithTargetDialog::isTextsTargetEnabled(SubtitleTarget target) const
282 {
283 	return m_textTargetsButtonGroup && m_textTargetsButtonGroup->button(target) && m_textTargetsButtonGroup->button(target)->isEnabled();
284 }
285 
286 void
setTextsTargetEnabled(SubtitleTarget target,bool enabled)287 ActionWithTargetDialog::setTextsTargetEnabled(SubtitleTarget target, bool enabled)
288 {
289 	if(m_textTargetsButtonGroup && m_textTargetsButtonGroup->button(target))
290 		m_textTargetsButtonGroup->button(target)->setEnabled(enabled);
291 }
292 
293 bool
translationMode() const294 ActionWithTargetDialog::translationMode() const
295 {
296 	return m_translationMode;
297 }
298 
299 void
setTranslationMode(bool enabled)300 ActionWithTargetDialog::setTranslationMode(bool enabled)
301 {
302 	_setTranslationMode(enabled, false);
303 }
304 
305 void
_setTranslationMode(bool enabled,bool force)306 ActionWithTargetDialog::_setTranslationMode(bool enabled, bool force)
307 {
308 	if(force || m_translationMode != enabled) {
309 		m_translationMode = enabled;
310 
311 		if(!m_targetGroupBox || !m_textTargetsButtonGroup)
312 			return;
313 
314 		if(!m_translationMode)
315 			m_textTargetsButtonGroup->button(m_nonTranslationModeTarget)->setChecked(true);
316 
317 		setTargetsButtonsHiddenState(m_textTargetsButtonGroup, !m_translationMode);
318 	}
319 }
320 
321 /// ACTION WITH LINES TARGET DIALOG
322 /// ===============================
323 
ActionWithLinesTargetDialog(const QString & title,QWidget * parent)324 ActionWithLinesTargetDialog::ActionWithLinesTargetDialog(const QString &title, QWidget *parent) : ActionWithTargetDialog(title, parent)
325 {
326 	createLineTargetsButtonGroup();
327 }
328 
ActionWithLinesTargetDialog(const QString & title,const QString & desc,QWidget * parent)329 ActionWithLinesTargetDialog::ActionWithLinesTargetDialog(const QString &title, const QString &desc, QWidget *parent) : ActionWithTargetDialog(title, parent)
330 {
331 	createTargetsGroupBox(desc);
332 	createLineTargetsButtonGroup();
333 }
334 
335 int
exec()336 ActionWithLinesTargetDialog::exec()
337 {
338 	setTranslationMode(app()->translationMode());
339 	setSelectionTargetOnlyMode(app()->showingLinesContextMenu());
340 
341 	return m_targetGroupBox->isHidden() ? QDialog::Accepted : ActionDialog::exec();
342 }
343 
344 /// ACTION WITH TEXTS TARGET DIALOG
345 /// ===============================
346 
ActionWithTextsTargetDialog(const QString & title,QWidget * parent)347 ActionWithTextsTargetDialog::ActionWithTextsTargetDialog(const QString &title, QWidget *parent) :
348 	ActionWithTargetDialog(title, parent)
349 {
350 	createTextTargetsButtonGroup();
351 }
352 
ActionWithTextsTargetDialog(const QString & title,const QString & desc,QWidget * parent)353 ActionWithTextsTargetDialog::ActionWithTextsTargetDialog(const QString &title, const QString &desc, QWidget *parent) : ActionWithTargetDialog(title, parent)
354 {
355 	createTargetsGroupBox(desc);
356 	createTextTargetsButtonGroup();
357 }
358 
359 int
exec()360 ActionWithTextsTargetDialog::exec()
361 {
362 	setTranslationMode(app()->translationMode());
363 	setSelectionTargetOnlyMode(app()->showingLinesContextMenu());
364 
365 	return m_targetGroupBox->isHidden() ? QDialog::Accepted : ActionDialog::exec();
366 }
367 
368 /// ACTION WITH LINES AND TEXTS TARGET DIALOG
369 /// =========================================
370 
ActionWithLinesAndTextsTargetDialog(const QString & title,QWidget * parent)371 ActionWithLinesAndTextsTargetDialog::ActionWithLinesAndTextsTargetDialog(const QString &title, QWidget *parent) :
372 	ActionWithTargetDialog(title, parent)
373 {
374 	createLineTargetsButtonGroup();
375 	createTextTargetsButtonGroup();
376 }
377 
ActionWithLinesAndTextsTargetDialog(const QString & title,const QString & desc,QWidget * parent)378 ActionWithLinesAndTextsTargetDialog::ActionWithLinesAndTextsTargetDialog(const QString &title, const QString &desc, QWidget *parent) : ActionWithTargetDialog(title, parent)
379 {
380 	createTargetsGroupBox(desc);
381 	createLineTargetsButtonGroup();
382 	createTextTargetsButtonGroup();
383 }
384 
385 int
exec()386 ActionWithLinesAndTextsTargetDialog::exec()
387 {
388 	setTranslationMode(app()->translationMode());
389 	setSelectionTargetOnlyMode(app()->showingLinesContextMenu());
390 
391 	return m_targetGroupBox->isHidden() ? QDialog::Accepted : ActionDialog::exec();
392 }
393 
394 
395