diff --git a/autotests/data/additionalFormActions.pdf b/autotests/data/additionalFormActions.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@visibleRegion().rects().count() == 4); } +// Helper for testAdditionalActionTriggers +static void verifyTargetStates( const QString & triggerName, + const QMap &fields, + bool focusVisible, bool cursorVisible, bool mouseVisible, + int line) +{ + Okular::FormField *focusTarget = fields.value( triggerName + QStringLiteral ("_focus_target") ); + Okular::FormField *cursorTarget = fields.value( triggerName + QStringLiteral ("_cursor_target") ); + Okular::FormField *mouseTarget = fields.value( triggerName + QStringLiteral ("_mouse_target") ); + + QVERIFY( focusTarget ); + QVERIFY( cursorTarget ); + QVERIFY( mouseTarget ); + + QTRY_VERIFY2( focusTarget->isVisible() == focusVisible, + QStringLiteral ("line: %1 focus for %2 not matched. Expected %3 Actual %4"). + arg( line ).arg( triggerName ).arg( focusTarget->isVisible() ).arg( focusVisible ).toUtf8().constData() ); + QTRY_VERIFY2( cursorTarget->isVisible() == cursorVisible, + QStringLiteral ("line: %1 cursor for %2 not matched. Actual %3 Expected %4"). + arg( line ).arg( triggerName ).arg( cursorTarget->isVisible() ).arg( cursorVisible ).toUtf8().constData() ); + QTRY_VERIFY2( mouseTarget->isVisible() == mouseVisible, + QStringLiteral ("line: %1 mouse for %2 not matched. Expected %3 Actual %4"). + arg( line ).arg( triggerName ).arg( mouseTarget->isVisible() ).arg( mouseVisible ).toUtf8().constData() ); } +void PartTest::testAdditionalActionTriggers() +{ +#ifndef HAVE_POPPLER_0_65 + return; +#endif + const QString testFile = QStringLiteral( KDESRCDIR "data/additionalFormActions.pdf" ); + Okular::Part part( nullptr, nullptr, QVariantList() ); + part.openDocument( testFile ); + part.widget()->resize(800, 600); + + part.widget()->show(); + QVERIFY( QTest::qWaitForWindowExposed( part.widget() ) ); + + QMap fields; + // Field names in test document are: + // For trigger fields: tf, cb, rb, dd, pb + // For target fields: _focus_target, _cursor_target, + // _mouse_target + const Okular::Page* page = part.m_document->page( 0 ); + for ( Okular::FormField *ff: page->formFields() ) + { + fields.insert( ff->name(), static_cast< Okular::FormField* >( ff ) ); + } + + // Verify that everything is set up. + verifyTargetStates( QStringLiteral( "tf" ), fields, true, true, true, __LINE__ ); + verifyTargetStates( QStringLiteral( "cb" ), fields, true, true, true, __LINE__ ); + verifyTargetStates( QStringLiteral( "rb" ), fields, true, true, true, __LINE__ ); + verifyTargetStates( QStringLiteral( "dd" ), fields, true, true, true, __LINE__ ); + verifyTargetStates( QStringLiteral( "pb" ), fields, true, true, true, __LINE__ ); + + const int width = part.m_pageView->horizontalScrollBar()->maximum() + + part.m_pageView->viewport()->width(); + const int height = part.m_pageView->verticalScrollBar()->maximum() + + part.m_pageView->viewport()->height(); + + part.m_document->setViewportPage( 0 ); + + // wait for pixmap + QTRY_VERIFY( part.m_document->page( 0 )->hasPixmap( part.m_pageView) ); + + part.actionCollection()->action( QStringLiteral( "view_toggle_forms" ) )->trigger(); + + QPoint tfPos( width * 0.045, height * 0.05 ); + QPoint cbPos( width * 0.045, height * 0.08 ); + QPoint rbPos( width * 0.045, height * 0.12 ); + QPoint ddPos( width * 0.045, height * 0.16 ); + QPoint pbPos( width * 0.045, height * 0.26 ); + + // Test text field + auto widget = part.m_pageView->viewport()->childAt( tfPos ); + QVERIFY( widget ); + + QTest::mouseMove( part.m_pageView->viewport(), QPoint( tfPos )); + verifyTargetStates( QStringLiteral( "tf" ), fields, true, false, true, __LINE__ ); + QTest::mousePress( widget, Qt::LeftButton, Qt::NoModifier, QPoint( 5, 5 ) ); + verifyTargetStates( QStringLiteral( "tf" ), fields, false, false, false, __LINE__ ); + QTest::mouseRelease( widget, Qt::LeftButton, Qt::NoModifier, QPoint( 5, 5 ) ); + verifyTargetStates( QStringLiteral( "tf" ), fields, false, false, true, __LINE__ ); + + // Checkbox + widget = part.m_pageView->viewport()->childAt( cbPos ); + QVERIFY( widget ); + + QTest::mouseMove( part.m_pageView->viewport(), QPoint( cbPos ) ); + verifyTargetStates( QStringLiteral( "cb" ), fields, true, false, true, __LINE__ ); + QTest::mousePress( widget, Qt::LeftButton, Qt::NoModifier, QPoint( 5, 5 ) ); + verifyTargetStates( QStringLiteral( "cb" ), fields, false, false, false, __LINE__ ); + // Confirm that the textfield no longer has any invisible + verifyTargetStates( QStringLiteral( "tf" ), fields, true, true, true, __LINE__ ); + QTest::mouseRelease( widget, Qt::LeftButton, Qt::NoModifier, QPoint( 5, 5 ) ); + verifyTargetStates( QStringLiteral( "cb" ), fields, false, false, true, __LINE__ ); + + // Radio + widget = part.m_pageView->viewport()->childAt( rbPos ); + QVERIFY( widget ); + + QTest::mouseMove( part.m_pageView->viewport(), QPoint( rbPos ) ); + verifyTargetStates( QStringLiteral( "rb" ), fields, true, false, true, __LINE__ ); + QTest::mousePress( widget, Qt::LeftButton, Qt::NoModifier, QPoint( 5, 5 ) ); + verifyTargetStates( QStringLiteral( "rb" ), fields, false, false, false, __LINE__ ); + QTest::mouseRelease( widget, Qt::LeftButton, Qt::NoModifier, QPoint( 5, 5 ) ); + verifyTargetStates( QStringLiteral( "rb" ), fields, false, false, true, __LINE__ ); + + // Dropdown + widget = part.m_pageView->viewport()->childAt( ddPos ); + QVERIFY( widget ); + + QTest::mouseMove( part.m_pageView->viewport(), QPoint( ddPos ) ); + verifyTargetStates( QStringLiteral( "dd" ), fields, true, false, true, __LINE__ ); + QTest::mousePress( widget, Qt::LeftButton, Qt::NoModifier, QPoint( 5, 5 ) ); + verifyTargetStates( QStringLiteral( "dd" ), fields, false, false, false, __LINE__ ); + QTest::mouseRelease( widget, Qt::LeftButton, Qt::NoModifier, QPoint( 5, 5 ) ); + verifyTargetStates( QStringLiteral( "dd" ), fields, false, false, true, __LINE__ ); + + // Pushbutton + widget = part.m_pageView->viewport()->childAt( pbPos ); + QVERIFY( widget ); + + QTest::mouseMove( part.m_pageView->viewport(), QPoint( pbPos ) ); + verifyTargetStates( QStringLiteral( "pb" ), fields, true, false, true, __LINE__ ); + QTest::mousePress( widget, Qt::LeftButton, Qt::NoModifier, QPoint( 5, 5 ) ); + verifyTargetStates( QStringLiteral( "pb" ), fields, false, false, false, __LINE__ ); + QTest::mouseRelease( widget, Qt::LeftButton, Qt::NoModifier, QPoint( 5, 5 ) ); + verifyTargetStates( QStringLiteral( "pb" ), fields, false, false, true, __LINE__ ); + + // Confirm that a mouse release outside does not trigger the show action. + QTest::mousePress( widget, Qt::LeftButton, Qt::NoModifier, QPoint( 5, 5 ) ); + verifyTargetStates( QStringLiteral( "pb" ), fields, false, false, false, __LINE__ ); + QTest::mouseRelease( part.m_pageView->viewport(), Qt::LeftButton, Qt::NoModifier, tfPos ); + verifyTargetStates( QStringLiteral( "pb" ), fields, false, false, false, __LINE__ ); +} + +} // namespace Okular + int main(int argc, char *argv[]) { // Force consistent locale