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"