summary refs log tree commit diff
path: root/src/TextInputWidget.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/TextInputWidget.cc')
-rw-r--r--src/TextInputWidget.cc108
1 files changed, 86 insertions, 22 deletions
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);