From a4e0c2cc34979e05822b489828ab5431d5ca0557 Mon Sep 17 00:00:00 2001 From: Matthew Griffin <45285214+matthew-griffin@users.noreply.github.com> Date: Mon, 24 Jun 2019 16:30:29 +0100 Subject: [PATCH] Implement Copy to Clipboard for images --- include/wx/qt/dataobj2.h | 13 +++++++++++ src/qt/clipbrd.cpp | 2 +- src/qt/dataobj.cpp | 48 +++++++++++++++++++++++++++++++++++++++- 3 files changed, 61 insertions(+), 2 deletions(-) diff --git a/include/wx/qt/dataobj2.h b/include/wx/qt/dataobj2.h index 26536b2750..d340432f6f 100644 --- a/include/wx/qt/dataobj2.h +++ b/include/wx/qt/dataobj2.h @@ -8,15 +8,28 @@ #ifndef _WX_QT_DATAOBJ2_H_ #define _WX_QT_DATAOBJ2_H_ +#include + +class QByteArray; + class WXDLLIMPEXP_CORE wxBitmapDataObject : public wxBitmapDataObjectBase { public: wxBitmapDataObject(); wxBitmapDataObject(const wxBitmap& bitmap); + ~wxBitmapDataObject(); + + void SetBitmap(const wxBitmap& bitmap) wxOVERRIDE; + size_t GetDataSize() const wxOVERRIDE; + bool GetDataHere(void *buf) const wxOVERRIDE; + bool SetData(const wxDataFormat& format, size_t len, const void *buf) wxOVERRIDE; + protected: + void DoConvertToPng(); private: + wxScopedPtr m_imageBytes; }; diff --git a/src/qt/clipbrd.cpp b/src/qt/clipbrd.cpp index 0a9dc2902d..3cd5149c4d 100644 --- a/src/qt/clipbrd.cpp +++ b/src/qt/clipbrd.cpp @@ -152,7 +152,7 @@ bool wxClipboard::GetData( wxDataObject& data ) textdata->SetText(wxQtConvertString(MimeData->text())); else { - QByteArray bytearray = MimeData->data( wxQtConvertString(format.GetMimeType()) ).data(); + QByteArray bytearray = MimeData->data( wxQtConvertString(format.GetMimeType()) ); data.SetData(format, bytearray.size(), bytearray.constData()); } diff --git a/src/qt/dataobj.cpp b/src/qt/dataobj.cpp index f8ba76bcc2..95c06bb2e0 100644 --- a/src/qt/dataobj.cpp +++ b/src/qt/dataobj.cpp @@ -12,6 +12,9 @@ #pragma hdrstop #endif +#include +#include + #include "wx/dataobj.h" #include "wx/scopedarray.h" @@ -153,11 +156,54 @@ bool wxDataObject::IsSupportedFormat(const wxDataFormat& format, //############################################################################ wxBitmapDataObject::wxBitmapDataObject() + : m_imageBytes(new QByteArray()) { } -wxBitmapDataObject::wxBitmapDataObject( const wxBitmap &WXUNUSED(bitmap) ) +wxBitmapDataObject::wxBitmapDataObject( const wxBitmap &bitmap ) + : wxBitmapDataObjectBase( bitmap ), + m_imageBytes(new QByteArray()) { + DoConvertToPng(); +} + +wxBitmapDataObject::~wxBitmapDataObject() +{ +} + +void wxBitmapDataObject::SetBitmap(const wxBitmap &bitmap) +{ + wxBitmapDataObjectBase::SetBitmap(bitmap); + + DoConvertToPng(); +} + +size_t wxBitmapDataObject::GetDataSize() const +{ + return m_imageBytes->size(); +} + +bool wxBitmapDataObject::GetDataHere(void *buf) const +{ + memcpy(buf, m_imageBytes->constData(), GetDataSize()); + return true; +} + +bool wxBitmapDataObject::SetData(const wxDataFormat &WXUNUSED(format), size_t len, const void *buf) +{ + m_imageBytes->resize(len); + memcpy(m_imageBytes->data(), buf, len); + QPixmap pix; + pix.loadFromData(*m_imageBytes); + m_bitmap = wxBitmap(pix); + return true; +} + +void wxBitmapDataObject::DoConvertToPng() +{ + QBuffer buffer(m_imageBytes.get()); + buffer.open(QIODevice::WriteOnly); + m_bitmap.GetHandle()->save(&buffer, "PNG"); } //#############################################################################