File indexing completed on 2025-03-09 03:57:05

0001 /* ============================================================
0002  *
0003  * This file is a part of digiKam project
0004  * https://www.digikam.org
0005  *
0006  * Date        : 2010-05-01
0007  * Description : a dialog that can be used to display a configuration
0008  *               dialog for a rule
0009  *
0010  * SPDX-FileCopyrightText: 2009-2012 by Andi Clemens <andi dot clemens at gmail dot com>
0011  *
0012  * SPDX-License-Identifier: GPL-2.0-or-later
0013  *
0014  * ============================================================ */
0015 
0016 #include "ruledialog.h"
0017 
0018 // Qt includes
0019 
0020 #include <QFrame>
0021 #include <QGridLayout>
0022 #include <QLabel>
0023 #include <QRegularExpression>
0024 #include <QWidget>
0025 #include <QDialogButtonBox>
0026 #include <QVBoxLayout>
0027 #include <QPushButton>
0028 
0029 // Local includes
0030 
0031 #include "digikam_globals.h"
0032 #include "rule.h"
0033 #include "dxmlguiwindow.h"
0034 
0035 namespace Digikam
0036 {
0037 
0038 class Q_DECL_HIDDEN RuleDialog::Private
0039 {
0040 public:
0041 
0042     explicit Private()
0043       : buttons(nullptr),
0044         container(nullptr),
0045         dialogTitle(nullptr),
0046         dialogDescription(nullptr),
0047         dialogIcon(nullptr),
0048         settingsWidget(nullptr)
0049     {
0050     }
0051 
0052     QDialogButtonBox* buttons;
0053     QWidget*          container;
0054     QLabel*           dialogTitle;
0055     QLabel*           dialogDescription;
0056     QLabel*           dialogIcon;
0057     QWidget*          settingsWidget;
0058 };
0059 
0060 RuleDialog::RuleDialog(Rule* const parent)
0061     : QDialog(nullptr),
0062       d(new Private)
0063 {
0064     d->buttons           = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::Help, this);
0065     d->buttons->button(QDialogButtonBox::Ok)->setDefault(true);
0066 
0067     d->dialogTitle       = new QLabel(this);
0068     d->dialogDescription = new QLabel(this);
0069     d->dialogIcon        = new QLabel(this);
0070 
0071     setDialogTitle(parent->objectName());
0072     setDialogDescription(parent->description());
0073     setDialogIcon(parent->icon(Rule::Dialog));
0074 
0075     d->dialogTitle->setAlignment(Qt::AlignHCenter);
0076     d->dialogDescription->setAlignment(Qt::AlignHCenter);
0077     d->dialogDescription->setWordWrap(true);
0078 
0079     QFrame* const line = new QFrame(this);
0080     line->setFrameShape(QFrame::HLine);
0081     line->setFrameShadow(QFrame::Sunken);
0082 
0083     QWidget* const header     = new QWidget(this);
0084     QGridLayout* headerLayout = new QGridLayout(this);
0085     headerLayout->addWidget(d->dialogIcon,        0, 0, 4, 1);
0086     headerLayout->addWidget(d->dialogTitle,       1, 1, 1, 1);
0087     headerLayout->addWidget(d->dialogDescription, 2, 1, 1, 1);
0088     headerLayout->addWidget(line,                 4, 0, 1, -1);
0089     headerLayout->setColumnStretch(1, 10);
0090     header->setLayout(headerLayout);
0091 
0092     d->container                       = new QWidget(this);
0093     QGridLayout* const containerLayout = new QGridLayout(this);
0094     containerLayout->addWidget(header,            0, 0, 1, 1);
0095     containerLayout->addWidget(d->settingsWidget, 1, 0, 1, 1);
0096     containerLayout->setRowStretch(1, 10);
0097     d->container->setLayout(containerLayout);
0098 
0099     QVBoxLayout* const vbx = new QVBoxLayout(this);
0100     vbx->addWidget(d->container);
0101     vbx->addWidget(d->buttons);
0102     setLayout(vbx);
0103 
0104     setMinimumWidth(300);
0105 
0106     connect(d->buttons->button(QDialogButtonBox::Ok), SIGNAL(clicked()),
0107             this, SLOT(accept()));
0108 
0109     connect(d->buttons->button(QDialogButtonBox::Cancel), SIGNAL(clicked()),
0110             this, SLOT(reject()));
0111 
0112     connect(d->buttons->button(QDialogButtonBox::Help), SIGNAL(clicked()),
0113             this, SLOT(slotHelp()));
0114 }
0115 
0116 RuleDialog::~RuleDialog()
0117 {
0118     delete d;
0119 }
0120 
0121 void RuleDialog::setDialogTitle(const QString& title)
0122 {
0123     // remove ellipsis and "&&" from the string
0124 
0125     QString _title = title;
0126     _title.remove(QRegularExpression(QLatin1String("\\.{3,}"))).replace(QLatin1String("&&"), QLatin1String("&"));
0127 
0128     d->dialogTitle->setText(QString::fromUtf8("<b>%1</b>").arg(_title));
0129     setWindowTitle(_title);
0130 }
0131 
0132 void RuleDialog::setDialogDescription(const QString& description)
0133 {
0134     d->dialogDescription->setText(description);
0135 }
0136 
0137 void RuleDialog::setDialogIcon(const QPixmap& icon)
0138 {
0139     d->dialogIcon->setPixmap(icon);
0140 }
0141 
0142 void RuleDialog::setSettingsWidget(QWidget* const settingsWidget)
0143 {
0144     delete d->settingsWidget;
0145 
0146     d->settingsWidget    = new QWidget(this);
0147     QGridLayout* const l = new QGridLayout(this);
0148     l->addWidget(settingsWidget);
0149     l->setSpacing(0);
0150     l->setContentsMargins(QMargins());
0151     d->settingsWidget->setLayout(l);
0152     d->container->layout()->addWidget(d->settingsWidget);
0153 }
0154 
0155 void RuleDialog::slotHelp()
0156 {
0157     openOnlineDocumentation(QLatin1String("main_window"), QLatin1String("image_view"), QLatin1String("renaming-photograph"));
0158 }
0159 
0160 } // namespace Digikam
0161 
0162 #include "moc_ruledialog.cpp"