diff --git a/Telegram/SourceFiles/apiwrap.cpp b/Telegram/SourceFiles/apiwrap.cpp index 686d8924a..1830eee54 100644 --- a/Telegram/SourceFiles/apiwrap.cpp +++ b/Telegram/SourceFiles/apiwrap.cpp @@ -4213,8 +4213,7 @@ void ApiWrap::sendFiles( const SendAction &action) { const auto haveCaption = !caption.text.isEmpty(); const auto isAlbum = (album != nullptr); - const auto compressImages = (type == SendMediaType::Photo); - if (haveCaption && !list.canAddCaption(isAlbum, compressImages)) { + if (haveCaption && !list.canAddCaption(isAlbum)) { auto message = MessageToSend(action.history); message.textWithTags = std::move(caption); message.action = action; diff --git a/Telegram/SourceFiles/boxes/send_files_box.cpp b/Telegram/SourceFiles/boxes/send_files_box.cpp index 16a389809..01d323c81 100644 --- a/Telegram/SourceFiles/boxes/send_files_box.cpp +++ b/Telegram/SourceFiles/boxes/send_files_box.cpp @@ -32,6 +32,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/widgets/scroll_area.h" #include "ui/wrap/fade_wrap.h" #include "ui/chat/attach/attach_prepare.h" +#include "ui/chat/attach/attach_send_files_way.h" #include "ui/chat/attach/attach_album_preview.h" #include "ui/chat/attach/attach_single_file_preview.h" #include "ui/chat/attach/attach_single_media_preview.h" @@ -97,9 +98,9 @@ void FileDialogCallback( rpl::producer FieldPlaceholder( const Ui::PreparedList &list, SendFilesWay way) { - const auto isAlbum = (way == SendFilesWay::Album); - const auto compressImages = (way != SendFilesWay::Files); - return list.canAddCaption(isAlbum, compressImages) + const auto isAlbum = list.singleAlbumIsPossible + && way.groupMediaInAlbums(); + return list.canAddCaption(isAlbum) ? tr::lng_photo_caption() : tr::lng_photos_comment(); } @@ -111,15 +112,12 @@ SendFilesBox::SendFilesBox( not_null controller, Ui::PreparedList &&list, const TextWithTags &caption, - CompressConfirm compressed, SendLimit limit, Api::SendType sendType, SendMenu::Type sendMenuType) : _controller(controller) , _sendType(sendType) , _list(std::move(list)) -, _compressConfirmInitial(compressed) -, _compressConfirm(compressed) , _sendLimit(limit) , _sendMenuType(sendMenuType) , _caption( @@ -131,11 +129,13 @@ SendFilesBox::SendFilesBox( } void SendFilesBox::initPreview(rpl::producer desiredPreviewHeight) { + using namespace rpl::mappers; + setupControls(); updateBoxSize(); - using namespace rpl::mappers; + _dimensionsLifetime.destroy(); rpl::combine( std::move(desiredPreviewHeight), _footerHeight.value(), @@ -145,7 +145,7 @@ void SendFilesBox::initPreview(rpl::producer desiredPreviewHeight) { st::boxWideWidth, std::min(st::sendMediaPreviewHeightMax, height), true); - }, lifetime()); + }, _dimensionsLifetime); if (_preview) { _preview->show(); @@ -162,29 +162,23 @@ void SendFilesBox::prepareSingleFilePreview() { Window::GifPauseReason::Layer); }, file); if (media) { - if (!media->canSendAsPhoto()) { - _compressConfirm = CompressConfirm::None; - } _preview = media; initPreview(media->desiredHeightValue()); } else { const auto preview = Ui::CreateChild(this, file); - _compressConfirm = CompressConfirm::None; _preview = preview; initPreview(preview->desiredHeightValue()); } } void SendFilesBox::prepareAlbumPreview() { - Expects(_sendWay != nullptr); - const auto wrap = Ui::CreateChild( this, st::boxScroll); _albumPreview = wrap->setOwnedWidget(object_ptr( this, _list, - _sendWay->value())); + _sendWay.current())); addThumbButtonHandlers(wrap); @@ -214,15 +208,10 @@ void SendFilesBox::addThumbButtonHandlers(not_null wrap) { _albumPreview = nullptr; if (IsSingleItem(_list)) { - _list.albumIsPossible = false; - if (_sendWay->value() == SendFilesWay::Album) { - _sendWay->setValue(SendFilesWay::Photos); - } + _list.singleAlbumIsPossible = false; } - _compressConfirm = _compressConfirmInitial; refreshAllAfterAlbumChanges(); - }, _albumPreview->lifetime()); _albumPreview->thumbChanged( @@ -297,20 +286,20 @@ void SendFilesBox::prepare() { addButton(tr::lng_cancel(), [=] { closeBox(); }); initSendWay(); setupCaption(); + setupSendWayControls(); preparePreview(); + boxClosing() | rpl::start_with_next([=] { if (!_confirmed && _cancelledCallback) { _cancelledCallback(); } }, lifetime()); - _addFileToAlbum = addLeftButton( + _addFile = addLeftButton( tr::lng_stickers_featured_add(), App::LambdaDelayed(st::historyAttach.ripple.hideDuration, this, [=] { openDialogToAddFileToAlbum(); })); - - updateLeftButtonVisibility(); setupDragArea(); } @@ -348,21 +337,9 @@ void SendFilesBox::setupDragArea() { }, lifetime()); } -void SendFilesBox::updateLeftButtonVisibility() { - const auto isAlbum = _list.albumIsPossible - && (_list.files.size() < Ui::MaxAlbumItems()); - if (isAlbum || (IsSingleItem(_list) && IsFirstAlbumItem(_list))) { - _addFileToAlbum->show(); - } else { - _addFileToAlbum->hide(); - } -} - void SendFilesBox::refreshAllAfterAlbumChanges() { - refreshAlbumMediaCount(); preparePreview(); captionResized(); - updateLeftButtonVisibility(); _albumChanged.fire({}); } @@ -384,36 +361,23 @@ void SendFilesBox::openDialogToAddFileToAlbum() { } void SendFilesBox::initSendWay() { - refreshAlbumMediaCount(); - const auto value = [&] { - if (_sendLimit == SendLimit::One - && _list.albumIsPossible - && _list.files.size() > 1) { - return SendFilesWay::Album; + _sendWay = [&] { + auto result = Core::App().settings().sendFilesWay(); + if (_sendLimit == SendLimit::One) { + result.setGroupMediaInAlbums(true); + result.setGroupFiles(true); + return result; + } else if (_list.overrideSendImagesAsPhotos == false) { + result.setSendImagesAsPhotos(false); + return result; + } else if (_list.overrideSendImagesAsPhotos == true) { + result.setSendImagesAsPhotos(true); + return result; } - if (_compressConfirm == CompressConfirm::None) { - return SendFilesWay::Files; - } else if (_compressConfirm == CompressConfirm::No) { - return SendFilesWay::Files; - } else if (_compressConfirm == CompressConfirm::Yes) { - return _list.albumIsPossible - ? SendFilesWay::Album - : SendFilesWay::Photos; - } - const auto way = Core::App().settings().sendFilesWay(); - if (way == SendFilesWay::Files) { - return way; - } else if (way == SendFilesWay::Album) { - return _list.albumIsPossible - ? SendFilesWay::Album - : SendFilesWay::Photos; - } - return (_list.albumIsPossible && !_albumPhotosCount) - ? SendFilesWay::Album - : SendFilesWay::Photos; + return result; }(); - _sendWay = std::make_shared>(value); - _sendWay->setChangedCallback([=](SendFilesWay value) { + _sendWay.changes( + ) | rpl::start_with_next([=](SendFilesWay value) { updateCaptionPlaceholder(); applyAlbumOrder(); if (_albumPreview) { @@ -421,18 +385,17 @@ void SendFilesBox::initSendWay() { } updateEmojiPanelGeometry(); setInnerFocus(); - }); + }, lifetime()); } void SendFilesBox::updateCaptionPlaceholder() { if (!_caption) { return; } - const auto sendWay = _sendWay->value(); - const auto isAlbum = (sendWay == SendFilesWay::Album); - const auto compressImages = (sendWay != SendFilesWay::Files); - if (!_list.canAddCaption(isAlbum, compressImages) - && _sendLimit == SendLimit::One) { + const auto sendWay = _sendWay.current(); + const auto isAlbum = _list.singleAlbumIsPossible + && sendWay.groupMediaInAlbums(); + if (!_list.canAddCaption(isAlbum) && _sendLimit == SendLimit::One) { _caption->hide(); if (_emojiToggle) { _emojiToggle->hide(); @@ -446,67 +409,74 @@ void SendFilesBox::updateCaptionPlaceholder() { } } -void SendFilesBox::refreshAlbumMediaCount() { - _albumVideosCount = _list.albumIsPossible - ? ranges::count( - _list.files, - Ui::PreparedFile::AlbumType::Video, - [](const Ui::PreparedFile &file) { return file.type; }) - : 0; - _albumPhotosCount = _list.albumIsPossible - ? (_list.files.size() - _albumVideosCount) - : 0; -} - void SendFilesBox::preparePreview() { if (IsSingleItem(_list)) { prepareSingleFilePreview(); } else { - if (_list.albumIsPossible) { - prepareAlbumPreview(); - } else { - auto desiredPreviewHeight = rpl::single(0); - initPreview(std::move(desiredPreviewHeight)); - } + prepareAlbumPreview(); // #TODO files many albums } } void SendFilesBox::setupControls() { setupTitleText(); - setupSendWayControls(); + updateSendWayControlsVisibility(); } void SendFilesBox::setupSendWayControls() { - _sendAlbum.destroy(); - _sendPhotos.destroy(); - _sendFiles.destroy(); - if (_compressConfirm == CompressConfirm::None - || _sendLimit == SendLimit::One) { + // #TODO files + _groupMediaInAlbums.create( + this, + "Group media in albums", + _sendWay.current().groupMediaInAlbums(), + st::defaultBoxCheckbox); + _sendImagesAsPhotos.create( + this, + "Send images as photos", + _sendWay.current().sendImagesAsPhotos(), + st::defaultBoxCheckbox); + _groupFiles.create( + this, + "Group files", + _sendWay.current().groupFiles(), + st::defaultBoxCheckbox); + + _sendWay.changes( + ) | rpl::start_with_next([=](SendFilesWay value) { + _groupMediaInAlbums->setChecked(value.groupMediaInAlbums()); + _sendImagesAsPhotos->setChecked(value.sendImagesAsPhotos()); + _groupFiles->setChecked(value.groupFiles()); + }, lifetime()); + + _groupMediaInAlbums->checkedChanges( + ) | rpl::start_with_next([=] { + auto sendWay = _sendWay.current(); + sendWay.setGroupMediaInAlbums(_groupMediaInAlbums->checked()); + _sendWay = sendWay; + }, lifetime()); + + _sendImagesAsPhotos->checkedChanges( + ) | rpl::start_with_next([=] { + auto sendWay = _sendWay.current(); + sendWay.setSendImagesAsPhotos(_sendImagesAsPhotos->checked()); + _sendWay = sendWay; + }, lifetime()); + + _groupFiles->checkedChanges( + ) | rpl::start_with_next([=] { + auto sendWay = _sendWay.current(); + sendWay.setGroupFiles(_groupFiles->checked()); + _sendWay = sendWay; + }, lifetime()); +} + +void SendFilesBox::updateSendWayControlsVisibility() { + if (_sendLimit == SendLimit::One) { return; } - const auto addRadio = [&]( - object_ptr> &button, - SendFilesWay value, - const QString &text) { - const auto &style = st::defaultBoxCheckbox; - button.create(this, _sendWay, value, text, style); - button->show(); - }; - if (_list.albumIsPossible) { - addRadio(_sendAlbum, SendFilesWay::Album, tr::lng_send_album(tr::now)); - } - if (!_list.albumIsPossible || _albumPhotosCount > 0) { - addRadio(_sendPhotos, SendFilesWay::Photos, IsSingleItem(_list) - ? tr::lng_send_photo(tr::now) - : (_albumVideosCount > 0) - ? tr::lng_send_separate_photos_videos(tr::now) - : (_list.albumIsPossible - ? tr::lng_send_separate_photos(tr::now) - : tr::lng_send_photos(tr::now, lt_count, _list.files.size()))); - } - addRadio(_sendFiles, SendFilesWay::Files, (IsSingleItem(_list)) - ? tr::lng_send_file(tr::now) - : tr::lng_send_files(tr::now, lt_count, _list.files.size())); + const auto onlyOne = (_sendLimit == SendLimit::One); + _groupMediaInAlbums->setVisible(!onlyOne); + _sendImagesAsPhotos->setVisible(/*_list.hasImagesForCompression()*/true); // #TODO files + _groupFiles->setVisible(!onlyOne); } void SendFilesBox::applyAlbumOrder() { @@ -682,34 +652,29 @@ bool SendFilesBox::addFiles(Ui::PreparedList list) { const auto cutToAlbumSize = (sumFiles > Ui::MaxAlbumItems()); if (list.error != Ui::PreparedList::Error::None) { return false; - } else if (!IsSingleItem(list) && !list.albumIsPossible) { - return false; - } else if (!IsFirstAlbumItem(list)) { - return false; - } else if (_list.files.size() > 1 && !_albumPreview) { - return false; - } else if (!IsFirstAlbumItem(_list)) { - return false; + //} else if (!IsSingleItem(list) && !list.albumIsPossible) { // #TODO files + // return false; + //} else if (!IsFirstAlbumItem(list)) { + // return false; + //} else if (_list.files.size() > 1 && !_albumPreview) { + // return false; + //} else if (!IsFirstAlbumItem(_list)) { + // return false; } applyAlbumOrder(); delete base::take(_preview); _albumPreview = nullptr; - if (IsSingleItem(_list) - && _sendWay->value() == SendFilesWay::Photos) { - _sendWay->setValue(SendFilesWay::Album); - } _list.mergeToEnd(std::move(list), cutToAlbumSize); - _compressConfirm = _compressConfirmInitial; refreshAllAfterAlbumChanges(); return true; } void SendFilesBox::setupTitleText() { if (_list.files.size() > 1) { - const auto onlyImages = (_compressConfirm != CompressConfirm::None) - && (_albumVideosCount == 0); + const auto onlyImages = false;/* #TODO files (_compressConfirm != CompressConfirm::None) + && (_albumVideosCount == 0);*/ _titleText = onlyImages ? tr::lng_send_images_selected(tr::now, lt_count, _list.files.size()) : tr::lng_send_files_selected(tr::now, lt_count, _list.files.size()); @@ -726,12 +691,12 @@ void SendFilesBox::updateBoxSize() { footerHeight += st::boxPhotoCaptionSkip + _caption->height(); } const auto pointers = { - _sendAlbum.data(), - _sendPhotos.data(), - _sendFiles.data() + _groupMediaInAlbums.data(), + _sendImagesAsPhotos.data(), + _groupFiles.data() }; for (auto pointer : pointers) { - if (pointer) { + if (pointer && !pointer->isHidden()) { footerHeight += st::boxPhotoCompressedSkip + pointer->heightNoMargins(); } @@ -740,7 +705,7 @@ void SendFilesBox::updateBoxSize() { } void SendFilesBox::keyPressEvent(QKeyEvent *e) { - if (e->matches(QKeySequence::Open) && !_addFileToAlbum->isHidden()) { + if (e->matches(QKeySequence::Open)) { openDialogToAddFileToAlbum(); } else if (e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return) { const auto modifiers = e->modifiers(); @@ -792,12 +757,12 @@ void SendFilesBox::updateControlsGeometry() { } } const auto pointers = { - _sendAlbum.data(), - _sendPhotos.data(), - _sendFiles.data() + _groupMediaInAlbums.data(), + _sendImagesAsPhotos.data(), + _groupFiles.data() }; for (const auto pointer : ranges::view::reverse(pointers)) { - if (pointer) { + if (pointer && !pointer->isHidden()) { pointer->moveToLeft( st::boxPhotoPadding.left(), bottom - pointer->heightNoMargins()); @@ -827,22 +792,21 @@ void SendFilesBox::send( return sendScheduled(); } - using Way = SendFilesWay; - const auto way = _sendWay ? _sendWay->value() : Way::Files; - - if (_compressConfirm == CompressConfirm::Auto) { - const auto oldWay = Core::App().settings().sendFilesWay(); - if (way != oldWay) { - // Check if the user _could_ use the old value, but didn't. - if ((oldWay == Way::Album && _sendAlbum) - || (oldWay == Way::Photos && _sendPhotos) - || (oldWay == Way::Files && _sendFiles) - || (way == Way::Files && (_sendAlbum || _sendPhotos))) { - // And in that case save it to settings. - Core::App().settings().setSendFilesWay(way); - Core::App().saveSettingsDelayed(); - } - } + auto way = _sendWay.current(); + auto oldWay = Core::App().settings().sendFilesWay(); + if (_list.overrideSendImagesAsPhotos == way.sendImagesAsPhotos() + || _sendImagesAsPhotos->isHidden()) { + way.setSendImagesAsPhotos(oldWay.sendImagesAsPhotos()); + } + if (_groupMediaInAlbums->isHidden()) { + way.setGroupMediaInAlbums(oldWay.groupMediaInAlbums()); + } + if (_groupFiles->isHidden()) { + way.setGroupFiles(oldWay.groupFiles()); + } + if (way != oldWay) { + Core::App().settings().setSendFilesWay(way); + Core::App().saveSettingsDelayed(); } applyAlbumOrder(); diff --git a/Telegram/SourceFiles/boxes/send_files_box.h b/Telegram/SourceFiles/boxes/send_files_box.h index 4b99028d7..46ffe34b5 100644 --- a/Telegram/SourceFiles/boxes/send_files_box.h +++ b/Telegram/SourceFiles/boxes/send_files_box.h @@ -10,6 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include #include "boxes/abstract_box.h" #include "ui/chat/attach/attach_prepare.h" +#include "ui/chat/attach/attach_send_files_way.h" #include "storage/localimageloader.h" #include "storage/storage_media_prepare.h" @@ -27,16 +28,12 @@ class TabbedPanel; } // namespace ChatHelpers namespace Ui { -template -class Radioenum; -template -class RadioenumGroup; +class Checkbox; class RoundButton; class InputField; struct GroupMediaLayout; class EmojiButton; class AlbumPreview; -enum class SendFilesWay; } // namespace Ui namespace Window { @@ -58,7 +55,6 @@ public: not_null controller, Ui::PreparedList &&list, const TextWithTags &caption, - CompressConfirm compressed, SendLimit limit, Api::SendType sendType, SendMenu::Type sendMenuType); @@ -98,10 +94,10 @@ private: not_null content); void setupEmojiPanel(); + void updateSendWayControlsVisibility(); void updateEmojiPanelGeometry(); void emojiFilterForGeometry(not_null event); - void refreshAlbumMediaCount(); void preparePreview(); void prepareSingleFilePreview(); void prepareAlbumPreview(); @@ -125,7 +121,6 @@ private: bool addFiles(Ui::PreparedList list); void openDialogToAddFileToAlbum(); - void updateLeftButtonVisibility(); void refreshAllAfterAlbumChanges(); const not_null _controller; @@ -136,8 +131,6 @@ private: Ui::PreparedList _list; - CompressConfirm _compressConfirmInitial = CompressConfirm::None; - CompressConfirm _compressConfirm = CompressConfirm::None; SendLimit _sendLimit = SendLimit::Many; SendMenu::Type _sendMenuType = SendMenu::Type(); @@ -155,22 +148,21 @@ private: base::unique_qptr _emojiPanel; base::unique_qptr _emojiFilter; - object_ptr> _sendAlbum = { nullptr }; - object_ptr> _sendPhotos = { nullptr }; - object_ptr> _sendFiles = { nullptr }; - std::shared_ptr> _sendWay; + object_ptr _groupMediaInAlbums = { nullptr }; + object_ptr _sendImagesAsPhotos = { nullptr }; + object_ptr _groupFiles = { nullptr }; + rpl::variable _sendWay = Ui::SendFilesWay(); rpl::variable _footerHeight = 0; rpl::event_stream<> _albumChanged; + rpl::lifetime _dimensionsLifetime; QWidget *_preview = nullptr; Ui::AlbumPreview *_albumPreview = nullptr; - int _albumVideosCount = 0; - int _albumPhotosCount = 0; int _lastScrollTop = 0; QPointer _send; - QPointer _addFileToAlbum; + QPointer _addFile; }; diff --git a/Telegram/SourceFiles/core/core_settings.cpp b/Telegram/SourceFiles/core/core_settings.cpp index 41d138ebf..c6ea4b8dc 100644 --- a/Telegram/SourceFiles/core/core_settings.cpp +++ b/Telegram/SourceFiles/core/core_settings.cpp @@ -9,7 +9,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "boxes/send_files_box.h" #include "ui/widgets/input_fields.h" -#include "ui/chat/attach/attach_common.h" #include "storage/serialize_common.h" #include "window/themes/window_theme.h" #include "window/section_widget.h" @@ -19,8 +18,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL namespace Core { Settings::Settings() -: _sendFilesWay(Ui::SendFilesWay::Album) -, _sendSubmitWay(Ui::InputSubmitSettings::Enter) +: _sendSubmitWay(Ui::InputSubmitSettings::Enter) , _floatPlayerColumn(Window::Column::Second) , _floatPlayerCorner(RectPart::TopRight) , _dialogsWidthRatio(DefaultDialogsWidthRatio()) { @@ -76,7 +74,7 @@ QByteArray Settings::serialize() const { stream << key << value; } stream - << qint32(_sendFilesWay) + << qint32(_sendFilesWay.serialize()) << qint32(_sendSubmitWay) << qint32(_includeMutedCounter ? 1 : 0) << qint32(_countUnreadMessages ? 1 : 0) @@ -150,7 +148,7 @@ void Settings::addFromSerialized(const QByteArray &serialized) { qint32 lastSeenWarningSeen = _lastSeenWarningSeen ? 1 : 0; qint32 soundOverridesCount = 0; base::flat_map soundOverrides; - qint32 sendFilesWay = static_cast(_sendFilesWay); + qint32 sendFilesWay = _sendFilesWay.serialize(); qint32 sendSubmitWay = static_cast(_sendSubmitWay); qint32 includeMutedCounter = _includeMutedCounter ? 1 : 0; qint32 countUnreadMessages = _countUnreadMessages ? 1 : 0; @@ -310,12 +308,7 @@ void Settings::addFromSerialized(const QByteArray &serialized) { _callAudioDuckingEnabled = (callAudioDuckingEnabled == 1); _lastSeenWarningSeen = (lastSeenWarningSeen == 1); _soundOverrides = std::move(soundOverrides); - auto uncheckedSendFilesWay = static_cast(sendFilesWay); - switch (uncheckedSendFilesWay) { - case Ui::SendFilesWay::Album: - case Ui::SendFilesWay::Photos: - case Ui::SendFilesWay::Files: _sendFilesWay = uncheckedSendFilesWay; break; - } + _sendFilesWay = Ui::SendFilesWay::FromSerialized(sendFilesWay).value_or(_sendFilesWay); auto uncheckedSendSubmitWay = static_cast(sendSubmitWay); switch (uncheckedSendSubmitWay) { case Ui::InputSubmitSettings::Enter: @@ -470,7 +463,7 @@ void Settings::resetOnLastLogout() { //_themesAccentColors = Window::Theme::AccentColors(); _lastSeenWarningSeen = false; - _sendFilesWay = Ui::SendFilesWay::Album; + _sendFilesWay = Ui::SendFilesWay(); //_sendSubmitWay = Ui::InputSubmitSettings::Enter; _soundOverrides = {}; diff --git a/Telegram/SourceFiles/core/core_settings.h b/Telegram/SourceFiles/core/core_settings.h index bab3bd920..dbb3a8933 100644 --- a/Telegram/SourceFiles/core/core_settings.h +++ b/Telegram/SourceFiles/core/core_settings.h @@ -9,12 +9,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "window/themes/window_themes_embedded.h" #include "window/window_controls_layout.h" +#include "ui/chat/attach/attach_send_files_way.h" enum class RectPart; namespace Ui { enum class InputSubmitSettings; -enum class SendFilesWay; } // namespace Ui namespace Window { diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index 8bd28b1dc..4a50804bd 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -31,7 +31,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/text/text_utilities.h" // Ui::Text::ToUpper #include "ui/text/format_values.h" #include "ui/chat/message_bar.h" -#include "ui/chat/attach/attach_common.h" +#include "ui/chat/attach/attach_send_files_way.h" #include "ui/image/image.h" #include "ui/special_buttons.h" #include "ui/controls/emoji_button.h" @@ -327,10 +327,7 @@ HistoryWidget::HistoryWidget( if (action == Ui::InputField::MimeAction::Check) { return canSendFiles(data); } else if (action == Ui::InputField::MimeAction::Insert) { - return confirmSendingFiles( - data, - CompressConfirm::Auto, - data->text()); + return confirmSendingFiles(data, std::nullopt, data->text()); } Unexpected("action in MimeData hook."); }); @@ -375,11 +372,11 @@ HistoryWidget::HistoryWidget( crl::guard(this, [=](bool f) { _field->setAcceptDrops(f); }), crl::guard(this, [=] { updateControlsGeometry(); })); _attachDragAreas.document->setDroppedCallback([=](const QMimeData *data) { - confirmSendingFiles(data, CompressConfirm::No); + confirmSendingFiles(data, false); Window::ActivateWindow(controller); }); _attachDragAreas.photo->setDroppedCallback([=](const QMimeData *data) { - confirmSendingFiles(data, CompressConfirm::Yes); + confirmSendingFiles(data, true); Window::ActivateWindow(controller); }); @@ -3298,8 +3295,7 @@ void HistoryWidget::chooseAttach() { if (!image.isNull() && !animated) { confirmSendingFiles( std::move(image), - std::move(result.remoteContent), - CompressConfirm::Auto); + std::move(result.remoteContent)); } else { uploadFile(result.remoteContent, SendMediaType::File); } @@ -3307,11 +3303,7 @@ void HistoryWidget::chooseAttach() { auto list = Storage::PrepareMediaList( result.paths, st::sendMediaPreviewSize); - if (list.allFilesForCompress || list.albumIsPossible) { - confirmSendingFiles(std::move(list), CompressConfirm::Auto); - } else if (!showSendingFilesError(list)) { - confirmSendingFiles(std::move(list), CompressConfirm::No); - } + confirmSendingFiles(std::move(list)); } }), nullptr); } @@ -4107,7 +4099,7 @@ bool HistoryWidget::showSendingFilesError( } if (list.files.size() > 1 && _peer->slowmodeApplied() - && !list.albumIsPossible) { + && !list.singleAlbumIsPossible) { return tr::lng_slowmode_no_many(tr::now); } else if (const auto left = _peer->slowmodeSecondsLeft()) { return tr::lng_slowmode_enabled( @@ -4142,26 +4134,23 @@ bool HistoryWidget::showSendingFilesError( } bool HistoryWidget::confirmSendingFiles(const QStringList &files) { - return confirmSendingFiles(files, CompressConfirm::Auto); + return confirmSendingFiles(files, QString()); } bool HistoryWidget::confirmSendingFiles(not_null data) { - return confirmSendingFiles(data, CompressConfirm::Auto); + return confirmSendingFiles(data, std::nullopt); } bool HistoryWidget::confirmSendingFiles( const QStringList &files, - CompressConfirm compressed, const QString &insertTextOnCancel) { return confirmSendingFiles( Storage::PrepareMediaList(files, st::sendMediaPreviewSize), - compressed, insertTextOnCancel); } bool HistoryWidget::confirmSendingFiles( Ui::PreparedList &&list, - CompressConfirm compressed, const QString &insertTextOnCancel) { if (showSendingFilesError(list)) { return false; @@ -4171,13 +4160,6 @@ bool HistoryWidget::confirmSendingFiles( return false; } - const auto noCompressOption = (list.files.size() > 1) - && !list.allFilesForCompress - && !list.albumIsPossible; - const auto boxCompressConfirm = noCompressOption - ? CompressConfirm::None - : compressed; - const auto cursor = _field->textCursor(); const auto position = cursor.position(); const auto anchor = cursor.anchor(); @@ -4187,7 +4169,6 @@ bool HistoryWidget::confirmSendingFiles( controller(), std::move(list), text, - boxCompressConfirm, _peer->slowmodeApplied() ? SendLimit::One : SendLimit::Many, Api::SendType::Normal, sendMenuType()); @@ -4201,10 +4182,10 @@ bool HistoryWidget::confirmSendingFiles( if (showSendingFilesError(list)) { return; } - const auto type = (way == Ui::SendFilesWay::Files) - ? SendMediaType::File - : SendMediaType::Photo; - const auto album = (way == Ui::SendFilesWay::Album) + const auto type = way.sendImagesAsPhotos() + ? SendMediaType::Photo + : SendMediaType::File; + const auto album = way.groupMediaInAlbums() // #TODO files ? std::make_shared() : nullptr; uploadFilesAfterConfirmation( @@ -4238,7 +4219,7 @@ bool HistoryWidget::confirmSendingFiles( bool HistoryWidget::confirmSendingFiles( QImage &&image, QByteArray &&content, - CompressConfirm compressed, + std::optional overrideSendImagesAsPhotos, const QString &insertTextOnCancel) { if (image.isNull()) { return false; @@ -4248,10 +4229,8 @@ bool HistoryWidget::confirmSendingFiles( std::move(image), std::move(content), st::sendMediaPreviewSize); - return confirmSendingFiles( - std::move(list), - compressed, - insertTextOnCancel); + list.overrideSendImagesAsPhotos = overrideSendImagesAsPhotos; + return confirmSendingFiles(std::move(list), insertTextOnCancel); } bool HistoryWidget::canSendFiles(not_null data) const { @@ -4269,7 +4248,7 @@ bool HistoryWidget::canSendFiles(not_null data) const { bool HistoryWidget::confirmSendingFiles( not_null data, - CompressConfirm compressed, + std::optional overrideSendImagesAsPhotos, const QString &insertTextOnCancel) { if (!canWriteMessage()) { return false; @@ -4285,10 +4264,8 @@ bool HistoryWidget::confirmSendingFiles( if (list.error == Ui::PreparedList::Error::None || !hasImage) { const auto emptyTextOnCancel = QString(); - confirmSendingFiles( - std::move(list), - compressed, - emptyTextOnCancel); + list.overrideSendImagesAsPhotos = overrideSendImagesAsPhotos; + confirmSendingFiles(std::move(list), emptyTextOnCancel); return true; } } @@ -4303,7 +4280,7 @@ bool HistoryWidget::confirmSendingFiles( confirmSendingFiles( std::move(image), QByteArray(), - compressed, + overrideSendImagesAsPhotos, insertTextOnCancel); return true; } @@ -4321,12 +4298,11 @@ void HistoryWidget::uploadFilesAfterConfirmation( Assert(canWriteMessage()); const auto isAlbum = (album != nullptr); - const auto compressImages = (type == SendMediaType::Photo); if (_peer->slowmodeApplied() && ((list.files.size() > 1 && !album) || (!list.files.empty() && !caption.text.isEmpty() - && !list.canAddCaption(isAlbum, compressImages)))) { + && !list.canAddCaption(isAlbum)))) { Ui::ShowMultilineToast({ .text = { tr::lng_slowmode_no_many(tr::now) }, }); diff --git a/Telegram/SourceFiles/history/history_widget.h b/Telegram/SourceFiles/history/history_widget.h index 2e5f034c8..377bb4ede 100644 --- a/Telegram/SourceFiles/history/history_widget.h +++ b/Telegram/SourceFiles/history/history_widget.h @@ -23,7 +23,6 @@ class RPCError; struct FileLoadResult; struct SendingAlbum; enum class SendMediaType; -enum class CompressConfirm; class MessageLinksParser; namespace SendMenu { @@ -411,20 +410,18 @@ private: bool canSendFiles(not_null data) const; bool confirmSendingFiles( const QStringList &files, - CompressConfirm compressed, - const QString &insertTextOnCancel = QString()); + const QString &insertTextOnCancel); bool confirmSendingFiles( QImage &&image, QByteArray &&content, - CompressConfirm compressed, + std::optional overrideSendImagesAsPhotos = std::nullopt, const QString &insertTextOnCancel = QString()); bool confirmSendingFiles( not_null data, - CompressConfirm compressed, + std::optional overrideSendImagesAsPhotos, const QString &insertTextOnCancel = QString()); bool confirmSendingFiles( Ui::PreparedList &&list, - CompressConfirm compressed, const QString &insertTextOnCancel = QString()); bool showSendingFilesError(const Ui::PreparedList &list) const; diff --git a/Telegram/SourceFiles/history/view/history_view_replies_section.cpp b/Telegram/SourceFiles/history/view/history_view_replies_section.cpp index 37d256a6b..6415cd87a 100644 --- a/Telegram/SourceFiles/history/view/history_view_replies_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_replies_section.cpp @@ -27,7 +27,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/text/format_values.h" #include "ui/text/text_utilities.h" #include "ui/chat/attach/attach_prepare.h" -#include "ui/chat/attach/attach_common.h" +#include "ui/chat/attach/attach_send_files_way.h" #include "ui/special_buttons.h" #include "ui/ui_utility.h" #include "ui/toasts/common_toasts.h" @@ -505,10 +505,7 @@ void RepliesWidget::setupComposeControls() { if (action == Ui::InputField::MimeAction::Check) { return CanSendFiles(data); } else if (action == Ui::InputField::MimeAction::Insert) { - return confirmSendingFiles( - data, - CompressConfirm::Auto, - data->text()); + return confirmSendingFiles(data, std::nullopt, data->text()); } Unexpected("action in MimeData hook."); }); @@ -545,8 +542,7 @@ void RepliesWidget::chooseAttach() { if (!image.isNull() && !animated) { confirmSendingFiles( std::move(image), - std::move(result.remoteContent), - CompressConfirm::Auto); + std::move(result.remoteContent)); } else { uploadFile(result.remoteContent, SendMediaType::File); } @@ -554,18 +550,14 @@ void RepliesWidget::chooseAttach() { auto list = Storage::PrepareMediaList( result.paths, st::sendMediaPreviewSize); - if (list.allFilesForCompress || list.albumIsPossible) { - confirmSendingFiles(std::move(list), CompressConfirm::Auto); - } else if (!showSendingFilesError(list)) { - confirmSendingFiles(std::move(list), CompressConfirm::No); - } + confirmSendingFiles(std::move(list)); } }), nullptr); } bool RepliesWidget::confirmSendingFiles( not_null data, - CompressConfirm compressed, + std::optional overrideSendImagesAsPhotos, const QString &insertTextOnCancel) { const auto hasImage = data->hasImage(); @@ -577,10 +569,8 @@ bool RepliesWidget::confirmSendingFiles( if (list.error == Ui::PreparedList::Error::None || !hasImage) { const auto emptyTextOnCancel = QString(); - confirmSendingFiles( - std::move(list), - compressed, - emptyTextOnCancel); + list.overrideSendImagesAsPhotos = overrideSendImagesAsPhotos; + confirmSendingFiles(std::move(list), emptyTextOnCancel); return true; } } @@ -595,7 +585,7 @@ bool RepliesWidget::confirmSendingFiles( confirmSendingFiles( std::move(image), QByteArray(), - compressed, + overrideSendImagesAsPhotos, insertTextOnCancel); return true; } @@ -605,19 +595,11 @@ bool RepliesWidget::confirmSendingFiles( bool RepliesWidget::confirmSendingFiles( Ui::PreparedList &&list, - CompressConfirm compressed, const QString &insertTextOnCancel) { if (showSendingFilesError(list)) { return false; } - const auto noCompressOption = (list.files.size() > 1) - && !list.allFilesForCompress - && !list.albumIsPossible; - const auto boxCompressConfirm = noCompressOption - ? CompressConfirm::None - : compressed; - //const auto cursor = _field->textCursor(); //const auto position = cursor.position(); //const auto anchor = cursor.anchor(); @@ -627,7 +609,6 @@ bool RepliesWidget::confirmSendingFiles( controller(), std::move(list), text, - boxCompressConfirm, _history->peer->slowmodeApplied() ? SendLimit::One : SendLimit::Many, Api::SendType::Normal, SendMenu::Type::Disabled); // #TODO replies schedule @@ -643,10 +624,10 @@ bool RepliesWidget::confirmSendingFiles( if (showSendingFilesError(list)) { return; } - const auto type = (way == Ui::SendFilesWay::Files) - ? SendMediaType::File - : SendMediaType::Photo; - const auto album = (way == Ui::SendFilesWay::Album) + const auto type = way.sendImagesAsPhotos() + ? SendMediaType::Photo + : SendMediaType::File; + const auto album = way.groupMediaInAlbums() // #TODO files ? std::make_shared() : nullptr; uploadFilesAfterConfirmation( @@ -683,7 +664,7 @@ bool RepliesWidget::confirmSendingFiles( bool RepliesWidget::confirmSendingFiles( QImage &&image, QByteArray &&content, - CompressConfirm compressed, + std::optional overrideSendImagesAsPhotos, const QString &insertTextOnCancel) { if (image.isNull()) { return false; @@ -693,10 +674,8 @@ bool RepliesWidget::confirmSendingFiles( std::move(image), std::move(content), st::sendMediaPreviewSize); - return confirmSendingFiles( - std::move(list), - compressed, - insertTextOnCancel); + list.overrideSendImagesAsPhotos = overrideSendImagesAsPhotos; + return confirmSendingFiles(std::move(list), insertTextOnCancel); } bool RepliesWidget::showSlowmodeError() { @@ -737,12 +716,11 @@ void RepliesWidget::uploadFilesAfterConfirmation( Api::SendOptions options, std::shared_ptr album) { const auto isAlbum = (album != nullptr); - const auto compressImages = (type == SendMediaType::Photo); if (_history->peer->slowmodeApplied() && ((list.files.size() > 1 && !album) || (!list.files.empty() && !caption.text.isEmpty() - && !list.canAddCaption(isAlbum, compressImages)))) { + && !list.canAddCaption(isAlbum)))) { Ui::ShowMultilineToast({ .text = { tr::lng_slowmode_no_many(tr::now) } }); @@ -830,7 +808,7 @@ bool RepliesWidget::showSendingFilesError( } if (list.files.size() > 1 && _history->peer->slowmodeApplied() - && !list.albumIsPossible) { + && !list.singleAlbumIsPossible) { return tr::lng_slowmode_no_many(tr::now); } else if (const auto left = _history->peer->slowmodeSecondsLeft()) { return tr::lng_slowmode_enabled( @@ -1808,14 +1786,14 @@ void RepliesWidget::setupDragArea() { nullptr, [=] { updateControlsGeometry(); }); - const auto droppedCallback = [=](CompressConfirm compressed) { + const auto droppedCallback = [=](bool overrideSendImagesAsPhotos) { return [=](const QMimeData *data) { - confirmSendingFiles(data, compressed); + confirmSendingFiles(data, overrideSendImagesAsPhotos); Window::ActivateWindow(controller()); }; }; - areas.document->setDroppedCallback(droppedCallback(CompressConfirm::No)); - areas.photo->setDroppedCallback(droppedCallback(CompressConfirm::Yes)); + areas.document->setDroppedCallback(droppedCallback(false)); + areas.photo->setDroppedCallback(droppedCallback(true)); } } // namespace HistoryView diff --git a/Telegram/SourceFiles/history/view/history_view_replies_section.h b/Telegram/SourceFiles/history/view/history_view_replies_section.h index 97e061a55..f7a664740 100644 --- a/Telegram/SourceFiles/history/view/history_view_replies_section.h +++ b/Telegram/SourceFiles/history/view/history_view_replies_section.h @@ -14,7 +14,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "base/timer.h" class History; -enum class CompressConfirm; enum class SendMediaType; struct SendingAlbum; @@ -198,15 +197,14 @@ private: bool confirmSendingFiles( QImage &&image, QByteArray &&content, - CompressConfirm compressed, + std::optional overrideSendImagesAsPhotos = std::nullopt, const QString &insertTextOnCancel = QString()); bool confirmSendingFiles( Ui::PreparedList &&list, - CompressConfirm compressed, const QString &insertTextOnCancel = QString()); bool confirmSendingFiles( not_null data, - CompressConfirm compressed, + std::optional overrideSendImagesAsPhotos = std::nullopt, const QString &insertTextOnCancel = QString()); bool showSendingFilesError(const Ui::PreparedList &list) const; void uploadFilesAfterConfirmation( diff --git a/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp b/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp index 94015efa2..d16daf465 100644 --- a/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp @@ -21,7 +21,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/item_text_options.h" #include "ui/toast/toast.h" #include "ui/chat/attach/attach_prepare.h" -#include "ui/chat/attach/attach_common.h" +#include "ui/chat/attach/attach_send_files_way.h" #include "ui/special_buttons.h" #include "ui/ui_utility.h" #include "ui/toasts/common_toasts.h" @@ -249,10 +249,7 @@ void ScheduledWidget::setupComposeControls() { if (action == Ui::InputField::MimeAction::Check) { return CanSendFiles(data); } else if (action == Ui::InputField::MimeAction::Insert) { - return confirmSendingFiles( - data, - CompressConfirm::Auto, - data->text()); + return confirmSendingFiles(data, std::nullopt, data->text()); } Unexpected("action in MimeData hook."); }); @@ -285,8 +282,7 @@ void ScheduledWidget::chooseAttach() { if (!image.isNull() && !animated) { confirmSendingFiles( std::move(image), - std::move(result.remoteContent), - CompressConfirm::Auto); + std::move(result.remoteContent)); } else { uploadFile(result.remoteContent, SendMediaType::File); } @@ -294,18 +290,14 @@ void ScheduledWidget::chooseAttach() { auto list = Storage::PrepareMediaList( result.paths, st::sendMediaPreviewSize); - if (list.allFilesForCompress || list.albumIsPossible) { - confirmSendingFiles(std::move(list), CompressConfirm::Auto); - } else if (!showSendingFilesError(list)) { - confirmSendingFiles(std::move(list), CompressConfirm::No); - } + confirmSendingFiles(std::move(list)); } }), nullptr); } bool ScheduledWidget::confirmSendingFiles( not_null data, - CompressConfirm compressed, + std::optional overrideSendImagesAsPhotos, const QString &insertTextOnCancel) { const auto hasImage = data->hasImage(); @@ -317,10 +309,8 @@ bool ScheduledWidget::confirmSendingFiles( if (list.error == Ui::PreparedList::Error::None || !hasImage) { const auto emptyTextOnCancel = QString(); - confirmSendingFiles( - std::move(list), - compressed, - emptyTextOnCancel); + list.overrideSendImagesAsPhotos = overrideSendImagesAsPhotos; + confirmSendingFiles(std::move(list), emptyTextOnCancel); return true; } } @@ -335,7 +325,7 @@ bool ScheduledWidget::confirmSendingFiles( confirmSendingFiles( std::move(image), QByteArray(), - compressed, + overrideSendImagesAsPhotos, insertTextOnCancel); return true; } @@ -345,19 +335,11 @@ bool ScheduledWidget::confirmSendingFiles( bool ScheduledWidget::confirmSendingFiles( Ui::PreparedList &&list, - CompressConfirm compressed, const QString &insertTextOnCancel) { if (showSendingFilesError(list)) { return false; } - const auto noCompressOption = (list.files.size() > 1) - && !list.allFilesForCompress - && !list.albumIsPossible; - const auto boxCompressConfirm = noCompressOption - ? CompressConfirm::None - : compressed; - //const auto cursor = _field->textCursor(); //const auto position = cursor.position(); //const auto anchor = cursor.anchor(); @@ -367,7 +349,6 @@ bool ScheduledWidget::confirmSendingFiles( controller(), std::move(list), text, - boxCompressConfirm, _history->peer->slowmodeApplied() ? SendLimit::One : SendLimit::Many, CanScheduleUntilOnline(_history->peer) ? Api::SendType::ScheduledToUser @@ -384,10 +365,10 @@ bool ScheduledWidget::confirmSendingFiles( if (showSendingFilesError(list)) { return; } - const auto type = (way == Ui::SendFilesWay::Files) - ? SendMediaType::File - : SendMediaType::Photo; - const auto album = (way == Ui::SendFilesWay::Album) + const auto type = way.sendImagesAsPhotos() + ? SendMediaType::Photo + : SendMediaType::File; + const auto album = way.groupMediaInAlbums() // #TODO files ? std::make_shared() : nullptr; uploadFilesAfterConfirmation( @@ -421,7 +402,7 @@ bool ScheduledWidget::confirmSendingFiles( bool ScheduledWidget::confirmSendingFiles( QImage &&image, QByteArray &&content, - CompressConfirm compressed, + std::optional overrideSendImagesAsPhotos, const QString &insertTextOnCancel) { if (image.isNull()) { return false; @@ -431,10 +412,8 @@ bool ScheduledWidget::confirmSendingFiles( std::move(image), std::move(content), st::sendMediaPreviewSize); - return confirmSendingFiles( - std::move(list), - compressed, - insertTextOnCancel); + list.overrideSendImagesAsPhotos = overrideSendImagesAsPhotos; + return confirmSendingFiles(std::move(list), insertTextOnCancel); } void ScheduledWidget::uploadFilesAfterConfirmation( @@ -445,12 +424,11 @@ void ScheduledWidget::uploadFilesAfterConfirmation( Api::SendOptions options, std::shared_ptr album) { const auto isAlbum = (album != nullptr); - const auto compressImages = (type == SendMediaType::Photo); if (_history->peer->slowmodeApplied() && ((list.files.size() > 1 && !album) || (!list.files.empty() && !caption.text.isEmpty() - && !list.canAddCaption(isAlbum, compressImages)))) { + && !list.canAddCaption(isAlbum)))) { Ui::ShowMultilineToast({ .text = { tr::lng_slowmode_no_many(tr::now) }, }); @@ -1228,14 +1206,14 @@ void ScheduledWidget::setupDragArea() { nullptr, [=] { updateControlsGeometry(); }); - const auto droppedCallback = [=](CompressConfirm compressed) { + const auto droppedCallback = [=](bool overrideSendImagesAsPhotos) { return [=](const QMimeData *data) { - confirmSendingFiles(data, compressed); + confirmSendingFiles(data, overrideSendImagesAsPhotos); Window::ActivateWindow(controller()); }; }; - areas.document->setDroppedCallback(droppedCallback(CompressConfirm::No)); - areas.photo->setDroppedCallback(droppedCallback(CompressConfirm::Yes)); + areas.document->setDroppedCallback(droppedCallback(false)); + areas.photo->setDroppedCallback(droppedCallback(true)); } } // namespace HistoryView diff --git a/Telegram/SourceFiles/history/view/history_view_scheduled_section.h b/Telegram/SourceFiles/history/view/history_view_scheduled_section.h index 57af2c5c3..56c2377f4 100644 --- a/Telegram/SourceFiles/history/view/history_view_scheduled_section.h +++ b/Telegram/SourceFiles/history/view/history_view_scheduled_section.h @@ -13,7 +13,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_messages.h" class History; -enum class CompressConfirm; enum class SendMediaType; struct SendingAlbum; @@ -164,15 +163,14 @@ private: bool confirmSendingFiles( QImage &&image, QByteArray &&content, - CompressConfirm compressed, + std::optional overrideSendImagesAsPhotos = std::nullopt, const QString &insertTextOnCancel = QString()); bool confirmSendingFiles( Ui::PreparedList &&list, - CompressConfirm compressed, const QString &insertTextOnCancel = QString()); bool confirmSendingFiles( not_null data, - CompressConfirm compressed, + std::optional overrideSendImagesAsPhotos = std::nullopt, const QString &insertTextOnCancel = QString()); bool showSendingFilesError(const Ui::PreparedList &list) const; void uploadFilesAfterConfirmation( diff --git a/Telegram/SourceFiles/main/main_session_settings.cpp b/Telegram/SourceFiles/main/main_session_settings.cpp index 6b178cd01..e97770cbf 100644 --- a/Telegram/SourceFiles/main/main_session_settings.cpp +++ b/Telegram/SourceFiles/main/main_session_settings.cpp @@ -9,7 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "chat_helpers/tabbed_selector.h" #include "ui/widgets/input_fields.h" -#include "ui/chat/attach/attach_common.h" +#include "ui/chat/attach/attach_send_files_way.h" #include "window/section_widget.h" #include "support/support_common.h" #include "storage/serialize_common.h" @@ -97,7 +97,7 @@ void SessionSettings::addFromSerialized(const QByteArray &serialized) { float64 appDialogsWidthRatio = app.dialogsWidthRatio(); int appThirdColumnWidth = app.thirdColumnWidth(); int appThirdSectionExtendedBy = app.thirdSectionExtendedBy(); - qint32 appSendFilesWay = static_cast(app.sendFilesWay()); + qint32 appSendFilesWay = app.sendFilesWay().serialize(); qint32 legacyCallsPeerToPeer = qint32(0); qint32 appSendSubmitWay = static_cast(app.sendSubmitWay()); qint32 supportSwitch = static_cast(_supportSwitch); @@ -368,11 +368,8 @@ void SessionSettings::addFromSerialized(const QByteArray &serialized) { for (const auto &[key, value] : appSoundOverrides) { app.setSoundOverride(key, value); } - auto uncheckedSendFilesWay = static_cast(appSendFilesWay); - switch (uncheckedSendFilesWay) { - case Ui::SendFilesWay::Album: - case Ui::SendFilesWay::Photos: - case Ui::SendFilesWay::Files: app.setSendFilesWay(uncheckedSendFilesWay); break; + if (const auto sendFilesWay = Ui::SendFilesWay::FromSerialized(appSendFilesWay)) { + app.setSendFilesWay(*sendFilesWay); } auto uncheckedSendSubmitWay = static_cast( appSendSubmitWay); diff --git a/Telegram/SourceFiles/storage/details/storage_settings_scheme.cpp b/Telegram/SourceFiles/storage/details/storage_settings_scheme.cpp index 2bed620ff..6550150a8 100644 --- a/Telegram/SourceFiles/storage/details/storage_settings_scheme.cpp +++ b/Telegram/SourceFiles/storage/details/storage_settings_scheme.cpp @@ -14,7 +14,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "mtproto/mtproto_config.h" #include "ui/effects/animation_value.h" #include "ui/widgets/input_fields.h" -#include "ui/chat/attach/attach_common.h" +#include "ui/chat/attach/attach_send_files_way.h" #include "window/themes/window_theme.h" #include "core/update_checker.h" #include "platform/platform_specific.h" @@ -918,9 +918,10 @@ bool ReadSetting( stream >> v; if (!CheckStreamStatus(stream)) return false; - Core::App().settings().setSendFilesWay((v == 1) - ? Ui::SendFilesWay::Album - : Ui::SendFilesWay::Files); + auto way = Ui::SendFilesWay(); + way.setGroupMediaInAlbums(v == 1); + way.setSendImagesAsPhotos(v == 1); + Core::App().settings().setSendFilesWay(way); context.legacyRead = true; } break; diff --git a/Telegram/SourceFiles/storage/localimageloader.h b/Telegram/SourceFiles/storage/localimageloader.h index d744b5b4c..b550bb082 100644 --- a/Telegram/SourceFiles/storage/localimageloader.h +++ b/Telegram/SourceFiles/storage/localimageloader.h @@ -13,13 +13,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL constexpr auto kFileSizeLimit = 2000 * 1024 * 1024; // Load files up to 1500mb -enum class CompressConfirm { - Auto, - Yes, - No, - None, -}; - enum class SendMediaType { Photo, Audio, diff --git a/Telegram/SourceFiles/storage/storage_media_prepare.cpp b/Telegram/SourceFiles/storage/storage_media_prepare.cpp index ebd65091c..a7c79875e 100644 --- a/Telegram/SourceFiles/storage/storage_media_prepare.cpp +++ b/Telegram/SourceFiles/storage/storage_media_prepare.cpp @@ -122,7 +122,7 @@ void PrepareAlbum(PreparedList &result, int previewWidth) { return; } - result.albumIsPossible = (count > 1); + //result.albumIsPossible = (count > 1); auto waiting = 0; QSemaphore semaphore; for (auto &file : result.files) { @@ -132,13 +132,13 @@ void PrepareAlbum(PreparedList &result, int previewWidth) { } if (waiting > 0) { semaphore.acquire(waiting); - if (result.albumIsPossible) { - const auto badIt = ranges::find( - result.files, - PreparedFile::AlbumType::None, - [](const PreparedFile &file) { return file.type; }); - result.albumIsPossible = (badIt == result.files.end()); - } + //if (result.albumIsPossible) { + // const auto badIt = ranges::find( + // result.files, + // PreparedFile::AlbumType::None, + // [](const PreparedFile &file) { return file.type; }); + // result.albumIsPossible = (badIt == result.files.end()); + //} } } @@ -252,7 +252,7 @@ PreparedList PrepareMediaList(const QStringList &files, int previewWidth) { } const auto toCompress = HasExtensionFrom(file, extensionsToCompress); if (filesize > App::kImageSizeLimit || !toCompress) { - result.allFilesForCompress = false; +// result.allFilesForCompress = false; } result.files.emplace_back(file); } @@ -265,9 +265,6 @@ PreparedList PrepareMediaFromImage( QByteArray &&content, int previewWidth) { auto result = Storage::PreparedList(); - result.allFilesForCompress = Ui::ValidateThumbDimensions( - image.width(), - image.height()); auto file = PreparedFile(QString()); file.content = content; if (file.content.isEmpty()) { @@ -364,8 +361,7 @@ std::optional PreparedFileFromFilesDialog( } auto list = PreparedList(temp.error, temp.errorData); - list.albumIsPossible = isAlbum; - list.allFilesForCompress = temp.allFilesForCompress; + //list.albumIsPossible = isAlbum; list.files = std::move(filteredFiles); return list; diff --git a/Telegram/SourceFiles/ui/chat/attach/attach_album_preview.cpp b/Telegram/SourceFiles/ui/chat/attach/attach_album_preview.cpp index f7086ccd6..e57e5ab48 100644 --- a/Telegram/SourceFiles/ui/chat/attach/attach_album_preview.cpp +++ b/Telegram/SourceFiles/ui/chat/attach/attach_album_preview.cpp @@ -47,7 +47,8 @@ void AlbumPreview::setSendWay(SendFilesWay way) { void AlbumPreview::updateFileRows() { Expects(_order.size() == _thumbs.size()); - const auto isFile = (_sendWay == SendFilesWay::Files); + + const auto isFile = !_sendWay.sendImagesAsPhotos(); for (auto i = 0; i < _order.size(); i++) { _thumbs[i]->updateFileRow(isFile ? _order[i] : -1); } @@ -122,14 +123,14 @@ AlbumThumbnail *AlbumPreview::findThumb(QPoint position) const { position -= QPoint(contentLeft(), contentTop()); auto top = 0; - const auto isPhotosWay = (_sendWay == SendFilesWay::Photos); + const auto isPhotosWay = _sendWay.sendImagesAsPhotos(); const auto skip = isPhotosWay ? st::sendMediaPreviewPhotoSkip : st::sendMediaFileThumbSkip; auto find = [&](const auto &thumb) { - if (_sendWay == SendFilesWay::Album) { + if (_sendWay.groupMediaInAlbums()) { return thumb->containsPoint(position); - } else if (isPhotosWay || _sendWay == SendFilesWay::Files) { + } else { const auto bottom = top + (isPhotosWay ? thumb->photoHeight() : st::sendMediaFileThumbSize); @@ -248,14 +249,14 @@ void AlbumPreview::updateSizeAnimated( void AlbumPreview::updateSize() { const auto newHeight = [&] { - switch (_sendWay) { - case SendFilesWay::Album: + if (_sendWay.groupMediaInAlbums()) { return int(std::round(_thumbsHeightAnimation.value( _thumbsHeight))); - case SendFilesWay::Photos: return _photosHeight; - case SendFilesWay::Files: return _filesHeight; + } else if (_sendWay.sendImagesAsPhotos()) { + return _photosHeight; + } else { + return _filesHeight; } - Unexpected("Send way in AlbumPreview::updateSize"); }(); if (height() != newHeight) { resize(st::boxWideWidth, newHeight); @@ -265,10 +266,12 @@ void AlbumPreview::updateSize() { void AlbumPreview::paintEvent(QPaintEvent *e) { Painter p(this); - switch (_sendWay) { - case SendFilesWay::Album: paintAlbum(p); break; - case SendFilesWay::Photos: paintPhotos(p, e->rect()); break; - case SendFilesWay::Files: paintFiles(p, e->rect()); break; + if (_sendWay.groupMediaInAlbums()) { + paintAlbum(p); + } else if (_sendWay.sendImagesAsPhotos()) { + paintPhotos(p, e->rect()); + } else { + paintFiles(p, e->rect()); } } @@ -393,11 +396,11 @@ void AlbumPreview::mousePressEvent(QMouseEvent *e) { } void AlbumPreview::mouseMoveEvent(QMouseEvent *e) { - if (_sendWay == SendFilesWay::Files) { + if (!_sendWay.sendImagesAsPhotos()) { applyCursor(style::cur_default); return; } - const auto isAlbum = (_sendWay == SendFilesWay::Album); + const auto isAlbum = _sendWay.groupMediaInAlbums(); if (isAlbum && _draggedThumb) { const auto position = e->pos(); _draggedThumb->moveInAlbum(position - _draggedStartPosition); diff --git a/Telegram/SourceFiles/ui/chat/attach/attach_album_preview.h b/Telegram/SourceFiles/ui/chat/attach/attach_album_preview.h index 752cc2af7..fe9a2d160 100644 --- a/Telegram/SourceFiles/ui/chat/attach/attach_album_preview.h +++ b/Telegram/SourceFiles/ui/chat/attach/attach_album_preview.h @@ -8,7 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #pragma once #include "ui/rp_widget.h" -#include "ui/chat/attach/attach_common.h" +#include "ui/chat/attach/attach_send_files_way.h" namespace Ui { @@ -74,7 +74,7 @@ private: void finishDrag(); const PreparedList &_list; - SendFilesWay _sendWay = SendFilesWay::Files; + SendFilesWay _sendWay; style::cursor _cursor = style::cur_default; std::vector _order; std::vector> _thumbs; diff --git a/Telegram/SourceFiles/ui/chat/attach/attach_album_thumbnail.cpp b/Telegram/SourceFiles/ui/chat/attach/attach_album_thumbnail.cpp index 7664a2168..6b2618140 100644 --- a/Telegram/SourceFiles/ui/chat/attach/attach_album_thumbnail.cpp +++ b/Telegram/SourceFiles/ui/chat/attach/attach_album_thumbnail.cpp @@ -107,9 +107,7 @@ AlbumThumbnail::AlbumThumbnail( _editMedia->setClickedCallback([=] { base::call_delayed(duration, parent, editCallback); }); - _deleteMedia->setClickedCallback([=] { - base::call_delayed(duration, parent, deleteCallback); - }); + _deleteMedia->setClickedCallback(deleteCallback); _editMedia->setIconOverride(&st::editMediaButtonIconFile); _deleteMedia->setIconOverride(&st::sendBoxAlbumGroupDeleteButtonIconFile); diff --git a/Telegram/SourceFiles/ui/chat/attach/attach_album_thumbnail.h b/Telegram/SourceFiles/ui/chat/attach/attach_album_thumbnail.h index 13683d356..c492d4eeb 100644 --- a/Telegram/SourceFiles/ui/chat/attach/attach_album_thumbnail.h +++ b/Telegram/SourceFiles/ui/chat/attach/attach_album_thumbnail.h @@ -7,7 +7,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once -#include "ui/chat/attach/attach_common.h" +#include "ui/chat/attach/attach_send_files_way.h" #include "ui/effects/animations.h" #include "ui/grouped_layout.h" #include "ui/round_rect.h" diff --git a/Telegram/SourceFiles/ui/chat/attach/attach_common.h b/Telegram/SourceFiles/ui/chat/attach/attach_common.h deleted file mode 100644 index 89226df88..000000000 --- a/Telegram/SourceFiles/ui/chat/attach/attach_common.h +++ /dev/null @@ -1,24 +0,0 @@ -/* -This file is part of Telegram Desktop, -the official desktop application for the Telegram messaging service. - -For license and copyright information please follow this link: -https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL -*/ -#pragma once - -namespace Ui { - -enum class AttachButtonType { - Edit, - Delete, - None, -}; - -enum class SendFilesWay { - Album, - Photos, - Files, -}; - -} // namespace Ui diff --git a/Telegram/SourceFiles/ui/chat/attach/attach_prepare.cpp b/Telegram/SourceFiles/ui/chat/attach/attach_prepare.cpp index 06712deb9..1698eb5bb 100644 --- a/Telegram/SourceFiles/ui/chat/attach/attach_prepare.cpp +++ b/Telegram/SourceFiles/ui/chat/attach/attach_prepare.cpp @@ -32,8 +32,7 @@ PreparedList PreparedList::Reordered( Expects(list.files.size() == order.size()); auto result = PreparedList(list.error, list.errorData); - result.albumIsPossible = list.albumIsPossible; - result.allFilesForCompress = list.allFilesForCompress; + result.singleAlbumIsPossible = list.singleAlbumIsPossible; result.files.reserve(list.files.size()); for (auto index : order) { result.files.push_back(std::move(list.files[index])); @@ -50,7 +49,6 @@ void PreparedList::mergeToEnd(PreparedList &&other, bool cutToAlbumSize) { errorData = other.errorData; return; } - allFilesForCompress = allFilesForCompress && other.allFilesForCompress; files.reserve(std::min( size_t(cutToAlbumSize ? kMaxAlbumCount : INT_MAX), files.size() + other.files.size())); @@ -65,13 +63,13 @@ void PreparedList::mergeToEnd(PreparedList &&other, bool cutToAlbumSize) { files, PreparedFile::AlbumType::None, [](const PreparedFile &file) { return file.type; }); - albumIsPossible = (badIt == files.end()); + singleAlbumIsPossible = (badIt == files.end()); } else { - albumIsPossible = false; + singleAlbumIsPossible = false; } } -bool PreparedList::canAddCaption(bool isAlbum, bool compressImages) const { +bool PreparedList::canAddCaption(bool isAlbum) const { const auto isSticker = [&] { if (files.empty()) { return false; diff --git a/Telegram/SourceFiles/ui/chat/attach/attach_prepare.h b/Telegram/SourceFiles/ui/chat/attach/attach_prepare.h index 05f9e3db0..56e9781ec 100644 --- a/Telegram/SourceFiles/ui/chat/attach/attach_prepare.h +++ b/Telegram/SourceFiles/ui/chat/attach/attach_prepare.h @@ -7,6 +7,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once +#include + namespace Ui { struct PreparedFileInformation { @@ -71,13 +73,16 @@ struct PreparedList { std::vector order); void mergeToEnd(PreparedList &&other, bool cutToAlbumSize = false); - [[nodiscard]] bool canAddCaption(bool isAlbum, bool compressImages) const; + [[nodiscard]] bool canAddCaption(bool isAlbum) const; Error error = Error::None; QString errorData; std::vector files; - bool allFilesForCompress = true; - bool albumIsPossible = false; + std::deque filesToProcess; + std::optional overrideSendImagesAsPhotos; + //bool someFilesForCompress = false; + //bool someAlbumIsPossible = false; + bool singleAlbumIsPossible = false; }; [[nodiscard]] int MaxAlbumItems(); diff --git a/Telegram/SourceFiles/ui/chat/attach/attach_send_files_way.cpp b/Telegram/SourceFiles/ui/chat/attach/attach_send_files_way.cpp new file mode 100644 index 000000000..00fea6cd3 --- /dev/null +++ b/Telegram/SourceFiles/ui/chat/attach/attach_send_files_way.cpp @@ -0,0 +1,76 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#include "ui/chat/attach/attach_send_files_way.h" + +namespace Ui { + +void SendFilesWay::setGroupMediaInAlbums(bool value) { + if (value) { + _flags |= (Flag::GroupMediaInAlbums | Flag::SendImagesAsPhotos); + } else { + _flags &= ~Flag::GroupMediaInAlbums; + } +} + +void SendFilesWay::setSendImagesAsPhotos(bool value) { + if (value) { + _flags |= Flag::SendImagesAsPhotos; + } else { + _flags &= ~(Flag::SendImagesAsPhotos | Flag::GroupMediaInAlbums); + } +} + +void SendFilesWay::setGroupFiles(bool value) { + if (value) { + _flags |= Flag::GroupFiles; + } else { + _flags &= ~Flag::GroupFiles; + } +} + +//enum class SendFilesWay { // Old way. Serialize should be compatible. +// Album, +// Photos, +// Files, +//}; + +int32 SendFilesWay::serialize() const { + auto result = groupMediaInAlbums() + ? int32(0) + : sendImagesAsPhotos() + ? int32(1) + : int32(2); + if (!groupFiles()) { + result |= 0x04; + } + return result; +} + +std::optional SendFilesWay::FromSerialized(int32 value) { + auto result = SendFilesWay(); + result.setGroupFiles(!(value & 0x04)); + value &= ~0x04; + switch (value) { + case 0: + result.setGroupMediaInAlbums(true); + result.setSendImagesAsPhotos(true); + break; + case 1: + result.setGroupMediaInAlbums(false); + result.setSendImagesAsPhotos(true); + break; + case 2: + result.setGroupMediaInAlbums(false); + result.setSendImagesAsPhotos(false); + break; + default: return std::nullopt; + } + return result; +} + +} // namespace Ui diff --git a/Telegram/SourceFiles/ui/chat/attach/attach_send_files_way.h b/Telegram/SourceFiles/ui/chat/attach/attach_send_files_way.h new file mode 100644 index 000000000..53cb646c8 --- /dev/null +++ b/Telegram/SourceFiles/ui/chat/attach/attach_send_files_way.h @@ -0,0 +1,72 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#pragma once + +#include "base/flags.h" + +namespace Ui { + +enum class AttachButtonType { + Edit, + Delete, + None, +}; + +class SendFilesWay final { +public: + [[nodiscard]] bool groupMediaInAlbums() const { + return (_flags & Flag::GroupMediaInAlbums) != 0; + } + [[nodiscard]] bool sendImagesAsPhotos() const { + return (_flags & Flag::SendImagesAsPhotos) != 0; + } + [[nodiscard]] bool groupFiles() const { + return (_flags & Flag::GroupFiles); + } + void setGroupMediaInAlbums(bool value); + void setSendImagesAsPhotos(bool value); + void setGroupFiles(bool value); + + [[nodiscard]] inline bool operator<(const SendFilesWay &other) const { + return _flags < other._flags; + } + [[nodiscard]] inline bool operator>(const SendFilesWay &other) const { + return other < *this; + } + [[nodiscard]] inline bool operator<=(const SendFilesWay &other) const { + return !(other < *this); + } + [[nodiscard]] inline bool operator>=(const SendFilesWay &other) const { + return !(*this < other); + } + [[nodiscard]] inline bool operator==(const SendFilesWay &other) const { + return _flags == other._flags; + } + [[nodiscard]] inline bool operator!=(const SendFilesWay &other) const { + return !(*this == other); + } + + [[nodiscard]] int32 serialize() const; + [[nodiscard]] static std::optional FromSerialized( + int32 value); + +private: + enum class Flag : uchar { + GroupMediaInAlbums = (1 << 0), + SendImagesAsPhotos = (1 << 1), + GroupFiles = (1 << 2), + + Default = GroupMediaInAlbums | SendImagesAsPhotos | GroupFiles, + }; + friend inline constexpr bool is_flag_type(Flag) { return true; }; + + base::flags _flags = Flag::Default; + +}; + +} // namespace Ui diff --git a/Telegram/cmake/td_ui.cmake b/Telegram/cmake/td_ui.cmake index ac073df9c..1c7d0888c 100644 --- a/Telegram/cmake/td_ui.cmake +++ b/Telegram/cmake/td_ui.cmake @@ -68,11 +68,12 @@ PRIVATE ui/chat/attach/attach_album_thumbnail.h ui/chat/attach/attach_album_preview.cpp ui/chat/attach/attach_album_preview.h - ui/chat/attach/attach_common.h ui/chat/attach/attach_extensions.cpp ui/chat/attach/attach_extensions.h ui/chat/attach/attach_prepare.cpp ui/chat/attach/attach_prepare.h + ui/chat/attach/attach_send_files_way.cpp + ui/chat/attach/attach_send_files_way.h ui/chat/attach/attach_single_file_preview.cpp ui/chat/attach/attach_single_file_preview.h ui/chat/attach/attach_single_media_preview.cpp