From 3a70df21f87f69ce0ea881d47adfb9026779e6d8 Mon Sep 17 00:00:00 2001 From: shunf4 Date: Wed, 6 Oct 2021 23:09:18 +0800 Subject: [PATCH] feat: paste image in chat --- ui/widgets/conversation.cpp | 45 ++++++++++++++++++++++++++++++++++++- ui/widgets/conversation.h | 5 +++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/ui/widgets/conversation.cpp b/ui/widgets/conversation.cpp index d003551..f0a6be6 100644 --- a/ui/widgets/conversation.cpp +++ b/ui/widgets/conversation.cpp @@ -20,6 +20,7 @@ #include "ui_conversation.h" #include +#include #include #include #include @@ -27,6 +28,9 @@ #include #include #include +#include +#include +#include Conversation::Conversation(bool muc, Models::Account* acc, Models::Element* el, const QString pJid, const QString pRes, QWidget* parent): QWidget(parent), @@ -47,6 +51,7 @@ Conversation::Conversation(bool muc, Models::Account* acc, Models::Element* el, delegate(new MessageDelegate(this)), manualSliderChange(false), tsb(QApplication::style()->styleHint(QStyle::SH_ScrollBar_Transient) == 1), + pasteImageAction(nullptr), shadow(10, 1, Qt::black, this), contextMenu(new QMenu()) { @@ -75,6 +80,7 @@ Conversation::Conversation(bool muc, Models::Account* acc, Models::Element* el, statusLabel = m_ui->statusLabel; connect(&ker, &KeyEnterReceiver::enterPressed, this, &Conversation::onEnterPressed); + connect(&ker, &KeyEnterReceiver::imagePasted, this, &Conversation::onImagePasted); connect(m_ui->sendButton, &QPushButton::clicked, this, &Conversation::onEnterPressed); connect(m_ui->attachButton, &QPushButton::clicked, this, &Conversation::onAttach); connect(m_ui->clearButton, &QPushButton::clicked, this, &Conversation::onClearButton); @@ -82,7 +88,20 @@ Conversation::Conversation(bool muc, Models::Account* acc, Models::Element* el, this, &Conversation::onTextEditDocSizeChanged); m_ui->messageEditor->installEventFilter(&ker); - + + QAction* pasteImageAction = new QAction(tr("Paste Image"), this); + connect(pasteImageAction, &QAction::triggered, this, &Conversation::onImagePasted); + + m_ui->messageEditor->setContextMenuPolicy(Qt::CustomContextMenu); + connect(m_ui->messageEditor, &QTextEdit::customContextMenuRequested, this, [this, pasteImageAction](const QPoint &pos) { + pasteImageAction->setEnabled(Conversation::checkClipboardImage()); + + QMenu *editorMenu = m_ui->messageEditor->createStandardContextMenu(); + editorMenu->addSeparator(); + editorMenu->addAction(pasteImageAction); + + editorMenu->exec(this->m_ui->messageEditor->mapToGlobal(pos)); + }); //line->setAutoFillBackground(false); //if (testAttribute(Qt::WA_TranslucentBackground)) { @@ -183,10 +202,20 @@ bool KeyEnterReceiver::eventFilter(QObject* obj, QEvent* event) } } } + if (k == Qt::Key_V && key->modifiers() & Qt::CTRL) { + if (Conversation::checkClipboardImage()) { + emit imagePasted(); + return true; + } + } } return QObject::eventFilter(obj, event); } +bool Conversation::checkClipboardImage() { + return !QApplication::clipboard()->image().isNull(); +} + QString Conversation::getPalResource() const { return activePalResource; @@ -218,6 +247,20 @@ void Conversation::onEnterPressed() } } +void Conversation::onImagePasted() +{ + QImage image = QApplication::clipboard()->image(); + if (image.isNull()) { + return; + } + QTemporaryFile *tempFile = new QTemporaryFile(QDir::tempPath() + QStringLiteral("/squawk_img_attach_XXXXXX.png"), QApplication::instance()); + tempFile->open(); + image.save(tempFile, "PNG"); + tempFile->close(); + qDebug() << "image on paste temp file: " << tempFile->fileName(); + addAttachedFile(tempFile->fileName()); +} + void Conversation::onAttach() { QFileDialog* d = new QFileDialog(this, tr("Chose a file to send")); diff --git a/ui/widgets/conversation.h b/ui/widgets/conversation.h index b0eb745..5f5d69a 100644 --- a/ui/widgets/conversation.h +++ b/ui/widgets/conversation.h @@ -60,6 +60,7 @@ protected: signals: void enterPressed(); + void imagePasted(); }; class Conversation : public QWidget @@ -77,6 +78,7 @@ public: void setPalResource(const QString& res); virtual void setAvatar(const QString& path); void setFeedFrames(bool top, bool right, bool bottom, bool left); + static bool checkClipboardImage(); signals: void sendMessage(const Shared::Message& message); @@ -102,6 +104,7 @@ protected: protected slots: void onEnterPressed(); + void onImagePasted(); void onAttach(); void onFileSelected(); void onBadgeClose(); @@ -133,6 +136,8 @@ protected: bool manualSliderChange; bool tsb; //transient scroll bars + QAction* pasteImageAction; + ShadowOverlay shadow; QMenu* contextMenu; };