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