diff --git a/src/timeline/InputBar.cpp b/src/timeline/InputBar.cpp index 1a086c2ba..8cae463e8 100644 --- a/src/timeline/InputBar.cpp +++ b/src/timeline/InputBar.cpp @@ -394,6 +394,9 @@ InputBar::send() { QInputMethod *im = QGuiApplication::inputMethod(); im->commit(); + // If the input from the UI is only blanks or no text, this trigger should + // be used to confirm media upload. If that is not the case however, but + // but there are pending uploads, we fall into one of the cases seen later. if (text().trimmed().isEmpty()) { acceptUploads(); return; @@ -407,8 +410,18 @@ InputBar::send() updateTextContentProperties(text()); if (containsIncompleteCommand_) return; - if (commandName.isEmpty() || !command(commandName, args)) - message(text()); + if (unconfirmedUploads.empty()) { + if (commandName.isEmpty() || !command(commandName, args)) { + message(text()); + } + } else { + if (commandName.isEmpty()) { + // This is a set of uploads with text + acceptUploadsWithCaption(text()); + } else if (!command(commandName, args)) { + message(text()); + } + } if (!wasEdit) { history_.push_front(QLatin1String("")); @@ -708,6 +721,7 @@ void InputBar::image(const QString &filename, const std::optional &file, const QString &url, + const std::optional &caption, const QString &mime, uint64_t dsize, const QSize &dimensions, @@ -721,9 +735,10 @@ InputBar::image(const QString &filename, image.info.mimetype = mime.toStdString(); image.info.size = dsize; image.info.blurhash = blurhash.toStdString(); - image.body = filename.toStdString(); - image.info.h = dimensions.height(); - image.info.w = dimensions.width(); + // Depending on the input bar's situation, retrieve the text + image.body = caption.has_value() ? caption.value().toStdString() : filename.toStdString(); + image.info.h = dimensions.height(); + image.info.w = dimensions.width(); if (file) image.file = file; @@ -752,13 +767,14 @@ void InputBar::file(const QString &filename, const std::optional &encryptedFile, const QString &url, + const std::optional &caption, const QString &mime, uint64_t dsize) { mtx::events::msg::File file; file.info.mimetype = mime.toStdString(); file.info.size = dsize; - file.body = filename.toStdString(); + file.body = caption.has_value() ? caption.value().toStdString() : filename.toStdString(); if (encryptedFile) file.file = encryptedFile; @@ -775,6 +791,7 @@ void InputBar::audio(const QString &filename, const std::optional &file, const QString &url, + const std::optional &caption, const QString &mime, uint64_t dsize, uint64_t duration) @@ -782,8 +799,8 @@ InputBar::audio(const QString &filename, mtx::events::msg::Audio audio; audio.info.mimetype = mime.toStdString(); audio.info.size = dsize; - audio.body = filename.toStdString(); - audio.url = url.toStdString(); + audio.body = caption.has_value() ? caption.value().toStdString() : filename.toStdString(); + audio.url = url.toStdString(); if (duration > 0) audio.info.duration = duration; @@ -803,6 +820,7 @@ void InputBar::video(const QString &filename, const std::optional &file, const QString &url, + const std::optional &caption, const QString &mime, uint64_t dsize, uint64_t duration, @@ -817,7 +835,7 @@ InputBar::video(const QString &filename, video.info.mimetype = mime.toStdString(); video.info.size = dsize; video.info.blurhash = blurhash.toStdString(); - video.body = filename.toStdString(); + video.body = caption.has_value() ? caption.value().toStdString() : filename.toStdString(); if (duration > 0) video.info.duration = duration; @@ -1282,10 +1300,12 @@ InputBar::finalizeUpload(MediaUpload *upload, const QString &url) auto mimeClass = upload->mimeClass(); auto size = upload->size(); auto encryptedFile = upload->encryptedFile_(); + auto caption = upload->caption(); if (mimeClass == u"image") image(filename, encryptedFile, url, + caption, mime, size, upload->dimensions(), @@ -1295,11 +1315,12 @@ InputBar::finalizeUpload(MediaUpload *upload, const QString &url) upload->thumbnailImg().size(), upload->blurhash()); else if (mimeClass == u"audio") - audio(filename, encryptedFile, url, mime, size, upload->duration()); + audio(filename, encryptedFile, url, caption, mime, size, upload->duration()); else if (mimeClass == u"video") video(filename, encryptedFile, url, + caption, mime, size, upload->duration(), @@ -1310,7 +1331,7 @@ InputBar::finalizeUpload(MediaUpload *upload, const QString &url) upload->thumbnailImg().size(), upload->blurhash()); else - file(filename, encryptedFile, url, mime, size); + file(filename, encryptedFile, url, caption, mime, size); removeRunUpload(upload); } @@ -1405,6 +1426,15 @@ InputBar::acceptUploads() } } +void +InputBar::acceptUploadsWithCaption(QString caption) +{ + for (UploadHandle &upload : unconfirmedUploads) { + upload->caption_ = std::optional(caption); + } + acceptUploads(); +} + void InputBar::declineUploads() { diff --git a/src/timeline/InputBar.h b/src/timeline/InputBar.h index c38de6621..a36096422 100644 --- a/src/timeline/InputBar.h +++ b/src/timeline/InputBar.h @@ -86,6 +86,7 @@ class MediaUpload final : public QObject return MediaType::File; } [[nodiscard]] QString url() const { return url_; } + [[nodiscard]] std::optional caption() const { return caption_; } [[nodiscard]] QString mimetype() const { return mimetype_; } [[nodiscard]] QString mimeClass() const { return mimeClass_; } [[nodiscard]] QString filename() const { return originalFilename_; } @@ -143,6 +144,7 @@ private slots: QString blurhash_; QString thumbnailUrl_; QString url_; + std::optional caption_; std::optional encryptedFile, thumbnailEncryptedFile; QImage thumbnail_; @@ -236,6 +238,7 @@ public slots: void sticker(QStringList descriptor); void acceptUploads(); + void acceptUploadsWithCaption(QString); void declineUploads(); private slots: @@ -264,6 +267,7 @@ private slots: void image(const QString &filename, const std::optional &file, const QString &url, + const std::optional &caption, const QString &mime, uint64_t dsize, const QSize &dimensions, @@ -275,17 +279,20 @@ private slots: void file(const QString &filename, const std::optional &encryptedFile, const QString &url, + const std::optional &caption, const QString &mime, uint64_t dsize); void audio(const QString &filename, const std::optional &file, const QString &url, + const std::optional &caption, const QString &mime, uint64_t dsize, uint64_t duration); void video(const QString &filename, const std::optional &file, const QString &url, + const std::optional &caption, const QString &mime, uint64_t dsize, uint64_t duration,