Use QtClipboard image functions instead of setting mime type
This commit is contained in:
@@ -8,28 +8,15 @@
|
|||||||
#ifndef _WX_QT_DATAOBJ2_H_
|
#ifndef _WX_QT_DATAOBJ2_H_
|
||||||
#define _WX_QT_DATAOBJ2_H_
|
#define _WX_QT_DATAOBJ2_H_
|
||||||
|
|
||||||
#include <wx/scopedptr.h>
|
|
||||||
|
|
||||||
class QByteArray;
|
|
||||||
|
|
||||||
class WXDLLIMPEXP_CORE wxBitmapDataObject : public wxBitmapDataObjectBase
|
class WXDLLIMPEXP_CORE wxBitmapDataObject : public wxBitmapDataObjectBase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
wxBitmapDataObject();
|
wxBitmapDataObject();
|
||||||
wxBitmapDataObject(const wxBitmap& bitmap);
|
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:
|
protected:
|
||||||
void DoConvertToPng();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
wxScopedPtr<QByteArray> m_imageBytes;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@@ -14,14 +14,14 @@
|
|||||||
|
|
||||||
#include <QtWidgets/QApplication>
|
#include <QtWidgets/QApplication>
|
||||||
#include <QtGui/QClipboard>
|
#include <QtGui/QClipboard>
|
||||||
|
#include <QtCore/QMimeData>
|
||||||
|
#include <QPixmap>
|
||||||
|
|
||||||
#include "wx/clipbrd.h"
|
#include "wx/clipbrd.h"
|
||||||
#include "wx/scopedarray.h"
|
#include "wx/scopedarray.h"
|
||||||
#include "wx/scopeguard.h"
|
#include "wx/scopeguard.h"
|
||||||
#include "wx/qt/private/converter.h"
|
#include "wx/qt/private/converter.h"
|
||||||
|
|
||||||
#include <QtCore/QMimeData>
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// wxClipboard ctor/dtor
|
// wxClipboard ctor/dtor
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -89,6 +89,14 @@ bool wxClipboard::IsOpened() const
|
|||||||
|
|
||||||
bool wxClipboard::AddData( wxDataObject *data )
|
bool wxClipboard::AddData( wxDataObject *data )
|
||||||
{
|
{
|
||||||
|
wxBitmapDataObjectBase* bitmap = dynamic_cast<wxBitmapDataObjectBase*>(data);
|
||||||
|
if (bitmap != NULL)
|
||||||
|
{
|
||||||
|
QtClipboard->setPixmap(*bitmap->GetBitmap().GetHandle());
|
||||||
|
delete data;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
QMimeData *MimeData = new QMimeData;
|
QMimeData *MimeData = new QMimeData;
|
||||||
const size_t count = data->GetFormatCount();
|
const size_t count = data->GetFormatCount();
|
||||||
wxDataFormatArray formats(count);
|
wxDataFormatArray formats(count);
|
||||||
@@ -134,6 +142,17 @@ bool wxClipboard::GetData( wxDataObject& data )
|
|||||||
{
|
{
|
||||||
wxCHECK_MSG( m_open, false, wxT("clipboard not open") );
|
wxCHECK_MSG( m_open, false, wxT("clipboard not open") );
|
||||||
|
|
||||||
|
wxBitmapDataObjectBase* bitmap = dynamic_cast<wxBitmapDataObjectBase*>(&data);
|
||||||
|
if (bitmap != NULL)
|
||||||
|
{
|
||||||
|
QPixmap pix = QtClipboard->pixmap();
|
||||||
|
if (pix.isNull())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
bitmap->SetBitmap(wxBitmap(pix));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
const QMimeData *MimeData = QtClipboard->mimeData( (QClipboard::Mode)Mode() );
|
const QMimeData *MimeData = QtClipboard->mimeData( (QClipboard::Mode)Mode() );
|
||||||
const size_t count = data.GetFormatCount(wxDataObject::Set);
|
const size_t count = data.GetFormatCount(wxDataObject::Set);
|
||||||
wxDataFormatArray formats(count);
|
wxDataFormatArray formats(count);
|
||||||
@@ -170,6 +189,10 @@ void wxClipboard::Clear()
|
|||||||
bool wxClipboard::IsSupported( const wxDataFormat& format )
|
bool wxClipboard::IsSupported( const wxDataFormat& format )
|
||||||
{
|
{
|
||||||
const QMimeData *data = QtClipboard->mimeData( (QClipboard::Mode)Mode() );
|
const QMimeData *data = QtClipboard->mimeData( (QClipboard::Mode)Mode() );
|
||||||
|
if (format.GetType() == wxDF_BITMAP)
|
||||||
|
{
|
||||||
|
return data->hasImage();
|
||||||
|
}
|
||||||
return data->hasFormat(wxQtConvertString(format.GetMimeType()));
|
return data->hasFormat(wxQtConvertString(format.GetMimeType()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -12,9 +12,6 @@
|
|||||||
#pragma hdrstop
|
#pragma hdrstop
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <QPixmap>
|
|
||||||
#include <QBuffer>
|
|
||||||
|
|
||||||
#include "wx/dataobj.h"
|
#include "wx/dataobj.h"
|
||||||
#include "wx/scopedarray.h"
|
#include "wx/scopedarray.h"
|
||||||
|
|
||||||
@@ -26,7 +23,7 @@ wxString DataFormatIdToMimeType(wxDataFormatId formatId)
|
|||||||
switch ( formatId )
|
switch ( formatId )
|
||||||
{
|
{
|
||||||
case wxDF_TEXT: return "text/plain";
|
case wxDF_TEXT: return "text/plain";
|
||||||
case wxDF_BITMAP: return "PNG";
|
case wxDF_BITMAP: return "image/bmp";
|
||||||
case wxDF_TIFF: return "image/tiff";
|
case wxDF_TIFF: return "image/tiff";
|
||||||
case wxDF_WAVE: return "audio/x-wav";
|
case wxDF_WAVE: return "audio/x-wav";
|
||||||
case wxDF_UNICODETEXT: return "text/plain";
|
case wxDF_UNICODETEXT: return "text/plain";
|
||||||
@@ -156,54 +153,12 @@ bool wxDataObject::IsSupportedFormat(const wxDataFormat& format,
|
|||||||
//############################################################################
|
//############################################################################
|
||||||
|
|
||||||
wxBitmapDataObject::wxBitmapDataObject()
|
wxBitmapDataObject::wxBitmapDataObject()
|
||||||
: m_imageBytes(new QByteArray())
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
wxBitmapDataObject::wxBitmapDataObject( const wxBitmap &bitmap )
|
wxBitmapDataObject::wxBitmapDataObject( const wxBitmap &bitmap )
|
||||||
: wxBitmapDataObjectBase( 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");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//#############################################################################
|
//#############################################################################
|
||||||
|
Reference in New Issue
Block a user