File indexing completed on 2024-06-16 04:46:39

0001 /*
0002     SPDX-FileCopyrightText: 2018 Łukasz Wojniłowicz lukasz.wojnilowicz @gmail.com
0003     SPDX-FileCopyrightText: 2021 Dawid Wróbel <me@dawidwrobel.com>
0004     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005 */
0006 
0007 #include "kcm_reportsview.h"
0008 #include <config-kmymoney-version.h>
0009 
0010 // ----------------------------------------------------------------------------
0011 // QT Includes
0012 
0013 #include <QUrl>
0014 #include <QFileInfo>
0015 
0016 // ----------------------------------------------------------------------------
0017 // KDE Includes
0018 
0019 #include <KAboutData>
0020 #include <KLineEdit>
0021 #include <KLocalizedString>
0022 #include <KMessageBox>
0023 #include <KPluginFactory>
0024 #include <kio_version.h>
0025 
0026 // ----------------------------------------------------------------------------
0027 // Project Includes
0028 
0029 #include "kmymoneysettings.h"
0030 #include "ui_reportsviewsettings.h"
0031 
0032 class ReportsViewSettingsWidgetPrivate
0033 {
0034     Q_DISABLE_COPY(ReportsViewSettingsWidgetPrivate)
0035 
0036 public:
0037     ReportsViewSettingsWidgetPrivate() :
0038         ui(new Ui::ReportsViewSettings),
0039         m_fileKLineEdit(nullptr)
0040     {
0041     }
0042 
0043     ~ReportsViewSettingsWidgetPrivate()
0044     {
0045         delete ui;
0046     }
0047 
0048 
0049     /**
0050      * Collector for both signals
0051      * urlSelected and editingFinished.
0052      *
0053      * Only shows a warning
0054      * if the selected file
0055      * is not a readable plain file -
0056      * and only one time.
0057      *
0058      * @param[in] css  css file name
0059      *
0060      * @see ReportsViewSettingsWidget#slotCssUrlSelected
0061      * @see ReportsViewSettingsWidget#slotEditingFinished
0062      */
0063     void checkCssFile(QString& css) {
0064 
0065         if (css == m_cssFileOld) {
0066             // do not check again to avoid emitting a warning more than 1 time
0067             return;
0068         }
0069 
0070         m_cssFileOld = css;
0071 
0072         QFileInfo* info = new QFileInfo(css);
0073 
0074         if (!info->exists()) {
0075             KMessageBox::error(0, i18n("File %1 does not exist", css));
0076             return;
0077         }
0078 
0079         QList<QString> warnings;
0080 
0081         if (!info->isFile()) {
0082             warnings.append(i18n("it is not a plain file"));
0083         }
0084 
0085         if (!info->isReadable()) {
0086             warnings.append(i18n("it is not readable"));
0087         }
0088 
0089         if (info->size() < 1) {
0090             warnings.append(i18n("it is empty"));
0091         }
0092 
0093         if (warnings.size() < 1) {
0094             // no warnings, fine
0095             return;
0096         }
0097 
0098         QString out = i18np("There is a problem with file %1", "There are problems with file %1", css);
0099 
0100         QList<QString>::const_iterator i;
0101         for (i = warnings.constBegin(); i != warnings.constEnd(); ++i) {
0102             out += '\n' + *i;
0103         }
0104 
0105         KMessageBox::error(0, out);
0106     }
0107 
0108     Ui::ReportsViewSettings *ui;
0109     /**
0110      * Old value of css file to avoid warnings
0111      * when a signal is emitted
0112      * but the value itself did not change.
0113      */
0114     QString m_cssFileOld;
0115 
0116     /**
0117      * Pointer to the KLineEdit of the KFileDialog which we need
0118      * to receive signal editingFinished.
0119      */
0120     KLineEdit* m_fileKLineEdit;
0121 };
0122 
0123 ReportsViewSettingsWidget::ReportsViewSettingsWidget(QWidget* parent) :
0124     QWidget(parent),
0125     d_ptr(new ReportsViewSettingsWidgetPrivate)
0126 {
0127     Q_D(ReportsViewSettingsWidget);
0128     d->ui->setupUi(this);
0129 
0130 #if KIO_VERSION >= QT_VERSION_CHECK(5, 108, 0)
0131     d->ui->kcfg_CssFileDefault->setNameFilters({i18n("CSS files") + QLatin1String(" (*.css)"), i18n("All files") + QLatin1String(" (*)")});
0132 #else
0133     d->ui->kcfg_CssFileDefault->setFilter(QLatin1String("*.css|") + i18n("CSS files") + QLatin1String("\n*|") + i18n("All files"));
0134 #endif
0135 
0136     // keep initial (default) css file in mind
0137     d->m_cssFileOld = KMyMoneySettings::cssFileDefault();
0138 
0139     // set default css file in ReportsViewSettingsWidget dialog
0140     d->ui->kcfg_CssFileDefault->setUrl(QUrl::fromLocalFile(KMyMoneySettings::cssFileDefault()));
0141 
0142     d->m_fileKLineEdit = d->ui->kcfg_CssFileDefault->lineEdit();
0143 
0144     connect(d->ui->kcfg_CssFileDefault, &KUrlRequester::urlSelected,
0145             this, &ReportsViewSettingsWidget::slotCssUrlSelected);
0146 
0147     connect(d->m_fileKLineEdit, &QLineEdit::editingFinished,
0148             this, &ReportsViewSettingsWidget::slotEditingFinished);
0149 }
0150 
0151 ReportsViewSettingsWidget::~ReportsViewSettingsWidget()
0152 {
0153     Q_D(ReportsViewSettingsWidget);
0154     delete d;
0155 }
0156 
0157 /**
0158  * Receiver for signal urlSelected.
0159  *
0160  * Signal urlSelected only is emitted
0161  * when a file is selected with the file chooser.
0162  *
0163  * @param[in] cssUrl  url of css file
0164  *
0165  * @see ReportsViewSettingsWidget#Private#checkCssFile
0166  */
0167 void ReportsViewSettingsWidget::slotCssUrlSelected(const QUrl &cssUrl)
0168 {
0169     Q_D(ReportsViewSettingsWidget);
0170     auto css = cssUrl.toLocalFile();
0171     d->checkCssFile(css);
0172 }
0173 
0174 /**
0175  * Receiver for signal editingFinished.
0176  *
0177  * Signal editingFinished is emitted
0178  * on focus out only,
0179  * not  when a file is selected with the file chooser.
0180  *
0181  * @see ReportsViewSettingsWidget#Private#checkCssFile
0182  */
0183 void ReportsViewSettingsWidget::slotEditingFinished()
0184 {
0185     Q_D(ReportsViewSettingsWidget);
0186     auto txt = d->m_fileKLineEdit->text();
0187     d->checkCssFile(txt);
0188 }
0189 
0190 KCMReportsView::KCMReportsView(QWidget *parent, const QVariantList& args)
0191     : KCModule(parent, args)
0192 {
0193     ReportsViewSettingsWidget* w = new ReportsViewSettingsWidget(this);
0194     // addConfig(ReportsViewSettings::self(), w);
0195     addConfig(KMyMoneySettings::self(), w);
0196     QVBoxLayout *layout = new QVBoxLayout;
0197     setLayout(layout);
0198     layout->addWidget(w);
0199     setButtons(NoAdditionalButton);
0200     load();
0201 }
0202 
0203 KCMReportsView::~KCMReportsView()
0204 {
0205 }
0206 
0207 K_PLUGIN_CLASS(KCMReportsView)
0208 
0209 #include "kcm_reportsview.moc"