File indexing completed on 2024-04-28 15:51:58

0001 /*
0002     SPDX-FileCopyrightText: 2018 Chinmoy Ranjan Pradhan <chinmoyrp65@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "signaturepanel.h"
0008 
0009 #include "gui/signaturemodel.h"
0010 #include "pageview.h"
0011 #include "revisionviewer.h"
0012 #include "signaturepartutils.h"
0013 #include "signaturepropertiesdialog.h"
0014 
0015 #include <kwidgetsaddons_version.h>
0016 
0017 #include <KLocalizedString>
0018 #include <KTitleWidget>
0019 
0020 #include <QApplication>
0021 #include <QHeaderView>
0022 #include <QMenu>
0023 #include <QTreeView>
0024 #include <QVBoxLayout>
0025 
0026 #include "core/document.h"
0027 #include "core/form.h"
0028 
0029 class SignaturePanelPrivate
0030 {
0031 public:
0032     Okular::Document *m_document;
0033     const Okular::FormFieldSignature *m_currentForm;
0034     QTreeView *m_view;
0035     SignatureModel *m_model;
0036     PageView *m_pageView;
0037 };
0038 
0039 SignaturePanel::SignaturePanel(Okular::Document *document, QWidget *parent)
0040     : QWidget(parent)
0041     , d_ptr(new SignaturePanelPrivate)
0042 {
0043     Q_D(SignaturePanel);
0044 
0045     KTitleWidget *titleWidget = new KTitleWidget(this);
0046     titleWidget->setLevel(4);
0047     titleWidget->setText(i18n("Signatures"));
0048 
0049     d->m_view = new QTreeView(this);
0050     d->m_view->setAlternatingRowColors(true);
0051     d->m_view->setSelectionMode(QAbstractItemView::SingleSelection);
0052     d->m_view->setContextMenuPolicy(Qt::CustomContextMenu);
0053     d->m_view->header()->hide();
0054 
0055     d->m_document = document;
0056     d->m_model = new SignatureModel(d->m_document, this);
0057 
0058     d->m_view->setModel(d->m_model);
0059     connect(d->m_view->selectionModel(), &QItemSelectionModel::currentChanged, this, &SignaturePanel::activated);
0060     connect(d->m_view, &QTreeView::customContextMenuRequested, this, &SignaturePanel::slotShowContextMenu);
0061 
0062     auto vLayout = new QVBoxLayout(this);
0063     vLayout->setSpacing(6);
0064 
0065     vLayout->addWidget(titleWidget);
0066     vLayout->setAlignment(titleWidget, Qt::AlignHCenter);
0067     vLayout->addWidget(d->m_view);
0068 }
0069 
0070 void SignaturePanel::activated(const QModelIndex &index)
0071 {
0072     Q_D(SignaturePanel);
0073     d->m_currentForm = d->m_model->data(index, SignatureModel::FormRole).value<const Okular::FormFieldSignature *>();
0074     if (!d->m_currentForm) {
0075         return;
0076     }
0077     const Okular::NormalizedRect nr = d->m_currentForm->rect();
0078     Okular::DocumentViewport vp;
0079     vp.pageNumber = d->m_model->data(index, SignatureModel::PageRole).toInt();
0080     vp.rePos.enabled = true;
0081     vp.rePos.pos = Okular::DocumentViewport::Center;
0082     vp.rePos.normalizedX = (nr.right + nr.left) / 2.0;
0083     vp.rePos.normalizedY = (nr.bottom + nr.top) / 2.0;
0084     d->m_document->setViewport(vp, nullptr);
0085     d->m_pageView->highlightSignatureFormWidget(d->m_currentForm);
0086 }
0087 
0088 void SignaturePanel::slotShowContextMenu()
0089 {
0090     Q_D(SignaturePanel);
0091     if (!d->m_currentForm) {
0092         return;
0093     }
0094 
0095     QMenu *menu = new QMenu(this);
0096     if (d->m_currentForm->signatureType() == Okular::FormFieldSignature::UnsignedSignature) {
0097         QAction *signAction = new QAction(i18n("&Sign..."), menu);
0098         connect(signAction, &QAction::triggered, this, &SignaturePanel::signUnsignedSignature);
0099         menu->addAction(signAction);
0100     } else {
0101         QAction *sigProp = new QAction(i18n("Properties"), menu);
0102         connect(sigProp, &QAction::triggered, this, &SignaturePanel::slotViewProperties);
0103         menu->addAction(sigProp);
0104     }
0105     menu->exec(QCursor::pos());
0106     delete menu;
0107 }
0108 
0109 void SignaturePanel::slotViewProperties()
0110 {
0111     Q_D(SignaturePanel);
0112     SignaturePropertiesDialog propDlg(d->m_document, d->m_currentForm, this);
0113     propDlg.exec();
0114 }
0115 
0116 void SignaturePanel::signUnsignedSignature()
0117 {
0118     Q_D(SignaturePanel);
0119     SignaturePartUtils::signUnsignedSignature(d->m_currentForm, d->m_pageView, d->m_document);
0120 }
0121 
0122 void SignaturePanel::notifySetup(const QVector<Okular::Page *> & /*pages*/, int setupFlags)
0123 {
0124     if (!(setupFlags & Okular::DocumentObserver::UrlChanged)) {
0125         return;
0126     }
0127 
0128     Q_D(SignaturePanel);
0129     const QVector<const Okular::FormFieldSignature *> signatureForms = SignatureGuiUtils::getSignatureFormFields(d->m_document);
0130     Q_EMIT documentHasSignatures(!signatureForms.isEmpty());
0131 }
0132 
0133 SignaturePanel::~SignaturePanel()
0134 {
0135     Q_D(SignaturePanel);
0136     d->m_document->removeObserver(this);
0137     delete d->m_model;
0138 }
0139 
0140 void SignaturePanel::setPageView(PageView *pv)
0141 {
0142     Q_D(SignaturePanel);
0143     d->m_pageView = pv;
0144 }