Transform Clipboard to singleton and add rich text copying feature

This commit is contained in:
Carl Schwan
2020-11-07 11:30:15 +01:00
parent 91f82fb42c
commit 8c8a9976a5
6 changed files with 39 additions and 25 deletions

View File

@@ -2,7 +2,7 @@ add_executable(neochat
accountlistmodel.cpp
controller.cpp
emojimodel.cpp
imageclipboard.cpp
clipboard.cpp
matriximageprovider.cpp
messageeventmodel.cpp
roomlistmodel.cpp

View File

@@ -3,32 +3,35 @@
*
* SPDX-LicenseIdentifier: GPL-3.0-only
*/
#include "imageclipboard.h"
#include "clipboard.h"
#include <QDebug>
#include <QClipboard>
#include <QMimeData>
#include <QRegularExpression>
#include <QImage>
#include <QDir>
#include <QFileInfo>
#include <QGuiApplication>
#include <QUrl>
ImageClipboard::ImageClipboard(QObject *parent)
Clipboard::Clipboard(QObject *parent)
: QObject(parent)
, m_clipboard(QGuiApplication::clipboard())
{
connect(m_clipboard, &QClipboard::changed, this, &ImageClipboard::imageChanged);
connect(m_clipboard, &QClipboard::changed, this, &Clipboard::imageChanged);
}
bool ImageClipboard::hasImage() const
bool Clipboard::hasImage() const
{
return !image().isNull();
}
QImage ImageClipboard::image() const
QImage Clipboard::image() const
{
return m_clipboard->image();
}
bool ImageClipboard::saveImage(const QUrl &localPath)
bool Clipboard::saveImage(const QUrl &localPath)
{
if (!localPath.isLocalFile())
return false;
@@ -48,3 +51,12 @@ bool ImageClipboard::saveImage(const QUrl &localPath)
return true;
}
void Clipboard::saveText(QString message)
{
QRegularExpression re("<[^>]*>");
auto *mineData = new QMimeData; // ownership is transfered to clipboard
mineData->setHtml(message);
mineData->setText(message.replace(re, ""));
m_clipboard->setMimeData(mineData);
}

View File

@@ -3,32 +3,35 @@
*
* SPDX-LicenseIdentifier: GPL-3.0-only
*/
#ifndef IMAGECLIPBOARD_H
#define IMAGECLIPBOARD_H
#pragma once
#include <QClipboard>
#include <QImage>
#include <QObject>
class ImageClipboard : public QObject
class QClipboard;
class QImage;
/**
* Clipboard proxy
*/
class Clipboard : public QObject
{
Q_OBJECT
Q_PROPERTY(bool hasImage READ hasImage NOTIFY imageChanged)
Q_PROPERTY(QImage image READ image NOTIFY imageChanged)
public:
explicit ImageClipboard(QObject *parent = nullptr);
explicit Clipboard(QObject *parent = nullptr);
bool hasImage() const;
QImage image() const;
Q_INVOKABLE bool saveImage(const QUrl &localPath);
Q_INVOKABLE void saveText(QString message);
private:
QClipboard *m_clipboard;
Q_SIGNALS:
void imageChanged();
};
#endif // IMAGECLIPBOARD_H

View File

@@ -23,7 +23,7 @@
#include "csapi/joining.h"
#include "csapi/leaving.h"
#include "emojimodel.h"
#include "imageclipboard.h"
#include "clipboard.h"
#include "matriximageprovider.h"
#include "messageeventmodel.h"
#include "notificationsmanager.h"
@@ -57,7 +57,10 @@ int main(int argc, char *argv[])
app.setOrganizationName("KDE");
app.setWindowIcon(QIcon(":/assets/img/icon.png"));
Clipboard clipboard;
qmlRegisterSingletonInstance("Spectral", 0, 1, "Controller", &Controller::instance());
qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "Clipboard", &clipboard);
qmlRegisterType<AccountListModel>("Spectral", 0, 1, "AccountListModel");
qmlRegisterType<RoomListModel>("Spectral", 0, 1, "RoomListModel");
qmlRegisterType<UserListModel>("Spectral", 0, 1, "UserListModel");
@@ -67,7 +70,6 @@ int main(int argc, char *argv[])
qmlRegisterType<EmojiModel>("Spectral", 0, 1, "EmojiModel");
qmlRegisterType<NotificationsManager>("Spectral", 0, 1, "NotificationsManager");
qmlRegisterType<TrayIcon>("Spectral", 0, 1, "TrayIcon");
qmlRegisterType<ImageClipboard>("Spectral", 0, 1, "ImageClipboard");
qmlRegisterUncreatableType<RoomMessageEvent>("Spectral", 0, 1, "RoomMessageEvent", "ENUM");
qmlRegisterUncreatableType<RoomType>("Spectral", 0, 1, "RoomType", "ENUM");
qmlRegisterUncreatableType<UserType>("Spectral", 0, 1, "UserType", "ENUM");