Add setting for grouping files.

This commit is contained in:
John Preston 2020-10-15 17:27:16 +03:00
parent c2f0bcf933
commit 8d2fa313b7
25 changed files with 409 additions and 420 deletions

View file

@ -4213,8 +4213,7 @@ void ApiWrap::sendFiles(
const SendAction &action) { const SendAction &action) {
const auto haveCaption = !caption.text.isEmpty(); const auto haveCaption = !caption.text.isEmpty();
const auto isAlbum = (album != nullptr); const auto isAlbum = (album != nullptr);
const auto compressImages = (type == SendMediaType::Photo); if (haveCaption && !list.canAddCaption(isAlbum)) {
if (haveCaption && !list.canAddCaption(isAlbum, compressImages)) {
auto message = MessageToSend(action.history); auto message = MessageToSend(action.history);
message.textWithTags = std::move(caption); message.textWithTags = std::move(caption);
message.action = action; message.action = action;

View file

@ -32,6 +32,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/widgets/scroll_area.h" #include "ui/widgets/scroll_area.h"
#include "ui/wrap/fade_wrap.h" #include "ui/wrap/fade_wrap.h"
#include "ui/chat/attach/attach_prepare.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_album_preview.h"
#include "ui/chat/attach/attach_single_file_preview.h" #include "ui/chat/attach/attach_single_file_preview.h"
#include "ui/chat/attach/attach_single_media_preview.h" #include "ui/chat/attach/attach_single_media_preview.h"
@ -97,9 +98,9 @@ void FileDialogCallback(
rpl::producer<QString> FieldPlaceholder( rpl::producer<QString> FieldPlaceholder(
const Ui::PreparedList &list, const Ui::PreparedList &list,
SendFilesWay way) { SendFilesWay way) {
const auto isAlbum = (way == SendFilesWay::Album); const auto isAlbum = list.singleAlbumIsPossible
const auto compressImages = (way != SendFilesWay::Files); && way.groupMediaInAlbums();
return list.canAddCaption(isAlbum, compressImages) return list.canAddCaption(isAlbum)
? tr::lng_photo_caption() ? tr::lng_photo_caption()
: tr::lng_photos_comment(); : tr::lng_photos_comment();
} }
@ -111,15 +112,12 @@ SendFilesBox::SendFilesBox(
not_null<Window::SessionController*> controller, not_null<Window::SessionController*> controller,
Ui::PreparedList &&list, Ui::PreparedList &&list,
const TextWithTags &caption, const TextWithTags &caption,
CompressConfirm compressed,
SendLimit limit, SendLimit limit,
Api::SendType sendType, Api::SendType sendType,
SendMenu::Type sendMenuType) SendMenu::Type sendMenuType)
: _controller(controller) : _controller(controller)
, _sendType(sendType) , _sendType(sendType)
, _list(std::move(list)) , _list(std::move(list))
, _compressConfirmInitial(compressed)
, _compressConfirm(compressed)
, _sendLimit(limit) , _sendLimit(limit)
, _sendMenuType(sendMenuType) , _sendMenuType(sendMenuType)
, _caption( , _caption(
@ -131,11 +129,13 @@ SendFilesBox::SendFilesBox(
} }
void SendFilesBox::initPreview(rpl::producer<int> desiredPreviewHeight) { void SendFilesBox::initPreview(rpl::producer<int> desiredPreviewHeight) {
using namespace rpl::mappers;
setupControls(); setupControls();
updateBoxSize(); updateBoxSize();
using namespace rpl::mappers; _dimensionsLifetime.destroy();
rpl::combine( rpl::combine(
std::move(desiredPreviewHeight), std::move(desiredPreviewHeight),
_footerHeight.value(), _footerHeight.value(),
@ -145,7 +145,7 @@ void SendFilesBox::initPreview(rpl::producer<int> desiredPreviewHeight) {
st::boxWideWidth, st::boxWideWidth,
std::min(st::sendMediaPreviewHeightMax, height), std::min(st::sendMediaPreviewHeightMax, height),
true); true);
}, lifetime()); }, _dimensionsLifetime);
if (_preview) { if (_preview) {
_preview->show(); _preview->show();
@ -162,29 +162,23 @@ void SendFilesBox::prepareSingleFilePreview() {
Window::GifPauseReason::Layer); Window::GifPauseReason::Layer);
}, file); }, file);
if (media) { if (media) {
if (!media->canSendAsPhoto()) {
_compressConfirm = CompressConfirm::None;
}
_preview = media; _preview = media;
initPreview(media->desiredHeightValue()); initPreview(media->desiredHeightValue());
} else { } else {
const auto preview = Ui::CreateChild<Ui::SingleFilePreview>(this, file); const auto preview = Ui::CreateChild<Ui::SingleFilePreview>(this, file);
_compressConfirm = CompressConfirm::None;
_preview = preview; _preview = preview;
initPreview(preview->desiredHeightValue()); initPreview(preview->desiredHeightValue());
} }
} }
void SendFilesBox::prepareAlbumPreview() { void SendFilesBox::prepareAlbumPreview() {
Expects(_sendWay != nullptr);
const auto wrap = Ui::CreateChild<Ui::ScrollArea>( const auto wrap = Ui::CreateChild<Ui::ScrollArea>(
this, this,
st::boxScroll); st::boxScroll);
_albumPreview = wrap->setOwnedWidget(object_ptr<Ui::AlbumPreview>( _albumPreview = wrap->setOwnedWidget(object_ptr<Ui::AlbumPreview>(
this, this,
_list, _list,
_sendWay->value())); _sendWay.current()));
addThumbButtonHandlers(wrap); addThumbButtonHandlers(wrap);
@ -214,15 +208,10 @@ void SendFilesBox::addThumbButtonHandlers(not_null<Ui::ScrollArea*> wrap) {
_albumPreview = nullptr; _albumPreview = nullptr;
if (IsSingleItem(_list)) { if (IsSingleItem(_list)) {
_list.albumIsPossible = false; _list.singleAlbumIsPossible = false;
if (_sendWay->value() == SendFilesWay::Album) {
_sendWay->setValue(SendFilesWay::Photos);
}
} }
_compressConfirm = _compressConfirmInitial;
refreshAllAfterAlbumChanges(); refreshAllAfterAlbumChanges();
}, _albumPreview->lifetime()); }, _albumPreview->lifetime());
_albumPreview->thumbChanged( _albumPreview->thumbChanged(
@ -297,20 +286,20 @@ void SendFilesBox::prepare() {
addButton(tr::lng_cancel(), [=] { closeBox(); }); addButton(tr::lng_cancel(), [=] { closeBox(); });
initSendWay(); initSendWay();
setupCaption(); setupCaption();
setupSendWayControls();
preparePreview(); preparePreview();
boxClosing() | rpl::start_with_next([=] { boxClosing() | rpl::start_with_next([=] {
if (!_confirmed && _cancelledCallback) { if (!_confirmed && _cancelledCallback) {
_cancelledCallback(); _cancelledCallback();
} }
}, lifetime()); }, lifetime());
_addFileToAlbum = addLeftButton( _addFile = addLeftButton(
tr::lng_stickers_featured_add(), tr::lng_stickers_featured_add(),
App::LambdaDelayed(st::historyAttach.ripple.hideDuration, this, [=] { App::LambdaDelayed(st::historyAttach.ripple.hideDuration, this, [=] {
openDialogToAddFileToAlbum(); openDialogToAddFileToAlbum();
})); }));
updateLeftButtonVisibility();
setupDragArea(); setupDragArea();
} }
@ -348,21 +337,9 @@ void SendFilesBox::setupDragArea() {
}, lifetime()); }, 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() { void SendFilesBox::refreshAllAfterAlbumChanges() {
refreshAlbumMediaCount();
preparePreview(); preparePreview();
captionResized(); captionResized();
updateLeftButtonVisibility();
_albumChanged.fire({}); _albumChanged.fire({});
} }
@ -384,36 +361,23 @@ void SendFilesBox::openDialogToAddFileToAlbum() {
} }
void SendFilesBox::initSendWay() { void SendFilesBox::initSendWay() {
refreshAlbumMediaCount(); _sendWay = [&] {
const auto value = [&] { auto result = Core::App().settings().sendFilesWay();
if (_sendLimit == SendLimit::One if (_sendLimit == SendLimit::One) {
&& _list.albumIsPossible result.setGroupMediaInAlbums(true);
&& _list.files.size() > 1) { result.setGroupFiles(true);
return SendFilesWay::Album; 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 result;
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;
}(); }();
_sendWay = std::make_shared<Ui::RadioenumGroup<SendFilesWay>>(value); _sendWay.changes(
_sendWay->setChangedCallback([=](SendFilesWay value) { ) | rpl::start_with_next([=](SendFilesWay value) {
updateCaptionPlaceholder(); updateCaptionPlaceholder();
applyAlbumOrder(); applyAlbumOrder();
if (_albumPreview) { if (_albumPreview) {
@ -421,18 +385,17 @@ void SendFilesBox::initSendWay() {
} }
updateEmojiPanelGeometry(); updateEmojiPanelGeometry();
setInnerFocus(); setInnerFocus();
}); }, lifetime());
} }
void SendFilesBox::updateCaptionPlaceholder() { void SendFilesBox::updateCaptionPlaceholder() {
if (!_caption) { if (!_caption) {
return; return;
} }
const auto sendWay = _sendWay->value(); const auto sendWay = _sendWay.current();
const auto isAlbum = (sendWay == SendFilesWay::Album); const auto isAlbum = _list.singleAlbumIsPossible
const auto compressImages = (sendWay != SendFilesWay::Files); && sendWay.groupMediaInAlbums();
if (!_list.canAddCaption(isAlbum, compressImages) if (!_list.canAddCaption(isAlbum) && _sendLimit == SendLimit::One) {
&& _sendLimit == SendLimit::One) {
_caption->hide(); _caption->hide();
if (_emojiToggle) { if (_emojiToggle) {
_emojiToggle->hide(); _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() { void SendFilesBox::preparePreview() {
if (IsSingleItem(_list)) { if (IsSingleItem(_list)) {
prepareSingleFilePreview(); prepareSingleFilePreview();
} else { } else {
if (_list.albumIsPossible) { prepareAlbumPreview(); // #TODO files many albums
prepareAlbumPreview();
} else {
auto desiredPreviewHeight = rpl::single(0);
initPreview(std::move(desiredPreviewHeight));
}
} }
} }
void SendFilesBox::setupControls() { void SendFilesBox::setupControls() {
setupTitleText(); setupTitleText();
setupSendWayControls(); updateSendWayControlsVisibility();
} }
void SendFilesBox::setupSendWayControls() { void SendFilesBox::setupSendWayControls() {
_sendAlbum.destroy(); // #TODO files
_sendPhotos.destroy(); _groupMediaInAlbums.create(
_sendFiles.destroy(); this,
if (_compressConfirm == CompressConfirm::None "Group media in albums",
|| _sendLimit == SendLimit::One) { _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; return;
} }
const auto addRadio = [&]( const auto onlyOne = (_sendLimit == SendLimit::One);
object_ptr<Ui::Radioenum<SendFilesWay>> &button, _groupMediaInAlbums->setVisible(!onlyOne);
SendFilesWay value, _sendImagesAsPhotos->setVisible(/*_list.hasImagesForCompression()*/true); // #TODO files
const QString &text) { _groupFiles->setVisible(!onlyOne);
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()));
} }
void SendFilesBox::applyAlbumOrder() { void SendFilesBox::applyAlbumOrder() {
@ -682,34 +652,29 @@ bool SendFilesBox::addFiles(Ui::PreparedList list) {
const auto cutToAlbumSize = (sumFiles > Ui::MaxAlbumItems()); const auto cutToAlbumSize = (sumFiles > Ui::MaxAlbumItems());
if (list.error != Ui::PreparedList::Error::None) { if (list.error != Ui::PreparedList::Error::None) {
return false; return false;
} else if (!IsSingleItem(list) && !list.albumIsPossible) { //} else if (!IsSingleItem(list) && !list.albumIsPossible) { // #TODO files
return false; // return false;
} else if (!IsFirstAlbumItem(list)) { //} else if (!IsFirstAlbumItem(list)) {
return false; // return false;
} else if (_list.files.size() > 1 && !_albumPreview) { //} else if (_list.files.size() > 1 && !_albumPreview) {
return false; // return false;
} else if (!IsFirstAlbumItem(_list)) { //} else if (!IsFirstAlbumItem(_list)) {
return false; // return false;
} }
applyAlbumOrder(); applyAlbumOrder();
delete base::take(_preview); delete base::take(_preview);
_albumPreview = nullptr; _albumPreview = nullptr;
if (IsSingleItem(_list)
&& _sendWay->value() == SendFilesWay::Photos) {
_sendWay->setValue(SendFilesWay::Album);
}
_list.mergeToEnd(std::move(list), cutToAlbumSize); _list.mergeToEnd(std::move(list), cutToAlbumSize);
_compressConfirm = _compressConfirmInitial;
refreshAllAfterAlbumChanges(); refreshAllAfterAlbumChanges();
return true; return true;
} }
void SendFilesBox::setupTitleText() { void SendFilesBox::setupTitleText() {
if (_list.files.size() > 1) { if (_list.files.size() > 1) {
const auto onlyImages = (_compressConfirm != CompressConfirm::None) const auto onlyImages = false;/* #TODO files (_compressConfirm != CompressConfirm::None)
&& (_albumVideosCount == 0); && (_albumVideosCount == 0);*/
_titleText = onlyImages _titleText = onlyImages
? tr::lng_send_images_selected(tr::now, lt_count, _list.files.size()) ? tr::lng_send_images_selected(tr::now, lt_count, _list.files.size())
: tr::lng_send_files_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(); footerHeight += st::boxPhotoCaptionSkip + _caption->height();
} }
const auto pointers = { const auto pointers = {
_sendAlbum.data(), _groupMediaInAlbums.data(),
_sendPhotos.data(), _sendImagesAsPhotos.data(),
_sendFiles.data() _groupFiles.data()
}; };
for (auto pointer : pointers) { for (auto pointer : pointers) {
if (pointer) { if (pointer && !pointer->isHidden()) {
footerHeight += st::boxPhotoCompressedSkip footerHeight += st::boxPhotoCompressedSkip
+ pointer->heightNoMargins(); + pointer->heightNoMargins();
} }
@ -740,7 +705,7 @@ void SendFilesBox::updateBoxSize() {
} }
void SendFilesBox::keyPressEvent(QKeyEvent *e) { void SendFilesBox::keyPressEvent(QKeyEvent *e) {
if (e->matches(QKeySequence::Open) && !_addFileToAlbum->isHidden()) { if (e->matches(QKeySequence::Open)) {
openDialogToAddFileToAlbum(); openDialogToAddFileToAlbum();
} else if (e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return) { } else if (e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return) {
const auto modifiers = e->modifiers(); const auto modifiers = e->modifiers();
@ -792,12 +757,12 @@ void SendFilesBox::updateControlsGeometry() {
} }
} }
const auto pointers = { const auto pointers = {
_sendAlbum.data(), _groupMediaInAlbums.data(),
_sendPhotos.data(), _sendImagesAsPhotos.data(),
_sendFiles.data() _groupFiles.data()
}; };
for (const auto pointer : ranges::view::reverse(pointers)) { for (const auto pointer : ranges::view::reverse(pointers)) {
if (pointer) { if (pointer && !pointer->isHidden()) {
pointer->moveToLeft( pointer->moveToLeft(
st::boxPhotoPadding.left(), st::boxPhotoPadding.left(),
bottom - pointer->heightNoMargins()); bottom - pointer->heightNoMargins());
@ -827,23 +792,22 @@ void SendFilesBox::send(
return sendScheduled(); return sendScheduled();
} }
using Way = SendFilesWay; auto way = _sendWay.current();
const auto way = _sendWay ? _sendWay->value() : Way::Files; auto oldWay = Core::App().settings().sendFilesWay();
if (_list.overrideSendImagesAsPhotos == way.sendImagesAsPhotos()
if (_compressConfirm == CompressConfirm::Auto) { || _sendImagesAsPhotos->isHidden()) {
const auto oldWay = Core::App().settings().sendFilesWay(); way.setSendImagesAsPhotos(oldWay.sendImagesAsPhotos());
}
if (_groupMediaInAlbums->isHidden()) {
way.setGroupMediaInAlbums(oldWay.groupMediaInAlbums());
}
if (_groupFiles->isHidden()) {
way.setGroupFiles(oldWay.groupFiles());
}
if (way != oldWay) { 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().settings().setSendFilesWay(way);
Core::App().saveSettingsDelayed(); Core::App().saveSettingsDelayed();
} }
}
}
applyAlbumOrder(); applyAlbumOrder();
_confirmed = true; _confirmed = true;

View file

@ -10,6 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include <rpl/variable.h> #include <rpl/variable.h>
#include "boxes/abstract_box.h" #include "boxes/abstract_box.h"
#include "ui/chat/attach/attach_prepare.h" #include "ui/chat/attach/attach_prepare.h"
#include "ui/chat/attach/attach_send_files_way.h"
#include "storage/localimageloader.h" #include "storage/localimageloader.h"
#include "storage/storage_media_prepare.h" #include "storage/storage_media_prepare.h"
@ -27,16 +28,12 @@ class TabbedPanel;
} // namespace ChatHelpers } // namespace ChatHelpers
namespace Ui { namespace Ui {
template <typename Enum> class Checkbox;
class Radioenum;
template <typename Enum>
class RadioenumGroup;
class RoundButton; class RoundButton;
class InputField; class InputField;
struct GroupMediaLayout; struct GroupMediaLayout;
class EmojiButton; class EmojiButton;
class AlbumPreview; class AlbumPreview;
enum class SendFilesWay;
} // namespace Ui } // namespace Ui
namespace Window { namespace Window {
@ -58,7 +55,6 @@ public:
not_null<Window::SessionController*> controller, not_null<Window::SessionController*> controller,
Ui::PreparedList &&list, Ui::PreparedList &&list,
const TextWithTags &caption, const TextWithTags &caption,
CompressConfirm compressed,
SendLimit limit, SendLimit limit,
Api::SendType sendType, Api::SendType sendType,
SendMenu::Type sendMenuType); SendMenu::Type sendMenuType);
@ -98,10 +94,10 @@ private:
not_null<Ui::AlbumPreview*> content); not_null<Ui::AlbumPreview*> content);
void setupEmojiPanel(); void setupEmojiPanel();
void updateSendWayControlsVisibility();
void updateEmojiPanelGeometry(); void updateEmojiPanelGeometry();
void emojiFilterForGeometry(not_null<QEvent*> event); void emojiFilterForGeometry(not_null<QEvent*> event);
void refreshAlbumMediaCount();
void preparePreview(); void preparePreview();
void prepareSingleFilePreview(); void prepareSingleFilePreview();
void prepareAlbumPreview(); void prepareAlbumPreview();
@ -125,7 +121,6 @@ private:
bool addFiles(Ui::PreparedList list); bool addFiles(Ui::PreparedList list);
void openDialogToAddFileToAlbum(); void openDialogToAddFileToAlbum();
void updateLeftButtonVisibility();
void refreshAllAfterAlbumChanges(); void refreshAllAfterAlbumChanges();
const not_null<Window::SessionController*> _controller; const not_null<Window::SessionController*> _controller;
@ -136,8 +131,6 @@ private:
Ui::PreparedList _list; Ui::PreparedList _list;
CompressConfirm _compressConfirmInitial = CompressConfirm::None;
CompressConfirm _compressConfirm = CompressConfirm::None;
SendLimit _sendLimit = SendLimit::Many; SendLimit _sendLimit = SendLimit::Many;
SendMenu::Type _sendMenuType = SendMenu::Type(); SendMenu::Type _sendMenuType = SendMenu::Type();
@ -155,22 +148,21 @@ private:
base::unique_qptr<ChatHelpers::TabbedPanel> _emojiPanel; base::unique_qptr<ChatHelpers::TabbedPanel> _emojiPanel;
base::unique_qptr<QObject> _emojiFilter; base::unique_qptr<QObject> _emojiFilter;
object_ptr<Ui::Radioenum<Ui::SendFilesWay>> _sendAlbum = { nullptr }; object_ptr<Ui::Checkbox> _groupMediaInAlbums = { nullptr };
object_ptr<Ui::Radioenum<Ui::SendFilesWay>> _sendPhotos = { nullptr }; object_ptr<Ui::Checkbox> _sendImagesAsPhotos = { nullptr };
object_ptr<Ui::Radioenum<Ui::SendFilesWay>> _sendFiles = { nullptr }; object_ptr<Ui::Checkbox> _groupFiles = { nullptr };
std::shared_ptr<Ui::RadioenumGroup<Ui::SendFilesWay>> _sendWay; rpl::variable<Ui::SendFilesWay> _sendWay = Ui::SendFilesWay();
rpl::variable<int> _footerHeight = 0; rpl::variable<int> _footerHeight = 0;
rpl::event_stream<> _albumChanged; rpl::event_stream<> _albumChanged;
rpl::lifetime _dimensionsLifetime;
QWidget *_preview = nullptr; QWidget *_preview = nullptr;
Ui::AlbumPreview *_albumPreview = nullptr; Ui::AlbumPreview *_albumPreview = nullptr;
int _albumVideosCount = 0;
int _albumPhotosCount = 0;
int _lastScrollTop = 0; int _lastScrollTop = 0;
QPointer<Ui::RoundButton> _send; QPointer<Ui::RoundButton> _send;
QPointer<Ui::RoundButton> _addFileToAlbum; QPointer<Ui::RoundButton> _addFile;
}; };

View file

@ -9,7 +9,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "boxes/send_files_box.h" #include "boxes/send_files_box.h"
#include "ui/widgets/input_fields.h" #include "ui/widgets/input_fields.h"
#include "ui/chat/attach/attach_common.h"
#include "storage/serialize_common.h" #include "storage/serialize_common.h"
#include "window/themes/window_theme.h" #include "window/themes/window_theme.h"
#include "window/section_widget.h" #include "window/section_widget.h"
@ -19,8 +18,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
namespace Core { namespace Core {
Settings::Settings() Settings::Settings()
: _sendFilesWay(Ui::SendFilesWay::Album) : _sendSubmitWay(Ui::InputSubmitSettings::Enter)
, _sendSubmitWay(Ui::InputSubmitSettings::Enter)
, _floatPlayerColumn(Window::Column::Second) , _floatPlayerColumn(Window::Column::Second)
, _floatPlayerCorner(RectPart::TopRight) , _floatPlayerCorner(RectPart::TopRight)
, _dialogsWidthRatio(DefaultDialogsWidthRatio()) { , _dialogsWidthRatio(DefaultDialogsWidthRatio()) {
@ -76,7 +74,7 @@ QByteArray Settings::serialize() const {
stream << key << value; stream << key << value;
} }
stream stream
<< qint32(_sendFilesWay) << qint32(_sendFilesWay.serialize())
<< qint32(_sendSubmitWay) << qint32(_sendSubmitWay)
<< qint32(_includeMutedCounter ? 1 : 0) << qint32(_includeMutedCounter ? 1 : 0)
<< qint32(_countUnreadMessages ? 1 : 0) << qint32(_countUnreadMessages ? 1 : 0)
@ -150,7 +148,7 @@ void Settings::addFromSerialized(const QByteArray &serialized) {
qint32 lastSeenWarningSeen = _lastSeenWarningSeen ? 1 : 0; qint32 lastSeenWarningSeen = _lastSeenWarningSeen ? 1 : 0;
qint32 soundOverridesCount = 0; qint32 soundOverridesCount = 0;
base::flat_map<QString, QString> soundOverrides; base::flat_map<QString, QString> soundOverrides;
qint32 sendFilesWay = static_cast<qint32>(_sendFilesWay); qint32 sendFilesWay = _sendFilesWay.serialize();
qint32 sendSubmitWay = static_cast<qint32>(_sendSubmitWay); qint32 sendSubmitWay = static_cast<qint32>(_sendSubmitWay);
qint32 includeMutedCounter = _includeMutedCounter ? 1 : 0; qint32 includeMutedCounter = _includeMutedCounter ? 1 : 0;
qint32 countUnreadMessages = _countUnreadMessages ? 1 : 0; qint32 countUnreadMessages = _countUnreadMessages ? 1 : 0;
@ -310,12 +308,7 @@ void Settings::addFromSerialized(const QByteArray &serialized) {
_callAudioDuckingEnabled = (callAudioDuckingEnabled == 1); _callAudioDuckingEnabled = (callAudioDuckingEnabled == 1);
_lastSeenWarningSeen = (lastSeenWarningSeen == 1); _lastSeenWarningSeen = (lastSeenWarningSeen == 1);
_soundOverrides = std::move(soundOverrides); _soundOverrides = std::move(soundOverrides);
auto uncheckedSendFilesWay = static_cast<Ui::SendFilesWay>(sendFilesWay); _sendFilesWay = Ui::SendFilesWay::FromSerialized(sendFilesWay).value_or(_sendFilesWay);
switch (uncheckedSendFilesWay) {
case Ui::SendFilesWay::Album:
case Ui::SendFilesWay::Photos:
case Ui::SendFilesWay::Files: _sendFilesWay = uncheckedSendFilesWay; break;
}
auto uncheckedSendSubmitWay = static_cast<Ui::InputSubmitSettings>(sendSubmitWay); auto uncheckedSendSubmitWay = static_cast<Ui::InputSubmitSettings>(sendSubmitWay);
switch (uncheckedSendSubmitWay) { switch (uncheckedSendSubmitWay) {
case Ui::InputSubmitSettings::Enter: case Ui::InputSubmitSettings::Enter:
@ -470,7 +463,7 @@ void Settings::resetOnLastLogout() {
//_themesAccentColors = Window::Theme::AccentColors(); //_themesAccentColors = Window::Theme::AccentColors();
_lastSeenWarningSeen = false; _lastSeenWarningSeen = false;
_sendFilesWay = Ui::SendFilesWay::Album; _sendFilesWay = Ui::SendFilesWay();
//_sendSubmitWay = Ui::InputSubmitSettings::Enter; //_sendSubmitWay = Ui::InputSubmitSettings::Enter;
_soundOverrides = {}; _soundOverrides = {};

View file

@ -9,12 +9,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "window/themes/window_themes_embedded.h" #include "window/themes/window_themes_embedded.h"
#include "window/window_controls_layout.h" #include "window/window_controls_layout.h"
#include "ui/chat/attach/attach_send_files_way.h"
enum class RectPart; enum class RectPart;
namespace Ui { namespace Ui {
enum class InputSubmitSettings; enum class InputSubmitSettings;
enum class SendFilesWay;
} // namespace Ui } // namespace Ui
namespace Window { namespace Window {

View file

@ -31,7 +31,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/text/text_utilities.h" // Ui::Text::ToUpper #include "ui/text/text_utilities.h" // Ui::Text::ToUpper
#include "ui/text/format_values.h" #include "ui/text/format_values.h"
#include "ui/chat/message_bar.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/image/image.h"
#include "ui/special_buttons.h" #include "ui/special_buttons.h"
#include "ui/controls/emoji_button.h" #include "ui/controls/emoji_button.h"
@ -327,10 +327,7 @@ HistoryWidget::HistoryWidget(
if (action == Ui::InputField::MimeAction::Check) { if (action == Ui::InputField::MimeAction::Check) {
return canSendFiles(data); return canSendFiles(data);
} else if (action == Ui::InputField::MimeAction::Insert) { } else if (action == Ui::InputField::MimeAction::Insert) {
return confirmSendingFiles( return confirmSendingFiles(data, std::nullopt, data->text());
data,
CompressConfirm::Auto,
data->text());
} }
Unexpected("action in MimeData hook."); Unexpected("action in MimeData hook.");
}); });
@ -375,11 +372,11 @@ HistoryWidget::HistoryWidget(
crl::guard(this, [=](bool f) { _field->setAcceptDrops(f); }), crl::guard(this, [=](bool f) { _field->setAcceptDrops(f); }),
crl::guard(this, [=] { updateControlsGeometry(); })); crl::guard(this, [=] { updateControlsGeometry(); }));
_attachDragAreas.document->setDroppedCallback([=](const QMimeData *data) { _attachDragAreas.document->setDroppedCallback([=](const QMimeData *data) {
confirmSendingFiles(data, CompressConfirm::No); confirmSendingFiles(data, false);
Window::ActivateWindow(controller); Window::ActivateWindow(controller);
}); });
_attachDragAreas.photo->setDroppedCallback([=](const QMimeData *data) { _attachDragAreas.photo->setDroppedCallback([=](const QMimeData *data) {
confirmSendingFiles(data, CompressConfirm::Yes); confirmSendingFiles(data, true);
Window::ActivateWindow(controller); Window::ActivateWindow(controller);
}); });
@ -3298,8 +3295,7 @@ void HistoryWidget::chooseAttach() {
if (!image.isNull() && !animated) { if (!image.isNull() && !animated) {
confirmSendingFiles( confirmSendingFiles(
std::move(image), std::move(image),
std::move(result.remoteContent), std::move(result.remoteContent));
CompressConfirm::Auto);
} else { } else {
uploadFile(result.remoteContent, SendMediaType::File); uploadFile(result.remoteContent, SendMediaType::File);
} }
@ -3307,11 +3303,7 @@ void HistoryWidget::chooseAttach() {
auto list = Storage::PrepareMediaList( auto list = Storage::PrepareMediaList(
result.paths, result.paths,
st::sendMediaPreviewSize); st::sendMediaPreviewSize);
if (list.allFilesForCompress || list.albumIsPossible) { confirmSendingFiles(std::move(list));
confirmSendingFiles(std::move(list), CompressConfirm::Auto);
} else if (!showSendingFilesError(list)) {
confirmSendingFiles(std::move(list), CompressConfirm::No);
}
} }
}), nullptr); }), nullptr);
} }
@ -4107,7 +4099,7 @@ bool HistoryWidget::showSendingFilesError(
} }
if (list.files.size() > 1 if (list.files.size() > 1
&& _peer->slowmodeApplied() && _peer->slowmodeApplied()
&& !list.albumIsPossible) { && !list.singleAlbumIsPossible) {
return tr::lng_slowmode_no_many(tr::now); return tr::lng_slowmode_no_many(tr::now);
} else if (const auto left = _peer->slowmodeSecondsLeft()) { } else if (const auto left = _peer->slowmodeSecondsLeft()) {
return tr::lng_slowmode_enabled( return tr::lng_slowmode_enabled(
@ -4142,26 +4134,23 @@ bool HistoryWidget::showSendingFilesError(
} }
bool HistoryWidget::confirmSendingFiles(const QStringList &files) { bool HistoryWidget::confirmSendingFiles(const QStringList &files) {
return confirmSendingFiles(files, CompressConfirm::Auto); return confirmSendingFiles(files, QString());
} }
bool HistoryWidget::confirmSendingFiles(not_null<const QMimeData*> data) { bool HistoryWidget::confirmSendingFiles(not_null<const QMimeData*> data) {
return confirmSendingFiles(data, CompressConfirm::Auto); return confirmSendingFiles(data, std::nullopt);
} }
bool HistoryWidget::confirmSendingFiles( bool HistoryWidget::confirmSendingFiles(
const QStringList &files, const QStringList &files,
CompressConfirm compressed,
const QString &insertTextOnCancel) { const QString &insertTextOnCancel) {
return confirmSendingFiles( return confirmSendingFiles(
Storage::PrepareMediaList(files, st::sendMediaPreviewSize), Storage::PrepareMediaList(files, st::sendMediaPreviewSize),
compressed,
insertTextOnCancel); insertTextOnCancel);
} }
bool HistoryWidget::confirmSendingFiles( bool HistoryWidget::confirmSendingFiles(
Ui::PreparedList &&list, Ui::PreparedList &&list,
CompressConfirm compressed,
const QString &insertTextOnCancel) { const QString &insertTextOnCancel) {
if (showSendingFilesError(list)) { if (showSendingFilesError(list)) {
return false; return false;
@ -4171,13 +4160,6 @@ bool HistoryWidget::confirmSendingFiles(
return false; 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 cursor = _field->textCursor();
const auto position = cursor.position(); const auto position = cursor.position();
const auto anchor = cursor.anchor(); const auto anchor = cursor.anchor();
@ -4187,7 +4169,6 @@ bool HistoryWidget::confirmSendingFiles(
controller(), controller(),
std::move(list), std::move(list),
text, text,
boxCompressConfirm,
_peer->slowmodeApplied() ? SendLimit::One : SendLimit::Many, _peer->slowmodeApplied() ? SendLimit::One : SendLimit::Many,
Api::SendType::Normal, Api::SendType::Normal,
sendMenuType()); sendMenuType());
@ -4201,10 +4182,10 @@ bool HistoryWidget::confirmSendingFiles(
if (showSendingFilesError(list)) { if (showSendingFilesError(list)) {
return; return;
} }
const auto type = (way == Ui::SendFilesWay::Files) const auto type = way.sendImagesAsPhotos()
? SendMediaType::File ? SendMediaType::Photo
: SendMediaType::Photo; : SendMediaType::File;
const auto album = (way == Ui::SendFilesWay::Album) const auto album = way.groupMediaInAlbums() // #TODO files
? std::make_shared<SendingAlbum>() ? std::make_shared<SendingAlbum>()
: nullptr; : nullptr;
uploadFilesAfterConfirmation( uploadFilesAfterConfirmation(
@ -4238,7 +4219,7 @@ bool HistoryWidget::confirmSendingFiles(
bool HistoryWidget::confirmSendingFiles( bool HistoryWidget::confirmSendingFiles(
QImage &&image, QImage &&image,
QByteArray &&content, QByteArray &&content,
CompressConfirm compressed, std::optional<bool> overrideSendImagesAsPhotos,
const QString &insertTextOnCancel) { const QString &insertTextOnCancel) {
if (image.isNull()) { if (image.isNull()) {
return false; return false;
@ -4248,10 +4229,8 @@ bool HistoryWidget::confirmSendingFiles(
std::move(image), std::move(image),
std::move(content), std::move(content),
st::sendMediaPreviewSize); st::sendMediaPreviewSize);
return confirmSendingFiles( list.overrideSendImagesAsPhotos = overrideSendImagesAsPhotos;
std::move(list), return confirmSendingFiles(std::move(list), insertTextOnCancel);
compressed,
insertTextOnCancel);
} }
bool HistoryWidget::canSendFiles(not_null<const QMimeData*> data) const { bool HistoryWidget::canSendFiles(not_null<const QMimeData*> data) const {
@ -4269,7 +4248,7 @@ bool HistoryWidget::canSendFiles(not_null<const QMimeData*> data) const {
bool HistoryWidget::confirmSendingFiles( bool HistoryWidget::confirmSendingFiles(
not_null<const QMimeData*> data, not_null<const QMimeData*> data,
CompressConfirm compressed, std::optional<bool> overrideSendImagesAsPhotos,
const QString &insertTextOnCancel) { const QString &insertTextOnCancel) {
if (!canWriteMessage()) { if (!canWriteMessage()) {
return false; return false;
@ -4285,10 +4264,8 @@ bool HistoryWidget::confirmSendingFiles(
if (list.error == Ui::PreparedList::Error::None if (list.error == Ui::PreparedList::Error::None
|| !hasImage) { || !hasImage) {
const auto emptyTextOnCancel = QString(); const auto emptyTextOnCancel = QString();
confirmSendingFiles( list.overrideSendImagesAsPhotos = overrideSendImagesAsPhotos;
std::move(list), confirmSendingFiles(std::move(list), emptyTextOnCancel);
compressed,
emptyTextOnCancel);
return true; return true;
} }
} }
@ -4303,7 +4280,7 @@ bool HistoryWidget::confirmSendingFiles(
confirmSendingFiles( confirmSendingFiles(
std::move(image), std::move(image),
QByteArray(), QByteArray(),
compressed, overrideSendImagesAsPhotos,
insertTextOnCancel); insertTextOnCancel);
return true; return true;
} }
@ -4321,12 +4298,11 @@ void HistoryWidget::uploadFilesAfterConfirmation(
Assert(canWriteMessage()); Assert(canWriteMessage());
const auto isAlbum = (album != nullptr); const auto isAlbum = (album != nullptr);
const auto compressImages = (type == SendMediaType::Photo);
if (_peer->slowmodeApplied() if (_peer->slowmodeApplied()
&& ((list.files.size() > 1 && !album) && ((list.files.size() > 1 && !album)
|| (!list.files.empty() || (!list.files.empty()
&& !caption.text.isEmpty() && !caption.text.isEmpty()
&& !list.canAddCaption(isAlbum, compressImages)))) { && !list.canAddCaption(isAlbum)))) {
Ui::ShowMultilineToast({ Ui::ShowMultilineToast({
.text = { tr::lng_slowmode_no_many(tr::now) }, .text = { tr::lng_slowmode_no_many(tr::now) },
}); });

View file

@ -23,7 +23,6 @@ class RPCError;
struct FileLoadResult; struct FileLoadResult;
struct SendingAlbum; struct SendingAlbum;
enum class SendMediaType; enum class SendMediaType;
enum class CompressConfirm;
class MessageLinksParser; class MessageLinksParser;
namespace SendMenu { namespace SendMenu {
@ -411,20 +410,18 @@ private:
bool canSendFiles(not_null<const QMimeData*> data) const; bool canSendFiles(not_null<const QMimeData*> data) const;
bool confirmSendingFiles( bool confirmSendingFiles(
const QStringList &files, const QStringList &files,
CompressConfirm compressed, const QString &insertTextOnCancel);
const QString &insertTextOnCancel = QString());
bool confirmSendingFiles( bool confirmSendingFiles(
QImage &&image, QImage &&image,
QByteArray &&content, QByteArray &&content,
CompressConfirm compressed, std::optional<bool> overrideSendImagesAsPhotos = std::nullopt,
const QString &insertTextOnCancel = QString()); const QString &insertTextOnCancel = QString());
bool confirmSendingFiles( bool confirmSendingFiles(
not_null<const QMimeData*> data, not_null<const QMimeData*> data,
CompressConfirm compressed, std::optional<bool> overrideSendImagesAsPhotos,
const QString &insertTextOnCancel = QString()); const QString &insertTextOnCancel = QString());
bool confirmSendingFiles( bool confirmSendingFiles(
Ui::PreparedList &&list, Ui::PreparedList &&list,
CompressConfirm compressed,
const QString &insertTextOnCancel = QString()); const QString &insertTextOnCancel = QString());
bool showSendingFilesError(const Ui::PreparedList &list) const; bool showSendingFilesError(const Ui::PreparedList &list) const;

View file

@ -27,7 +27,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/text/format_values.h" #include "ui/text/format_values.h"
#include "ui/text/text_utilities.h" #include "ui/text/text_utilities.h"
#include "ui/chat/attach/attach_prepare.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/special_buttons.h"
#include "ui/ui_utility.h" #include "ui/ui_utility.h"
#include "ui/toasts/common_toasts.h" #include "ui/toasts/common_toasts.h"
@ -505,10 +505,7 @@ void RepliesWidget::setupComposeControls() {
if (action == Ui::InputField::MimeAction::Check) { if (action == Ui::InputField::MimeAction::Check) {
return CanSendFiles(data); return CanSendFiles(data);
} else if (action == Ui::InputField::MimeAction::Insert) { } else if (action == Ui::InputField::MimeAction::Insert) {
return confirmSendingFiles( return confirmSendingFiles(data, std::nullopt, data->text());
data,
CompressConfirm::Auto,
data->text());
} }
Unexpected("action in MimeData hook."); Unexpected("action in MimeData hook.");
}); });
@ -545,8 +542,7 @@ void RepliesWidget::chooseAttach() {
if (!image.isNull() && !animated) { if (!image.isNull() && !animated) {
confirmSendingFiles( confirmSendingFiles(
std::move(image), std::move(image),
std::move(result.remoteContent), std::move(result.remoteContent));
CompressConfirm::Auto);
} else { } else {
uploadFile(result.remoteContent, SendMediaType::File); uploadFile(result.remoteContent, SendMediaType::File);
} }
@ -554,18 +550,14 @@ void RepliesWidget::chooseAttach() {
auto list = Storage::PrepareMediaList( auto list = Storage::PrepareMediaList(
result.paths, result.paths,
st::sendMediaPreviewSize); st::sendMediaPreviewSize);
if (list.allFilesForCompress || list.albumIsPossible) { confirmSendingFiles(std::move(list));
confirmSendingFiles(std::move(list), CompressConfirm::Auto);
} else if (!showSendingFilesError(list)) {
confirmSendingFiles(std::move(list), CompressConfirm::No);
}
} }
}), nullptr); }), nullptr);
} }
bool RepliesWidget::confirmSendingFiles( bool RepliesWidget::confirmSendingFiles(
not_null<const QMimeData*> data, not_null<const QMimeData*> data,
CompressConfirm compressed, std::optional<bool> overrideSendImagesAsPhotos,
const QString &insertTextOnCancel) { const QString &insertTextOnCancel) {
const auto hasImage = data->hasImage(); const auto hasImage = data->hasImage();
@ -577,10 +569,8 @@ bool RepliesWidget::confirmSendingFiles(
if (list.error == Ui::PreparedList::Error::None if (list.error == Ui::PreparedList::Error::None
|| !hasImage) { || !hasImage) {
const auto emptyTextOnCancel = QString(); const auto emptyTextOnCancel = QString();
confirmSendingFiles( list.overrideSendImagesAsPhotos = overrideSendImagesAsPhotos;
std::move(list), confirmSendingFiles(std::move(list), emptyTextOnCancel);
compressed,
emptyTextOnCancel);
return true; return true;
} }
} }
@ -595,7 +585,7 @@ bool RepliesWidget::confirmSendingFiles(
confirmSendingFiles( confirmSendingFiles(
std::move(image), std::move(image),
QByteArray(), QByteArray(),
compressed, overrideSendImagesAsPhotos,
insertTextOnCancel); insertTextOnCancel);
return true; return true;
} }
@ -605,19 +595,11 @@ bool RepliesWidget::confirmSendingFiles(
bool RepliesWidget::confirmSendingFiles( bool RepliesWidget::confirmSendingFiles(
Ui::PreparedList &&list, Ui::PreparedList &&list,
CompressConfirm compressed,
const QString &insertTextOnCancel) { const QString &insertTextOnCancel) {
if (showSendingFilesError(list)) { if (showSendingFilesError(list)) {
return false; 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 cursor = _field->textCursor();
//const auto position = cursor.position(); //const auto position = cursor.position();
//const auto anchor = cursor.anchor(); //const auto anchor = cursor.anchor();
@ -627,7 +609,6 @@ bool RepliesWidget::confirmSendingFiles(
controller(), controller(),
std::move(list), std::move(list),
text, text,
boxCompressConfirm,
_history->peer->slowmodeApplied() ? SendLimit::One : SendLimit::Many, _history->peer->slowmodeApplied() ? SendLimit::One : SendLimit::Many,
Api::SendType::Normal, Api::SendType::Normal,
SendMenu::Type::Disabled); // #TODO replies schedule SendMenu::Type::Disabled); // #TODO replies schedule
@ -643,10 +624,10 @@ bool RepliesWidget::confirmSendingFiles(
if (showSendingFilesError(list)) { if (showSendingFilesError(list)) {
return; return;
} }
const auto type = (way == Ui::SendFilesWay::Files) const auto type = way.sendImagesAsPhotos()
? SendMediaType::File ? SendMediaType::Photo
: SendMediaType::Photo; : SendMediaType::File;
const auto album = (way == Ui::SendFilesWay::Album) const auto album = way.groupMediaInAlbums() // #TODO files
? std::make_shared<SendingAlbum>() ? std::make_shared<SendingAlbum>()
: nullptr; : nullptr;
uploadFilesAfterConfirmation( uploadFilesAfterConfirmation(
@ -683,7 +664,7 @@ bool RepliesWidget::confirmSendingFiles(
bool RepliesWidget::confirmSendingFiles( bool RepliesWidget::confirmSendingFiles(
QImage &&image, QImage &&image,
QByteArray &&content, QByteArray &&content,
CompressConfirm compressed, std::optional<bool> overrideSendImagesAsPhotos,
const QString &insertTextOnCancel) { const QString &insertTextOnCancel) {
if (image.isNull()) { if (image.isNull()) {
return false; return false;
@ -693,10 +674,8 @@ bool RepliesWidget::confirmSendingFiles(
std::move(image), std::move(image),
std::move(content), std::move(content),
st::sendMediaPreviewSize); st::sendMediaPreviewSize);
return confirmSendingFiles( list.overrideSendImagesAsPhotos = overrideSendImagesAsPhotos;
std::move(list), return confirmSendingFiles(std::move(list), insertTextOnCancel);
compressed,
insertTextOnCancel);
} }
bool RepliesWidget::showSlowmodeError() { bool RepliesWidget::showSlowmodeError() {
@ -737,12 +716,11 @@ void RepliesWidget::uploadFilesAfterConfirmation(
Api::SendOptions options, Api::SendOptions options,
std::shared_ptr<SendingAlbum> album) { std::shared_ptr<SendingAlbum> album) {
const auto isAlbum = (album != nullptr); const auto isAlbum = (album != nullptr);
const auto compressImages = (type == SendMediaType::Photo);
if (_history->peer->slowmodeApplied() if (_history->peer->slowmodeApplied()
&& ((list.files.size() > 1 && !album) && ((list.files.size() > 1 && !album)
|| (!list.files.empty() || (!list.files.empty()
&& !caption.text.isEmpty() && !caption.text.isEmpty()
&& !list.canAddCaption(isAlbum, compressImages)))) { && !list.canAddCaption(isAlbum)))) {
Ui::ShowMultilineToast({ Ui::ShowMultilineToast({
.text = { tr::lng_slowmode_no_many(tr::now) } .text = { tr::lng_slowmode_no_many(tr::now) }
}); });
@ -830,7 +808,7 @@ bool RepliesWidget::showSendingFilesError(
} }
if (list.files.size() > 1 if (list.files.size() > 1
&& _history->peer->slowmodeApplied() && _history->peer->slowmodeApplied()
&& !list.albumIsPossible) { && !list.singleAlbumIsPossible) {
return tr::lng_slowmode_no_many(tr::now); return tr::lng_slowmode_no_many(tr::now);
} else if (const auto left = _history->peer->slowmodeSecondsLeft()) { } else if (const auto left = _history->peer->slowmodeSecondsLeft()) {
return tr::lng_slowmode_enabled( return tr::lng_slowmode_enabled(
@ -1808,14 +1786,14 @@ void RepliesWidget::setupDragArea() {
nullptr, nullptr,
[=] { updateControlsGeometry(); }); [=] { updateControlsGeometry(); });
const auto droppedCallback = [=](CompressConfirm compressed) { const auto droppedCallback = [=](bool overrideSendImagesAsPhotos) {
return [=](const QMimeData *data) { return [=](const QMimeData *data) {
confirmSendingFiles(data, compressed); confirmSendingFiles(data, overrideSendImagesAsPhotos);
Window::ActivateWindow(controller()); Window::ActivateWindow(controller());
}; };
}; };
areas.document->setDroppedCallback(droppedCallback(CompressConfirm::No)); areas.document->setDroppedCallback(droppedCallback(false));
areas.photo->setDroppedCallback(droppedCallback(CompressConfirm::Yes)); areas.photo->setDroppedCallback(droppedCallback(true));
} }
} // namespace HistoryView } // namespace HistoryView

View file

@ -14,7 +14,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "base/timer.h" #include "base/timer.h"
class History; class History;
enum class CompressConfirm;
enum class SendMediaType; enum class SendMediaType;
struct SendingAlbum; struct SendingAlbum;
@ -198,15 +197,14 @@ private:
bool confirmSendingFiles( bool confirmSendingFiles(
QImage &&image, QImage &&image,
QByteArray &&content, QByteArray &&content,
CompressConfirm compressed, std::optional<bool> overrideSendImagesAsPhotos = std::nullopt,
const QString &insertTextOnCancel = QString()); const QString &insertTextOnCancel = QString());
bool confirmSendingFiles( bool confirmSendingFiles(
Ui::PreparedList &&list, Ui::PreparedList &&list,
CompressConfirm compressed,
const QString &insertTextOnCancel = QString()); const QString &insertTextOnCancel = QString());
bool confirmSendingFiles( bool confirmSendingFiles(
not_null<const QMimeData*> data, not_null<const QMimeData*> data,
CompressConfirm compressed, std::optional<bool> overrideSendImagesAsPhotos = std::nullopt,
const QString &insertTextOnCancel = QString()); const QString &insertTextOnCancel = QString());
bool showSendingFilesError(const Ui::PreparedList &list) const; bool showSendingFilesError(const Ui::PreparedList &list) const;
void uploadFilesAfterConfirmation( void uploadFilesAfterConfirmation(

View file

@ -21,7 +21,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/item_text_options.h" #include "ui/item_text_options.h"
#include "ui/toast/toast.h" #include "ui/toast/toast.h"
#include "ui/chat/attach/attach_prepare.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/special_buttons.h"
#include "ui/ui_utility.h" #include "ui/ui_utility.h"
#include "ui/toasts/common_toasts.h" #include "ui/toasts/common_toasts.h"
@ -249,10 +249,7 @@ void ScheduledWidget::setupComposeControls() {
if (action == Ui::InputField::MimeAction::Check) { if (action == Ui::InputField::MimeAction::Check) {
return CanSendFiles(data); return CanSendFiles(data);
} else if (action == Ui::InputField::MimeAction::Insert) { } else if (action == Ui::InputField::MimeAction::Insert) {
return confirmSendingFiles( return confirmSendingFiles(data, std::nullopt, data->text());
data,
CompressConfirm::Auto,
data->text());
} }
Unexpected("action in MimeData hook."); Unexpected("action in MimeData hook.");
}); });
@ -285,8 +282,7 @@ void ScheduledWidget::chooseAttach() {
if (!image.isNull() && !animated) { if (!image.isNull() && !animated) {
confirmSendingFiles( confirmSendingFiles(
std::move(image), std::move(image),
std::move(result.remoteContent), std::move(result.remoteContent));
CompressConfirm::Auto);
} else { } else {
uploadFile(result.remoteContent, SendMediaType::File); uploadFile(result.remoteContent, SendMediaType::File);
} }
@ -294,18 +290,14 @@ void ScheduledWidget::chooseAttach() {
auto list = Storage::PrepareMediaList( auto list = Storage::PrepareMediaList(
result.paths, result.paths,
st::sendMediaPreviewSize); st::sendMediaPreviewSize);
if (list.allFilesForCompress || list.albumIsPossible) { confirmSendingFiles(std::move(list));
confirmSendingFiles(std::move(list), CompressConfirm::Auto);
} else if (!showSendingFilesError(list)) {
confirmSendingFiles(std::move(list), CompressConfirm::No);
}
} }
}), nullptr); }), nullptr);
} }
bool ScheduledWidget::confirmSendingFiles( bool ScheduledWidget::confirmSendingFiles(
not_null<const QMimeData*> data, not_null<const QMimeData*> data,
CompressConfirm compressed, std::optional<bool> overrideSendImagesAsPhotos,
const QString &insertTextOnCancel) { const QString &insertTextOnCancel) {
const auto hasImage = data->hasImage(); const auto hasImage = data->hasImage();
@ -317,10 +309,8 @@ bool ScheduledWidget::confirmSendingFiles(
if (list.error == Ui::PreparedList::Error::None if (list.error == Ui::PreparedList::Error::None
|| !hasImage) { || !hasImage) {
const auto emptyTextOnCancel = QString(); const auto emptyTextOnCancel = QString();
confirmSendingFiles( list.overrideSendImagesAsPhotos = overrideSendImagesAsPhotos;
std::move(list), confirmSendingFiles(std::move(list), emptyTextOnCancel);
compressed,
emptyTextOnCancel);
return true; return true;
} }
} }
@ -335,7 +325,7 @@ bool ScheduledWidget::confirmSendingFiles(
confirmSendingFiles( confirmSendingFiles(
std::move(image), std::move(image),
QByteArray(), QByteArray(),
compressed, overrideSendImagesAsPhotos,
insertTextOnCancel); insertTextOnCancel);
return true; return true;
} }
@ -345,19 +335,11 @@ bool ScheduledWidget::confirmSendingFiles(
bool ScheduledWidget::confirmSendingFiles( bool ScheduledWidget::confirmSendingFiles(
Ui::PreparedList &&list, Ui::PreparedList &&list,
CompressConfirm compressed,
const QString &insertTextOnCancel) { const QString &insertTextOnCancel) {
if (showSendingFilesError(list)) { if (showSendingFilesError(list)) {
return false; 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 cursor = _field->textCursor();
//const auto position = cursor.position(); //const auto position = cursor.position();
//const auto anchor = cursor.anchor(); //const auto anchor = cursor.anchor();
@ -367,7 +349,6 @@ bool ScheduledWidget::confirmSendingFiles(
controller(), controller(),
std::move(list), std::move(list),
text, text,
boxCompressConfirm,
_history->peer->slowmodeApplied() ? SendLimit::One : SendLimit::Many, _history->peer->slowmodeApplied() ? SendLimit::One : SendLimit::Many,
CanScheduleUntilOnline(_history->peer) CanScheduleUntilOnline(_history->peer)
? Api::SendType::ScheduledToUser ? Api::SendType::ScheduledToUser
@ -384,10 +365,10 @@ bool ScheduledWidget::confirmSendingFiles(
if (showSendingFilesError(list)) { if (showSendingFilesError(list)) {
return; return;
} }
const auto type = (way == Ui::SendFilesWay::Files) const auto type = way.sendImagesAsPhotos()
? SendMediaType::File ? SendMediaType::Photo
: SendMediaType::Photo; : SendMediaType::File;
const auto album = (way == Ui::SendFilesWay::Album) const auto album = way.groupMediaInAlbums() // #TODO files
? std::make_shared<SendingAlbum>() ? std::make_shared<SendingAlbum>()
: nullptr; : nullptr;
uploadFilesAfterConfirmation( uploadFilesAfterConfirmation(
@ -421,7 +402,7 @@ bool ScheduledWidget::confirmSendingFiles(
bool ScheduledWidget::confirmSendingFiles( bool ScheduledWidget::confirmSendingFiles(
QImage &&image, QImage &&image,
QByteArray &&content, QByteArray &&content,
CompressConfirm compressed, std::optional<bool> overrideSendImagesAsPhotos,
const QString &insertTextOnCancel) { const QString &insertTextOnCancel) {
if (image.isNull()) { if (image.isNull()) {
return false; return false;
@ -431,10 +412,8 @@ bool ScheduledWidget::confirmSendingFiles(
std::move(image), std::move(image),
std::move(content), std::move(content),
st::sendMediaPreviewSize); st::sendMediaPreviewSize);
return confirmSendingFiles( list.overrideSendImagesAsPhotos = overrideSendImagesAsPhotos;
std::move(list), return confirmSendingFiles(std::move(list), insertTextOnCancel);
compressed,
insertTextOnCancel);
} }
void ScheduledWidget::uploadFilesAfterConfirmation( void ScheduledWidget::uploadFilesAfterConfirmation(
@ -445,12 +424,11 @@ void ScheduledWidget::uploadFilesAfterConfirmation(
Api::SendOptions options, Api::SendOptions options,
std::shared_ptr<SendingAlbum> album) { std::shared_ptr<SendingAlbum> album) {
const auto isAlbum = (album != nullptr); const auto isAlbum = (album != nullptr);
const auto compressImages = (type == SendMediaType::Photo);
if (_history->peer->slowmodeApplied() if (_history->peer->slowmodeApplied()
&& ((list.files.size() > 1 && !album) && ((list.files.size() > 1 && !album)
|| (!list.files.empty() || (!list.files.empty()
&& !caption.text.isEmpty() && !caption.text.isEmpty()
&& !list.canAddCaption(isAlbum, compressImages)))) { && !list.canAddCaption(isAlbum)))) {
Ui::ShowMultilineToast({ Ui::ShowMultilineToast({
.text = { tr::lng_slowmode_no_many(tr::now) }, .text = { tr::lng_slowmode_no_many(tr::now) },
}); });
@ -1228,14 +1206,14 @@ void ScheduledWidget::setupDragArea() {
nullptr, nullptr,
[=] { updateControlsGeometry(); }); [=] { updateControlsGeometry(); });
const auto droppedCallback = [=](CompressConfirm compressed) { const auto droppedCallback = [=](bool overrideSendImagesAsPhotos) {
return [=](const QMimeData *data) { return [=](const QMimeData *data) {
confirmSendingFiles(data, compressed); confirmSendingFiles(data, overrideSendImagesAsPhotos);
Window::ActivateWindow(controller()); Window::ActivateWindow(controller());
}; };
}; };
areas.document->setDroppedCallback(droppedCallback(CompressConfirm::No)); areas.document->setDroppedCallback(droppedCallback(false));
areas.photo->setDroppedCallback(droppedCallback(CompressConfirm::Yes)); areas.photo->setDroppedCallback(droppedCallback(true));
} }
} // namespace HistoryView } // namespace HistoryView

View file

@ -13,7 +13,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "data/data_messages.h" #include "data/data_messages.h"
class History; class History;
enum class CompressConfirm;
enum class SendMediaType; enum class SendMediaType;
struct SendingAlbum; struct SendingAlbum;
@ -164,15 +163,14 @@ private:
bool confirmSendingFiles( bool confirmSendingFiles(
QImage &&image, QImage &&image,
QByteArray &&content, QByteArray &&content,
CompressConfirm compressed, std::optional<bool> overrideSendImagesAsPhotos = std::nullopt,
const QString &insertTextOnCancel = QString()); const QString &insertTextOnCancel = QString());
bool confirmSendingFiles( bool confirmSendingFiles(
Ui::PreparedList &&list, Ui::PreparedList &&list,
CompressConfirm compressed,
const QString &insertTextOnCancel = QString()); const QString &insertTextOnCancel = QString());
bool confirmSendingFiles( bool confirmSendingFiles(
not_null<const QMimeData*> data, not_null<const QMimeData*> data,
CompressConfirm compressed, std::optional<bool> overrideSendImagesAsPhotos = std::nullopt,
const QString &insertTextOnCancel = QString()); const QString &insertTextOnCancel = QString());
bool showSendingFilesError(const Ui::PreparedList &list) const; bool showSendingFilesError(const Ui::PreparedList &list) const;
void uploadFilesAfterConfirmation( void uploadFilesAfterConfirmation(

View file

@ -9,7 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "chat_helpers/tabbed_selector.h" #include "chat_helpers/tabbed_selector.h"
#include "ui/widgets/input_fields.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 "window/section_widget.h"
#include "support/support_common.h" #include "support/support_common.h"
#include "storage/serialize_common.h" #include "storage/serialize_common.h"
@ -97,7 +97,7 @@ void SessionSettings::addFromSerialized(const QByteArray &serialized) {
float64 appDialogsWidthRatio = app.dialogsWidthRatio(); float64 appDialogsWidthRatio = app.dialogsWidthRatio();
int appThirdColumnWidth = app.thirdColumnWidth(); int appThirdColumnWidth = app.thirdColumnWidth();
int appThirdSectionExtendedBy = app.thirdSectionExtendedBy(); int appThirdSectionExtendedBy = app.thirdSectionExtendedBy();
qint32 appSendFilesWay = static_cast<qint32>(app.sendFilesWay()); qint32 appSendFilesWay = app.sendFilesWay().serialize();
qint32 legacyCallsPeerToPeer = qint32(0); qint32 legacyCallsPeerToPeer = qint32(0);
qint32 appSendSubmitWay = static_cast<qint32>(app.sendSubmitWay()); qint32 appSendSubmitWay = static_cast<qint32>(app.sendSubmitWay());
qint32 supportSwitch = static_cast<qint32>(_supportSwitch); qint32 supportSwitch = static_cast<qint32>(_supportSwitch);
@ -368,11 +368,8 @@ void SessionSettings::addFromSerialized(const QByteArray &serialized) {
for (const auto &[key, value] : appSoundOverrides) { for (const auto &[key, value] : appSoundOverrides) {
app.setSoundOverride(key, value); app.setSoundOverride(key, value);
} }
auto uncheckedSendFilesWay = static_cast<Ui::SendFilesWay>(appSendFilesWay); if (const auto sendFilesWay = Ui::SendFilesWay::FromSerialized(appSendFilesWay)) {
switch (uncheckedSendFilesWay) { app.setSendFilesWay(*sendFilesWay);
case Ui::SendFilesWay::Album:
case Ui::SendFilesWay::Photos:
case Ui::SendFilesWay::Files: app.setSendFilesWay(uncheckedSendFilesWay); break;
} }
auto uncheckedSendSubmitWay = static_cast<Ui::InputSubmitSettings>( auto uncheckedSendSubmitWay = static_cast<Ui::InputSubmitSettings>(
appSendSubmitWay); appSendSubmitWay);

View file

@ -14,7 +14,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "mtproto/mtproto_config.h" #include "mtproto/mtproto_config.h"
#include "ui/effects/animation_value.h" #include "ui/effects/animation_value.h"
#include "ui/widgets/input_fields.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 "window/themes/window_theme.h"
#include "core/update_checker.h" #include "core/update_checker.h"
#include "platform/platform_specific.h" #include "platform/platform_specific.h"
@ -918,9 +918,10 @@ bool ReadSetting(
stream >> v; stream >> v;
if (!CheckStreamStatus(stream)) return false; if (!CheckStreamStatus(stream)) return false;
Core::App().settings().setSendFilesWay((v == 1) auto way = Ui::SendFilesWay();
? Ui::SendFilesWay::Album way.setGroupMediaInAlbums(v == 1);
: Ui::SendFilesWay::Files); way.setSendImagesAsPhotos(v == 1);
Core::App().settings().setSendFilesWay(way);
context.legacyRead = true; context.legacyRead = true;
} break; } break;

View file

@ -13,13 +13,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
constexpr auto kFileSizeLimit = 2000 * 1024 * 1024; // Load files up to 1500mb constexpr auto kFileSizeLimit = 2000 * 1024 * 1024; // Load files up to 1500mb
enum class CompressConfirm {
Auto,
Yes,
No,
None,
};
enum class SendMediaType { enum class SendMediaType {
Photo, Photo,
Audio, Audio,

View file

@ -122,7 +122,7 @@ void PrepareAlbum(PreparedList &result, int previewWidth) {
return; return;
} }
result.albumIsPossible = (count > 1); //result.albumIsPossible = (count > 1);
auto waiting = 0; auto waiting = 0;
QSemaphore semaphore; QSemaphore semaphore;
for (auto &file : result.files) { for (auto &file : result.files) {
@ -132,13 +132,13 @@ void PrepareAlbum(PreparedList &result, int previewWidth) {
} }
if (waiting > 0) { if (waiting > 0) {
semaphore.acquire(waiting); semaphore.acquire(waiting);
if (result.albumIsPossible) { //if (result.albumIsPossible) {
const auto badIt = ranges::find( // const auto badIt = ranges::find(
result.files, // result.files,
PreparedFile::AlbumType::None, // PreparedFile::AlbumType::None,
[](const PreparedFile &file) { return file.type; }); // [](const PreparedFile &file) { return file.type; });
result.albumIsPossible = (badIt == result.files.end()); // result.albumIsPossible = (badIt == result.files.end());
} //}
} }
} }
@ -252,7 +252,7 @@ PreparedList PrepareMediaList(const QStringList &files, int previewWidth) {
} }
const auto toCompress = HasExtensionFrom(file, extensionsToCompress); const auto toCompress = HasExtensionFrom(file, extensionsToCompress);
if (filesize > App::kImageSizeLimit || !toCompress) { if (filesize > App::kImageSizeLimit || !toCompress) {
result.allFilesForCompress = false; // result.allFilesForCompress = false;
} }
result.files.emplace_back(file); result.files.emplace_back(file);
} }
@ -265,9 +265,6 @@ PreparedList PrepareMediaFromImage(
QByteArray &&content, QByteArray &&content,
int previewWidth) { int previewWidth) {
auto result = Storage::PreparedList(); auto result = Storage::PreparedList();
result.allFilesForCompress = Ui::ValidateThumbDimensions(
image.width(),
image.height());
auto file = PreparedFile(QString()); auto file = PreparedFile(QString());
file.content = content; file.content = content;
if (file.content.isEmpty()) { if (file.content.isEmpty()) {
@ -364,8 +361,7 @@ std::optional<PreparedList> PreparedFileFromFilesDialog(
} }
auto list = PreparedList(temp.error, temp.errorData); auto list = PreparedList(temp.error, temp.errorData);
list.albumIsPossible = isAlbum; //list.albumIsPossible = isAlbum;
list.allFilesForCompress = temp.allFilesForCompress;
list.files = std::move(filteredFiles); list.files = std::move(filteredFiles);
return list; return list;

View file

@ -47,7 +47,8 @@ void AlbumPreview::setSendWay(SendFilesWay way) {
void AlbumPreview::updateFileRows() { void AlbumPreview::updateFileRows() {
Expects(_order.size() == _thumbs.size()); Expects(_order.size() == _thumbs.size());
const auto isFile = (_sendWay == SendFilesWay::Files);
const auto isFile = !_sendWay.sendImagesAsPhotos();
for (auto i = 0; i < _order.size(); i++) { for (auto i = 0; i < _order.size(); i++) {
_thumbs[i]->updateFileRow(isFile ? _order[i] : -1); _thumbs[i]->updateFileRow(isFile ? _order[i] : -1);
} }
@ -122,14 +123,14 @@ AlbumThumbnail *AlbumPreview::findThumb(QPoint position) const {
position -= QPoint(contentLeft(), contentTop()); position -= QPoint(contentLeft(), contentTop());
auto top = 0; auto top = 0;
const auto isPhotosWay = (_sendWay == SendFilesWay::Photos); const auto isPhotosWay = _sendWay.sendImagesAsPhotos();
const auto skip = isPhotosWay const auto skip = isPhotosWay
? st::sendMediaPreviewPhotoSkip ? st::sendMediaPreviewPhotoSkip
: st::sendMediaFileThumbSkip; : st::sendMediaFileThumbSkip;
auto find = [&](const auto &thumb) { auto find = [&](const auto &thumb) {
if (_sendWay == SendFilesWay::Album) { if (_sendWay.groupMediaInAlbums()) {
return thumb->containsPoint(position); return thumb->containsPoint(position);
} else if (isPhotosWay || _sendWay == SendFilesWay::Files) { } else {
const auto bottom = top + (isPhotosWay const auto bottom = top + (isPhotosWay
? thumb->photoHeight() ? thumb->photoHeight()
: st::sendMediaFileThumbSize); : st::sendMediaFileThumbSize);
@ -248,14 +249,14 @@ void AlbumPreview::updateSizeAnimated(
void AlbumPreview::updateSize() { void AlbumPreview::updateSize() {
const auto newHeight = [&] { const auto newHeight = [&] {
switch (_sendWay) { if (_sendWay.groupMediaInAlbums()) {
case SendFilesWay::Album:
return int(std::round(_thumbsHeightAnimation.value( return int(std::round(_thumbsHeightAnimation.value(
_thumbsHeight))); _thumbsHeight)));
case SendFilesWay::Photos: return _photosHeight; } else if (_sendWay.sendImagesAsPhotos()) {
case SendFilesWay::Files: return _filesHeight; return _photosHeight;
} else {
return _filesHeight;
} }
Unexpected("Send way in AlbumPreview::updateSize");
}(); }();
if (height() != newHeight) { if (height() != newHeight) {
resize(st::boxWideWidth, newHeight); resize(st::boxWideWidth, newHeight);
@ -265,10 +266,12 @@ void AlbumPreview::updateSize() {
void AlbumPreview::paintEvent(QPaintEvent *e) { void AlbumPreview::paintEvent(QPaintEvent *e) {
Painter p(this); Painter p(this);
switch (_sendWay) { if (_sendWay.groupMediaInAlbums()) {
case SendFilesWay::Album: paintAlbum(p); break; paintAlbum(p);
case SendFilesWay::Photos: paintPhotos(p, e->rect()); break; } else if (_sendWay.sendImagesAsPhotos()) {
case SendFilesWay::Files: paintFiles(p, e->rect()); break; paintPhotos(p, e->rect());
} else {
paintFiles(p, e->rect());
} }
} }
@ -393,11 +396,11 @@ void AlbumPreview::mousePressEvent(QMouseEvent *e) {
} }
void AlbumPreview::mouseMoveEvent(QMouseEvent *e) { void AlbumPreview::mouseMoveEvent(QMouseEvent *e) {
if (_sendWay == SendFilesWay::Files) { if (!_sendWay.sendImagesAsPhotos()) {
applyCursor(style::cur_default); applyCursor(style::cur_default);
return; return;
} }
const auto isAlbum = (_sendWay == SendFilesWay::Album); const auto isAlbum = _sendWay.groupMediaInAlbums();
if (isAlbum && _draggedThumb) { if (isAlbum && _draggedThumb) {
const auto position = e->pos(); const auto position = e->pos();
_draggedThumb->moveInAlbum(position - _draggedStartPosition); _draggedThumb->moveInAlbum(position - _draggedStartPosition);

View file

@ -8,7 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#pragma once #pragma once
#include "ui/rp_widget.h" #include "ui/rp_widget.h"
#include "ui/chat/attach/attach_common.h" #include "ui/chat/attach/attach_send_files_way.h"
namespace Ui { namespace Ui {
@ -74,7 +74,7 @@ private:
void finishDrag(); void finishDrag();
const PreparedList &_list; const PreparedList &_list;
SendFilesWay _sendWay = SendFilesWay::Files; SendFilesWay _sendWay;
style::cursor _cursor = style::cur_default; style::cursor _cursor = style::cur_default;
std::vector<int> _order; std::vector<int> _order;
std::vector<std::unique_ptr<AlbumThumbnail>> _thumbs; std::vector<std::unique_ptr<AlbumThumbnail>> _thumbs;

View file

@ -107,9 +107,7 @@ AlbumThumbnail::AlbumThumbnail(
_editMedia->setClickedCallback([=] { _editMedia->setClickedCallback([=] {
base::call_delayed(duration, parent, editCallback); base::call_delayed(duration, parent, editCallback);
}); });
_deleteMedia->setClickedCallback([=] { _deleteMedia->setClickedCallback(deleteCallback);
base::call_delayed(duration, parent, deleteCallback);
});
_editMedia->setIconOverride(&st::editMediaButtonIconFile); _editMedia->setIconOverride(&st::editMediaButtonIconFile);
_deleteMedia->setIconOverride(&st::sendBoxAlbumGroupDeleteButtonIconFile); _deleteMedia->setIconOverride(&st::sendBoxAlbumGroupDeleteButtonIconFile);

View file

@ -7,7 +7,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/ */
#pragma once #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/effects/animations.h"
#include "ui/grouped_layout.h" #include "ui/grouped_layout.h"
#include "ui/round_rect.h" #include "ui/round_rect.h"

View file

@ -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

View file

@ -32,8 +32,7 @@ PreparedList PreparedList::Reordered(
Expects(list.files.size() == order.size()); Expects(list.files.size() == order.size());
auto result = PreparedList(list.error, list.errorData); auto result = PreparedList(list.error, list.errorData);
result.albumIsPossible = list.albumIsPossible; result.singleAlbumIsPossible = list.singleAlbumIsPossible;
result.allFilesForCompress = list.allFilesForCompress;
result.files.reserve(list.files.size()); result.files.reserve(list.files.size());
for (auto index : order) { for (auto index : order) {
result.files.push_back(std::move(list.files[index])); result.files.push_back(std::move(list.files[index]));
@ -50,7 +49,6 @@ void PreparedList::mergeToEnd(PreparedList &&other, bool cutToAlbumSize) {
errorData = other.errorData; errorData = other.errorData;
return; return;
} }
allFilesForCompress = allFilesForCompress && other.allFilesForCompress;
files.reserve(std::min( files.reserve(std::min(
size_t(cutToAlbumSize ? kMaxAlbumCount : INT_MAX), size_t(cutToAlbumSize ? kMaxAlbumCount : INT_MAX),
files.size() + other.files.size())); files.size() + other.files.size()));
@ -65,13 +63,13 @@ void PreparedList::mergeToEnd(PreparedList &&other, bool cutToAlbumSize) {
files, files,
PreparedFile::AlbumType::None, PreparedFile::AlbumType::None,
[](const PreparedFile &file) { return file.type; }); [](const PreparedFile &file) { return file.type; });
albumIsPossible = (badIt == files.end()); singleAlbumIsPossible = (badIt == files.end());
} else { } else {
albumIsPossible = false; singleAlbumIsPossible = false;
} }
} }
bool PreparedList::canAddCaption(bool isAlbum, bool compressImages) const { bool PreparedList::canAddCaption(bool isAlbum) const {
const auto isSticker = [&] { const auto isSticker = [&] {
if (files.empty()) { if (files.empty()) {
return false; return false;

View file

@ -7,6 +7,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/ */
#pragma once #pragma once
#include <deque>
namespace Ui { namespace Ui {
struct PreparedFileInformation { struct PreparedFileInformation {
@ -71,13 +73,16 @@ struct PreparedList {
std::vector<int> order); std::vector<int> order);
void mergeToEnd(PreparedList &&other, bool cutToAlbumSize = false); 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; Error error = Error::None;
QString errorData; QString errorData;
std::vector<PreparedFile> files; std::vector<PreparedFile> files;
bool allFilesForCompress = true; std::deque<PreparedFile> filesToProcess;
bool albumIsPossible = false; std::optional<bool> overrideSendImagesAsPhotos;
//bool someFilesForCompress = false;
//bool someAlbumIsPossible = false;
bool singleAlbumIsPossible = false;
}; };
[[nodiscard]] int MaxAlbumItems(); [[nodiscard]] int MaxAlbumItems();

View file

@ -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> 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

View file

@ -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<SendFilesWay> 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<Flag> _flags = Flag::Default;
};
} // namespace Ui

View file

@ -68,11 +68,12 @@ PRIVATE
ui/chat/attach/attach_album_thumbnail.h ui/chat/attach/attach_album_thumbnail.h
ui/chat/attach/attach_album_preview.cpp ui/chat/attach/attach_album_preview.cpp
ui/chat/attach/attach_album_preview.h ui/chat/attach/attach_album_preview.h
ui/chat/attach/attach_common.h
ui/chat/attach/attach_extensions.cpp ui/chat/attach/attach_extensions.cpp
ui/chat/attach/attach_extensions.h ui/chat/attach/attach_extensions.h
ui/chat/attach/attach_prepare.cpp ui/chat/attach/attach_prepare.cpp
ui/chat/attach/attach_prepare.h 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.cpp
ui/chat/attach/attach_single_file_preview.h ui/chat/attach/attach_single_file_preview.h
ui/chat/attach/attach_single_media_preview.cpp ui/chat/attach/attach_single_media_preview.cpp