mirror of
https://gitee.com/vnotex/vnote.git
synced 2025-07-05 13:59:52 +08:00
VWebView: alter copied Html in VWebView to paste correctly in OneNote
This commit is contained in:
parent
00d7f5e013
commit
7986ebe475
@ -3,14 +3,15 @@ body {
|
||||
font-family: Helvetica, sans-serif, Tahoma, Arial, Verdana, Geneva, Georgia, Palatino, "Times New Roman", "Hiragino Sans GB", "冬青黑体", "Microsoft YaHei", "微软雅黑", "Microsoft YaHei UI", "WenQuanYi Micro Hei", "文泉驿雅黑", Dengxian, "等线体", STXihei, "华文细黑", "Liberation Sans", "Droid Sans", NSimSun, "新宋体", SimSun, "宋体";
|
||||
color: #ABB2BF;
|
||||
line-height: 1;
|
||||
padding: 30px;
|
||||
padding: 15px;
|
||||
background: #282C34;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
color: #E06C75;
|
||||
font-weight: bold;
|
||||
margin-bottom: 24px;
|
||||
margin-top: 20px;
|
||||
margin-bottom: 10px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
@ -93,8 +94,8 @@ pre code {
|
||||
display: block;
|
||||
overflow-x: auto;
|
||||
padding: 0.5em;
|
||||
border: 1px solid #373E47;
|
||||
color: #98C379;
|
||||
background-color: #2C313A;
|
||||
}
|
||||
|
||||
aside {
|
||||
|
@ -3,14 +3,15 @@ body {
|
||||
font-family: Helvetica, sans-serif, Tahoma, Arial, Verdana, Geneva, Georgia, Palatino, "Times New Roman", "Hiragino Sans GB", "冬青黑体", "Microsoft YaHei", "微软雅黑", "Microsoft YaHei UI", "WenQuanYi Micro Hei", "文泉驿雅黑", Dengxian, "等线体", STXihei, "华文细黑", "Liberation Sans", "Droid Sans", NSimSun, "新宋体", SimSun, "宋体";
|
||||
color: #363636;
|
||||
line-height: 1;
|
||||
padding: 30px;
|
||||
padding: 15px;
|
||||
background: #F5F5F5;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
color: #363636;
|
||||
font-weight: bold;
|
||||
margin-bottom: 24px;
|
||||
margin-top: 20px;
|
||||
margin-bottom: 10px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
@ -93,8 +94,8 @@ pre code {
|
||||
display: block;
|
||||
overflow-x: auto;
|
||||
padding: 0.5em;
|
||||
border: 1px solid #D3D3D3;
|
||||
color: #363636;
|
||||
background-color: #E0E0E0;
|
||||
}
|
||||
|
||||
aside {
|
||||
|
@ -3,13 +3,14 @@ body {
|
||||
font-family: Helvetica, sans-serif, Tahoma, Arial, Verdana, Geneva, Georgia, Palatino, "Times New Roman", "Hiragino Sans GB", "冬青黑体", "Microsoft YaHei", "微软雅黑", "Microsoft YaHei UI", "WenQuanYi Micro Hei", "文泉驿雅黑", Dengxian, "等线体", STXihei, "华文细黑", "Liberation Sans", "Droid Sans", NSimSun, "新宋体", SimSun, "宋体";
|
||||
color: #363636;
|
||||
line-height: 1;
|
||||
padding: 30px;
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
color: #363636;
|
||||
font-weight: bold;
|
||||
margin-bottom: 24px;
|
||||
margin-top: 20px;
|
||||
margin-bottom: 10px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
@ -92,8 +93,8 @@ pre code {
|
||||
display: block;
|
||||
overflow-x: auto;
|
||||
padding: 0.5em;
|
||||
border: 1px solid #C0C0C0;
|
||||
color: #363636;
|
||||
background-color: #E0E0E0;
|
||||
}
|
||||
|
||||
aside {
|
||||
|
@ -47,7 +47,7 @@ void VClipboardUtils::setMimeDataToClipboard(QClipboard *p_clipboard,
|
||||
#endif
|
||||
}
|
||||
|
||||
static QMimeData *cloneMimeData(const QMimeData *p_mimeData)
|
||||
QMimeData *VClipboardUtils::cloneMimeData(const QMimeData *p_mimeData)
|
||||
{
|
||||
QMimeData *da = new QMimeData();
|
||||
if (p_mimeData->hasUrls()) {
|
||||
|
@ -18,6 +18,8 @@ public:
|
||||
QMimeData *p_mimeData,
|
||||
QClipboard::Mode p_mode = QClipboard::Clipboard);
|
||||
|
||||
static QMimeData *cloneMimeData(const QMimeData *p_mimeData);
|
||||
|
||||
private:
|
||||
VClipboardUtils()
|
||||
{
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include <QMimeData>
|
||||
#include <QApplication>
|
||||
#include <QImage>
|
||||
#include <QRegExp>
|
||||
#include "vfile.h"
|
||||
#include "utils/vclipboardutils.h"
|
||||
#include "utils/viconutils.h"
|
||||
@ -22,9 +23,12 @@ VWebView::VWebView(VFile *p_file, QWidget *p_parent)
|
||||
: QWebEngineView(p_parent),
|
||||
m_file(p_file),
|
||||
m_copyImageUrlActionHooked(false),
|
||||
m_copyActionHooked(false)
|
||||
m_needRemoveBackground(false)
|
||||
{
|
||||
setAcceptDrops(false);
|
||||
|
||||
connect(QApplication::clipboard(), &QClipboard::changed,
|
||||
this, &VWebView::handleClipboardChanged);
|
||||
}
|
||||
|
||||
void VWebView::contextMenuEvent(QContextMenuEvent *p_event)
|
||||
@ -65,6 +69,18 @@ void VWebView::contextMenuEvent(QContextMenuEvent *p_event)
|
||||
}
|
||||
}
|
||||
|
||||
// Add Copy without Background action.
|
||||
QAction *copyAct = pageAction(QWebEnginePage::Copy);
|
||||
if (actions.contains(copyAct)) {
|
||||
QAction *copyWithoutBgAct = new QAction(tr("Copy &without Background"), menu);
|
||||
copyWithoutBgAct->setToolTip(tr("Copy selected content without background styles"));
|
||||
connect(copyWithoutBgAct, &QAction::triggered,
|
||||
this, &VWebView::handleCopyWithoutBackgroundAction);
|
||||
menu->insertAction(copyAct, copyWithoutBgAct);
|
||||
menu->removeAction(copyAct);
|
||||
menu->insertAction(copyWithoutBgAct, copyAct);
|
||||
}
|
||||
|
||||
// We need to replace the "Copy Image" action, because the default one use
|
||||
// the fully-encoded URL to fetch the image while Windows seems to not
|
||||
// recognize it.
|
||||
@ -195,38 +211,69 @@ void VWebView::hideUnusedActions(QMenu *p_menu)
|
||||
}
|
||||
}
|
||||
|
||||
void VWebView::handleCopyAction()
|
||||
static bool removeBackgroundColor(QString &p_html)
|
||||
{
|
||||
// To avoid failure of setting clipboard mime data.
|
||||
QCoreApplication::processEvents();
|
||||
QRegExp reg("(\\s|\")background(-color)?:[^;]+;");
|
||||
int size = p_html.size();
|
||||
p_html.replace(reg, "\\1");
|
||||
return p_html.size() != size;
|
||||
}
|
||||
|
||||
QClipboard *clipboard = QApplication::clipboard();
|
||||
const QMimeData *mimeData = clipboard->mimeData();
|
||||
clipboard->setProperty(c_ClipboardPropertyMark.toLatin1(), false);
|
||||
qDebug() << clipboard->ownsClipboard() << mimeData->hasHtml();
|
||||
if (clipboard->ownsClipboard()
|
||||
&& mimeData->hasHtml()) {
|
||||
QString html = mimeData->html();
|
||||
if (html.startsWith("<html>")) {
|
||||
void VWebView::handleCopyWithoutBackgroundAction()
|
||||
{
|
||||
m_needRemoveBackground = true;
|
||||
|
||||
QAction *copyAct = pageAction(QWebEnginePage::Copy);
|
||||
copyAct->trigger();
|
||||
}
|
||||
|
||||
void VWebView::handleClipboardChanged(QClipboard::Mode p_mode)
|
||||
{
|
||||
bool removeBackground = m_needRemoveBackground;
|
||||
m_needRemoveBackground = false;
|
||||
|
||||
if (!hasFocus()
|
||||
|| p_mode != QClipboard::Clipboard) {
|
||||
return;
|
||||
}
|
||||
|
||||
html = QString("<html><body><!--StartFragment-->%1<!--EndFragment--></body></html>").arg(html);
|
||||
QClipboard *clipboard = QApplication::clipboard();
|
||||
const QMimeData *mimeData = clipboard->mimeData();
|
||||
if (!clipboard->ownsClipboard()) {
|
||||
return;
|
||||
}
|
||||
|
||||
alterHtmlMimeData(clipboard, mimeData, removeBackground);
|
||||
}
|
||||
|
||||
void VWebView::alterHtmlMimeData(QClipboard *p_clipboard,
|
||||
const QMimeData *p_mimeData,
|
||||
bool p_removeBackground)
|
||||
{
|
||||
if (!p_mimeData->hasHtml()) {
|
||||
return;
|
||||
}
|
||||
|
||||
bool altered = false;
|
||||
QString html = p_mimeData->html();
|
||||
|
||||
if (!html.startsWith("<html>")) {
|
||||
altered = true;
|
||||
html = QString("<html><body>%1</body></html>").arg(html);
|
||||
}
|
||||
|
||||
if (p_removeBackground && removeBackgroundColor(html)) {
|
||||
altered = true;
|
||||
}
|
||||
|
||||
if (!altered) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Set new mime data.
|
||||
QMimeData *data = new QMimeData();
|
||||
QMimeData *data = VClipboardUtils::cloneMimeData(p_mimeData);
|
||||
data->setHtml(html);
|
||||
|
||||
if (mimeData->hasUrls()) {
|
||||
data->setUrls(mimeData->urls());
|
||||
}
|
||||
|
||||
if (mimeData->hasText()) {
|
||||
data->setText(mimeData->text());
|
||||
}
|
||||
|
||||
VClipboardUtils::setMimeDataToClipboard(clipboard, data, QClipboard::Clipboard);
|
||||
clipboard->setProperty(c_ClipboardPropertyMark.toLatin1(), true);
|
||||
qDebug() << "clipboard copy Html altered" << html;
|
||||
}
|
||||
VClipboardUtils::setMimeDataToClipboard(p_clipboard, data, QClipboard::Clipboard);
|
||||
qDebug() << "altered clipboard's Html";
|
||||
}
|
||||
|
@ -2,6 +2,7 @@
|
||||
#define VWEBVIEW_H
|
||||
|
||||
#include <QWebEngineView>
|
||||
#include <QClipboard>
|
||||
|
||||
class VFile;
|
||||
class QMenu;
|
||||
@ -24,21 +25,27 @@ private slots:
|
||||
|
||||
void handleCopyImageUrlAction();
|
||||
|
||||
void handleCopyAction();
|
||||
void handleCopyWithoutBackgroundAction();
|
||||
|
||||
// Copy the clicked image.
|
||||
// Used to replace the default CopyImageToClipboard action.
|
||||
void copyImage();
|
||||
|
||||
void handleClipboardChanged(QClipboard::Mode p_mode);
|
||||
|
||||
private:
|
||||
void hideUnusedActions(QMenu *p_menu);
|
||||
|
||||
void alterHtmlMimeData(QClipboard *p_clipboard,
|
||||
const QMimeData *p_mimeData,
|
||||
bool p_removeBackground);
|
||||
|
||||
VFile *m_file;
|
||||
|
||||
// Whether this view has hooked the Copy Image Url action.
|
||||
bool m_copyImageUrlActionHooked;
|
||||
|
||||
bool m_copyActionHooked;
|
||||
bool m_needRemoveBackground;
|
||||
};
|
||||
|
||||
#endif // VWEBVIEW_H
|
||||
|
Loading…
x
Reference in New Issue
Block a user