浏览代码

MarkdownEditor : Copy local GIF to clipboard without frame loss (#2654)

* ClipboardUtils : allow local file to clipboard

* MarkdownEditor : Copy local GIF to clipboard without frame loss

---------

Co-authored-by: schips <[email protected]>
Schips 4 周之前
父节点
当前提交
27a573984e
共有 3 个文件被更改,包括 26 次插入0 次删除
  1. 15 0
      src/utils/clipboardutils.cpp
  2. 5 0
      src/utils/clipboardutils.h
  3. 6 0
      src/widgets/editors/markdowneditor.cpp

+ 15 - 0
src/utils/clipboardutils.cpp

@@ -11,6 +11,7 @@
 
 #include "utils.h"
 #include "pathutils.h"
+#include "fileutils.h"
 
 using namespace vnotex;
 
@@ -186,6 +187,7 @@ void ClipboardUtils::setImageToClipboard(QClipboard *p_clipboard,
 #endif
 }
 
+
 void ClipboardUtils::setImageLoop(QClipboard *p_clipboard,
                                   const QImage &p_image,
                                   QClipboard::Mode p_mode)
@@ -220,3 +222,16 @@ std::unique_ptr<QMimeData> ClipboardUtils::linkMimeData(const QString &p_link)
     data->setText(text);
     return data;
 }
+
+void ClipboardUtils::setLocalFileToClipboard(QClipboard *p_clipboard,
+                                            const QString &p_filePath,
+                                            QClipboard::Mode p_mode)
+{
+    // Check if the file exists
+    if (!FileUtils::existsCaseInsensitive(p_filePath)) {
+        qWarning() << "ClipboardUtils::setLocalFileToClipboard: file does not exist:" << p_filePath;
+        return;
+    }
+
+    setMimeDataToClipboard(p_clipboard, linkMimeData(p_filePath).release(), p_mode);
+}

+ 5 - 0
src/utils/clipboardutils.h

@@ -31,6 +31,11 @@ namespace vnotex
                                         const QImage &p_image,
                                         QClipboard::Mode p_mode = QClipboard::Clipboard);
 
+        // Set a local file to clipboard.
+        static void setLocalFileToClipboard(QClipboard *p_clipboard,
+                                            const QString &p_filePath,
+                                            QClipboard::Mode p_mode = QClipboard::Clipboard);
+
     private:
         static bool mimeDataEquals(const QMimeData *p_a, const QMimeData *p_b);
 

+ 6 - 0
src/widgets/editors/markdowneditor.cpp

@@ -1677,6 +1677,12 @@ bool MarkdownEditor::prependImageMenu(QMenu *p_menu, QAction *p_before, int p_cu
                     auto clipboard = QApplication::clipboard();
                     clipboard->clear();
 
+                    // Copy local GIF to clipboard to ensure no frame loss
+                    if (imgPath.endsWith(QStringLiteral(".gif"), Qt::CaseInsensitive) && FileUtils::existsCaseInsensitive(imgPath)) {
+                        ClipboardUtils::setLocalFileToClipboard(clipboard, imgPath, QClipboard::Clipboard);
+                        return ;
+                    }
+
                     auto img = FileUtils::imageFromFile(imgPath);
                     if (!img.isNull()) {
                         ClipboardUtils::setImageToClipboard(clipboard, img);