[office/kmymoney] /: Revisit Check Printing plugin

Dawid Wrobel null at kde.org
Wed Apr 28 01:18:09 BST 2021


Git commit 31c9b0bec3386c8c66416e33ec30f47d7ba623d7 by Dawid Wrobel, on behalf of Dawid Wróbel.
Committed on 28/04/2021 at 00:08.
Pushed by wrobelda into branch 'master'.

Revisit Check Printing plugin

- Use QTextEdit instead of QWebkit/WebEngine
- embed the default template using Qt Resources
- allow overriding the default template with a custom one
- fix settings dialog's window title
- move tempaltes to their own subfolder
- update the manual

M  +14   -10   doc/details-settings.docbook
M  +3    -7    kmymoney/plugins/checkprinting/CMakeLists.txt
M  +14   -26   kmymoney/plugins/checkprinting/checkprinting.cpp
M  +3    -0    kmymoney/plugins/checkprinting/checkprinting.qrc
M  +75   -19   kmymoney/plugins/checkprinting/kcm_checkprinting.cpp
M  +14   -13   kmymoney/plugins/checkprinting/kcm_checkprinting.h
M  +6    -1    kmymoney/plugins/checkprinting/pluginsettings.kcfg
M  +1    -0    kmymoney/plugins/checkprinting/pluginsettings.kcfgc
M  +7    -7    kmymoney/plugins/checkprinting/pluginsettingsdecl.ui
R  +0    -0    kmymoney/plugins/checkprinting/templates/check-3-part-template.html [from: kmymoney/plugins/checkprinting/check-3-part-template.html - 100% similarity]
R  +0    -0    kmymoney/plugins/checkprinting/templates/check_template.html [from: kmymoney/plugins/checkprinting/check_template.html - 100% similarity]
R  +0    -0    kmymoney/plugins/checkprinting/templates/check_template_green_linen.html [from: kmymoney/plugins/checkprinting/check_template_green_linen.html - 100% similarity]

https://invent.kde.org/office/kmymoney/commit/31c9b0bec3386c8c66416e33ec30f47d7ba623d7

diff --git a/doc/details-settings.docbook b/doc/details-settings.docbook
index 3a69cc7ca..fd9b52586 100644
--- a/doc/details-settings.docbook
+++ b/doc/details-settings.docbook
@@ -908,23 +908,27 @@ of accounts.</para>
   is included with the source of &kmymoney;, and should always be
   enabled.  It allows printing of a check based on the data from a selected
   transaction, with the layout controlled by an &HTML; template. You need to use a
-  template which is matched to your pre-printed checks.  When you click on the
-  <guibutton>configure</guibutton> (&configicon;) button, the <guilabel>Check
-  printing</guilabel> configuration dialog is displayed.  At the top is a text box
-  for the path to the selected template.  To the right of that is a button which
-  brings up a file chooser, to select an alternate template file.
+  template which is matched to your pre-printed checks.  A default, built-in
+  template is provided. You may also choose a custom template. To do so, click on
+  the <guibutton>configure</guibutton> (&configicon;) button to get the
+  <guilabel>Check printing</guilabel> configuration dialog displayed.  At the top
+  you can check the box to use a custom template.  To the right of that is a
+  button which brings up a file chooser, to select an alternate template file.
 </para>
 
 <para>
   A template file is an &HTML; file, in which specific strings are used to
   reference the fields from the transaction and from the current account and
-  institution to show where they will be printed on the check.  &kmymoney; is
-  shipped with some sample template files.  You should either be able to use one
-  of them, or modify one to suit your needs.  When the default template is
-  selected, the configuration dialog will show you the folder which contains
-  the sample files.
+  institution to show where they will be printed on the check.  &kmymoney;
+  ships with a default, built-in template.  At <ulink url="https://invent.kde.org/office/kmymoney/-/blob/master/kmymoney/plugins/checkprinting/templates/">this</ulink>
+  address you can find the HTML source file of default template, as well as some
+  additional templates.  You should either be able to use one of them, or modify
+  one to suit your needs.  Note that only a <emphasis>subset</emphasis> of the
+  HTML standard is supported — the detailed documentation on that can be found
+  <ulink url="https://doc.qt.io/qt-5/richtext-html-subset.html">here</ulink>.
 </para>
 
+
 <!-- info from source code on substitution variables
     // data about the user
     checkHTML.replace("$OWNER_NAME", file->user().name());
