diff --git a/ui/formwidgets.h b/ui/formwidgets.h --- a/ui/formwidgets.h +++ b/ui/formwidgets.h @@ -38,7 +38,9 @@ class FormFieldButton; class FormFieldChoice; class FormFieldText; +class FormFieldSignature; class Document; +class SignatureInfo; } struct RadioData @@ -346,6 +348,30 @@ DECLARE_ADDITIONAL_ACTIONS }; +class SignatureEdit : public QAbstractButton, public FormWidgetIface +{ + Q_OBJECT + + public: + explicit SignatureEdit( Okular::FormFieldSignature * signature, QWidget * parent = nullptr ); + Okular::SignatureInfo *validate(); + + protected: + bool event( QEvent * e ) override; + void contextMenuEvent( QContextMenuEvent * event ) override; + void paintEvent( QPaintEvent * event ) override; + + private Q_SLOTS: + void slotShowSummary(); + void slotShowProperties(); + + private: + Okular::SignatureInfo *m_sigInfo; + bool m_lefMouseButtonPressed; + + DECLARE_ADDITIONAL_ACTIONS +}; + #undef DECLARE_ADDITIONAL_ACTIONS #endif diff --git a/ui/formwidgets.cpp b/ui/formwidgets.cpp --- a/ui/formwidgets.cpp +++ b/ui/formwidgets.cpp @@ -13,6 +13,7 @@ #include "formwidgets.h" #include "pageviewutils.h" +#include "signaturewidgets.h" #include #include @@ -23,6 +24,7 @@ #include #include #include +#include // local includes #include "core/form.h" @@ -276,6 +278,13 @@ } break; } + case Okular::FormField::FormSignature: + { + Okular::FormFieldSignature * ffs = static_cast< Okular::FormFieldSignature * >( ff ); + if ( ffs->isVisible() && ffs->signatureType() != Okular::FormFieldSignature::UnknownType ) + widget = new SignatureEdit( ffs, parent ); + break; + } default: ; } @@ -1049,6 +1058,105 @@ return QComboBox::event( e ); } +SignatureEdit::SignatureEdit( Okular::FormFieldSignature * signature, QWidget * parent ) + : QAbstractButton( parent ), FormWidgetIface( this, signature ), + m_sigInfo( nullptr ), m_lefMouseButtonPressed( false ) +{ + setCheckable( false ); + setCursor( Qt::PointingHandCursor ); + connect( this, &SignatureEdit::clicked, this, &SignatureEdit::slotShowSummary ); +} + +bool SignatureEdit::event( QEvent * e ) +{ + switch ( e->type() ) + { + case QEvent::MouseButtonPress: + { + QMouseEvent *ev = static_cast< QMouseEvent * >( e ); + if ( ev->button() == Qt::LeftButton ) + { + m_lefMouseButtonPressed = true; + update(); + } + mousePressEvent( ev ); + break; + } + case QEvent::MouseButtonRelease: + { + QMouseEvent *ev = static_cast< QMouseEvent * >( e ); + m_lefMouseButtonPressed = false; + if ( ev->button() == Qt::LeftButton) + { + update(); + } + mouseReleaseEvent( ev ); + break; + } + default: + break; + } + + return QAbstractButton::event( e ); +} + +void SignatureEdit::contextMenuEvent( QContextMenuEvent * event ) +{ + QMenu *menu = new QMenu( this ); + QAction *sigVal = new QAction( i18n("Validate Signature"), this ); + menu->addAction( sigVal ); + connect( sigVal, &QAction::triggered, this, &SignatureEdit::slotShowSummary ); + QAction *sigProp = new QAction( i18n("Show Signature Properties"), this ); + sigProp->setEnabled( m_sigInfo != nullptr ); + menu->addAction( sigProp ); + connect( sigProp, &QAction::triggered, this, &SignatureEdit::slotShowProperties ); + menu->exec( event->globalPos() ); + delete menu; +} + +void SignatureEdit::paintEvent( QPaintEvent * ) +{ + QPainter painter( this ); + painter.setPen( Qt::black ); + if ( m_lefMouseButtonPressed ) + { + QColor col = palette().color( QPalette::Active, QPalette::Highlight ); + col.setAlpha(50); + painter.setBrush( col ); + } + else + { + painter.setBrush( Qt::transparent ); + } + painter.drawRect( 0, 0, width()-2, height()-2 ); +} + +Okular::SignatureInfo *SignatureEdit::validate() +{ + Okular::FormFieldSignature *sigField = static_cast< Okular::FormFieldSignature * >( formField() ); + m_sigInfo = sigField->validate(); + return m_sigInfo; +} + +void SignatureEdit::slotShowSummary() +{ + validate(); + if ( !m_sigInfo ) + return; + + SignatureSummaryDialog sigSummaryDlg( m_sigInfo, this ); + sigSummaryDlg.exec(); +} + +void SignatureEdit::slotShowProperties() +{ + if ( !m_sigInfo ) + return; + + SignaturePropertiesDialog sigPropDlg( m_sigInfo, this ); + sigPropDlg.exec(); +} + // Code for additional action handling. // Challenge: Change preprocessor magic to C++ magic! // @@ -1134,6 +1242,7 @@ DEFINE_ADDITIONAL_ACTIONS( FileEdit, KUrlRequester ) DEFINE_ADDITIONAL_ACTIONS( ListEdit, QListWidget ) DEFINE_ADDITIONAL_ACTIONS( ComboEdit, QComboBox ) +DEFINE_ADDITIONAL_ACTIONS( SignatureEdit, QAbstractButton ) #undef DEFINE_ADDITIONAL_ACTIONS