File indexing completed on 2025-04-27 03:58:22

0001 /* ============================================================
0002  *
0003  * This file is a part of digiKam project
0004  * https://www.digikam.org
0005  *
0006  * Date        : 2006-09-13
0007  * Description : a widget to provide conflict rules to save image.
0008  *
0009  * SPDX-FileCopyrightText: 2006-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 "filesaveconflictbox.h"
0016 
0017 // Qt includes
0018 
0019 #include <QButtonGroup>
0020 #include <QGridLayout>
0021 #include <QLabel>
0022 #include <QRadioButton>
0023 #include <QVBoxLayout>
0024 #include <QApplication>
0025 #include <QStyle>
0026 
0027 // KDE includes
0028 
0029 #include <klocalizedstring.h>
0030 #include <kconfiggroup.h>
0031 
0032 namespace Digikam
0033 {
0034 
0035 class Q_DECL_HIDDEN FileSaveConflictBox::Private
0036 {
0037 public:
0038 
0039     explicit Private()
0040       : conflictLabel       (nullptr),
0041         conflictButtonGroup (nullptr),
0042         storeDiffButton     (nullptr),
0043         overwriteButton     (nullptr),
0044         skipFileButton      (nullptr)
0045     {
0046     }
0047 
0048     QLabel*       conflictLabel;
0049 
0050     QButtonGroup* conflictButtonGroup;
0051 
0052     QRadioButton* storeDiffButton;
0053     QRadioButton* overwriteButton;
0054     QRadioButton* skipFileButton;
0055 };
0056 
0057 FileSaveConflictBox::FileSaveConflictBox(QWidget* const parent, bool addSkip)
0058     : QWidget(parent),
0059       d      (new Private)
0060 {
0061     setAttribute(Qt::WA_DeleteOnClose);
0062 
0063     const int spacing          = qMin(QApplication::style()->pixelMetric(QStyle::PM_LayoutHorizontalSpacing),
0064                                       QApplication::style()->pixelMetric(QStyle::PM_LayoutVerticalSpacing));
0065     QGridLayout* const grid    = new QGridLayout(this);
0066     d->conflictLabel           = new QLabel(i18n("If Target File Exists:"), this);
0067     QWidget* const conflictBox = new QWidget(this);
0068     QVBoxLayout* const vlay    = new QVBoxLayout(conflictBox);
0069     d->conflictButtonGroup     = new QButtonGroup(conflictBox);
0070     d->storeDiffButton         = new QRadioButton(i18n("Store as a different name"), conflictBox);
0071     d->overwriteButton         = new QRadioButton(i18n("Overwrite automatically"),   conflictBox);
0072     d->skipFileButton          = new QRadioButton(i18n("Skip automatically"),        conflictBox);
0073 
0074     d->conflictButtonGroup->addButton(d->overwriteButton, OVERWRITE);
0075     d->conflictButtonGroup->addButton(d->storeDiffButton, DIFFNAME);
0076     d->conflictButtonGroup->addButton(d->skipFileButton,  SKIPFILE);
0077 
0078     d->conflictButtonGroup->setExclusive(true);
0079     d->storeDiffButton->setChecked(true);
0080 
0081     if (!addSkip)
0082     {
0083         d->skipFileButton->hide();
0084     }
0085 
0086     vlay->setContentsMargins(spacing, spacing, spacing, spacing);
0087     vlay->setSpacing(spacing);
0088     vlay->addWidget(d->storeDiffButton);
0089     vlay->addWidget(d->overwriteButton);
0090     vlay->addWidget(d->skipFileButton);
0091 
0092     grid->addWidget(d->conflictLabel, 1, 0, 1, 2);
0093     grid->addWidget(conflictBox,      2, 0, 1, 2);
0094     grid->setRowStretch(3, 10);
0095     grid->setContentsMargins(spacing, spacing, spacing, spacing);
0096     grid->setSpacing(spacing);
0097 
0098 #if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
0099 
0100     connect(d->conflictButtonGroup, static_cast<void (QButtonGroup::*)(int)>(&QButtonGroup::idClicked),
0101             this, &FileSaveConflictBox::signalConflictButtonChanged);
0102 
0103 #else
0104 
0105     connect(d->conflictButtonGroup, static_cast<void (QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked),
0106             this, &FileSaveConflictBox::signalConflictButtonChanged);
0107 
0108 #endif
0109 }
0110 
0111 FileSaveConflictBox::~FileSaveConflictBox()
0112 {
0113     delete d;
0114 }
0115 
0116 void FileSaveConflictBox::resetToDefault()
0117 {
0118     setConflictRule(DIFFNAME);
0119 }
0120 
0121 FileSaveConflictBox::ConflictRule FileSaveConflictBox::conflictRule() const
0122 {
0123     return ((ConflictRule)(d->conflictButtonGroup->checkedId()));
0124 }
0125 
0126 void FileSaveConflictBox::setConflictRule(ConflictRule r)
0127 {
0128     QAbstractButton* const bt = d->conflictButtonGroup->button((int)r);
0129 
0130     if (bt)
0131     {
0132         bt->setChecked(true);
0133     }
0134 }
0135 
0136 void FileSaveConflictBox::readSettings(KConfigGroup& group)
0137 {
0138     setConflictRule((FileSaveConflictBox::ConflictRule)group.readEntry("Conflict",
0139         (int)(FileSaveConflictBox::DIFFNAME)));
0140 }
0141 
0142 void FileSaveConflictBox::writeSettings(KConfigGroup& group)
0143 {
0144     group.writeEntry("Conflict", (int)conflictRule());
0145 }
0146 
0147 } // namespace Digikam
0148 
0149 #include "moc_filesaveconflictbox.cpp"