File indexing completed on 2025-04-27 03:57:25

0001 /* ============================================================
0002  *
0003  * This file is a part of digiKam project
0004  * https://www.digikam.org
0005  *
0006  * Date        : 2009-07-12
0007  * Description : caption editor
0008  *
0009  * SPDX-FileCopyrightText: 2009-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
0010  *
0011  * SPDX-License-Identifier: GPL-2.0-or-later
0012  *
0013  * ============================================================ */
0014 
0015 #include "captionedit.h"
0016 
0017 // KDE includes
0018 
0019 #include <klocalizedstring.h>
0020 
0021 // Local includes
0022 
0023 #include "digikam_debug.h"
0024 #include "dtextedit.h"
0025 
0026 namespace Digikam
0027 {
0028 
0029 class Q_DECL_HIDDEN CaptionEdit::Private
0030 {
0031 public:
0032 
0033     explicit Private()
0034       : altLangStrEdit(nullptr),
0035         authorEdit    (nullptr)
0036     {
0037     }
0038 
0039     AltLangStrEdit* altLangStrEdit;
0040 
0041     QLineEdit*      authorEdit;
0042 
0043     CaptionsMap     captionsValues;
0044 
0045     QString         lastDeletedLanguage;
0046     CaptionValues   lastDeletedValues;
0047 };
0048 
0049 CaptionEdit::CaptionEdit(QWidget* const parent)
0050     : DVBox(parent),
0051       d    (new Private)
0052 {
0053     d->altLangStrEdit = new AltLangStrEdit(this, 0);
0054     d->altLangStrEdit->setTitle(i18n("Captions: "));
0055 
0056     d->authorEdit     = new QLineEdit(this);
0057     d->authorEdit->setClearButtonEnabled(true);
0058     d->authorEdit->setPlaceholderText(i18n("Enter caption author name here."));
0059 
0060     setContentsMargins(QMargins());
0061     setSpacing(0);
0062 
0063     connect(d->altLangStrEdit, SIGNAL(signalSelectionChanged(QString)),
0064             this, SLOT(slotSelectionChanged(QString)));
0065 
0066     connect(d->altLangStrEdit, SIGNAL(signalModified(QString,QString)),
0067             this, SLOT(slotCaptionModified(QString,QString)));
0068 
0069     connect(d->altLangStrEdit, SIGNAL(signalValueAdded(QString,QString)),
0070             this, SLOT(slotAddValue(QString,QString)));
0071 
0072     connect(d->altLangStrEdit, SIGNAL(signalValueDeleted(QString)),
0073             this, SLOT(slotDeleteValue(QString)));
0074 
0075     connect(d->authorEdit, SIGNAL(textChanged(QString)),
0076             this, SLOT(slotAuthorChanged(QString)));
0077 }
0078 
0079 CaptionEdit::~CaptionEdit()
0080 {
0081     delete d;
0082 }
0083 
0084 void CaptionEdit::reset()
0085 {
0086     d->altLangStrEdit->reset();
0087 
0088     d->authorEdit->blockSignals(true);
0089     d->authorEdit->clear();
0090     d->authorEdit->blockSignals(false);
0091 
0092     d->captionsValues.clear();
0093 }
0094 
0095 void CaptionEdit::setPlaceholderText(const QString& msg)
0096 {
0097     d->altLangStrEdit->setPlaceholderText(msg);
0098 }
0099 
0100 QString CaptionEdit::currentLanguageCode() const
0101 {
0102     return d->altLangStrEdit->currentLanguageCode();
0103 }
0104 
0105 void CaptionEdit::setCurrentLanguageCode(const QString& lang)
0106 {
0107     d->altLangStrEdit->setCurrentLanguageCode(lang);
0108 }
0109 
0110 void CaptionEdit::slotAddValue(const QString& lang, const QString& text)
0111 {
0112     CaptionValues val;
0113     val.caption = text;
0114     val.author  = d->authorEdit->text();
0115     val.date    = QDateTime::currentDateTime();
0116 
0117     // The user may have removed the text and directly entered a new one. Do not drop author then.
0118 
0119     if (val.author.isEmpty() && d->lastDeletedLanguage == lang)
0120     {
0121         val.author = d->lastDeletedValues.author;
0122         d->authorEdit->blockSignals(true);
0123         d->authorEdit->setText(val.author);
0124         d->authorEdit->blockSignals(false);
0125     }
0126 
0127     d->lastDeletedLanguage.clear();
0128     d->captionsValues.insert(lang, val);
0129 
0130     Q_EMIT signalModified();
0131 }
0132 
0133 void CaptionEdit::slotCaptionModified(const QString& lang, const QString& text)
0134 {
0135     slotAddValue(lang, text);
0136 }
0137 
0138 void CaptionEdit::slotDeleteValue(const QString& lang)
0139 {
0140     d->lastDeletedLanguage = lang;
0141     d->lastDeletedValues   = d->captionsValues.value(lang);
0142 
0143     d->captionsValues.remove(lang);
0144     d->authorEdit->blockSignals(true);
0145     d->authorEdit->clear();
0146     d->authorEdit->blockSignals(false);
0147 
0148     Q_EMIT signalModified();
0149 }
0150 
0151 void CaptionEdit::slotSelectionChanged(const QString& lang)
0152 {
0153     QString author = d->captionsValues.value(lang).author;
0154     d->authorEdit->blockSignals(true);
0155     d->authorEdit->setText(author);
0156     d->authorEdit->blockSignals(false);
0157 }
0158 
0159 void CaptionEdit::setValues(const CaptionsMap& values)
0160 {
0161     d->lastDeletedLanguage.clear();
0162 
0163     d->captionsValues = values;
0164     d->altLangStrEdit->setValues(d->captionsValues.toAltLangMap());
0165     slotSelectionChanged(d->altLangStrEdit->currentLanguageCode());
0166 }
0167 
0168 CaptionsMap& CaptionEdit::values() const
0169 {
0170     return d->captionsValues;
0171 }
0172 
0173 void CaptionEdit::slotAuthorChanged(const QString& text)
0174 {
0175     CaptionValues captionValues = d->captionsValues.value(d->altLangStrEdit->currentLanguageCode());
0176 
0177     if (text != captionValues.author)
0178     {
0179         d->altLangStrEdit->addCurrent();
0180     }
0181 }
0182 
0183 AltLangStrEdit* CaptionEdit::altLangStrEdit() const
0184 {
0185     return d->altLangStrEdit;
0186 }
0187 
0188 QLineEdit* CaptionEdit::authorEdit() const
0189 {
0190     return d->authorEdit;
0191 }
0192 
0193 } // namespace Digikam
0194 
0195 #include "moc_captionedit.cpp"