diff --git a/Pdf4QtLib/sources/pdf3d_u3d.cpp b/Pdf4QtLib/sources/pdf3d_u3d.cpp index fbe814c..dca4428 100644 --- a/Pdf4QtLib/sources/pdf3d_u3d.cpp +++ b/Pdf4QtLib/sources/pdf3d_u3d.cpp @@ -434,6 +434,11 @@ const PDF3D_U3D_ContextManager::ContextData* PDF3D_U3D_ContextManager::getContex return nullptr; } +PDF3D_U3D PDF3D_U3D::parse(QByteArray data) +{ + return PDF3D_U3D(); +} + } // namespace u3d } // namespace pdf diff --git a/Pdf4QtLib/sources/pdf3d_u3d.h b/Pdf4QtLib/sources/pdf3d_u3d.h index 4ec9eed..8f66f32 100644 --- a/Pdf4QtLib/sources/pdf3d_u3d.h +++ b/Pdf4QtLib/sources/pdf3d_u3d.h @@ -31,6 +31,8 @@ namespace u3d class PDF3D_U3D { public: + + static PDF3D_U3D parse(QByteArray data); }; class PDF3D_U3D_ContextManager diff --git a/Pdf4QtLib/sources/pdfannotation.cpp b/Pdf4QtLib/sources/pdfannotation.cpp index b41f4cf..c7da6fc 100644 --- a/Pdf4QtLib/sources/pdfannotation.cpp +++ b/Pdf4QtLib/sources/pdfannotation.cpp @@ -1039,6 +1039,23 @@ bool PDFAnnotation::isTypeEditable(AnnotationType type) return false; } +bool PDFAnnotation::isTypeMultimedia(AnnotationType type) +{ + switch (type) + { + case AnnotationType::Sound: + case AnnotationType::Movie: + case AnnotationType::_3D: + case AnnotationType::RichMedia: + return true; + + default: + break; + } + + return false; +} + QPen PDFAnnotation::getPen() const { QColor strokeColor = getStrokeColor(); @@ -1816,7 +1833,8 @@ void PDFWidgetAnnotationManager::mousePressEvent(QWidget* widget, QMouseEvent* e void PDFWidgetAnnotationManager::mouseDoubleClickEvent(QWidget* widget, QMouseEvent* event) { Q_UNUSED(widget); - Q_UNUSED(event); + + updateFromMouseEvent(event); } void PDFWidgetAnnotationManager::mouseReleaseEvent(QWidget* widget, QMouseEvent* event) @@ -1967,6 +1985,16 @@ void PDFWidgetAnnotationManager::updateFromMouseEvent(QMouseEvent* event) Q_EMIT actionTriggered(linkAction); } } + + // Execute multimedia annotation + if (event->type() == QEvent::MouseButtonDblClick && event->button() == Qt::LeftButton) + { + const PDFAnnotation* annotation = pageAnnotation.annotation.get(); + if (PDFAnnotation::isTypeMultimedia(annotation->getType())) + { + emit multimediaTriggered(annotation); + } + } } else { diff --git a/Pdf4QtLib/sources/pdfannotation.h b/Pdf4QtLib/sources/pdfannotation.h index cabc717..edddd6e 100644 --- a/Pdf4QtLib/sources/pdfannotation.h +++ b/Pdf4QtLib/sources/pdfannotation.h @@ -601,6 +601,10 @@ public: /// \param type Annotation type static bool isTypeEditable(AnnotationType type); + /// Returns true, if annotation is multimedia + /// \param type Annotation type + static bool isTypeMultimedia(AnnotationType type); + protected: virtual QColor getStrokeColor() const; virtual QColor getFillColor() const; @@ -1655,8 +1659,9 @@ public: virtual int getInputPriority() const override { return AnnotationPriority; } signals: - void actionTriggered(const PDFAction* action); - void documentModified(PDFModifiedDocument document); + void actionTriggered(const pdf::PDFAction* action); + void multimediaTriggered(const pdf::PDFAnnotation* annotation); + void documentModified(pdf::PDFModifiedDocument document); private: void updateFromMouseEvent(QMouseEvent* event); diff --git a/Pdf4QtViewer/pdfmediaviewerdialog.cpp b/Pdf4QtViewer/pdfmediaviewerdialog.cpp index b811da5..0385d38 100644 --- a/Pdf4QtViewer/pdfmediaviewerdialog.cpp +++ b/Pdf4QtViewer/pdfmediaviewerdialog.cpp @@ -18,6 +18,9 @@ #include "pdfmediaviewerdialog.h" #include "ui_pdfmediaviewerdialog.h" #include "pdfwidgetutils.h" +#include "pdfdocument.h" +#include "pdfannotation.h" +#include "pdf3d_u3d.h" #include "pdfdbgheap.h" #include @@ -161,4 +164,48 @@ void PDFMediaViewerDialog::initDemo() lightEntity->addComponent(lightTransform); } +void PDFMediaViewerDialog::initFromAnnotation(const pdf::PDFDocument* document, + const pdf::PDFAnnotation* annotation) +{ + Q_ASSERT(document); + Q_ASSERT(annotation); + + switch (annotation->getType()) + { + case pdf::AnnotationType::_3D: + { + const pdf::PDF3DAnnotation* typedAnnotation = dynamic_cast(annotation); + initFrom3DAnnotation(document, typedAnnotation); + break; + } + + default: + break; + } +} + +void PDFMediaViewerDialog::initFrom3DAnnotation(const pdf::PDFDocument* document, + const pdf::PDF3DAnnotation* annotation) +{ + const pdf::PDF3DStream& stream = annotation->getStream(); + + pdf::PDFObject object = document->getObject(stream.getStream()); + if (object.isStream()) + { + QByteArray data = document->getDecodedStream(object.getStream()); + + switch (stream.getType()) + { + case pdf::PDF3DStream::Type::U3D: + break; + + case pdf::PDF3DStream::Type::PRC: + break; + + default: + break; + } + } +} + } // namespace pdfviewer diff --git a/Pdf4QtViewer/pdfmediaviewerdialog.h b/Pdf4QtViewer/pdfmediaviewerdialog.h index 7b3f412..0cb53b2 100644 --- a/Pdf4QtViewer/pdfmediaviewerdialog.h +++ b/Pdf4QtViewer/pdfmediaviewerdialog.h @@ -18,6 +18,8 @@ #ifndef PDFMEDIAVIEWERDIALOG_H #define PDFMEDIAVIEWERDIALOG_H +#include "pdfglobal.h" + #include namespace Qt3DCore @@ -35,6 +37,13 @@ namespace Ui class PDFMediaViewerDialog; } +namespace pdf +{ +class PDFDocument; +class PDFAnnotation; +class PDF3DAnnotation; +} + namespace pdfviewer { @@ -47,8 +56,11 @@ public: virtual ~PDFMediaViewerDialog() override; void initDemo(); + void initFromAnnotation(const pdf::PDFDocument* document, const pdf::PDFAnnotation* annotation); private: + void initFrom3DAnnotation(const pdf::PDFDocument* document, const pdf::PDF3DAnnotation* annotation); + Ui::PDFMediaViewerDialog* ui; Qt3DExtras::Qt3DWindow* m_3dWindow = nullptr; Qt3DCore::QEntity* m_rootEntity = nullptr; diff --git a/Pdf4QtViewer/pdfprogramcontroller.cpp b/Pdf4QtViewer/pdfprogramcontroller.cpp index 1562448..c22065f 100644 --- a/Pdf4QtViewer/pdfprogramcontroller.cpp +++ b/Pdf4QtViewer/pdfprogramcontroller.cpp @@ -352,6 +352,7 @@ void PDFProgramController::initializeAnnotationManager() { m_annotationManager = new pdf::PDFWidgetAnnotationManager(m_pdfWidget->getDrawWidgetProxy(), this); connect(m_annotationManager, &pdf::PDFWidgetAnnotationManager::actionTriggered, this, &PDFProgramController::onActionTriggered); + connect(m_annotationManager, &pdf::PDFWidgetAnnotationManager::multimediaTriggered, this, &PDFProgramController::onMultimediaTriggered); connect(m_annotationManager, &pdf::PDFWidgetAnnotationManager::documentModified, this, &PDFProgramController::onDocumentModified); m_pdfWidget->setAnnotationManager(m_annotationManager); } @@ -961,6 +962,13 @@ void PDFProgramController::onActionTriggered(const pdf::PDFAction* action) } } +void PDFProgramController::onMultimediaTriggered(const pdf::PDFAnnotation* annotation) +{ + PDFMediaViewerDialog* dialog = new PDFMediaViewerDialog(getMainWindow()); + dialog->initFromAnnotation(getDocument(), annotation); + dialog->open(); +} + void PDFProgramController::initializeToolManager() { // Initialize tools diff --git a/Pdf4QtViewer/pdfprogramcontroller.h b/Pdf4QtViewer/pdfprogramcontroller.h index e9cd476..f089d09 100644 --- a/Pdf4QtViewer/pdfprogramcontroller.h +++ b/Pdf4QtViewer/pdfprogramcontroller.h @@ -43,6 +43,7 @@ class PDFWidget; class PDFCMSManager; class PDFToolManager; class PDFFormManager; +class PDFAnnotation; class PDFWidgetAnnotationManager; } @@ -289,6 +290,7 @@ public: void onActionTriggered(const pdf::PDFAction* action); void onDocumentModified(pdf::PDFModifiedDocument document); + void onMultimediaTriggered(const pdf::PDFAnnotation* annotation); void updateActionsAvailability(); bool getIsBusy() const;