mirror of
https://github.com/JakubMelka/PDF4QT.git
synced 2025-06-05 21:59:17 +02:00
3D PDF: Open media viewer on double click
This commit is contained in:
@ -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
|
||||
|
@ -31,6 +31,8 @@ namespace u3d
|
||||
class PDF3D_U3D
|
||||
{
|
||||
public:
|
||||
|
||||
static PDF3D_U3D parse(QByteArray data);
|
||||
};
|
||||
|
||||
class PDF3D_U3D_ContextManager
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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);
|
||||
|
@ -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 <QColor>
|
||||
@ -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<const pdf::PDF3DAnnotation*>(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
|
||||
|
@ -18,6 +18,8 @@
|
||||
#ifndef PDFMEDIAVIEWERDIALOG_H
|
||||
#define PDFMEDIAVIEWERDIALOG_H
|
||||
|
||||
#include "pdfglobal.h"
|
||||
|
||||
#include <QDialog>
|
||||
|
||||
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;
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user