Add setting for grouping files.
This commit is contained in:
parent
c2f0bcf933
commit
8d2fa313b7
25 changed files with 409 additions and 420 deletions
|
@ -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;
|
||||
|
|
|
@ -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<QString> 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<Window::SessionController*> 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<int> 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<int> 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<Ui::SingleFilePreview>(this, file);
|
||||
_compressConfirm = CompressConfirm::None;
|
||||
_preview = preview;
|
||||
initPreview(preview->desiredHeightValue());
|
||||
}
|
||||
}
|
||||
|
||||
void SendFilesBox::prepareAlbumPreview() {
|
||||
Expects(_sendWay != nullptr);
|
||||
|
||||
const auto wrap = Ui::CreateChild<Ui::ScrollArea>(
|
||||
this,
|
||||
st::boxScroll);
|
||||
_albumPreview = wrap->setOwnedWidget(object_ptr<Ui::AlbumPreview>(
|
||||
this,
|
||||
_list,
|
||||
_sendWay->value()));
|
||||
_sendWay.current()));
|
||||
|
||||
addThumbButtonHandlers(wrap);
|
||||
|
||||
|
@ -214,15 +208,10 @@ void SendFilesBox::addThumbButtonHandlers(not_null<Ui::ScrollArea*> 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<Ui::RadioenumGroup<SendFilesWay>>(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<Ui::Radioenum<SendFilesWay>> &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();
|
||||
|
|
|
@ -10,6 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
|||
#include <rpl/variable.h>
|
||||
#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 <typename Enum>
|
||||
class Radioenum;
|
||||
template <typename Enum>
|
||||
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<Window::SessionController*> controller,
|
||||
Ui::PreparedList &&list,
|
||||
const TextWithTags &caption,
|
||||
CompressConfirm compressed,
|
||||
SendLimit limit,
|
||||
Api::SendType sendType,
|
||||
SendMenu::Type sendMenuType);
|
||||
|
@ -98,10 +94,10 @@ private:
|
|||
not_null<Ui::AlbumPreview*> content);
|
||||
|
||||
void setupEmojiPanel();
|
||||
void updateSendWayControlsVisibility();
|
||||
void updateEmojiPanelGeometry();
|
||||
void emojiFilterForGeometry(not_null<QEvent*> 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<Window::SessionController*> _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<ChatHelpers::TabbedPanel> _emojiPanel;
|
||||
base::unique_qptr<QObject> _emojiFilter;
|
||||
|
||||
object_ptr<Ui::Radioenum<Ui::SendFilesWay>> _sendAlbum = { nullptr };
|
||||
object_ptr<Ui::Radioenum<Ui::SendFilesWay>> _sendPhotos = { nullptr };
|
||||
object_ptr<Ui::Radioenum<Ui::SendFilesWay>> _sendFiles = { nullptr };
|
||||
std::shared_ptr<Ui::RadioenumGroup<Ui::SendFilesWay>> _sendWay;
|
||||
object_ptr<Ui::Checkbox> _groupMediaInAlbums = { nullptr };
|
||||
object_ptr<Ui::Checkbox> _sendImagesAsPhotos = { nullptr };
|
||||
object_ptr<Ui::Checkbox> _groupFiles = { nullptr };
|
||||
rpl::variable<Ui::SendFilesWay> _sendWay = Ui::SendFilesWay();
|
||||
|
||||
rpl::variable<int> _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<Ui::RoundButton> _send;
|
||||
QPointer<Ui::RoundButton> _addFileToAlbum;
|
||||
QPointer<Ui::RoundButton> _addFile;
|
||||
|
||||
};
|
||||
|
|
|
@ -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<QString, QString> soundOverrides;
|
||||
qint32 sendFilesWay = static_cast<qint32>(_sendFilesWay);
|
||||
qint32 sendFilesWay = _sendFilesWay.serialize();
|
||||
qint32 sendSubmitWay = static_cast<qint32>(_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<Ui::SendFilesWay>(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<Ui::InputSubmitSettings>(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 = {};
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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<const QMimeData*> 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<SendingAlbum>()
|
||||
: nullptr;
|
||||
uploadFilesAfterConfirmation(
|
||||
|
@ -4238,7 +4219,7 @@ bool HistoryWidget::confirmSendingFiles(
|
|||
bool HistoryWidget::confirmSendingFiles(
|
||||
QImage &&image,
|
||||
QByteArray &&content,
|
||||
CompressConfirm compressed,
|
||||
std::optional<bool> 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<const QMimeData*> data) const {
|
||||
|
@ -4269,7 +4248,7 @@ bool HistoryWidget::canSendFiles(not_null<const QMimeData*> data) const {
|
|||
|
||||
bool HistoryWidget::confirmSendingFiles(
|
||||
not_null<const QMimeData*> data,
|
||||
CompressConfirm compressed,
|
||||
std::optional<bool> 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) },
|
||||
});
|
||||
|
|
|
@ -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<const QMimeData*> 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<bool> overrideSendImagesAsPhotos = std::nullopt,
|
||||
const QString &insertTextOnCancel = QString());
|
||||
bool confirmSendingFiles(
|
||||
not_null<const QMimeData*> data,
|
||||
CompressConfirm compressed,
|
||||
std::optional<bool> overrideSendImagesAsPhotos,
|
||||
const QString &insertTextOnCancel = QString());
|
||||
bool confirmSendingFiles(
|
||||
Ui::PreparedList &&list,
|
||||
CompressConfirm compressed,
|
||||
const QString &insertTextOnCancel = QString());
|
||||
bool showSendingFilesError(const Ui::PreparedList &list) const;
|
||||
|
||||
|
|
|
@ -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<const QMimeData*> data,
|
||||
CompressConfirm compressed,
|
||||
std::optional<bool> 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<SendingAlbum>()
|
||||
: nullptr;
|
||||
uploadFilesAfterConfirmation(
|
||||
|
@ -683,7 +664,7 @@ bool RepliesWidget::confirmSendingFiles(
|
|||
bool RepliesWidget::confirmSendingFiles(
|
||||
QImage &&image,
|
||||
QByteArray &&content,
|
||||
CompressConfirm compressed,
|
||||
std::optional<bool> 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<SendingAlbum> 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
|
||||
|
|
|
@ -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<bool> overrideSendImagesAsPhotos = std::nullopt,
|
||||
const QString &insertTextOnCancel = QString());
|
||||
bool confirmSendingFiles(
|
||||
Ui::PreparedList &&list,
|
||||
CompressConfirm compressed,
|
||||
const QString &insertTextOnCancel = QString());
|
||||
bool confirmSendingFiles(
|
||||
not_null<const QMimeData*> data,
|
||||
CompressConfirm compressed,
|
||||
std::optional<bool> overrideSendImagesAsPhotos = std::nullopt,
|
||||
const QString &insertTextOnCancel = QString());
|
||||
bool showSendingFilesError(const Ui::PreparedList &list) const;
|
||||
void uploadFilesAfterConfirmation(
|
||||
|
|
|
@ -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<const QMimeData*> data,
|
||||
CompressConfirm compressed,
|
||||
std::optional<bool> 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<SendingAlbum>()
|
||||
: nullptr;
|
||||
uploadFilesAfterConfirmation(
|
||||
|
@ -421,7 +402,7 @@ bool ScheduledWidget::confirmSendingFiles(
|
|||
bool ScheduledWidget::confirmSendingFiles(
|
||||
QImage &&image,
|
||||
QByteArray &&content,
|
||||
CompressConfirm compressed,
|
||||
std::optional<bool> 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<SendingAlbum> 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
|
||||
|
|
|
@ -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<bool> overrideSendImagesAsPhotos = std::nullopt,
|
||||
const QString &insertTextOnCancel = QString());
|
||||
bool confirmSendingFiles(
|
||||
Ui::PreparedList &&list,
|
||||
CompressConfirm compressed,
|
||||
const QString &insertTextOnCancel = QString());
|
||||
bool confirmSendingFiles(
|
||||
not_null<const QMimeData*> data,
|
||||
CompressConfirm compressed,
|
||||
std::optional<bool> overrideSendImagesAsPhotos = std::nullopt,
|
||||
const QString &insertTextOnCancel = QString());
|
||||
bool showSendingFilesError(const Ui::PreparedList &list) const;
|
||||
void uploadFilesAfterConfirmation(
|
||||
|
|
|
@ -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<qint32>(app.sendFilesWay());
|
||||
qint32 appSendFilesWay = app.sendFilesWay().serialize();
|
||||
qint32 legacyCallsPeerToPeer = qint32(0);
|
||||
qint32 appSendSubmitWay = static_cast<qint32>(app.sendSubmitWay());
|
||||
qint32 supportSwitch = static_cast<qint32>(_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<Ui::SendFilesWay>(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<Ui::InputSubmitSettings>(
|
||||
appSendSubmitWay);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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<PreparedList> 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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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<int> _order;
|
||||
std::vector<std::unique_ptr<AlbumThumbnail>> _thumbs;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
|
@ -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;
|
||||
|
|
|
@ -7,6 +7,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
|||
*/
|
||||
#pragma once
|
||||
|
||||
#include <deque>
|
||||
|
||||
namespace Ui {
|
||||
|
||||
struct PreparedFileInformation {
|
||||
|
@ -71,13 +73,16 @@ struct PreparedList {
|
|||
std::vector<int> 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<PreparedFile> files;
|
||||
bool allFilesForCompress = true;
|
||||
bool albumIsPossible = false;
|
||||
std::deque<PreparedFile> filesToProcess;
|
||||
std::optional<bool> overrideSendImagesAsPhotos;
|
||||
//bool someFilesForCompress = false;
|
||||
//bool someAlbumIsPossible = false;
|
||||
bool singleAlbumIsPossible = false;
|
||||
};
|
||||
|
||||
[[nodiscard]] int MaxAlbumItems();
|
||||
|
|
|
@ -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
|
72
Telegram/SourceFiles/ui/chat/attach/attach_send_files_way.h
Normal file
72
Telegram/SourceFiles/ui/chat/attach/attach_send_files_way.h
Normal 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
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue