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