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 }