From 3467fe226ff0e640d4ed68d642a7e710c352562c Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Thu, 10 Nov 2022 18:34:37 +0300 Subject: [PATCH] Added ability to send webp as compressed image. --- Telegram/SourceFiles/apiwrap.cpp | 5 +- Telegram/SourceFiles/boxes/send_files_box.cpp | 19 +++-- .../SourceFiles/storage/localimageloader.cpp | 6 +- .../storage/storage_media_prepare.cpp | 9 +-- .../ui/chat/attach/attach_album_preview.cpp | 70 +++++++++++++++---- .../ui/chat/attach/attach_album_preview.h | 2 + .../ui/chat/attach/attach_album_thumbnail.cpp | 37 ++++++---- .../ui/chat/attach/attach_album_thumbnail.h | 8 ++- .../ui/chat/attach/attach_prepare.cpp | 26 ++++++- .../ui/chat/attach/attach_prepare.h | 4 +- .../ui/chat/attach/attach_send_files_way.cpp | 14 ++++ .../ui/chat/attach/attach_send_files_way.h | 6 ++ 12 files changed, 161 insertions(+), 45 deletions(-) diff --git a/Telegram/SourceFiles/apiwrap.cpp b/Telegram/SourceFiles/apiwrap.cpp index cf58b25b2..c810f69db 100644 --- a/Telegram/SourceFiles/apiwrap.cpp +++ b/Telegram/SourceFiles/apiwrap.cpp @@ -3374,7 +3374,10 @@ void ApiWrap::sendFiles( std::shared_ptr album, const SendAction &action) { const auto haveCaption = !caption.text.isEmpty(); - if (haveCaption && !list.canAddCaption(album != nullptr)) { + if (haveCaption + && !list.canAddCaption( + album != nullptr, + type == SendMediaType::Photo)) { auto message = MessageToSend(action); message.textWithTags = base::take(caption); message.action.clearDraft = false; diff --git a/Telegram/SourceFiles/boxes/send_files_box.cpp b/Telegram/SourceFiles/boxes/send_files_box.cpp index b5b69d4b4..058835dd8 100644 --- a/Telegram/SourceFiles/boxes/send_files_box.cpp +++ b/Telegram/SourceFiles/boxes/send_files_box.cpp @@ -102,7 +102,9 @@ void FileDialogCallback( rpl::producer FieldPlaceholder( const Ui::PreparedList &list, SendFilesWay way) { - return list.canAddCaption(way.groupFiles() && way.sendImagesAsPhotos()) + return list.canAddCaption( + way.groupFiles() && way.sendImagesAsPhotos(), + way.sendImagesAsPhotos()) ? tr::lng_photo_caption() : tr::lng_photos_comment(); } @@ -390,6 +392,11 @@ void SendFilesBox::refreshAllAfterChanges(int fromItem) { break; } } + { + auto sendWay = _sendWay.current(); + sendWay.setHasCompressedStickers(_list.hasSticker()); + _sendWay = sendWay; + } generatePreviewFrom(fromBlock); _inner->resizeToWidth(st::boxWideWidth); refreshControls(); @@ -427,6 +434,7 @@ void SendFilesBox::openDialogToAddFileToAlbum() { void SendFilesBox::initSendWay() { _sendWay = [&] { auto result = Core::App().settings().sendFilesWay(); + result.setHasCompressedStickers(_list.hasSticker()); if (_sendLimit == SendLimit::One) { result.setGroupFiles(true); return result; @@ -455,7 +463,9 @@ void SendFilesBox::updateCaptionPlaceholder() { return; } const auto way = _sendWay.current(); - if (!_list.canAddCaption(way.groupFiles() && way.sendImagesAsPhotos()) + if (!_list.canAddCaption( + way.groupFiles() && way.sendImagesAsPhotos(), + way.sendImagesAsPhotos()) && _sendLimit == SendLimit::One) { _caption->hide(); if (_emojiToggle) { @@ -668,7 +678,7 @@ void SendFilesBox::updateSendWayControlsVisibility() { _hintLabel->setVisible( _controller->session().settings().photoEditorHintShown() - ? _list.hasSendImagesAsPhotosOption(false) + ? _list.canHaveEditorHintLabel() : false); } @@ -1019,7 +1029,8 @@ bool SendFilesBox::validateLength(const QString &text) const { const auto way = _sendWay.current(); if (remove <= 0 || !_list.canAddCaption( - way.groupFiles() && way.sendImagesAsPhotos())) { + way.groupFiles() && way.sendImagesAsPhotos(), + way.sendImagesAsPhotos())) { return true; } _controller->show(Box(CaptionLimitReachedBox, session, remove)); diff --git a/Telegram/SourceFiles/storage/localimageloader.cpp b/Telegram/SourceFiles/storage/localimageloader.cpp index e4a30665e..f15539d58 100644 --- a/Telegram/SourceFiles/storage/localimageloader.cpp +++ b/Telegram/SourceFiles/storage/localimageloader.cpp @@ -915,7 +915,8 @@ void FileLoadTask::process(Args &&args) { attributes.push_back(MTP_documentAttributeImageSize(MTP_int(w), MTP_int(h))); if (ValidateThumbDimensions(w, h)) { - isSticker = Core::IsMimeSticker(filemime) + isSticker = (_type == SendMediaType::File) + && Core::IsMimeSticker(filemime) && (filesize < Storage::kMaxStickerBytesSize) && (Core::IsMimeStickerAnimated(filemime) || GoodStickerDimensions(w, h)); @@ -936,6 +937,9 @@ void FileLoadTask::process(Args &&args) { attributes.push_back(MTP_documentAttributeAnimated()); } else if (filemime.startsWith(u"image/"_q) && _type != SendMediaType::File) { + if (Core::IsMimeSticker(filemime)) { + fullimage = Images::Opaque(std::move(fullimage)); + } auto medium = (w > 320 || h > 320) ? fullimage.scaled(320, 320, Qt::KeepAspectRatio, Qt::SmoothTransformation) : fullimage; const auto downscaled = (w > 1280 || h > 1280); diff --git a/Telegram/SourceFiles/storage/storage_media_prepare.cpp b/Telegram/SourceFiles/storage/storage_media_prepare.cpp index eedc25746..05876d20b 100644 --- a/Telegram/SourceFiles/storage/storage_media_prepare.cpp +++ b/Telegram/SourceFiles/storage/storage_media_prepare.cpp @@ -145,7 +145,8 @@ MimeDataState ComputeMimeDataState(const QMimeData *data) { return MimeDataState::None; } - const auto imageExtensions = Ui::ImageExtensions(); + auto imageExtensions = Ui::ImageExtensions(); + imageExtensions.push_back(u".webp"_q); auto files = QStringList(); auto allAreSmallImages = true; for (const auto &url : urls) { @@ -303,11 +304,11 @@ void PrepareDetails(PreparedFile &file, int previewWidth) { if (const auto image = std::get_if( &file.information->media)) { Assert(!image->data.isNull()); - if (ValidPhotoForAlbum(*image, file.information->filemime)) { + if (ValidPhotoForAlbum(*image, file.information->filemime) + || Core::IsMimeSticker(file.information->filemime)) { UpdateImageDetails(file, previewWidth); file.type = PreparedFile::Type::Photo; - } else if (Core::IsMimeSticker(file.information->filemime) - || image->animated) { + } else if (image->animated) { file.type = PreparedFile::Type::None; } } else if (const auto video = std::get_if