diff --git a/src/TextInputWidget.cc b/src/TextInputWidget.cc
index 239f9d54..4927d195 100644
--- a/src/TextInputWidget.cc
+++ b/src/TextInputWidget.cc
@@ -58,9 +58,9 @@ FilteredTextEdit::FilteredTextEdit(QWidget *parent)
connect(typingTimer_, &QTimer::timeout, this, &FilteredTextEdit::stopTyping);
connect(&previewDialog_,
- &dialogs::PreviewImageOverlay::confirmImageUpload,
+ &dialogs::PreviewUploadOverlay::confirmUpload,
this,
- &FilteredTextEdit::receiveImage);
+ &FilteredTextEdit::uploadData);
previewDialog_.hide();
}
@@ -135,28 +135,65 @@ FilteredTextEdit::canInsertFromMimeData(const QMimeData *source) const
void
FilteredTextEdit::insertFromMimeData(const QMimeData *source)
{
- if (source->hasImage()) {
- const auto formats = source->formats();
- const auto idx = formats.indexOf(
- QRegularExpression{"image/.+", QRegularExpression::CaseInsensitiveOption});
+ const auto formats = source->formats().filter("/");
+ const auto image = formats.filter("image/", Qt::CaseInsensitive);
+ const auto audio = formats.filter("audio/", Qt::CaseInsensitive);
+ const auto video = formats.filter("video/", Qt::CaseInsensitive);
- // Note: in the future we may want to look into what the best choice is from the
- // formats list. For now we will default to PNG format.
- QString type = "png";
- if (idx != -1) {
- type = formats.at(idx).split('/')[1];
+ if (!image.empty()) {
+ showPreview(source, image);
+ } else if (!audio.empty()) {
+ showPreview(source, audio);
+ } else if (!video.empty()) {
+ showPreview(source, video);
+ } else if (source->hasUrls()) {
+ // Generic file path for any platform.
+ QString path;
+ for (auto &&u : source->urls()) {
+ if (u.isLocalFile()) {
+ path = u.toLocalFile();
+ break;
+ }
}
- // Encode raw pixel data of image.
- QByteArray data = source->data("image/" + type);
- previewDialog_.setImageAndCreate(data, type);
- previewDialog_.show();
- } else if (source->hasFormat("x-special/gnome-copied-files") &&
- QImageReader{source->text()}.canRead()) {
+ if (!path.isEmpty() && QFileInfo{path}.exists()) {
+ previewDialog_.setPreview(path);
+ } else {
+ qWarning()
+ << "Clipboard does not contain any valid file paths:" << source->urls();
+ }
+ } else if (source->hasFormat("x-special/gnome-copied-files")) {
// Special case for X11 users. See "Notes for X11 Users" in source.
// Source: http://doc.qt.io/qt-5/qclipboard.html
- previewDialog_.setImageAndCreate(source->text());
- previewDialog_.show();
+
+ // This MIME type returns a string with multiple lines separated by '\n'. The first
+ // line is the command to perform with the clipboard (not useful to us). The
+ // following lines are the file URIs.
+ //
+ // Source: the nautilus source code in file 'src/nautilus-clipboard.c' in function
+ // nautilus_clipboard_get_uri_list_from_selection_data()
+ // https://github.com/GNOME/nautilus/blob/master/src/nautilus-clipboard.c
+
+ auto data = source->data("x-special/gnome-copied-files").split('\n');
+ if (data.size() < 2) {
+ qWarning() << "MIME format is malformed, cannot perform paste.";
+ return;
+ }
+
+ QString path;
+ for (int i = 1; i < data.size(); ++i) {
+ QUrl url{data[i]};
+ if (url.isLocalFile()) {
+ path = url.toLocalFile();
+ break;
+ }
+ }
+
+ if (!path.isEmpty()) {
+ previewDialog_.setPreview(path);
+ } else {
+ qWarning() << "Clipboard does not contain any valid file paths:" << data;
+ }
} else {
QTextEdit::insertFromMimeData(source);
}
@@ -233,11 +270,30 @@ FilteredTextEdit::textChanged()
}
void
-FilteredTextEdit::receiveImage(const QByteArray img, const QString &img_name)
+FilteredTextEdit::uploadData(const QByteArray data, const QString &media, const QString &filename)
{
QSharedPointer<QBuffer> buffer{new QBuffer{this}};
- buffer->setData(img);
- emit image(buffer, img_name);
+ buffer->setData(data);
+
+ emit startedUpload();
+
+ if (media == "image")
+ emit image(buffer, filename);
+ else if (media == "audio")
+ emit audio(buffer, filename);
+ else if (media == "video")
+ emit video(buffer, filename);
+ else
+ emit file(buffer, filename);
+}
+
+void
+FilteredTextEdit::showPreview(const QMimeData *source, const QStringList &formats)
+{
+ // Retrieve data as MIME type.
+ auto const &mime = formats.first();
+ QByteArray data = source->data(mime);
+ previewDialog_.setPreview(data, mime);
}
TextInputWidget::TextInputWidget(QWidget *parent)
@@ -309,6 +365,9 @@ TextInputWidget::TextInputWidget(QWidget *parent)
connect(input_, &FilteredTextEdit::message, this, &TextInputWidget::sendTextMessage);
connect(input_, &FilteredTextEdit::command, this, &TextInputWidget::command);
connect(input_, &FilteredTextEdit::image, this, &TextInputWidget::uploadImage);
+ connect(input_, &FilteredTextEdit::audio, this, &TextInputWidget::uploadAudio);
+ connect(input_, &FilteredTextEdit::video, this, &TextInputWidget::uploadVideo);
+ connect(input_, &FilteredTextEdit::file, this, &TextInputWidget::uploadFile);
connect(emojiBtn_,
SIGNAL(emojiSelected(const QString &)),
this,
@@ -317,6 +376,9 @@ TextInputWidget::TextInputWidget(QWidget *parent)
connect(input_, &FilteredTextEdit::startedTyping, this, &TextInputWidget::startedTyping);
connect(input_, &FilteredTextEdit::stoppedTyping, this, &TextInputWidget::stoppedTyping);
+
+ connect(
+ input_, &FilteredTextEdit::startedUpload, this, &TextInputWidget::showUploadSpinner);
}
void
@@ -376,6 +438,8 @@ TextInputWidget::openFileSelection()
emit uploadImage(file, fileName);
else if (format == "audio")
emit uploadAudio(file, fileName);
+ else if (format == "video")
+ emit uploadVideo(file, fileName);
else
emit uploadFile(file, fileName);
|