File indexing completed on 2025-02-16 05:12:12

0001 #include "mtextedit.h"
0002 
0003 #include <QTextDocument>
0004 #include <QTextCursor>
0005 #include <QImage>
0006 #include <QByteArray>
0007 #include <QBuffer>
0008 
0009 #include <stdlib.h>
0010 
0011 
0012 MTextEdit::MTextEdit(QWidget *parent) : QTextEdit(parent) {
0013 }
0014 
0015 
0016 bool MTextEdit::canInsertFromMimeData(const QMimeData *source) const {
0017     return source->hasImage() || QTextEdit::canInsertFromMimeData(source);
0018 }
0019 
0020 
0021 void MTextEdit::insertFromMimeData(const QMimeData *source) {
0022     if (source->hasImage()) {
0023         QStringList formats = source->formats();
0024         QString format;
0025         for (int i=0; i<formats.size(); i++) {
0026             if (formats[i] == QStringLiteral("image/bmp"))  { format = QStringLiteral("BMP");  break; }
0027             if (formats[i] == QStringLiteral("image/jpeg")) { format = QStringLiteral("JPG");  break; }
0028             if (formats[i] == QStringLiteral("image/jpg"))  { format = QStringLiteral("JPG");  break; }
0029             if (formats[i] == QStringLiteral("image/gif"))  { format = QStringLiteral("GIF");  break; }
0030             if (formats[i] == QStringLiteral("image/png"))  { format = QStringLiteral("PNG");  break; }
0031             if (formats[i] == QStringLiteral("image/pbm"))  { format = QStringLiteral("PBM");  break; }
0032             if (formats[i] == QStringLiteral("image/pgm"))  { format = QStringLiteral("PGM");  break; }
0033             if (formats[i] == QStringLiteral("image/ppm"))  { format = QStringLiteral("PPM");  break; }
0034             if (formats[i] == QStringLiteral("image/tiff")) { format = QStringLiteral("TIFF"); break; }
0035             if (formats[i] == QStringLiteral("image/xbm"))  { format = QStringLiteral("XBM");  break; }
0036             if (formats[i] == QStringLiteral("image/xpm"))  { format = QStringLiteral("XPM");  break; }
0037             }
0038         if (!format.isEmpty()) {
0039             dropImage(qvariant_cast<QImage>(source->imageData()), QStringLiteral("JPG"));
0040             return;
0041             }
0042         }
0043     QTextEdit::insertFromMimeData(source);
0044 }
0045 
0046 
0047 QMimeData *MTextEdit::createMimeDataFromSelection() const {
0048     return QTextEdit::createMimeDataFromSelection();
0049 }
0050 
0051 
0052 void MTextEdit::dropImage(const QImage& image, const QString& format) {
0053     QByteArray bytes;
0054     QBuffer buffer(&bytes);
0055     buffer.open(QIODevice::WriteOnly);
0056     image.save(&buffer, format.toLocal8Bit().data());
0057     buffer.close();
0058     QByteArray base64 = bytes.toBase64();
0059     QByteArray base64l;
0060     for (int i=0; i<base64.size(); i++) {
0061         base64l.append(base64[i]);
0062         if (i%80 == 0) {
0063             base64l.append("\n");
0064             }
0065         }
0066 
0067     QTextCursor cursor = textCursor();
0068     QTextImageFormat imageFormat;
0069     imageFormat.setWidth  ( image.width() );
0070     imageFormat.setHeight ( image.height() );
0071     imageFormat.setName   ( QStringLiteral("data:image/%1;base64,%2")
0072                                 .arg(QStringLiteral("%1.%2").arg(rand()).arg(format))
0073                             .arg(QString::fromLocal8Bit(base64l))
0074                                 );
0075     cursor.insertImage    ( imageFormat );
0076 }
0077