diff --git a/src/mumble/MainWindow.cpp b/src/mumble/MainWindow.cpp index 5adde88eca9..f247531b256 100644 --- a/src/mumble/MainWindow.cpp +++ b/src/mumble/MainWindow.cpp @@ -78,6 +78,7 @@ #include #include #include +#include #include #include diff --git a/src/mumble/RichTextEditor.cpp b/src/mumble/RichTextEditor.cpp index 124ac9af414..8e54e8fd6dd 100644 --- a/src/mumble/RichTextEditor.cpp +++ b/src/mumble/RichTextEditor.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -202,6 +203,7 @@ RichTextEditor::RichTextEditor(QWidget *p) : QTabWidget(p) { qteRichText->installEventFilter(this); qptePlainText->installEventFilter(this); + addContextMenuToSaveImages(); } bool RichTextEditor::isModified() const { @@ -467,3 +469,42 @@ bool RichTextImage::isValidImage(const QByteArray &ba, QByteArray &fmt) { return false; } + +QTextEdit *RichTextEditor::getRichTextEdit() { + return qteRichText; +} + +void RichTextEditor::addContextMenuToSaveImages() { + qteRichText->setContextMenuPolicy(Qt::CustomContextMenu); + QString saveText = tr("Save Image As…"); + + connect(qteRichText, &QTextEdit::customContextMenuRequested, this, [=](const QPoint &pos) { + QTextCursor cursor = qteRichText->cursorForPosition(pos); + QTextCharFormat format = cursor.charFormat(); + + QMenu *menu = qteRichText->createStandardContextMenu(); + + if (format.isImageFormat()) { + menu->addSeparator(); + menu->addAction(saveText, [=]() { + QTextImageFormat imgFmt = format.toImageFormat(); + QString imgName = imgFmt.name(); + + QImage image = + qteRichText->document()->resource(QTextDocument::ImageResource, QUrl(imgName)).value< QImage >(); + + QString fileName = QFileDialog::getSaveFileName(this, "Save Image", "", + "Images (*.png *.jpg *.jpeg *.bmp *.ppm *.xbm *.xpm)"); + + if (!fileName.isEmpty()) { + if (QFileInfo(fileName).suffix().isEmpty()) + fileName += ".png"; // default to PNG if no extension + image.save(fileName); + } + }); + } + + menu->exec(qteRichText->mapToGlobal(pos)); + delete menu; + }); +} diff --git a/src/mumble/RichTextEditor.h b/src/mumble/RichTextEditor.h index 72fd1cc4dfc..21fc658fd87 100644 --- a/src/mumble/RichTextEditor.h +++ b/src/mumble/RichTextEditor.h @@ -54,6 +54,8 @@ class RichTextEditor : public QTabWidget, Ui::RichTextEditor { RichTextEditor(QWidget *p = nullptr); QString text(); bool isModified() const; + QTextEdit *getRichTextEdit(); + void addContextMenuToSaveImages(); signals: /// The accept signal is emitted when Ctrl-Enter is pressed inside the RichTextEditor. void accept();