File indexing completed on 2024-06-09 04:52:58
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 "actionwithtargetdialog.h" 0009 0010 #include "appglobal.h" 0011 #include "application.h" 0012 0013 #include <QGroupBox> 0014 #include <QButtonGroup> 0015 #include <QRadioButton> 0016 #include <QGridLayout> 0017 0018 #include <QIcon> 0019 #include <QDebug> 0020 0021 using namespace SubtitleComposer; 0022 0023 ActionWithTargetDialog::ActionWithTargetDialog(const QString &title, QWidget *parent) : 0024 ActionDialog(title, parent), 0025 m_targetGroupBox(0), 0026 m_targetLayout(0), 0027 m_lineTargetsButtonGroup(0), 0028 m_textTargetsButtonGroup(0), 0029 m_selectionTargetOnlyMode(false), 0030 m_selectionTargetWasChecked(false), 0031 m_translationMode(false), 0032 m_nonTranslationModeTarget(Primary) 0033 { 0034 } 0035 0036 int 0037 ActionWithTargetDialog::exec() 0038 { 0039 setTranslationMode(app()->translationMode()); 0040 setSelectionTargetOnlyMode(app()->showingLinesContextMenu()); 0041 0042 return ActionDialog::exec(); 0043 } 0044 0045 void 0046 ActionWithTargetDialog::show() 0047 { 0048 setTranslationMode(app()->translationMode()); 0049 setSelectionTargetOnlyMode(app()->showingLinesContextMenu()); 0050 0051 ActionDialog::show(); 0052 } 0053 0054 QGroupBox * 0055 ActionWithTargetDialog::createTargetsGroupBox(const QString &title, bool addToLayout) 0056 { 0057 if(!m_targetGroupBox) { 0058 m_targetGroupBox = createGroupBox(title, addToLayout); 0059 m_targetLayout = createLayout(m_targetGroupBox); 0060 } 0061 0062 return m_targetGroupBox; 0063 } 0064 0065 void 0066 ActionWithTargetDialog::updateTargetsGroupBoxHiddenState() 0067 { 0068 bool hidden = true; 0069 QList<QWidget *> children = m_targetGroupBox->findChildren<QWidget *>(); 0070 for(int index = 0, size = children.size(); index < size; ++index) { 0071 if(!children.at(index)->isHidden()) { 0072 hidden = false; 0073 break; 0074 } 0075 } 0076 0077 if(hidden != m_targetGroupBox->isHidden()) { 0078 if(hidden) 0079 m_targetGroupBox->hide(); 0080 else 0081 m_targetGroupBox->show(); 0082 } 0083 } 0084 0085 void 0086 ActionWithTargetDialog::onDefaultButtonClicked() 0087 { 0088 if(m_lineTargetsButtonGroup) { 0089 LinesTarget prevTarget = selectedLinesTarget(); 0090 setSelectionTargetOnlyMode(!m_lineTargetsButtonGroup->button(0)->isHidden()); 0091 setSelectedLinesTarget(prevTarget); // setSelectionTargetOnlyMode resets the target so we restore it 0092 } 0093 } 0094 0095 void 0096 ActionWithTargetDialog::setTargetsButtonsHiddenState(QButtonGroup *targetButtonGroup, bool hidden) 0097 { 0098 if(!targetButtonGroup || hidden == targetButtonGroup->button(0)->isHidden()) 0099 return; 0100 0101 QList<QAbstractButton *> buttons = targetButtonGroup->buttons(); 0102 if(hidden) { 0103 for(int index = 0, size = buttons.size(); index < size; ++index) 0104 buttons.at(index)->hide(); 0105 } else { 0106 for(int index = 0, size = buttons.size(); index < size; ++index) 0107 buttons.at(index)->show(); 0108 } 0109 0110 updateTargetsGroupBoxHiddenState(); 0111 0112 if(targetButtonGroup == m_lineTargetsButtonGroup) { 0113 m_buttonBox->button(QDialogButtonBox::RestoreDefaults)->setText(hidden ? i18n("Target >>") : i18n("Target <<")); 0114 0115 m_mainWidget->updateGeometry(); 0116 setMinimumSize(minimumSizeHint()); 0117 resize(size().width(), minimumSizeHint().height()); 0118 } 0119 } 0120 0121 /// LINE TARGETS 0122 /// ============ 0123 0124 void 0125 ActionWithTargetDialog::createLineTargetsButtonGroup() 0126 { 0127 QPushButton *btnDefault = m_buttonBox->addButton(QDialogButtonBox::RestoreDefaults); 0128 btnDefault->setIcon(QIcon()); 0129 btnDefault->setText(i18n("Target <<")); 0130 btnDefault->setToolTip(QString()); 0131 connect(btnDefault, &QAbstractButton::clicked, this, &ActionWithTargetDialog::onDefaultButtonClicked); 0132 0133 createTargetsGroupBox(); 0134 0135 m_lineTargetsButtonGroup = new QButtonGroup(this); 0136 0137 for(int index = 0; index < None; ++index) { 0138 QRadioButton *radioButton = new QRadioButton(m_targetGroupBox); 0139 m_lineTargetsButtonGroup->addButton(radioButton, index); 0140 m_targetLayout->addWidget(radioButton, index, 0); 0141 } 0142 0143 m_lineTargetsButtonGroup->button(AllLines)->setText(i18n("All lines")); 0144 m_lineTargetsButtonGroup->button(Selection)->setText(i18n("Selected lines")); 0145 m_lineTargetsButtonGroup->button(FromSelected)->setText(i18n("All lines from first selected")); 0146 m_lineTargetsButtonGroup->button(UpToSelected)->setText(i18n("All lines up to last selected")); 0147 0148 m_lineTargetsButtonGroup->button(AllLines)->setChecked(true); 0149 0150 _setSelectionTargetOnlyMode(m_selectionTargetOnlyMode, true); 0151 } 0152 0153 ActionWithTargetDialog::LinesTarget 0154 ActionWithTargetDialog::selectedLinesTarget() const 0155 { 0156 if(!m_lineTargetsButtonGroup) // lines target was not created 0157 return AllLines; 0158 0159 int checkedId = m_lineTargetsButtonGroup->checkedId(); 0160 return checkedId == -1 ? None : (LinesTarget)checkedId; 0161 } 0162 0163 void 0164 ActionWithTargetDialog::setSelectedLinesTarget(ActionWithTargetDialog::LinesTarget target) 0165 { 0166 if(m_lineTargetsButtonGroup && m_lineTargetsButtonGroup->button(target)) 0167 m_lineTargetsButtonGroup->button(target)->setChecked(true); 0168 } 0169 0170 bool 0171 ActionWithTargetDialog::isLinesTargetEnabled(LinesTarget target) const 0172 { 0173 return m_lineTargetsButtonGroup && m_lineTargetsButtonGroup->button(target) && m_lineTargetsButtonGroup->button(target)->isEnabled(); 0174 } 0175 0176 void 0177 ActionWithTargetDialog::setLinesTargetEnabled(LinesTarget target, bool enabled) 0178 { 0179 if(m_lineTargetsButtonGroup && m_lineTargetsButtonGroup->button(target)) 0180 m_lineTargetsButtonGroup->button(target)->setEnabled(enabled); 0181 } 0182 0183 bool 0184 ActionWithTargetDialog::selectionTargetOnlyMode() const 0185 { 0186 return m_selectionTargetOnlyMode; 0187 } 0188 0189 void 0190 ActionWithTargetDialog::setSelectionTargetOnlyMode(bool value) 0191 { 0192 _setSelectionTargetOnlyMode(value, false); 0193 } 0194 0195 void 0196 ActionWithTargetDialog::_setSelectionTargetOnlyMode(bool value, bool force) 0197 { 0198 if(force || m_selectionTargetOnlyMode != value) { 0199 m_selectionTargetOnlyMode = value; 0200 0201 if(!m_targetGroupBox || !m_lineTargetsButtonGroup) 0202 return; 0203 0204 if(m_selectionTargetOnlyMode) { 0205 m_selectionTargetWasChecked = m_lineTargetsButtonGroup->button(Selection)->isChecked(); 0206 m_lineTargetsButtonGroup->button(Selection)->setEnabled(true); 0207 m_lineTargetsButtonGroup->button(Selection)->setChecked(true); 0208 } else { 0209 if(!m_selectionTargetWasChecked) { 0210 m_lineTargetsButtonGroup->button(AllLines)->setEnabled(true); 0211 m_lineTargetsButtonGroup->button(AllLines)->setChecked(true); 0212 } 0213 } 0214 0215 setTargetsButtonsHiddenState(m_lineTargetsButtonGroup, m_selectionTargetOnlyMode); 0216 } 0217 } 0218 0219 /// TEXT TARGETS 0220 /// ============ 0221 0222 void 0223 ActionWithTargetDialog::createTextTargetsButtonGroup() 0224 { 0225 createTargetsGroupBox(); 0226 0227 m_textTargetsButtonGroup = new QButtonGroup(this); 0228 0229 for(int index = 0; index < SubtitleTargetSize; ++index) { 0230 QRadioButton *radioButton = new QRadioButton(m_targetGroupBox); 0231 m_textTargetsButtonGroup->addButton(radioButton, index); 0232 } 0233 0234 m_textTargetsButtonGroup->button(Both)->setText(i18n("Both subtitles")); 0235 m_targetLayout->addWidget(m_textTargetsButtonGroup->button(Both), 0, 1); 0236 0237 m_textTargetsButtonGroup->button(Primary)->setText(i18n("Primary subtitle")); 0238 m_targetLayout->addWidget(m_textTargetsButtonGroup->button(Primary), 1, 1); 0239 0240 m_textTargetsButtonGroup->button(Secondary)->setText(i18n("Translation subtitle")); 0241 m_targetLayout->addWidget(m_textTargetsButtonGroup->button(Secondary), 2, 1); 0242 0243 _setTranslationMode(m_translationMode, true); 0244 } 0245 0246 SubtitleTarget 0247 ActionWithTargetDialog::nonTranslationModeTarget() const 0248 { 0249 return m_nonTranslationModeTarget; 0250 } 0251 0252 void 0253 ActionWithTargetDialog::setNonTranslationModeTarget(SubtitleTarget target) 0254 { 0255 if(m_nonTranslationModeTarget != target) { 0256 if(!m_translationMode && m_textTargetsButtonGroup) { 0257 m_textTargetsButtonGroup->button(m_nonTranslationModeTarget)->setChecked(false); 0258 m_textTargetsButtonGroup->button(target)->setChecked(true); 0259 } 0260 0261 m_nonTranslationModeTarget = target; 0262 } 0263 } 0264 0265 SubtitleTarget 0266 ActionWithTargetDialog::selectedTextsTarget() const 0267 { 0268 if(!m_textTargetsButtonGroup) // texts target was not created 0269 return SubtitleTargetSize; 0270 0271 int checkedId = m_textTargetsButtonGroup->checkedId(); 0272 return checkedId == -1 ? SubtitleTargetSize : SubtitleTarget(checkedId); 0273 } 0274 0275 void 0276 ActionWithTargetDialog::setSelectedTextsTarget(SubtitleTarget target) 0277 { 0278 if(m_textTargetsButtonGroup && m_textTargetsButtonGroup->button(target)) 0279 m_textTargetsButtonGroup->button(target)->setChecked(true); 0280 } 0281 0282 bool 0283 ActionWithTargetDialog::isTextsTargetEnabled(SubtitleTarget target) const 0284 { 0285 return m_textTargetsButtonGroup && m_textTargetsButtonGroup->button(target) && m_textTargetsButtonGroup->button(target)->isEnabled(); 0286 } 0287 0288 void 0289 ActionWithTargetDialog::setTextsTargetEnabled(SubtitleTarget target, bool enabled) 0290 { 0291 if(m_textTargetsButtonGroup && m_textTargetsButtonGroup->button(target)) 0292 m_textTargetsButtonGroup->button(target)->setEnabled(enabled); 0293 } 0294 0295 bool 0296 ActionWithTargetDialog::translationMode() const 0297 { 0298 return m_translationMode; 0299 } 0300 0301 void 0302 ActionWithTargetDialog::setTranslationMode(bool enabled) 0303 { 0304 _setTranslationMode(enabled, false); 0305 } 0306 0307 void 0308 ActionWithTargetDialog::_setTranslationMode(bool enabled, bool force) 0309 { 0310 if(force || m_translationMode != enabled) { 0311 m_translationMode = enabled; 0312 0313 if(!m_targetGroupBox || !m_textTargetsButtonGroup) 0314 return; 0315 0316 if(!m_translationMode) 0317 m_textTargetsButtonGroup->button(m_nonTranslationModeTarget)->setChecked(true); 0318 0319 setTargetsButtonsHiddenState(m_textTargetsButtonGroup, !m_translationMode); 0320 } 0321 } 0322 0323 /// ACTION WITH LINES TARGET DIALOG 0324 /// =============================== 0325 0326 ActionWithLinesTargetDialog::ActionWithLinesTargetDialog(const QString &title, QWidget *parent) : ActionWithTargetDialog(title, parent) 0327 { 0328 createLineTargetsButtonGroup(); 0329 } 0330 0331 ActionWithLinesTargetDialog::ActionWithLinesTargetDialog(const QString &title, const QString &desc, QWidget *parent) : ActionWithTargetDialog(title, parent) 0332 { 0333 createTargetsGroupBox(desc); 0334 createLineTargetsButtonGroup(); 0335 } 0336 0337 int 0338 ActionWithLinesTargetDialog::exec() 0339 { 0340 setTranslationMode(app()->translationMode()); 0341 setSelectionTargetOnlyMode(app()->showingLinesContextMenu()); 0342 0343 return m_targetGroupBox->isHidden() ? QDialog::Accepted : ActionDialog::exec(); 0344 } 0345 0346 /// ACTION WITH TEXTS TARGET DIALOG 0347 /// =============================== 0348 0349 ActionWithTextsTargetDialog::ActionWithTextsTargetDialog(const QString &title, QWidget *parent) : 0350 ActionWithTargetDialog(title, parent) 0351 { 0352 createTextTargetsButtonGroup(); 0353 } 0354 0355 ActionWithTextsTargetDialog::ActionWithTextsTargetDialog(const QString &title, const QString &desc, QWidget *parent) : ActionWithTargetDialog(title, parent) 0356 { 0357 createTargetsGroupBox(desc); 0358 createTextTargetsButtonGroup(); 0359 } 0360 0361 int 0362 ActionWithTextsTargetDialog::exec() 0363 { 0364 setTranslationMode(app()->translationMode()); 0365 setSelectionTargetOnlyMode(app()->showingLinesContextMenu()); 0366 0367 return m_targetGroupBox->isHidden() ? QDialog::Accepted : ActionDialog::exec(); 0368 } 0369 0370 /// ACTION WITH LINES AND TEXTS TARGET DIALOG 0371 /// ========================================= 0372 0373 ActionWithLinesAndTextsTargetDialog::ActionWithLinesAndTextsTargetDialog(const QString &title, QWidget *parent) : 0374 ActionWithTargetDialog(title, parent) 0375 { 0376 createLineTargetsButtonGroup(); 0377 createTextTargetsButtonGroup(); 0378 } 0379 0380 ActionWithLinesAndTextsTargetDialog::ActionWithLinesAndTextsTargetDialog(const QString &title, const QString &desc, QWidget *parent) : ActionWithTargetDialog(title, parent) 0381 { 0382 createTargetsGroupBox(desc); 0383 createLineTargetsButtonGroup(); 0384 createTextTargetsButtonGroup(); 0385 } 0386 0387 int 0388 ActionWithLinesAndTextsTargetDialog::exec() 0389 { 0390 setTranslationMode(app()->translationMode()); 0391 setSelectionTargetOnlyMode(app()->showingLinesContextMenu()); 0392 0393 return m_targetGroupBox->isHidden() ? QDialog::Accepted : ActionDialog::exec(); 0394 } 0395 0396