diff --git a/kmymoney/plugins/checkprinting/CMakeLists.txt b/kmymoney/plugins/checkprinting/CMakeLists.txt
index 1a3c92e7f..9dce1e4a6 100644
--- a/kmymoney/plugins/checkprinting/CMakeLists.txt
+++ b/kmymoney/plugins/checkprinting/CMakeLists.txt
@@ -36,12 +36,6 @@ else(ENABLE_WEBENGINE)
  target_link_libraries(checkprinting KF5::WebKit)
 endif(ENABLE_WEBENGINE)
 
-install(FILES check_template.html
-        DESTINATION "${DATA_INSTALL_DIR}/checkprinting")
-
-install(FILES check_template_green_linen.html
-        DESTINATION "${DATA_INSTALL_DIR}/checkprinting")
-
 # the KCM module
 
 set(kcm_checkprinting_PART_SRCS
@@ -64,7 +58,9 @@ set_target_properties(kcm_checkprinting
                       PROPERTIES
                       LIBRARY_OUTPUT_DIRECTORY "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
 
-target_link_libraries(kcm_checkprinting
+target_link_libraries(
+                      kcm_checkprinting
+                      kmm_url
                       Qt5::PrintSupport
                       KF5::I18n
                       KF5::ConfigWidgets
diff --git a/kmymoney/plugins/checkprinting/checkprinting.cpp b/kmymoney/plugins/checkprinting/checkprinting.cpp
index d42f63d0c..6688f5815 100644
--- a/kmymoney/plugins/checkprinting/checkprinting.cpp
+++ b/kmymoney/plugins/checkprinting/checkprinting.cpp
@@ -12,11 +12,7 @@
 #include <QAction>
 #include <QFile>
 #include <QDialog>
-#ifdef ENABLE_WEBENGINE
-#include <QWebEngineView>
-#else
-#include <KWebView>
-#endif
+#include <QTextDocument>
 #include <QStandardPaths>
 
 // KDE includes
@@ -76,31 +72,27 @@ struct CheckPrinting::Private {
 
     void readCheckTemplate()
     {
-        QString checkTemplateHTMLPath = QStandardPaths::locate(QStandardPaths::GenericDataLocation, "checkprinting/check_template.html");
 
-        if (PluginSettings::checkTemplateFile().isEmpty()) {
-            PluginSettings::setCheckTemplateFile(checkTemplateHTMLPath);
-            PluginSettings::self()->save();
-        }
+        QFile *checkTemplateHTMLFile = new QFile(PluginSettings::checkTemplateFile());
 
-        QFile checkTemplateHTMLFile(PluginSettings::checkTemplateFile());
-        checkTemplateHTMLFile.open(QIODevice::ReadOnly);
+        if (!PluginSettings::useCustomCheckTemplate || PluginSettings::checkTemplateFile().isEmpty() || !checkTemplateHTMLFile->exists())
+            checkTemplateHTMLFile = new QFile(PluginSettings::defaultCheckTemplateFileValue());
+        if (!(checkTemplateHTMLFile->open(QIODevice::ReadOnly)))
+            qDebug() << "Failed to open the template from" << checkTemplateHTMLFile->fileName();
+        else
+            qDebug() << "Template successfully opened from" << checkTemplateHTMLFile->fileName();
 
-        QTextStream stream(&checkTemplateHTMLFile);
+        QTextStream stream(checkTemplateHTMLFile);
 
         m_checkTemplateHTML = stream.readAll();
 
-        checkTemplateHTMLFile.close();
+        checkTemplateHTMLFile->close();
     }
 
     void printCheck(const QString& accountId, const QString& transactionId)
     {
         MyMoneyMoneyToWordsConverter converter;
-#ifdef ENABLE_WEBENGINE
-        auto htmlPart = new QWebEngineView();
-#else
-        auto htmlPart = new KWebView();
-#endif
+        auto htmlPart = new QTextDocument();
 
         const auto file = MyMoneyFile::instance();
         const auto transaction = file->transaction(transactionId);
@@ -155,15 +147,10 @@ struct CheckPrinting::Private {
         }
 
         // print the check
-        htmlPart->setHtml(checkHTML, QUrl("file://"));
+        htmlPart->setHtml(checkHTML);
         auto printer = KMyMoneyPrinter::startPrint();
-        if (printer != nullptr) {
-#ifdef ENABLE_WEBENGINE
-            htmlPart->page()->print(printer, [=] (bool) {});
-#else
+        if (printer != nullptr)
             htmlPart->print(printer);
-#endif
-        }
 
         // mark the transaction as printed
         markAsPrinted(transactionId);
@@ -183,6 +170,7 @@ CheckPrinting::CheckPrinting(QObject *parent, const KPluginMetaData &metaData, c
     // Tell the host application to load my GUI component
     const auto rcFileName = QLatin1String("checkprinting.rc");
 
+
     setXMLFile(rcFileName);
 
     // For ease announce that we have been loaded.
diff --git a/kmymoney/plugins/checkprinting/checkprinting.qrc b/kmymoney/plugins/checkprinting/checkprinting.qrc
index 0fb65cb71..167cba652 100644
--- a/kmymoney/plugins/checkprinting/checkprinting.qrc
+++ b/kmymoney/plugins/checkprinting/checkprinting.qrc
@@ -2,4 +2,7 @@
     <qresource prefix="/kxmlgui5/checkprinting">
         <file>checkprinting.rc</file>
     </qresource>
+    <qresource prefix="/plugins/checkprinting/">
+        <file>templates/check_template.html</file>
+    </qresource>
 </RCC>
diff --git a/kmymoney/plugins/checkprinting/kcm_checkprinting.cpp b/kmymoney/plugins/checkprinting/kcm_checkprinting.cpp
index 15d4b9a5e..4633d8a0d 100644
--- a/kmymoney/plugins/checkprinting/kcm_checkprinting.cpp
+++ b/kmymoney/plugins/checkprinting/kcm_checkprinting.cpp
@@ -9,46 +9,101 @@
 
 // Qt includes
 #include <QFrame>
-#ifdef ENABLE_WEBENGINE
-#include <QWebEngineView>
-#else
-#include <KWebView>
-#endif
+#include <QTextEdit>
 
 // KDE includes
 #include <KPluginFactory>
 #include <KAboutData>
 
+// ----------------------------------------------------------------------------
+// Project Includes
+
 #include "pluginsettings.h"
+#include "kcm_checkprinting.h"
 
-PluginSettingsWidget::PluginSettingsWidget(QWidget* parent) :
+PluginSettingsWidget::PluginSettingsWidget(QWidget *parent)
+    :
     QWidget(parent)
 {
     setupUi(this);
-#ifdef ENABLE_WEBENGINE
-    m_checkTemplatePreviewHTMLPart = new QWebEngineView(m_previewFrame);
-#else
-    m_checkTemplatePreviewHTMLPart = new KWebView(m_previewFrame);
-#endif
+    m_checkTemplatePreviewHTMLPart = new QTextEdit(m_previewFrame);
 
     QVBoxLayout *layout = new QVBoxLayout;
     m_previewFrame->setLayout(layout);
     layout->addWidget(m_checkTemplatePreviewHTMLPart);
 
-    connect(kcfg_checkTemplateFile, &KUrlRequester::urlSelected, this, &PluginSettingsWidget::urlSelected);
-    connect(kcfg_checkTemplateFile, QOverload<const QString&>::of(&KUrlRequester::returnPressed), this, &PluginSettingsWidget::returnPressed);
+    if (PluginSettings::checkTemplateFile().isEmpty()) {
+        restoreDefaultSettings();
+    }
+
+    connect(kcfg_checkTemplateFile, &KUrlRequester::textChanged, this, &PluginSettingsWidget::textChanged);
+    connect(kcfg_checkTemplateFile,
+            &KUrlRequester::urlSelected,
+            this,
+            QOverload<const QUrl &>::of(&PluginSettingsWidget::urlSelected));
+    connect(kcfg_checkTemplateFile, QOverload<const QString &>::of(&KUrlRequester::returnPressed), this,
+            QOverload<const QString &>::of(&PluginSettingsWidget::urlSelected));
+    connect(kcfg_useCustomCheckTemplate, SIGNAL(toggled(bool)), kcfg_checkTemplateFile, SLOT(setEnabled(bool)));
+    connect(kcfg_useCustomCheckTemplate,
+            &QCheckBox::toggled,
+            this,
+            QOverload<>::of(&PluginSettingsWidget::urlSelected));
+}
+
+void PluginSettingsWidget::urlSelected()
+{
+    if (kcfg_useCustomCheckTemplate->checkState() == Qt::Unchecked
+        || PluginSettings::checkTemplateFile().isEmpty()
+        || kcfg_checkTemplateFile->url().isEmpty()) {
+        urlSelected(QUrl::fromUserInput(PluginSettings::defaultCheckTemplateFileValue()));
+    }
+    else {
+        urlSelected(kcfg_checkTemplateFile->url());
+    }
+}
+
+void PluginSettingsWidget::urlSelected(const QString &url)
+{
+    urlSelected(QUrl::fromUserInput(url));
 }
 
 void PluginSettingsWidget::urlSelected(const QUrl &url)
 {
-    if (!url.isEmpty())
-        m_checkTemplatePreviewHTMLPart->load(url);
+    if (!url.isEmpty()) {
+        m_checkTemplatePreviewHTMLPart->clear();
+        QFile file(url.toLocalFile());
+
+        if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
+            QTextStream stream(&file);
+            m_checkTemplatePreviewHTMLPart->setHtml(stream.readAll());
+            file.close();
+        }
+    }
+    else {
+        urlSelected();
+    }
+}
+
+void PluginSettingsWidget::textChanged(const QString& text)
+{
+    // conceal the default "qrc:/" value to avoid confusing regular users
+    if (text == PluginSettings::defaultCheckTemplateFileValue()) {
+        kcfg_checkTemplateFile->setText("");
+    }
+}
+
+void PluginSettingsWidget::restoreDefaultSettings() const
+{
+    PluginSettings::setUseCustomCheckTemplate(false);
+    PluginSettings::setCheckTemplateFile(PluginSettings::defaultCheckTemplateFileValue());
+    PluginSettings::self()->save();
 }
 
-void PluginSettingsWidget::returnPressed(const QString& url)
+PluginSettingsWidget::~PluginSettingsWidget()
 {
-    if (!url.isEmpty())
-        m_checkTemplatePreviewHTMLPart->load(QUrl::fromUserInput(url));
+    if (kcfg_checkTemplateFile->url().isEmpty()) {
+        restoreDefaultSettings();
+    }
 }
 
 KCMCheckPrinting::KCMCheckPrinting(QWidget *parent, const QVariantList& args)
@@ -60,7 +115,8 @@ KCMCheckPrinting::KCMCheckPrinting(QWidget *parent, const QVariantList& args)
     setLayout(layout);
     layout->addWidget(w);
     load();
-    w->urlSelected(QUrl::fromUserInput(PluginSettings::checkTemplateFile()));
+    w->urlSelected(PluginSettings::useCustomCheckTemplate() ? PluginSettings::checkTemplateFile()
+                                                            : PluginSettings::defaultCheckTemplateFileValue());
 }
 
 KCMCheckPrinting::~KCMCheckPrinting()
diff --git a/kmymoney/plugins/checkprinting/kcm_checkprinting.h b/kmymoney/plugins/checkprinting/kcm_checkprinting.h
index 18f58c23c..c8cf7e8f0 100644
--- a/kmymoney/plugins/checkprinting/kcm_checkprinting.h
+++ b/kmymoney/plugins/checkprinting/kcm_checkprinting.h
@@ -1,39 +1,40 @@
 /*
     SPDX-FileCopyrightText: 2009 Cristian Onet onet.cristian @gmail.com
+    SPDX-FileCopyrightText: 2021 Dawid Wróbel <me at dawidwrobel.com>
     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
 */
 #ifndef KCM_CHECKPRINTING_H
 #define KCM_CHECKPRINTING_H
 
 #include <config-kmymoney.h>
+#include "ui_pluginsettingsdecl.h"
+
+// Override QUrl
+#include <misc/kmmurl.h>
 
 #include <KCModule>
 #include <QWidget>
-#include "ui_pluginsettingsdecl.h"
 
-#ifdef ENABLE_WEBENGINE
-class QWebEngineView;
-#else
-class KWebView;
-#endif
+class QTextEdit;
+class QTextDocument;
 
 class PluginSettingsWidget : public QWidget, public Ui::PluginSettingsDecl
 {
-    Q_OBJECT
+Q_OBJECT
 
 public:
     explicit PluginSettingsWidget(QWidget* parent = 0);
+    ~PluginSettingsWidget();
 
 public Q_SLOTS:
+    void urlSelected();
     void urlSelected(const QUrl &url);
-    void returnPressed(const QString& url);
+    void urlSelected(const QString& url);
+    void textChanged(const QString& text);
 
 private:
-#ifdef ENABLE_WEBENGINE
-    QWebEngineView *m_checkTemplatePreviewHTMLPart;
-#else
-    KWebView       *m_checkTemplatePreviewHTMLPart;
-#endif
+    QTextEdit *m_checkTemplatePreviewHTMLPart;
+    void restoreDefaultSettings() const;
 };
 
 class KCMCheckPrinting : public KCModule
diff --git a/kmymoney/plugins/checkprinting/pluginsettings.kcfg b/kmymoney/plugins/checkprinting/pluginsettings.kcfg
index cab0d10d1..173a48460 100644
--- a/kmymoney/plugins/checkprinting/pluginsettings.kcfg
+++ b/kmymoney/plugins/checkprinting/pluginsettings.kcfg
@@ -6,8 +6,13 @@
 
 	<kcfgfile name="kmymoney/checkprintingrc"/>
 	<group name="General">
-    <entry name="checkTemplateFile" type="String">
+	<entry name="useCustomCheckTemplate" type="Bool">
+     <label>Use custom check template</label>
+     <default>true</default>
+    </entry>
+    <entry name="checkTemplateFile" type="Path">
       <label>The check template file which defines the way the printed check will look.</label>
+      <default>:/plugins/checkprinting/templates/check_template.html</default>
     </entry>
     <entry name="printedChecks" type="StringList">
       <label>A list containing the id's of already printed checks.</label>
diff --git a/kmymoney/plugins/checkprinting/pluginsettings.kcfgc b/kmymoney/plugins/checkprinting/pluginsettings.kcfgc
index fb06ac35c..89a56d786 100644
--- a/kmymoney/plugins/checkprinting/pluginsettings.kcfgc
+++ b/kmymoney/plugins/checkprinting/pluginsettings.kcfgc
@@ -3,4 +3,5 @@ File=pluginsettings.kcfg
 ClassName=PluginSettings
 Singleton=true
 Mutators=true
+DefaultValueGetters=true
 # will create the necessary code for setting those variables
diff --git a/kmymoney/plugins/checkprinting/pluginsettingsdecl.ui b/kmymoney/plugins/checkprinting/pluginsettingsdecl.ui
index dd4a51e34..09d548e62 100644
--- a/kmymoney/plugins/checkprinting/pluginsettingsdecl.ui
+++ b/kmymoney/plugins/checkprinting/pluginsettingsdecl.ui
@@ -17,7 +17,7 @@
    </sizepolicy>
   </property>
   <property name="windowTitle">
-   <string>Icalendar export settings</string>
+   <string>Checking settings</string>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout_2">
    <item>
@@ -25,18 +25,15 @@
      <item>
       <layout class="QHBoxLayout" name="horizontalLayout">
        <item>
-        <widget class="QLabel" name="check_template_file">
+        <widget class="QCheckBox" name="kcfg_useCustomCheckTemplate">
          <property name="sizePolicy">
-          <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+          <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
            <horstretch>0</horstretch>
            <verstretch>0</verstretch>
           </sizepolicy>
          </property>
          <property name="text">
-          <string>Check template file</string>
-         </property>
-         <property name="wordWrap">
-          <bool>false</bool>
+          <string>Use custom check template</string>
          </property>
         </widget>
        </item>
@@ -45,6 +42,9 @@
          <property name="kcfg_property" stdset="0">
           <cstring>text</cstring>
          </property>
+         <property name="enabled">
+          <bool>false</bool>
+         </property>
          <property name="sizePolicy">
           <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
            <horstretch>0</horstretch>
diff --git a/kmymoney/plugins/checkprinting/check-3-part-template.html b/kmymoney/plugins/checkprinting/templates/check-3-part-template.html
similarity index 100%
rename from kmymoney/plugins/checkprinting/check-3-part-template.html
rename to kmymoney/plugins/checkprinting/templates/check-3-part-template.html
diff --git a/kmymoney/plugins/checkprinting/check_template.html b/kmymoney/plugins/checkprinting/templates/check_template.html
similarity index 100%
rename from kmymoney/plugins/checkprinting/check_template.html
rename to kmymoney/plugins/checkprinting/templates/check_template.html
diff --git a/kmymoney/plugins/checkprinting/check_template_green_linen.html b/kmymoney/plugins/checkprinting/templates/check_template_green_linen.html
similarity index 100%
rename from kmymoney/plugins/checkprinting/check_template_green_linen.html
rename to kmymoney/plugins/checkprinting/templates/check_template_green_linen.html



More information about the kde-doc-english mailing list