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

0001 /* ============================================================
0002  *
0003  * This file is a part of digiKam project
0004  * https://www.digikam.org
0005  *
0006  * Date        : 2003-03-09
0007  * Description : Captions, Tags, and Rating properties editor - Description view.
0008  *
0009  * SPDX-FileCopyrightText: 2003-2005 by Renchi Raju <renchi dot raju at gmail dot com>
0010  * SPDX-FileCopyrightText: 2003-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
0011  * SPDX-FileCopyrightText: 2006-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
0012  * SPDX-FileCopyrightText: 2009-2011 by Andi Clemens <andi dot clemens at gmail dot com>
0013  * SPDX-FileCopyrightText: 2009-2011 by Johannes Wienke <languitar at semipol dot de>
0014  * SPDX-FileCopyrightText: 2015      by Veaceslav Munteanu <veaceslav dot munteanu90 at gmail dot com>
0015  *
0016  * SPDX-License-Identifier: GPL-2.0-or-later
0017  *
0018  * ============================================================ */
0019 
0020 #include "itemdescedittab_p.h"
0021 
0022 namespace Digikam
0023 {
0024 
0025 void ItemDescEditTab::initDescriptionView()
0026 {
0027     QScrollArea* const sv       = new QScrollArea(d->tabWidget);
0028     sv->setFrameStyle(QFrame::NoFrame);
0029     sv->setWidgetResizable(true);
0030 
0031     QWidget* const captionsArea = new QWidget(sv->viewport());
0032     QGridLayout* const grid1    = new QGridLayout(captionsArea);
0033     sv->setWidget(captionsArea);
0034 
0035     d->titleEdit          = new AltLangStrEdit(captionsArea, 0);
0036     d->titleEdit->setTitle(i18nc("@title: comment title string", "Title:"));
0037     resetTitleEditPlaceholderText();
0038 
0039     d->captionsEdit       = new CaptionEdit(captionsArea);
0040     resetCaptionEditPlaceholderText();
0041 
0042     DHBox* const dateBox  = new DHBox(captionsArea);
0043     new QLabel(i18nc("@label", "Date:"), dateBox);
0044     d->dateTimeEdit       = new DDateTimeEdit(dateBox, QLatin1String("datepicker"));
0045 
0046     DHBox* const pickBox  = new DHBox(captionsArea);
0047     new QLabel(i18nc("@label", "Pick Label:"), pickBox);
0048     d->pickLabelSelector  = new PickLabelSelector(pickBox);
0049     pickBox->layout()->setAlignment(d->pickLabelSelector, Qt::AlignVCenter | Qt::AlignRight);
0050 
0051     DHBox* const colorBox = new DHBox(captionsArea);
0052     new QLabel(i18nc("@label", "Color Label:"), colorBox);
0053     d->colorLabelSelector = new ColorLabelSelector(colorBox);
0054     colorBox->layout()->setAlignment(d->colorLabelSelector, Qt::AlignVCenter | Qt::AlignRight);
0055 
0056     DHBox* const rateBox  = new DHBox(captionsArea);
0057     new QLabel(i18nc("@label", "Rating:"), rateBox);
0058     d->ratingWidget       = new RatingWidget(rateBox);
0059     rateBox->layout()->setAlignment(d->ratingWidget, Qt::AlignVCenter | Qt::AlignRight);
0060 
0061     // Buttons -----------------------------------------
0062 
0063     DHBox* const applyButtonBox = new DHBox(this);
0064     applyButtonBox->setSpacing(d->spacing);
0065 
0066     d->applyBtn                 = new QPushButton(i18nc("@action", "Apply"), applyButtonBox);
0067     d->applyBtn->setIcon(QIcon::fromTheme(QLatin1String("dialog-ok-apply")));
0068     d->applyBtn->setEnabled(false);
0069     d->applyBtn->setToolTip(i18nc("@info", "Apply all changes to images"));
0070     //buttonsBox->setStretchFactor(d->applyBtn, 10);
0071 
0072     DHBox* const buttonsBox     = new DHBox(this);
0073     buttonsBox->setSpacing(d->spacing);
0074 
0075     d->revertBtn                = new QToolButton(buttonsBox);
0076     d->revertBtn->setIcon(QIcon::fromTheme(QLatin1String("document-revert")));
0077     d->revertBtn->setToolTip(i18nc("@info", "Revert all changes"));
0078     d->revertBtn->setEnabled(false);
0079 
0080     d->applyToAllVersionsButton = new QPushButton(i18nc("@action", "Apply to all versions"), buttonsBox);
0081     d->applyToAllVersionsButton->setIcon(QIcon::fromTheme(QLatin1String("dialog-ok-apply")));
0082     d->applyToAllVersionsButton->setEnabled(false);
0083     d->applyToAllVersionsButton->setToolTip(i18nc("@info", "Apply all changes to all versions of this image"));
0084 
0085     d->moreButton               = new QPushButton(i18nc("@action: more actions to apply changes", "More"), buttonsBox);
0086     d->moreMenu                 = new QMenu(captionsArea);
0087     d->moreButton->setMenu(d->moreMenu);
0088 
0089     // --------------------------------------------------
0090 
0091     grid1->addWidget(d->titleEdit,    0, 0, 1, 2);
0092     grid1->addWidget(d->captionsEdit, 1, 0, 1, 2);
0093     grid1->addWidget(dateBox,         2, 0, 1, 2);
0094     grid1->addWidget(pickBox,         3, 0, 1, 2);
0095     grid1->addWidget(colorBox,        4, 0, 1, 2);
0096     grid1->addWidget(rateBox,         5, 0, 1, 2);
0097     grid1->setRowStretch(1, 10);
0098     grid1->setContentsMargins(d->spacing, d->spacing, d->spacing, d->spacing);
0099     grid1->setSpacing(d->spacing);
0100 
0101     d->tabWidget->insertTab(DESCRIPTIONS, sv, i18nc("@title", "Description"));
0102 }
0103 
0104 void ItemDescEditTab::setFocusToTitlesEdit()
0105 {
0106     d->tabWidget->setCurrentIndex(DESCRIPTIONS);
0107     d->titleEdit->textEdit()->setFocus();
0108 }
0109 
0110 void ItemDescEditTab::setFocusToCommentsEdit()
0111 {
0112     d->tabWidget->setCurrentIndex(DESCRIPTIONS);
0113     d->captionsEdit->altLangStrEdit()->textEdit()->setFocus();
0114 }
0115 
0116 void ItemDescEditTab::slotCommentChanged()
0117 {
0118     d->hub->setComments(d->captionsEdit->values());
0119     d->setMetadataWidgetStatus(d->hub->commentsStatus(), d->captionsEdit);
0120     slotModified();
0121 }
0122 
0123 void ItemDescEditTab::slotTitleChanged()
0124 {
0125     CaptionsMap titles;
0126 
0127     titles.fromAltLangMap(d->titleEdit->values());
0128     d->hub->setTitles(titles);
0129     d->setMetadataWidgetStatus(d->hub->titlesStatus(), d->titleEdit);
0130     slotModified();
0131 }
0132 
0133 void ItemDescEditTab::slotDateTimeChanged(const QDateTime& dateTime)
0134 {
0135     d->hub->setDateTime(dateTime);
0136     d->setMetadataWidgetStatus(d->hub->dateTimeStatus(), d->dateTimeEdit);
0137     slotModified();
0138 }
0139 
0140 void ItemDescEditTab::slotPickLabelChanged(int pickId)
0141 {
0142     d->hub->setPickLabel(pickId);
0143 
0144     // no handling for MetadataDisjoint needed for pick label,
0145     // we set it to 0 when disjoint, see below
0146 
0147     slotModified();
0148 }
0149 
0150 void ItemDescEditTab::slotColorLabelChanged(int colorId)
0151 {
0152     d->hub->setColorLabel(colorId);
0153 
0154     // no handling for MetadataDisjoint needed for color label,
0155     // we set it to 0 when disjoint, see below
0156 
0157     slotModified();
0158 }
0159 
0160 void ItemDescEditTab::slotRatingChanged(int rating)
0161 {
0162     d->hub->setRating(rating);
0163 
0164     // no handling for MetadataDisjoint needed for rating,
0165     // we set it to 0 when disjoint, see below
0166 
0167     slotModified();
0168 }
0169 
0170 void ItemDescEditTab::assignColorLabel(int colorId)
0171 {
0172     d->colorLabelSelector->setColorLabel((ColorLabel)colorId);
0173 }
0174 
0175 void ItemDescEditTab::assignPickLabel(int pickId)
0176 {
0177     d->pickLabelSelector->setPickLabel((PickLabel)pickId);
0178 }
0179 
0180 void ItemDescEditTab::assignRating(int rating)
0181 {
0182     d->ratingWidget->setRating(rating);
0183 }
0184 
0185 void ItemDescEditTab::replaceColorLabel(int colorId)
0186 {
0187     d->hub->replaceColorLabel(colorId);
0188     updateColorLabel();
0189 }
0190 
0191 void ItemDescEditTab::replacePickLabel(int pickId)
0192 {
0193     d->hub->replacePickLabel(pickId);
0194     updatePickLabel();
0195 }
0196 
0197 void ItemDescEditTab::replaceRating(int rating)
0198 {
0199     d->hub->replaceRating(rating);
0200     updateRating();
0201 }
0202 
0203 void ItemDescEditTab::updateComments()
0204 {
0205     d->captionsEdit->blockSignals(true);
0206     d->captionsEdit->setValues(d->hub->comments());
0207     d->setMetadataWidgetStatus(d->hub->commentsStatus(), d->captionsEdit);
0208     d->captionsEdit->blockSignals(false);
0209 
0210     d->titleEdit->blockSignals(true);
0211     d->titleEdit->setValues(d->hub->titles().toAltLangMap());
0212     d->setMetadataWidgetStatus(d->hub->titlesStatus(), d->titleEdit);
0213     d->titleEdit->blockSignals(false);
0214 }
0215 
0216 void ItemDescEditTab::updatePickLabel()
0217 {
0218     d->pickLabelSelector->blockSignals(true);
0219 
0220     if (d->hub->pickLabelStatus() == DisjointMetadataDataFields::MetadataDisjoint)
0221     {
0222         d->pickLabelSelector->setPickLabel(NoPickLabel);
0223     }
0224     else
0225     {
0226         d->pickLabelSelector->setPickLabel((PickLabel)d->hub->pickLabel());
0227     }
0228 
0229     d->pickLabelSelector->blockSignals(false);
0230 }
0231 
0232 void ItemDescEditTab::updateColorLabel()
0233 {
0234     d->colorLabelSelector->blockSignals(true);
0235 
0236     if (d->hub->colorLabelStatus() == DisjointMetadataDataFields::MetadataDisjoint)
0237     {
0238         d->colorLabelSelector->setColorLabel(NoColorLabel);
0239     }
0240     else
0241     {
0242         d->colorLabelSelector->setColorLabel((ColorLabel)d->hub->colorLabel());
0243     }
0244 
0245     d->colorLabelSelector->blockSignals(false);
0246 }
0247 
0248 void ItemDescEditTab::updateRating()
0249 {
0250     d->ratingWidget->blockSignals(true);
0251 
0252     if (d->hub->ratingStatus() == DisjointMetadataDataFields::MetadataDisjoint)
0253     {
0254         d->ratingWidget->setRating(0);
0255     }
0256     else
0257     {
0258         d->ratingWidget->setRating(d->hub->rating());
0259     }
0260 
0261     d->ratingWidget->blockSignals(false);
0262 }
0263 
0264 void ItemDescEditTab::updateDate()
0265 {
0266     d->dateTimeEdit->blockSignals(true);
0267     d->dateTimeEdit->setDateTime(d->hub->dateTime());
0268     d->setMetadataWidgetStatus(d->hub->dateTimeStatus(), d->dateTimeEdit);
0269     d->dateTimeEdit->blockSignals(false);
0270 }
0271 
0272 void ItemDescEditTab::slotImageRatingChanged(qlonglong imageId)
0273 {
0274     d->metadataChange(imageId);
0275 }
0276 
0277 void ItemDescEditTab::slotImageCaptionChanged(qlonglong imageId)
0278 {
0279     d->metadataChange(imageId);
0280 }
0281 
0282 void ItemDescEditTab::slotImageDateChanged(qlonglong imageId)
0283 {
0284     d->metadataChange(imageId);
0285 }
0286 
0287 void ItemDescEditTab::resetTitleEditPlaceholderText()
0288 {
0289     d->titleEdit->setPlaceholderText(i18nc("@info", "Enter title text here."));
0290 }
0291 
0292 void ItemDescEditTab::resetCaptionEditPlaceholderText()
0293 {
0294     d->captionsEdit->setPlaceholderText(i18nc("@info", "Enter caption text here."));
0295 }
0296 
0297 } // namespace Digikam